wde_renderer/assets/meshes/
cube.rs

1use bevy::math::Vec3;
2use wde_wgpu::vertex::Vertex;
3
4use crate::assets::{Mesh, MeshBbox};
5
6pub struct CubeMesh;
7impl CubeMesh {
8    /// Create a new cube mesh.
9    /// The cube goes from (-length/2) to (length/2) in all directions.
10    ///
11    /// # Arguments
12    ///
13    /// * `label` - The label for the mesh.
14    /// * `length` - The length of the cube's sides.
15    ///
16    /// # Returns
17    ///
18    /// The cube mesh.
19    pub fn from(label: &str, length: f32) -> Mesh {
20        let half_length = length / 2.0;
21
22        // Create vertices
23        let positions = [
24            // Front face
25            -half_length,
26            -half_length,
27            half_length,
28            half_length,
29            -half_length,
30            half_length,
31            half_length,
32            half_length,
33            half_length,
34            -half_length,
35            half_length,
36            half_length,
37            // Back face
38            -half_length,
39            -half_length,
40            -half_length,
41            -half_length,
42            half_length,
43            -half_length,
44            half_length,
45            half_length,
46            -half_length,
47            half_length,
48            -half_length,
49            -half_length,
50            // Top face
51            -half_length,
52            half_length,
53            -half_length,
54            -half_length,
55            half_length,
56            half_length,
57            half_length,
58            half_length,
59            half_length,
60            half_length,
61            half_length,
62            -half_length,
63            // Bottom face
64            -half_length,
65            -half_length,
66            -half_length,
67            half_length,
68            -half_length,
69            -half_length,
70            half_length,
71            -half_length,
72            half_length,
73            -half_length,
74            -half_length,
75            half_length,
76            // Right face
77            half_length,
78            -half_length,
79            -half_length,
80            half_length,
81            half_length,
82            -half_length,
83            half_length,
84            half_length,
85            half_length,
86            half_length,
87            -half_length,
88            half_length,
89            // Left face
90            -half_length,
91            -half_length,
92            -half_length,
93            -half_length,
94            -half_length,
95            half_length,
96            -half_length,
97            half_length,
98            half_length,
99            -half_length,
100            half_length,
101            -half_length
102        ];
103        let normals = [
104            // Front face
105            0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // Back face
106            0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, // Top face
107            0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Bottom face
108            0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // Right face
109            1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Left face
110            -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0
111        ];
112        let texcoords = [
113            // Front face
114            0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Back face
115            1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // Top face
116            0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, // Bottom face
117            1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Right face
118            1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // Left face
119            0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0
120        ];
121        let mut vertices = Vec::new();
122        for vtx in 0..positions.len() / 3 {
123            let x = positions[3 * vtx];
124            let y = positions[3 * vtx + 1];
125            let z = positions[3 * vtx + 2];
126
127            // Normals
128            let nx = normals[3 * vtx];
129            let ny = normals[3 * vtx + 1];
130            let nz = normals[3 * vtx + 2];
131
132            // UVs
133            let u = texcoords[2 * vtx];
134            let v = texcoords[2 * vtx + 1];
135
136            // Vertex
137            vertices.push(Vertex {
138                position: [x, y, z],
139                normal: [nx, ny, nz],
140                uv: [u, v],
141                tangent: [0.0, 0.0, 0.0, 0.0]
142            });
143        }
144
145        // Create indices
146        let indices = vec![
147            0, 1, 2, 0, 2, 3, // Front face
148            4, 5, 6, 4, 6, 7, // Back face
149            8, 9, 10, 8, 10, 11, // Top face
150            12, 13, 14, 12, 14, 15, // Bottom face
151            16, 17, 18, 16, 18, 19, // Right face
152            20, 21, 22, 20, 22, 23, // Left face
153        ];
154
155        // Create bounding box
156        let bounding_box = MeshBbox {
157            min: Vec3::new(-half_length, -half_length, -half_length),
158            max: Vec3::new(half_length, half_length, half_length)
159        };
160
161        Mesh {
162            label: label.to_string(),
163            vertices,
164            indices,
165            bbox: bounding_box,
166            use_ssbo: false
167        }
168    }
169}