From 6e2de6ac872cf4729229b9e5a01bb3a2131bccb0 Mon Sep 17 00:00:00 2001 From: Nova Date: Thu, 23 Oct 2025 15:37:19 -0700 Subject: [PATCH] fix(spatial): no more zero values in scale --- src/nodes/spatial/mod.rs | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/nodes/spatial/mod.rs b/src/nodes/spatial/mod.rs index 54523b5..7983012 100644 --- a/src/nodes/spatial/mod.rs +++ b/src/nodes/spatial/mod.rs @@ -126,9 +126,17 @@ impl Transform { .then_some(self.rotation) .flatten() .unwrap_or_else(|| Quat::IDENTITY.into()); + + // Zero scale values break everything + let epsilon = 0.00001; let scale = scale .then_some(self.scale) .flatten() + .map(|s| Vector3 { + x: if s.x == 0.0 { epsilon } else { s.x }, + y: if s.y == 0.0 { epsilon } else { s.y }, + z: if s.z == 0.0 { epsilon } else { s.z }, + }) .unwrap_or_else(|| Vector3::from([1.0; 3])); Mat4::from_scale_rotation_translation(scale.into(), rotation.into(), position.into()) @@ -268,9 +276,7 @@ impl Spatial { transform: Transform, ) { if reference_space == Some(self) { - self.set_local_transform( - parse_transform(transform, true, true, true) * self.local_transform(), - ); + self.set_local_transform(transform.to_mat4(true, true, true) * self.local_transform()); return; } let reference_to_parent_transform = reference_space @@ -517,23 +523,6 @@ impl SpatialRefAspect for SpatialRef { } } -pub fn parse_transform(transform: Transform, position: bool, rotation: bool, scale: bool) -> Mat4 { - let position = position - .then_some(transform.translation) - .flatten() - .unwrap_or_else(|| Vector3::from([0.0; 3])); - let rotation = rotation - .then_some(transform.rotation) - .flatten() - .unwrap_or_else(|| Quat::IDENTITY.into()); - let scale = scale - .then_some(transform.scale) - .flatten() - .unwrap_or_else(|| Vector3::from([1.0; 3])); - - Mat4::from_scale_rotation_translation(scale.into(), rotation.into(), position.into()) -} - impl InterfaceAspect for Interface { fn create_spatial( _node: Arc, @@ -544,7 +533,7 @@ impl InterfaceAspect for Interface { zoneable: bool, ) -> Result<()> { let parent = parent.get_aspect::()?; - let transform = parse_transform(transform, true, true, true); + let transform = transform.to_mat4(true, true, true); let node = Node::from_id(&calling_client, id, true).add_to_scenegraph()?; Spatial::add_to(&node, Some(parent.clone()), transform, zoneable); Ok(()) @@ -558,7 +547,7 @@ impl InterfaceAspect for Interface { field: Arc, ) -> Result<()> { let parent = parent.get_aspect::()?; - let transform = parse_transform(transform, true, true, false); + let transform = transform.to_mat4(true, true, false); let field = field.get_aspect::()?; let node = Node::from_id(&calling_client, id, true).add_to_scenegraph()?;