use std::f64::consts::TAU;
use glam::{dvec2, vec2};
use crate::{backend::RenderState, render::Mesh};
use super::Vertex;
pub const MESH_RECT: u32 = 4;
pub const MESH_HEXAGON: u32 = 6;
pub const MESH_CIRCLE: u32 = 32;
pub(crate) fn register_primitive_meshes(render_state: &mut RenderState) {
render_state.register_mesh(
MESH_RECT,
Mesh::new_triangle_fan(
(0..4)
.map(|i| Vertex {
position: vec2((i / 2) as f32 - 0.5, 0.5 - (i % 2) as f32),
uv: vec2((i / 2) as f32, (i % 2) as f32),
})
.collect(),
true,
),
);
for (id, n) in [(MESH_HEXAGON, 6), (MESH_CIRCLE, 32)] {
render_state.register_mesh(id, Mesh::new_regular_polygon_fill(n));
}
}
impl Mesh<Vertex> {
pub fn new_regular_polygon_fill(n: u32) -> Self {
let vertices = (0..n)
.map(|i| {
let t = (i as f64 / n as f64 + 0.25) * TAU;
let (sin, cos) = t.sin_cos();
Vertex {
position: dvec2(cos, sin).as_vec2(),
uv: dvec2((cos + 1.0) * 0.5, (1.0 - sin) * 0.5).as_vec2(),
}
})
.collect();
Self::new_triangle_fan(vertices, true)
}
}