use rootvg_core::math::{Angle, Point, Transform, Vector};
mod solid;
pub use solid::*;
#[cfg(feature = "gradient")]
mod gradient;
#[cfg(feature = "gradient")]
pub use gradient::*;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Indexed<T> {
pub vertices: Vec<T>,
pub indices: Vec<u32>,
}
impl<T> Indexed<T> {
pub fn new() -> Self {
Self {
vertices: Vec::new(),
indices: Vec::new(),
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, bytemuck::Pod, bytemuck::Zeroable)]
pub struct MeshUniforms {
pub offset: [f32; 2],
pub transform: [f32; 6],
pub has_transform: u32,
}
impl MeshUniforms {
pub fn new(offset: Point, transform: Option<Transform>) -> Self {
let (transform, has_transform) = if let Some(transform) = transform {
(transform.to_array(), 1)
} else {
([0.0; 6], 0)
};
Self {
offset: offset.into(),
transform,
has_transform,
}
}
}
impl Default for MeshUniforms {
fn default() -> Self {
Self {
offset: [0.0; 2],
transform: [0.0; 6],
has_transform: 0,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum MeshPrimitive {
Solid(SolidMeshPrimitive),
#[cfg(feature = "gradient")]
Gradient(GradientMeshPrimitive),
}
impl MeshPrimitive {
pub fn set_offset(&mut self, offset: Point) {
match self {
MeshPrimitive::Solid(mesh) => mesh.uniform.offset = offset.into(),
#[cfg(feature = "gradient")]
MeshPrimitive::Gradient(mesh) => mesh.uniform.offset = offset.into(),
}
}
pub fn set_rotation(&mut self, angle: Angle, rotation_origin: Point) {
let transform = Transform::translation(-rotation_origin.x, -rotation_origin.y)
.then_rotate(angle)
.then_translate(Vector::new(rotation_origin.x, rotation_origin.y));
self.set_transform(transform);
}
pub fn set_transform(&mut self, transform: Transform) {
match self {
MeshPrimitive::Solid(mesh) => {
mesh.uniform.transform = transform.to_array();
mesh.uniform.has_transform = 1;
}
#[cfg(feature = "gradient")]
MeshPrimitive::Gradient(mesh) => {
mesh.uniform.transform = transform.to_array();
mesh.uniform.has_transform = 1;
}
}
}
}