1use bevy::math::Vec3;
2use wde_wgpu::vertex::Vertex;
3
4use crate::assets::{Mesh, MeshBbox};
5
6pub struct CubeMesh;
7impl CubeMesh {
8 pub fn from(label: &str, length: f32) -> Mesh {
20 let half_length = length / 2.0;
21
22 let positions = [
24 -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 -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 -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 -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 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 -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 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, -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 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 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 let nx = normals[3 * vtx];
129 let ny = normals[3 * vtx + 1];
130 let nz = normals[3 * vtx + 2];
131
132 let u = texcoords[2 * vtx];
134 let v = texcoords[2 * vtx + 1];
135
136 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 let indices = vec![
147 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23, ];
154
155 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}