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