fix(spatial): no more zero values in scale
This commit is contained in:
@@ -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()?;
|
||||||
|
|||||||
Reference in New Issue
Block a user