2022-07-08 18:48:31 +00:00
|
|
|
use crate::abi::UiPanel;
|
2022-07-09 22:56:19 +00:00
|
|
|
use crate::{Color, Vec2};
|
2022-07-08 18:48:31 +00:00
|
|
|
|
|
|
|
pub struct DrawContext {
|
|
|
|
panel: UiPanel,
|
2022-07-09 22:56:19 +00:00
|
|
|
offset: Vec2,
|
2022-07-08 18:48:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl DrawContext {
|
|
|
|
pub fn new(panel: UiPanel) -> Self {
|
2022-07-09 22:56:19 +00:00
|
|
|
Self {
|
|
|
|
panel,
|
|
|
|
offset: Vec2::ZERO,
|
|
|
|
}
|
2022-07-08 18:48:31 +00:00
|
|
|
}
|
|
|
|
|
2022-07-09 22:56:19 +00:00
|
|
|
pub fn draw_triangle(&self, v1: Vec2, v2: Vec2, v3: Vec2, color: Color) {
|
|
|
|
let v1 = v1 + self.offset;
|
|
|
|
let v2 = v2 + self.offset;
|
|
|
|
let v3 = v3 + self.offset;
|
|
|
|
self.panel.draw_triangle(v1, v2, v3, color);
|
2022-07-08 18:48:31 +00:00
|
|
|
}
|
|
|
|
|
2022-07-09 22:56:19 +00:00
|
|
|
pub fn draw_circle(&self, center: Vec2, radius: f32, color: Color) {
|
2022-07-08 18:48:31 +00:00
|
|
|
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 {
|
2022-07-09 22:56:19 +00:00
|
|
|
let new_spoke = Vec2::from_angle(theta) * radius + center;
|
|
|
|
self.draw_triangle(center, last_spoke, new_spoke, color);
|
2022-07-08 18:48:31 +00:00
|
|
|
last_spoke = new_spoke;
|
|
|
|
theta += delta;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-09 22:56:19 +00:00
|
|
|
pub fn draw_ring(&self, center: Vec2, radius: f32, thickness: f32, color: Color) {
|
2022-07-08 18:48:31 +00:00
|
|
|
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);
|
2022-07-09 22:56:19 +00:00
|
|
|
let new_spoke = angle * radius + center;
|
|
|
|
let new_spoke2 = angle * (radius + thickness) + center;
|
|
|
|
let last_spoke2 = Vec2::from_angle(last_theta) * (radius + thickness) + center;
|
2022-07-08 18:48:31 +00:00
|
|
|
|
2022-07-09 22:56:19 +00:00
|
|
|
self.draw_triangle(new_spoke2, last_spoke, new_spoke, color);
|
|
|
|
self.draw_triangle(new_spoke2, last_spoke2, last_spoke, color);
|
2022-07-08 18:48:31 +00:00
|
|
|
|
|
|
|
last_spoke = new_spoke;
|
|
|
|
last_theta = theta;
|
|
|
|
theta += delta;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-09 22:56:19 +00:00
|
|
|
pub fn draw_rect(&self, xy: &Vec2, size: &Vec2, color: Color) {
|
2022-07-08 18:48:31 +00:00
|
|
|
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;
|
|
|
|
|
2022-07-09 22:56:19 +00:00
|
|
|
self.draw_triangle(v1, v2, v3, color);
|
|
|
|
self.draw_triangle(v2, v3, v4, color);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn with_offset(&self, offset: Vec2) -> Self {
|
|
|
|
Self {
|
|
|
|
panel: self.panel,
|
|
|
|
offset: self.offset + offset,
|
|
|
|
}
|
2022-07-08 18:48:31 +00:00
|
|
|
}
|
|
|
|
}
|