diff --git a/crates/viewer/re_renderer/src/renderer/mesh_renderer.rs b/crates/viewer/re_renderer/src/renderer/mesh_renderer.rs index 1162c3890361..553f8c3e7160 100644 --- a/crates/viewer/re_renderer/src/renderer/mesh_renderer.rs +++ b/crates/viewer/re_renderer/src/renderer/mesh_renderer.rs @@ -220,8 +220,15 @@ impl MeshDrawData { count_with_outlines += instance.outline_mask_ids.is_some() as u32; let world_from_mesh_mat3 = instance.world_from_mesh.matrix3; + // If the matrix is not invertible the draw result is likely invalid as well. + // However, at this point it's really hard to bail out! + // Also, by skipping drawing here, we'd make the result worse as there would be no mesh draw calls that could be debugged. let world_from_mesh_normal = - instance.world_from_mesh.matrix3.inverse().transpose(); + if instance.world_from_mesh.matrix3.determinant() != 0.0 { + instance.world_from_mesh.matrix3.inverse().transpose() + } else { + glam::Mat3A::ZERO + }; instance_buffer_staging.push(gpu_data::InstanceData { world_from_mesh_row_0: world_from_mesh_mat3 .row(0) diff --git a/crates/viewer/re_space_view_spatial/src/contexts/transform_context.rs b/crates/viewer/re_space_view_spatial/src/contexts/transform_context.rs index 87e41460f921..e9287995c345 100644 --- a/crates/viewer/re_space_view_spatial/src/contexts/transform_context.rs +++ b/crates/viewer/re_space_view_spatial/src/contexts/transform_context.rs @@ -555,8 +555,14 @@ fn query_and_resolve_tree_transform_at_entity( if let Some(mat3x3) = result.component_instance::(0) { transform *= glam::Affine3A::from(mat3x3); } + if result.component_instance::(0) == Some(TransformRelation::ChildFromParent) { + if transform.matrix3.determinant() != 0.0 { + // TODO(andreas): Should we warn? This might be intentionally caused by zero scale. + transform = transform.inverse(); + } + transform = transform.inverse(); }