From 02e513df3e6406745fdff79c38ea23c6837af52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 5 Apr 2022 22:48:36 +0200 Subject: [PATCH 1/4] do not use a smallvec --- crates/bevy_pbr/Cargo.toml | 1 - crates/bevy_pbr/src/render/mesh.rs | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index e1496ac67c0a3..04f01ab963f6e 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -29,4 +29,3 @@ bevy_window = { path = "../bevy_window", version = "0.7.0-dev" } bitflags = "1.2" # direct dependency required for derive macro bytemuck = { version = "1", features = ["derive"] } -smallvec = "1.0" diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 08ac42b83865d..6d66f62a282c9 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -25,7 +25,6 @@ use bevy_render::{ RenderApp, RenderStage, }; use bevy_transform::components::GlobalTransform; -use smallvec::SmallVec; use std::num::NonZeroU64; #[derive(Default)] @@ -191,8 +190,7 @@ impl SkinnedMeshJoints { let inverse_bindposes = inverse_bindposes.get(&skin.inverse_bindposes)?; let bindposes = inverse_bindposes.iter(); let skin_joints = skin.joints.iter(); - let mut temp = - SmallVec::<[Mat4; MAX_JOINTS]>::with_capacity(bindposes.len().min(MAX_JOINTS)); + let mut temp = Vec::::with_capacity(bindposes.len().min(MAX_JOINTS)); for (inverse_bindpose, joint) in bindposes.zip(skin_joints).take(MAX_JOINTS) { let joint_matrix = joints.get(*joint).ok()?.compute_matrix(); temp.push(joint_matrix * *inverse_bindpose); From a1a730ddb174ea213d66f06ea01275c9b266bcf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 5 Apr 2022 22:49:06 +0200 Subject: [PATCH 2/4] remove temp variable --- crates/bevy_pbr/src/render/mesh.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 6d66f62a282c9..897a7f3298c7f 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -192,8 +192,7 @@ impl SkinnedMeshJoints { let skin_joints = skin.joints.iter(); let mut temp = Vec::::with_capacity(bindposes.len().min(MAX_JOINTS)); for (inverse_bindpose, joint) in bindposes.zip(skin_joints).take(MAX_JOINTS) { - let joint_matrix = joints.get(*joint).ok()?.compute_matrix(); - temp.push(joint_matrix * *inverse_bindpose); + temp.push(joints.get(*joint).ok()?.compute_matrix() * *inverse_bindpose); } let start = buffer.len(); From 8ed517d11c54676f060726853bb47cd4a17dcd6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 5 Apr 2022 22:51:01 +0200 Subject: [PATCH 3/4] use an Affine3A for the intermediary step --- crates/bevy_pbr/src/render/mesh.rs | 2 +- crates/bevy_transform/src/components/global_transform.rs | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 897a7f3298c7f..3733b8aa63fc5 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -192,7 +192,7 @@ impl SkinnedMeshJoints { let skin_joints = skin.joints.iter(); let mut temp = Vec::::with_capacity(bindposes.len().min(MAX_JOINTS)); for (inverse_bindpose, joint) in bindposes.zip(skin_joints).take(MAX_JOINTS) { - temp.push(joints.get(*joint).ok()?.compute_matrix() * *inverse_bindpose); + temp.push(joints.get(*joint).ok()?.compute_affine() * *inverse_bindpose); } let start = buffer.len(); diff --git a/crates/bevy_transform/src/components/global_transform.rs b/crates/bevy_transform/src/components/global_transform.rs index f1bce51993914..c0e0aeac786e4 100644 --- a/crates/bevy_transform/src/components/global_transform.rs +++ b/crates/bevy_transform/src/components/global_transform.rs @@ -1,6 +1,6 @@ use super::Transform; use bevy_ecs::{component::Component, reflect::ReflectComponent}; -use bevy_math::{const_vec3, Mat3, Mat4, Quat, Vec3}; +use bevy_math::{const_vec3, Affine3A, Mat3, Mat4, Quat, Vec3}; use bevy_reflect::Reflect; use std::ops::Mul; @@ -128,6 +128,13 @@ impl GlobalTransform { Mat4::from_scale_rotation_translation(self.scale, self.rotation, self.translation) } + /// Returns the 3d affine transformation from this transforms translation, + /// rotation, and scale. + #[inline] + pub fn compute_affine(&self) -> Affine3A { + Affine3A::from_scale_rotation_translation(self.scale, self.rotation, self.translation) + } + /// Get the unit vector in the local x direction #[inline] pub fn local_x(&self) -> Vec3 { From f192fcc6b4add0c42aeade360af187939c9bbc61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 5 Apr 2022 23:49:37 +0200 Subject: [PATCH 4/4] remove the temp vec Co-Authored-By: James Liu <3137680+james7132@users.noreply.github.com> --- crates/bevy_pbr/src/render/mesh.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 3733b8aa63fc5..91a7b2c91fe0c 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -190,13 +190,16 @@ impl SkinnedMeshJoints { let inverse_bindposes = inverse_bindposes.get(&skin.inverse_bindposes)?; let bindposes = inverse_bindposes.iter(); let skin_joints = skin.joints.iter(); - let mut temp = Vec::::with_capacity(bindposes.len().min(MAX_JOINTS)); + let start = buffer.len(); for (inverse_bindpose, joint) in bindposes.zip(skin_joints).take(MAX_JOINTS) { - temp.push(joints.get(*joint).ok()?.compute_affine() * *inverse_bindpose); + if let Ok(joint) = joints.get(*joint) { + buffer.push(joint.compute_affine() * *inverse_bindpose); + } else { + buffer.truncate(start); + return None; + } } - let start = buffer.len(); - buffer.extend(temp); // Pad to 256 byte alignment while buffer.len() % 4 != 0 { buffer.push(Mat4::ZERO);