diff --git a/crates/bevy_render/src/mesh/mesh.rs b/crates/bevy_render/src/mesh/mesh.rs index 585b0e9e01b1a..512b783206d28 100644 --- a/crates/bevy_render/src/mesh/mesh.rs +++ b/crates/bevy_render/src/mesh/mesh.rs @@ -176,7 +176,7 @@ pub mod shape { use bevy_math::*; use hexasphere::Hexasphere; - /// A cube. + /// A cube -> RectangularPrism where all length of sides are the same. pub struct Cube { /// Half the side length of the cube. pub size: f32, @@ -190,67 +190,14 @@ pub mod shape { impl From for Mesh { fn from(cube: Cube) -> Self { - let size = cube.size; - let vertices = &[ - // top (0., 0., size) - ([-size, -size, size], [0., 0., size], [0., 0.]), - ([size, -size, size], [0., 0., size], [size, 0.]), - ([size, size, size], [0., 0., size], [size, size]), - ([-size, size, size], [0., 0., size], [0., size]), - // bottom (0., 0., -size) - ([-size, size, -size], [0., 0., -size], [size, 0.]), - ([size, size, -size], [0., 0., -size], [0., 0.]), - ([size, -size, -size], [0., 0., -size], [0., size]), - ([-size, -size, -size], [0., 0., -size], [size, size]), - // right (size, 0., 0.) - ([size, -size, -size], [size, 0., 0.], [0., 0.]), - ([size, size, -size], [size, 0., 0.], [size, 0.]), - ([size, size, size], [size, 0., 0.], [size, size]), - ([size, -size, size], [size, 0., 0.], [0., size]), - // left (-size, 0., 0.) - ([-size, -size, size], [-size, 0., 0.], [size, 0.]), - ([-size, size, size], [-size, 0., 0.], [0., 0.]), - ([-size, size, -size], [-size, 0., 0.], [0., size]), - ([-size, -size, -size], [-size, 0., 0.], [size, size]), - // front (0., size, 0.) - ([size, size, -size], [0., size, 0.], [size, 0.]), - ([-size, size, -size], [0., size, 0.], [0., 0.]), - ([-size, size, size], [0., size, 0.], [0., size]), - ([size, size, size], [0., size, 0.], [size, size]), - // back (0., -size, 0.) - ([size, -size, size], [0., -size, 0.], [0., 0.]), - ([-size, -size, size], [0., -size, 0.], [size, 0.]), - ([-size, -size, -size], [0., -size, 0.], [size, size]), - ([size, -size, -size], [0., -size, 0.], [0., size]), - ]; - - let mut positions = Vec::new(); - let mut normals = Vec::new(); - let mut uvs = Vec::new(); - for (position, normal, uv) in vertices.iter() { - positions.push(*position); - normals.push(*normal); - uvs.push(*uv); - } - - let indices = vec![ - 0, 1, 2, 2, 3, 0, // top - 4, 5, 6, 6, 7, 4, // bottom - 8, 9, 10, 10, 11, 8, // right - 12, 13, 14, 14, 15, 12, // left - 16, 17, 18, 18, 19, 16, // front - 20, 21, 22, 22, 23, 20, // back - ]; - - Mesh { - primitive_topology: PrimitiveTopology::TriangleList, - attributes: vec![ - VertexAttribute::position(positions), - VertexAttribute::normal(normals), - VertexAttribute::uv(uvs), - ], - indices: Some(indices), - } + Mesh::from(RectangularPrism { + min_x: -cube.size, + max_x: cube.size, + min_y: -cube.size, + max_y: cube.size, + min_z: -cube.size, + max_z: cube.size, + }) } } @@ -453,6 +400,105 @@ pub mod shape { } } } + + /// A aectangular prism. Just like a cube, but you can specify the + /// length of each dimensions. + pub struct RectangularPrism { + pub min_x: f32, + pub max_x: f32, + + pub min_y: f32, + pub max_y: f32, + + pub min_z: f32, + pub max_z: f32, + } + + impl RectangularPrism { + pub fn new(length :f32, height :f32, width :f32) -> RectangularPrism { + RectangularPrism { + max_x: (length / 2.0), + min_x: -(length / 2.0), + max_y: (height / 2.0), + min_y: -(height / 2.0), + max_z: (width / 2.0), + min_z: -(width / 2.0), + } + } + } + + impl Default for RectangularPrism { + fn default() -> Self { + RectangularPrism::new(2.0,1.0,1.0) + } + } + + impl From for Mesh { + fn from(sp: RectangularPrism) -> Self { + // Position, Normals, UVs + let vertices = &[ + // Top + ([sp.min_x, sp.min_y, sp.max_z], [0., 0., 1.0], [0., 0.]), + ([sp.max_x, sp.min_y, sp.max_z], [0., 0., 1.0], [1.0, 0.]), + ([sp.max_x, sp.max_y, sp.max_z], [0., 0., 1.0], [1.0, 1.0]), + ([sp.min_x, sp.max_y, sp.max_z], [0., 0., 1.0], [0., 1.0]), + // Bottom + ([sp.min_x, sp.max_y, sp.min_z], [0., 0., -1.0], [1.0, 0.]), + ([sp.max_x, sp.max_y, sp.min_z], [0., 0., -1.0], [0., 0.]), + ([sp.max_x, sp.min_y, sp.min_z], [0., 0., -1.0], [0., 1.0]), + ([sp.min_x, sp.min_y, sp.min_z], [0., 0., -1.0], [1.0, 1.0]), + // Right + ([sp.max_x, sp.min_y, sp.min_z], [1.0, 0., 0.], [0., 0.]), + ([sp.max_x, sp.max_y, sp.min_z], [1.0, 0., 0.], [1.0, 0.]), + ([sp.max_x, sp.max_y, sp.max_z], [1.0, 0., 0.], [1.0, 1.0]), + ([sp.max_x, sp.min_y, sp.max_z], [1.0, 0., 0.], [0., 1.0]), + // Left + ([sp.min_x, sp.min_y, sp.max_z], [-1.0, 0., 0.], [1.0, 0.]), + ([sp.min_x, sp.max_y, sp.max_z], [-1.0, 0., 0.], [0., 0.]), + ([sp.min_x, sp.max_y, sp.min_z], [-1.0, 0., 0.], [0., 1.0]), + ([sp.min_x, sp.min_y, sp.min_z], [-1.0, 0., 0.], [1.0, 1.0]), + // Front + ([sp.max_x, sp.max_y, sp.min_z], [0., 1.0, 0.], [1.0, 0.]), + ([sp.min_x, sp.max_y, sp.min_z], [0., 1.0, 0.], [0., 0.]), + ([sp.min_x, sp.max_y, sp.max_z], [0., 1.0, 0.], [0., 1.0]), + ([sp.max_x, sp.max_y, sp.max_z], [0., 1.0, 0.], [1.0, 1.0]), + // Back + ([sp.max_x, sp.min_y, sp.max_z], [0., -1.0, 0.], [0., 0.]), + ([sp.min_x, sp.min_y, sp.max_z], [0., -1.0, 0.], [1.0, 0.]), + ([sp.min_x, sp.min_y, sp.min_z], [0., -1.0, 0.], [1.0, 1.0]), + ([sp.max_x, sp.min_y, sp.min_z], [0., -1.0, 0.], [0., 1.0]), + ]; + + let mut positions = Vec::with_capacity(24); + let mut normals = Vec::with_capacity(24); + let mut uvs = Vec::with_capacity(24); + + for (position, normal, uv) in vertices.iter() { + positions.push(*position); + normals.push(*normal); + uvs.push(*uv); + } + + let indices = vec![ + 0, 1, 2, 2, 3, 0, // top + 4, 5, 6, 6, 7, 4, // bottom + 8, 9, 10, 10, 11, 8, // right + 12, 13, 14, 14, 15, 12, // left + 16, 17, 18, 18, 19, 16, // front + 20, 21, 22, 22, 23, 20, // back + ]; + + Mesh { + primitive_topology: PrimitiveTopology::TriangleList, + attributes: vec![ + VertexAttribute::position(positions), + VertexAttribute::normal(normals), + VertexAttribute::uv(uvs), + ], + indices: Some(indices), + } + } + } } fn remove_current_mesh_resources(