From f35f813137d797da7e0d919317773c4da7c068c1 Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 30 Nov 2020 14:05:03 -0700 Subject: [PATCH] additional vertex attribute value types (#946) --- crates/bevy_render/src/mesh/mesh.rs | 80 +++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/crates/bevy_render/src/mesh/mesh.rs b/crates/bevy_render/src/mesh/mesh.rs index 96278eade50f6..8536868fdab1f 100644 --- a/crates/bevy_render/src/mesh/mesh.rs +++ b/crates/bevy_render/src/mesh/mesh.rs @@ -19,18 +19,34 @@ pub const VERTEX_ATTRIBUTE_BUFFER_ID: u64 = 10; #[derive(Clone, Debug)] pub enum VertexAttributeValues { Float(Vec), + Int(Vec), + Uint(Vec), Float2(Vec<[f32; 2]>), + Int2(Vec<[i32; 2]>), + Uint2(Vec<[u32; 2]>), Float3(Vec<[f32; 3]>), + Int3(Vec<[i32; 3]>), + Uint3(Vec<[u32; 3]>), Float4(Vec<[f32; 4]>), + Int4(Vec<[i32; 4]>), + Uint4(Vec<[u32; 4]>), } impl VertexAttributeValues { pub fn len(&self) -> usize { match *self { VertexAttributeValues::Float(ref values) => values.len(), + VertexAttributeValues::Int(ref values) => values.len(), + VertexAttributeValues::Uint(ref values) => values.len(), VertexAttributeValues::Float2(ref values) => values.len(), + VertexAttributeValues::Int2(ref values) => values.len(), + VertexAttributeValues::Uint2(ref values) => values.len(), VertexAttributeValues::Float3(ref values) => values.len(), + VertexAttributeValues::Int3(ref values) => values.len(), + VertexAttributeValues::Uint3(ref values) => values.len(), VertexAttributeValues::Float4(ref values) => values.len(), + VertexAttributeValues::Int4(ref values) => values.len(), + VertexAttributeValues::Uint4(ref values) => values.len(), } } @@ -42,9 +58,17 @@ impl VertexAttributeValues { pub fn get_bytes(&self) -> &[u8] { match self { VertexAttributeValues::Float(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Int(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Uint(values) => values.as_slice().as_bytes(), VertexAttributeValues::Float2(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Int2(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Uint2(values) => values.as_slice().as_bytes(), VertexAttributeValues::Float3(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Int3(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Uint3(values) => values.as_slice().as_bytes(), VertexAttributeValues::Float4(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Int4(values) => values.as_slice().as_bytes(), + VertexAttributeValues::Uint4(values) => values.as_slice().as_bytes(), } } } @@ -53,9 +77,17 @@ impl From<&VertexAttributeValues> for VertexFormat { fn from(values: &VertexAttributeValues) -> Self { match values { VertexAttributeValues::Float(_) => VertexFormat::Float, + VertexAttributeValues::Int(_) => VertexFormat::Int, + VertexAttributeValues::Uint(_) => VertexFormat::Uint, VertexAttributeValues::Float2(_) => VertexFormat::Float2, + VertexAttributeValues::Int2(_) => VertexFormat::Int2, + VertexAttributeValues::Uint2(_) => VertexFormat::Uint2, VertexAttributeValues::Float3(_) => VertexFormat::Float3, + VertexAttributeValues::Int3(_) => VertexFormat::Int3, + VertexAttributeValues::Uint3(_) => VertexFormat::Uint3, VertexAttributeValues::Float4(_) => VertexFormat::Float4, + VertexAttributeValues::Int4(_) => VertexFormat::Int4, + VertexAttributeValues::Uint4(_) => VertexFormat::Uint4, } } } @@ -66,24 +98,72 @@ impl From> for VertexAttributeValues { } } +impl From> for VertexAttributeValues { + fn from(vec: Vec) -> Self { + VertexAttributeValues::Int(vec) + } +} + +impl From> for VertexAttributeValues { + fn from(vec: Vec) -> Self { + VertexAttributeValues::Uint(vec) + } +} + impl From> for VertexAttributeValues { fn from(vec: Vec<[f32; 2]>) -> Self { VertexAttributeValues::Float2(vec) } } +impl From> for VertexAttributeValues { + fn from(vec: Vec<[i32; 2]>) -> Self { + VertexAttributeValues::Int2(vec) + } +} + +impl From> for VertexAttributeValues { + fn from(vec: Vec<[u32; 2]>) -> Self { + VertexAttributeValues::Uint2(vec) + } +} + impl From> for VertexAttributeValues { fn from(vec: Vec<[f32; 3]>) -> Self { VertexAttributeValues::Float3(vec) } } +impl From> for VertexAttributeValues { + fn from(vec: Vec<[i32; 3]>) -> Self { + VertexAttributeValues::Int3(vec) + } +} + +impl From> for VertexAttributeValues { + fn from(vec: Vec<[u32; 3]>) -> Self { + VertexAttributeValues::Uint3(vec) + } +} + impl From> for VertexAttributeValues { fn from(vec: Vec<[f32; 4]>) -> Self { VertexAttributeValues::Float4(vec) } } +impl From> for VertexAttributeValues { + fn from(vec: Vec<[i32; 4]>) -> Self { + VertexAttributeValues::Int4(vec) + } +} + +impl From> for VertexAttributeValues { + fn from(vec: Vec<[u32; 4]>) -> Self { + VertexAttributeValues::Uint4(vec) + } +} + #[derive(Debug)] pub enum Indices { U16(Vec),