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())
{
const AZ::Transform scaleMatrix = AZ::Transform::CreateScale(meshScale);
debugDisplay.PushMatrix(GetColliderLocalTransform(colliderConfig) * scaleMatrix);
debugDisplay.PushMatrix(GetColliderLocalTransform(colliderConfig));
if (meshConfig.GetMeshType() == Physics::CookedMeshShapeConfiguration::MeshType::TriangleMesh)
{
DrawTriangleMesh(debugDisplay, colliderConfig, geomIndex);
DrawTriangleMesh(debugDisplay, colliderConfig, geomIndex, meshScale);
}
else
{
DrawConvexMesh(debugDisplay, colliderConfig, geomIndex);
DrawConvexMesh(debugDisplay, colliderConfig, geomIndex, meshScale);
}
debugDisplay.PopMatrix();
}
}
void Collider::DrawTriangleMesh(AzFramework::DebugDisplayRequests& debugDisplay,
const Physics::ColliderConfiguration& colliderConfig,
AZ::u32 geomIndex) const
AZStd::vector<AZ::Vector3> ScalePoints(const AZ::Vector3& scale, const AZStd::vector<AZ::Vector3>& points)
{
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");
@@ -581,10 +593,10 @@ namespace PhysX
const AZStd::unordered_map<int, AZStd::vector<AZ::u32>>& triangleIndexesByMaterialSlot
= geom.m_triangleIndexesByMaterialSlot;
const AZStd::vector<AZ::Vector3>& verts = geom.m_verts;
const AZStd::vector<AZ::Vector3>& points = geom.m_points;
AZStd::vector<AZ::Vector3> scaledVerts = ScalePoints(meshScale, geom.m_verts);
AZStd::vector<AZ::Vector3> scaledPoints = ScalePoints(meshScale, geom.m_points);
if (!verts.empty())
if (!scaledVerts.empty())
{
for (const auto& element : triangleIndexesByMaterialSlot)
{
@@ -596,30 +608,31 @@ namespace PhysX
triangleMeshInfo.m_numTriangles = triangleCount;
triangleMeshInfo.m_materialSlotIndex = materialSlot;
debugDisplay.DrawTrianglesIndexed(verts, triangleIndexes
debugDisplay.DrawTrianglesIndexed(scaledVerts, triangleIndexes
, CalcDebugColor(colliderConfig, triangleMeshInfo));
}
debugDisplay.DrawLines(points, WireframeColor);
debugDisplay.DrawLines(scaledPoints, WireframeColor);
}
}
void Collider::DrawConvexMesh(AzFramework::DebugDisplayRequests& debugDisplay,
const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex) const
void Collider::DrawConvexMesh(
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");
const GeometryData& geom = m_geometry[geomIndex];
const AZStd::vector<AZ::Vector3>& verts = geom.m_verts;
const AZStd::vector<AZ::Vector3>& points = geom.m_points;
AZStd::vector<AZ::Vector3> scaledVerts = ScalePoints(meshScale, geom.m_verts);
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;
convexMeshInfo.m_numTriangles = triangleCount;
debugDisplay.DrawTriangles(verts, CalcDebugColor(colliderConfig, convexMeshInfo));
debugDisplay.DrawLines(points, WireframeColor);
debugDisplay.DrawTriangles(scaledVerts, CalcDebugColor(colliderConfig, convexMeshInfo));
debugDisplay.DrawLines(scaledPoints, WireframeColor);
}
}
+6 -4
View File
@@ -115,11 +115,13 @@ namespace PhysX
AzFramework::DebugDisplayRequests& debugDisplay) override;
// Internal mesh drawing subroutines
void DrawTriangleMesh(AzFramework::DebugDisplayRequests& debugDisplay,
const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex) const;
void DrawTriangleMesh(
AzFramework::DebugDisplayRequests& debugDisplay, const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex,
const AZ::Vector3& meshScale = AZ::Vector3::CreateOne()) const;
void DrawConvexMesh(AzFramework::DebugDisplayRequests& debugDisplay,
const Physics::ColliderConfiguration& colliderConfig, AZ::u32 geomIndex) const;
void DrawConvexMesh(
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;
@@ -868,7 +868,7 @@ namespace PhysX
colliderConfigNoOffset.m_rotation = AZ::Quaternion::CreateIdentity();
colliderConfigNoOffset.m_position = AZ::Vector3::CreateZero();
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()
{
return GetWorldTM().GetScale();
return AZ::Vector3(GetWorldTM().GetUniformScale());
}
void EditorColliderComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world)
@@ -1049,7 +1049,7 @@ namespace PhysX
void EditorColliderComponent::UpdateShapeConfigurationScale()
{
auto& shapeConfiguration = m_shapeConfiguration.GetCurrent();
shapeConfiguration.m_scale = GetWorldTM().ExtractScale() * m_cachedNonUniformScale;
shapeConfiguration.m_scale = GetWorldTM().ExtractUniformScale() * m_cachedNonUniformScale;
m_colliderDebugDraw.ClearCachedGeometry();
}
+2 -2
View File
@@ -148,7 +148,7 @@ namespace PhysX
{
m_worldTransform = world;
m_regionParams.m_position = world.GetTranslation();
m_regionParams.m_scale = world.GetScale();
m_regionParams.m_scale = world.GetUniformScale();
m_regionParams.m_rotation = world.GetRotation();
AZ::EBusReduceResult<AZ::Aabb, PhysX::TriggerAabbAggregator> triggerAabb;
triggerAabb.value = AZ::Aabb::CreateNull();
@@ -223,7 +223,7 @@ namespace PhysX
, entityId
, &AZ::TransformBus::Events::GetWorldTM);
regionParams.m_position = worldTransform.GetTranslation();
regionParams.m_scale = worldTransform.GetScale();
regionParams.m_scale = worldTransform.GetUniformScale();
regionParams.m_rotation = worldTransform.GetRotation();
LmbrCentral::SplineComponentRequestBus::EventResult(regionParams.m_spline
+1 -2
View File
@@ -294,8 +294,7 @@ namespace PhysX
rotateInverse.InvertFull();
}
AZ::Vector3 scaleInverse = region.m_scale;
scaleInverse = scaleInverse.GetReciprocal();
float scaleInverse = 1.0f / region.m_scale;
AZ::Vector3 position = entity.m_position + entity.m_velocity * m_lookAhead;
AZ::Vector3 localPos = position - region.m_position;
+1 -1
View File
@@ -36,7 +36,7 @@ namespace PhysX
AZ::EntityId m_id;
AZ::Vector3 m_position;
AZ::Quaternion m_rotation;
AZ::Vector3 m_scale;
float m_scale;
AZ::SplinePtr m_spline;
AZ::Aabb m_aabb;
};