use crate::render::WrcParam;
use crate::size::pos::Pos;
use crate::style::ClickStyle;
#[repr(C)]
#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
struct TriangleDrawParam {
p0: [f32; 2], p1: [f32; 2], p2: [f32; 2], _pad0: [f32; 2],
fill_color: [f32; 4], border_thickness: f32, _pad1: [f32; 3],
border_color: [f32; 4], }
pub struct TriangleParam {
pub p0: Pos,
pub p1: Pos,
pub p2: Pos,
pub style: ClickStyle,
draw: TriangleDrawParam,
}
impl TriangleParam {
pub fn new(p0: Pos, p1: Pos, p2: Pos, style: ClickStyle) -> Self {
let fill_color = style.dyn_fill(false, false).as_gamma_rgba();
let border = style.dyn_border(false, false);
let draw = TriangleDrawParam {
p0: [p0.x, p0.y],
p1: [p1.x, p1.y],
p2: [p2.x, p2.y],
_pad0: [0.0; 2],
fill_color,
border_thickness: border.width,
_pad1: [0.0; 3],
border_color: border.color.as_gamma_rgba(),
};
TriangleParam {
p0,
p1,
p2,
style,
draw,
}
}
}
impl WrcParam for TriangleParam {
fn as_draw_param(&mut self, hovered: bool, mouse_down: bool) -> &[u8] {
let fill_color = self.style.dyn_fill(mouse_down, hovered).as_gamma_rgba();
let border = self.style.dyn_border(mouse_down, hovered);
self.draw.p0 = [self.p0.x, self.p0.y];
self.draw.p1 = [self.p1.x, self.p1.y];
self.draw.p2 = [self.p2.x, self.p2.y];
self.draw.border_thickness = border.width;
self.draw.border_color = border.color.as_gamma_rgba();
self.draw.fill_color = fill_color;
bytemuck::bytes_of(&self.draw)
}
}