use crate::{Color, Vec2}; use crate::abi::UiPanel; pub struct DrawContext { panel: UiPanel, } impl DrawContext { pub fn new(panel: UiPanel) -> Self { Self { panel } } pub fn draw_triangle(&self, v1: &Vec2, v2: &Vec2, v3: &Vec2, color: &Color) { self.panel.draw_triangle(v1, v2, v3, color) } pub fn draw_circle(&self, center: &Vec2, radius: f32, color: &Color) { use std::f32::consts::PI; let delta = PI / 16.0; let limit = PI * 2.0 + delta; let mut last_spoke = Vec2::new(radius + center.x, center.y); let mut theta = delta; while theta < limit { let new_spoke = Vec2::from_angle(theta) * radius + *center; self.draw_triangle(¢er, &last_spoke, &new_spoke, &color); last_spoke = new_spoke; theta += delta; } } pub fn draw_ring(&self, center: &Vec2, radius: f32, thickness: f32, color: &Color) { use std::f32::consts::PI; let delta = PI / 64.0; let limit = PI * 2.0 + delta; let mut last_spoke = glam::Vec2::new(radius + center.x, center.y); let mut last_theta = 0.0; let mut theta = delta; while theta < limit { let angle = Vec2::from_angle(theta); let new_spoke = angle * radius + *center; let new_spoke2 = angle * (radius + thickness) + *center; let last_spoke2 = Vec2::from_angle(last_theta) * (radius + thickness) + *center; self.draw_triangle(&new_spoke2, &last_spoke, &new_spoke, &color); self.draw_triangle(&new_spoke2, &last_spoke2, &last_spoke, &color); last_spoke = new_spoke; last_theta = theta; theta += delta; } } pub fn draw_rect(&self, xy: &Vec2, size: &Vec2, color: &Color) { let v1 = *xy; let v2 = v1 + Vec2::new(size.x, 0.0); let v3 = v1 + Vec2::new(0.0, size.y); let v4 = v1 + *size; self.draw_triangle(&v1, &v2, &v3, &color); self.draw_triangle(&v2, &v3, &v4, &color); } }