# Objective - Fixes #11740 ## Solution - Turned `Mesh::set_indices` into `Mesh::insert_indices` and added related methods for completeness. --- ## Changelog - Replaced `Mesh::set_indices(indices: Option<Indices>)` with `Mesh::insert_indices(indices: Indices)` - Replaced `Mesh::with_indices(indices: Option<Indices>)` with `Mesh::with_inserted_indices(indices: Indices)` and `Mesh::with_removed_indices()` mirroring the API for inserting / removing attributes. - Updated the examples and internal uses of the APIs described above. ## Migration Guide - Use `Mesh::insert_indices` or `Mesh::with_inserted_indices` instead of `Mesh::set_indices` / `Mesh::with_indices`. - If you have passed `None` to `Mesh::set_indices` or `Mesh::with_indices` you should use `Mesh::remove_indices` or `Mesh::with_removed_indices` instead. --------- Co-authored-by: François <mockersf@gmail.com>
		
			
				
	
	
		
			79 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use bevy_math::primitives::Cuboid;
 | 
						|
use wgpu::PrimitiveTopology;
 | 
						|
 | 
						|
use crate::{
 | 
						|
    mesh::{Indices, Mesh, Meshable},
 | 
						|
    render_asset::RenderAssetUsages,
 | 
						|
};
 | 
						|
 | 
						|
impl Meshable for Cuboid {
 | 
						|
    type Output = Mesh;
 | 
						|
 | 
						|
    fn mesh(&self) -> Self::Output {
 | 
						|
        let min = -self.half_size;
 | 
						|
        let max = self.half_size;
 | 
						|
 | 
						|
        // Suppose Y-up right hand, and camera look from +Z to -Z
 | 
						|
        let vertices = &[
 | 
						|
            // Front
 | 
						|
            ([min.x, min.y, max.z], [0.0, 0.0, 1.0], [0.0, 0.0]),
 | 
						|
            ([max.x, min.y, max.z], [0.0, 0.0, 1.0], [1.0, 0.0]),
 | 
						|
            ([max.x, max.y, max.z], [0.0, 0.0, 1.0], [1.0, 1.0]),
 | 
						|
            ([min.x, max.y, max.z], [0.0, 0.0, 1.0], [0.0, 1.0]),
 | 
						|
            // Back
 | 
						|
            ([min.x, max.y, min.z], [0.0, 0.0, -1.0], [1.0, 0.0]),
 | 
						|
            ([max.x, max.y, min.z], [0.0, 0.0, -1.0], [0.0, 0.0]),
 | 
						|
            ([max.x, min.y, min.z], [0.0, 0.0, -1.0], [0.0, 1.0]),
 | 
						|
            ([min.x, min.y, min.z], [0.0, 0.0, -1.0], [1.0, 1.0]),
 | 
						|
            // Right
 | 
						|
            ([max.x, min.y, min.z], [1.0, 0.0, 0.0], [0.0, 0.0]),
 | 
						|
            ([max.x, max.y, min.z], [1.0, 0.0, 0.0], [1.0, 0.0]),
 | 
						|
            ([max.x, max.y, max.z], [1.0, 0.0, 0.0], [1.0, 1.0]),
 | 
						|
            ([max.x, min.y, max.z], [1.0, 0.0, 0.0], [0.0, 1.0]),
 | 
						|
            // Left
 | 
						|
            ([min.x, min.y, max.z], [-1.0, 0.0, 0.0], [1.0, 0.0]),
 | 
						|
            ([min.x, max.y, max.z], [-1.0, 0.0, 0.0], [0.0, 0.0]),
 | 
						|
            ([min.x, max.y, min.z], [-1.0, 0.0, 0.0], [0.0, 1.0]),
 | 
						|
            ([min.x, min.y, min.z], [-1.0, 0.0, 0.0], [1.0, 1.0]),
 | 
						|
            // Top
 | 
						|
            ([max.x, max.y, min.z], [0.0, 1.0, 0.0], [1.0, 0.0]),
 | 
						|
            ([min.x, max.y, min.z], [0.0, 1.0, 0.0], [0.0, 0.0]),
 | 
						|
            ([min.x, max.y, max.z], [0.0, 1.0, 0.0], [0.0, 1.0]),
 | 
						|
            ([max.x, max.y, max.z], [0.0, 1.0, 0.0], [1.0, 1.0]),
 | 
						|
            // Bottom
 | 
						|
            ([max.x, min.y, max.z], [0.0, -1.0, 0.0], [0.0, 0.0]),
 | 
						|
            ([min.x, min.y, max.z], [0.0, -1.0, 0.0], [1.0, 0.0]),
 | 
						|
            ([min.x, min.y, min.z], [0.0, -1.0, 0.0], [1.0, 1.0]),
 | 
						|
            ([max.x, min.y, min.z], [0.0, -1.0, 0.0], [0.0, 1.0]),
 | 
						|
        ];
 | 
						|
 | 
						|
        let positions: Vec<_> = vertices.iter().map(|(p, _, _)| *p).collect();
 | 
						|
        let normals: Vec<_> = vertices.iter().map(|(_, n, _)| *n).collect();
 | 
						|
        let uvs: Vec<_> = vertices.iter().map(|(_, _, uv)| *uv).collect();
 | 
						|
 | 
						|
        let indices = Indices::U32(vec![
 | 
						|
            0, 1, 2, 2, 3, 0, // front
 | 
						|
            4, 5, 6, 6, 7, 4, // back
 | 
						|
            8, 9, 10, 10, 11, 8, // right
 | 
						|
            12, 13, 14, 14, 15, 12, // left
 | 
						|
            16, 17, 18, 18, 19, 16, // top
 | 
						|
            20, 21, 22, 22, 23, 20, // bottom
 | 
						|
        ]);
 | 
						|
 | 
						|
        Mesh::new(
 | 
						|
            PrimitiveTopology::TriangleList,
 | 
						|
            RenderAssetUsages::default(),
 | 
						|
        )
 | 
						|
        .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
 | 
						|
        .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
 | 
						|
        .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
 | 
						|
        .with_inserted_indices(indices)
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl From<Cuboid> for Mesh {
 | 
						|
    fn from(cuboid: Cuboid) -> Self {
 | 
						|
        cuboid.mesh()
 | 
						|
    }
 | 
						|
}
 |