1use crate::vertex;
2use super::*;
3
4#[inline]
6pub const fn lines3d_vertex_index_counts (dims : u16) -> (u32, u32) {
7 let dims = dims as u32;
8 ( (dims+1) * (dims+1),
9 4 * (dims * dims + dims) )
10}
11
12impl Lines3d {
13 pub fn grid (index_offset : u32, dims : u16) -> Self {
24 assert!(0 < dims);
25 let (num_vertices, num_indices) = lines3d_vertex_index_counts (dims);
26 let dims = dims as u32;
27 let mut vertices
28 = Vec::<vertex::Vert3dInstanced>::with_capacity (num_vertices as usize);
29 for i in 0..=dims {
30 for j in 0..=dims {
31 #[expect(clippy::suboptimal_flops)]
32 let x = i as f32 - 0.5 * dims as f32;
33 #[expect(clippy::suboptimal_flops)]
34 let y = j as f32 - 0.5 * dims as f32;
35 vertices.push (vertex::Vert3dInstanced { inst_position: [x, y, 0.0] })
36 }
37 }
38 debug_assert_eq!(vertices.len(), num_vertices as usize);
39
40 let mut indices = Vec::<u32>::with_capacity (num_indices as usize);
41 for i in 0..dims {
42 for j in 0..dims {
43 let base_index = index_offset + (i * (dims+1) + j);
44 indices.push (base_index);
45 indices.push (base_index + (dims+1));
46 indices.push (base_index);
47 indices.push (base_index + 1);
48 }
49 }
50 let top_base_index = index_offset + (dims+1) * dims;
51 let right_base_index = index_offset + dims;
52 for k in 0..dims {
53 indices.push (top_base_index + k);
54 indices.push (top_base_index + k + 1);
55 indices.push (right_base_index + k * (dims+1));
56 indices.push (right_base_index + (k + 1) * (dims+1));
57 }
58 debug_assert_eq!(indices.len(), num_indices as usize);
59
60 Lines3d { vertices, indices }
61 }
62}