pittore 0.2.4

Simple toolkit for 2D visualization based on wgpu.
Documentation
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)
    }
}