Merge pull request #985 from aws-lumberyard-dev/physics-transform-scale

update physics code to avoid vector scale Transform functions
This commit is contained in:
greerdv
2021-05-27 18:03:23 +01:00
committed by GitHub
6 changed files with 46 additions and 32 deletions
+33 -20
View File
@@ -555,25 +555,37 @@ namespace PhysX
if (meshConfig.GetCachedNativeMesh()) if (meshConfig.GetCachedNativeMesh())
{ {
const AZ::Transform scaleMatrix = AZ::Transform::CreateScale(meshScale); debugDisplay.PushMatrix(GetColliderLocalTransform(colliderConfig));
debugDisplay.PushMatrix(GetColliderLocalTransform(colliderConfig) * scaleMatrix);
if (meshConfig.GetMeshType() == Physics::CookedMeshShapeConfiguration::MeshType::TriangleMesh) if (meshConfig.GetMeshType() == Physics::CookedMeshShapeConfiguration::MeshType::TriangleMesh)
{ {
DrawTriangleMesh(debugDisplay, colliderConfig, geomIndex); DrawTriangleMesh(debugDisplay, colliderConfig, geomIndex, meshScale);
} }
else else
{ {
DrawConvexMesh(debugDisplay, colliderConfig, geomIndex); DrawConvexMesh(debugDisplay, colliderConfig, geomIndex, meshScale);
} }
debugDisplay.PopMatrix(); debugDisplay.PopMatrix();
} }
} }
void Collider::DrawTriangleMesh(AzFramework::DebugDisplayRequests& debugDisplay, AZStd::vector<AZ::Vector3> ScalePoints(const AZ::Vector3& scale, const AZStd::vector<AZ::Vector3>& points)
const Physics::ColliderConfiguration& colliderConfig, {
AZ::u32 geomIndex) const AZStd::vector<AZ::Vector3> scaledPoints;
scaledPoints.resize_no_construct(points.size());
AZStd::transform(
points.begin(), points.end(), scaledPoints.begin(),
[scale](const AZ::Vector3& point)
{
return scale * point;
});
return scaledPoints;
}
void Collider::DrawTriangleMesh(
AzFramework::DebugDisplayRequests& debugDisplay, const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex,
const AZ::Vector3& meshScale) const
{ {
AZ_Assert(geomIndex < m_geometry.size(), "DrawTriangleMesh: geomIndex is out of range"); AZ_Assert(geomIndex < m_geometry.size(), "DrawTriangleMesh: geomIndex is out of range");
@@ -581,10 +593,10 @@ namespace PhysX
const AZStd::unordered_map<int, AZStd::vector<AZ::u32>>& triangleIndexesByMaterialSlot const AZStd::unordered_map<int, AZStd::vector<AZ::u32>>& triangleIndexesByMaterialSlot
= geom.m_triangleIndexesByMaterialSlot; = geom.m_triangleIndexesByMaterialSlot;
const AZStd::vector<AZ::Vector3>& verts = geom.m_verts; AZStd::vector<AZ::Vector3> scaledVerts = ScalePoints(meshScale, geom.m_verts);
const AZStd::vector<AZ::Vector3>& points = geom.m_points; AZStd::vector<AZ::Vector3> scaledPoints = ScalePoints(meshScale, geom.m_points);
if (!verts.empty()) if (!scaledVerts.empty())
{ {
for (const auto& element : triangleIndexesByMaterialSlot) for (const auto& element : triangleIndexesByMaterialSlot)
{ {
@@ -596,30 +608,31 @@ namespace PhysX
triangleMeshInfo.m_numTriangles = triangleCount; triangleMeshInfo.m_numTriangles = triangleCount;
triangleMeshInfo.m_materialSlotIndex = materialSlot; triangleMeshInfo.m_materialSlotIndex = materialSlot;
debugDisplay.DrawTrianglesIndexed(verts, triangleIndexes debugDisplay.DrawTrianglesIndexed(scaledVerts, triangleIndexes
, CalcDebugColor(colliderConfig, triangleMeshInfo)); , CalcDebugColor(colliderConfig, triangleMeshInfo));
} }
debugDisplay.DrawLines(points, WireframeColor); debugDisplay.DrawLines(scaledPoints, WireframeColor);
} }
} }
void Collider::DrawConvexMesh(AzFramework::DebugDisplayRequests& debugDisplay, void Collider::DrawConvexMesh(
const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex) const AzFramework::DebugDisplayRequests& debugDisplay, const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex,
const AZ::Vector3& meshScale) const
{ {
AZ_Assert(geomIndex < m_geometry.size(), "DrawConvexMesh: geomIndex is out of range"); AZ_Assert(geomIndex < m_geometry.size(), "DrawConvexMesh: geomIndex is out of range");
const GeometryData& geom = m_geometry[geomIndex]; const GeometryData& geom = m_geometry[geomIndex];
const AZStd::vector<AZ::Vector3>& verts = geom.m_verts; AZStd::vector<AZ::Vector3> scaledVerts = ScalePoints(meshScale, geom.m_verts);
const AZStd::vector<AZ::Vector3>& points = geom.m_points; AZStd::vector<AZ::Vector3> scaledPoints = ScalePoints(meshScale, geom.m_points);
if (!verts.empty()) if (!scaledVerts.empty())
{ {
const AZ::u32 triangleCount = static_cast<AZ::u32>(verts.size() / 3); const AZ::u32 triangleCount = static_cast<AZ::u32>(scaledVerts.size() / 3);
ElementDebugInfo convexMeshInfo; ElementDebugInfo convexMeshInfo;
convexMeshInfo.m_numTriangles = triangleCount; convexMeshInfo.m_numTriangles = triangleCount;
debugDisplay.DrawTriangles(verts, CalcDebugColor(colliderConfig, convexMeshInfo)); debugDisplay.DrawTriangles(scaledVerts, CalcDebugColor(colliderConfig, convexMeshInfo));
debugDisplay.DrawLines(points, WireframeColor); debugDisplay.DrawLines(scaledPoints, WireframeColor);
} }
} }
+6 -4
View File
@@ -115,11 +115,13 @@ namespace PhysX
AzFramework::DebugDisplayRequests& debugDisplay) override; AzFramework::DebugDisplayRequests& debugDisplay) override;
// Internal mesh drawing subroutines // Internal mesh drawing subroutines
void DrawTriangleMesh(AzFramework::DebugDisplayRequests& debugDisplay, void DrawTriangleMesh(
const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex) const; AzFramework::DebugDisplayRequests& debugDisplay, const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex,
const AZ::Vector3& meshScale = AZ::Vector3::CreateOne()) const;
void DrawConvexMesh(AzFramework::DebugDisplayRequests& debugDisplay, void DrawConvexMesh(
const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex) const; AzFramework::DebugDisplayRequests& debugDisplay, const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex,
const AZ::Vector3& meshScale = AZ::Vector3::CreateOne()) const;
void BuildTriangleMesh(physx::PxBase* meshData, AZ::u32 geomIndex) const; void BuildTriangleMesh(physx::PxBase* meshData, AZ::u32 geomIndex) const;
@@ -868,7 +868,7 @@ namespace PhysX
colliderConfigNoOffset.m_rotation = AZ::Quaternion::CreateIdentity(); colliderConfigNoOffset.m_rotation = AZ::Quaternion::CreateIdentity();
colliderConfigNoOffset.m_position = AZ::Vector3::CreateZero(); colliderConfigNoOffset.m_position = AZ::Vector3::CreateZero();
m_colliderDebugDraw.DrawMesh(debugDisplay, colliderConfigNoOffset, m_scaledPrimitive.value(), m_colliderDebugDraw.DrawMesh(debugDisplay, colliderConfigNoOffset, m_scaledPrimitive.value(),
GetWorldTM().GetScale() * m_cachedNonUniformScale, shapeIndex); GetWorldTM().GetUniformScale() * m_cachedNonUniformScale, shapeIndex);
} }
} }
@@ -1007,7 +1007,7 @@ namespace PhysX
AZ::Vector3 EditorColliderComponent::GetBoxScale() AZ::Vector3 EditorColliderComponent::GetBoxScale()
{ {
return GetWorldTM().GetScale(); return AZ::Vector3(GetWorldTM().GetUniformScale());
} }
void EditorColliderComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world) void EditorColliderComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world)
@@ -1049,7 +1049,7 @@ namespace PhysX
void EditorColliderComponent::UpdateShapeConfigurationScale() void EditorColliderComponent::UpdateShapeConfigurationScale()
{ {
auto& shapeConfiguration = m_shapeConfiguration.GetCurrent(); auto& shapeConfiguration = m_shapeConfiguration.GetCurrent();
shapeConfiguration.m_scale = GetWorldTM().ExtractScale() * m_cachedNonUniformScale; shapeConfiguration.m_scale = GetWorldTM().ExtractUniformScale() * m_cachedNonUniformScale;
m_colliderDebugDraw.ClearCachedGeometry(); m_colliderDebugDraw.ClearCachedGeometry();
} }
+2 -2
View File
@@ -148,7 +148,7 @@ namespace PhysX
{ {
m_worldTransform = world; m_worldTransform = world;
m_regionParams.m_position = world.GetTranslation(); m_regionParams.m_position = world.GetTranslation();
m_regionParams.m_scale = world.GetScale(); m_regionParams.m_scale = world.GetUniformScale();
m_regionParams.m_rotation = world.GetRotation(); m_regionParams.m_rotation = world.GetRotation();
AZ::EBusReduceResult<AZ::Aabb, PhysX::TriggerAabbAggregator> triggerAabb; AZ::EBusReduceResult<AZ::Aabb, PhysX::TriggerAabbAggregator> triggerAabb;
triggerAabb.value = AZ::Aabb::CreateNull(); triggerAabb.value = AZ::Aabb::CreateNull();
@@ -223,7 +223,7 @@ namespace PhysX
, entityId , entityId
, &AZ::TransformBus::Events::GetWorldTM); , &AZ::TransformBus::Events::GetWorldTM);
regionParams.m_position = worldTransform.GetTranslation(); regionParams.m_position = worldTransform.GetTranslation();
regionParams.m_scale = worldTransform.GetScale(); regionParams.m_scale = worldTransform.GetUniformScale();
regionParams.m_rotation = worldTransform.GetRotation(); regionParams.m_rotation = worldTransform.GetRotation();
LmbrCentral::SplineComponentRequestBus::EventResult(regionParams.m_spline LmbrCentral::SplineComponentRequestBus::EventResult(regionParams.m_spline
+1 -2
View File
@@ -294,8 +294,7 @@ namespace PhysX
rotateInverse.InvertFull(); rotateInverse.InvertFull();
} }
AZ::Vector3 scaleInverse = region.m_scale; float scaleInverse = 1.0f / region.m_scale;
scaleInverse = scaleInverse.GetReciprocal();
AZ::Vector3 position = entity.m_position + entity.m_velocity * m_lookAhead; AZ::Vector3 position = entity.m_position + entity.m_velocity * m_lookAhead;
AZ::Vector3 localPos = position - region.m_position; AZ::Vector3 localPos = position - region.m_position;
+1 -1
View File
@@ -36,7 +36,7 @@ namespace PhysX
AZ::EntityId m_id; AZ::EntityId m_id;
AZ::Vector3 m_position; AZ::Vector3 m_position;
AZ::Quaternion m_rotation; AZ::Quaternion m_rotation;
AZ::Vector3 m_scale; float m_scale;
AZ::SplinePtr m_spline; AZ::SplinePtr m_spline;
AZ::Aabb m_aabb; AZ::Aabb m_aabb;
}; };