fix(spatial): no more zero values in scale

This commit is contained in:
Nova
2025-10-23 15:37:19 -07:00
parent 04e20a3bbf
commit 6e2de6ac87

View File

@@ -126,9 +126,17 @@ impl Transform {
.then_some(self.rotation) .then_some(self.rotation)
.flatten() .flatten()
.unwrap_or_else(|| Quat::IDENTITY.into()); .unwrap_or_else(|| Quat::IDENTITY.into());
// Zero scale values break everything
let epsilon = 0.00001;
let scale = scale let scale = scale
.then_some(self.scale) .then_some(self.scale)
.flatten() .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])); .unwrap_or_else(|| Vector3::from([1.0; 3]));
Mat4::from_scale_rotation_translation(scale.into(), rotation.into(), position.into()) Mat4::from_scale_rotation_translation(scale.into(), rotation.into(), position.into())
@@ -268,9 +276,7 @@ impl Spatial {
transform: Transform, transform: Transform,
) { ) {
if reference_space == Some(self) { if reference_space == Some(self) {
self.set_local_transform( self.set_local_transform(transform.to_mat4(true, true, true) * self.local_transform());
parse_transform(transform, true, true, true) * self.local_transform(),
);
return; return;
} }
let reference_to_parent_transform = reference_space 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 { impl InterfaceAspect for Interface {
fn create_spatial( fn create_spatial(
_node: Arc<Node>, _node: Arc<Node>,
@@ -544,7 +533,7 @@ impl InterfaceAspect for Interface {
zoneable: bool, zoneable: bool,
) -> Result<()> { ) -> Result<()> {
let parent = parent.get_aspect::<Spatial>()?; let parent = parent.get_aspect::<Spatial>()?;
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()?; let node = Node::from_id(&calling_client, id, true).add_to_scenegraph()?;
Spatial::add_to(&node, Some(parent.clone()), transform, zoneable); Spatial::add_to(&node, Some(parent.clone()), transform, zoneable);
Ok(()) Ok(())
@@ -558,7 +547,7 @@ impl InterfaceAspect for Interface {
field: Arc<Node>, field: Arc<Node>,
) -> Result<()> { ) -> Result<()> {
let parent = parent.get_aspect::<Spatial>()?; let parent = parent.get_aspect::<Spatial>()?;
let transform = parse_transform(transform, true, true, false); let transform = transform.to_mat4(true, true, false);
let field = field.get_aspect::<Field>()?; let field = field.get_aspect::<Field>()?;
let node = Node::from_id(&calling_client, id, true).add_to_scenegraph()?; let node = Node::from_id(&calling_client, id, true).add_to_scenegraph()?;