sao-ui-rs/src/draw.rs

67 lines
2.0 KiB
Rust

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(&center, &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);
}
}