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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user