use super::Mappable; use crate::math::{self, Rect, Polygon, Triangle, Vec2}; use crate::scaleable::Scaleable; use crate::transform::Transform; use raylib::drawing::{RaylibDraw, RaylibDrawHandle}; use raylib::ffi::Color; pub type PolygonRoomData = Polygon; pub struct PolygonRoom { data: PolygonRoomData, // The polygon shape, but in triangles, so the polygon does not have to be triangulated every frame. triangulated: Vec>, } impl PolygonRoom { pub fn from_data(data: PolygonRoomData) -> Self { Self { data: data.clone(), triangulated: math::triangulate(data) } } fn retriangulate(&mut self) { self.triangulated = math::triangulate(self.data.clone()); } } impl Mappable for PolygonRoom { fn draw(&self, rld: &mut RaylibDrawHandle, transform: &Transform) { for triangle in &self.triangulated { rld.draw_triangle( transform.point_m_to_px(&triangle.corners()[0]), transform.point_m_to_px(&triangle.corners()[1]), transform.point_m_to_px(&triangle.corners()[2]), Color { r: 180, g: 180, b: 180, a: 255, }, ) } } fn bounding_rect(&self) -> Rect { Rect::bounding_rect_n(&self.data.corners()) } fn as_scaleable(&self) -> Option<&dyn Scaleable> { Some(self as &dyn Scaleable) } } impl Scaleable for PolygonRoom { fn scale(&mut self, by: &Vec2) { if by.x < 0. || by.y < 0. { panic!("Cannot set dimensions with negative size"); } for corner in self.data.corners_mut() { corner.x *= by.x; corner.y *= by.y; } self.retriangulate(); } }