sao-ui-rs/src/draw.rs

81 lines
2.3 KiB
Rust
Raw Normal View History

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
}
}