PR addressing. Removed RTTI from HeightMaterialPoint since it's just a struct of data with no intention being a part of class hierarchy
Signed-off-by: Sergey Pereslavtsev <pereslav@amazon.com>
This commit is contained in:
@@ -35,16 +35,15 @@ namespace Physics
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~HeightMaterialPoint() = default;
|
||||
~HeightMaterialPoint() = default;
|
||||
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
AZ_RTTI(HeightMaterialPoint, "{DF167ED4-24E6-4F7B-8AB7-42622F7DBAD3}");
|
||||
AZ_TYPE_INFO(HeightMaterialPoint, "{DF167ED4-24E6-4F7B-8AB7-42622F7DBAD3}");
|
||||
float m_height{ 0.0f }; //!< Holds the height of this point in the heightfield relative to the heightfield entity location.
|
||||
QuadMeshType m_quadMeshType{ QuadMeshType::SubdivideUpperLeftToBottomRight }; //!< By default, create two triangles like this |\|, where this point is in the upper left corner.
|
||||
uint8_t m_materialIndex{ 0 }; //!< The surface material index for the upper left corner of this quad.
|
||||
uint16_t m_padding{ 0 }; //!< available for future use.
|
||||
|
||||
};
|
||||
|
||||
//! An interface to provide heightfield values.
|
||||
|
||||
@@ -71,7 +71,6 @@ namespace PhysX
|
||||
const int32_t row, const int32_t col,
|
||||
const int32_t numRows, const int32_t numCols)
|
||||
{
|
||||
|
||||
uint8_t materialIndex0 = 0;
|
||||
uint8_t materialIndex1 = 0;
|
||||
|
||||
@@ -81,49 +80,51 @@ namespace PhysX
|
||||
// In PhysX, the material indices refer to the quad down and to the right of the sample.
|
||||
// If we're in the last row or last column, there aren't any quads down or to the right,
|
||||
// so just clear these out.
|
||||
|
||||
if (!lastRowIndex && !lastColumnIndex)
|
||||
if (lastRowIndex || lastColumnIndex)
|
||||
{
|
||||
auto GetIndex = [numCols](int32_t row, int32_t col)
|
||||
{
|
||||
return (row * numCols) + col;
|
||||
};
|
||||
|
||||
// Our source data is providing one material index per vertex, but PhysX wants one material index
|
||||
// per triangle. The heuristic that we'll go with for selecting the material index is to choose
|
||||
// the material for the vertex that's not on the diagonal of each triangle.
|
||||
// Ex: A *---* B
|
||||
// | / | For this, we'll use A for index0 and D for index1.
|
||||
// C *---* D
|
||||
//
|
||||
// Ex: A *---* B
|
||||
// | \ | For this, we'll use C for index0 and B for index1.
|
||||
// C *---* D
|
||||
//
|
||||
// This is a pretty arbitrary choice, so the heuristic might need to be revisited over time if this
|
||||
// causes incorrect or unpredictable physics material mappings.
|
||||
|
||||
const Physics::HeightMaterialPoint& currentSample = samples[GetIndex(row, col)];
|
||||
|
||||
switch (currentSample.m_quadMeshType)
|
||||
{
|
||||
case Physics::QuadMeshType::SubdivideUpperLeftToBottomRight:
|
||||
materialIndex0 = samples[GetIndex(row + 1, col)].m_materialIndex;
|
||||
materialIndex1 = samples[GetIndex(row, col + 1)].m_materialIndex;
|
||||
break;
|
||||
case Physics::QuadMeshType::SubdivideBottomLeftToUpperRight:
|
||||
materialIndex0 = currentSample.m_materialIndex;
|
||||
materialIndex1 = samples[GetIndex(row + 1, col + 1)].m_materialIndex;
|
||||
break;
|
||||
case Physics::QuadMeshType::Hole:
|
||||
materialIndex0 = physx::PxHeightFieldMaterial::eHOLE;
|
||||
materialIndex1 = physx::PxHeightFieldMaterial::eHOLE;
|
||||
break;
|
||||
default:
|
||||
AZ_Assert(false, "Unhandled case in GetPhysXMaterialIndicesFromHeightfieldSamples");
|
||||
break;
|
||||
}
|
||||
return { materialIndex0, materialIndex1 };
|
||||
}
|
||||
|
||||
auto GetIndex = [numCols](int32_t row, int32_t col)
|
||||
{
|
||||
return (row * numCols) + col;
|
||||
};
|
||||
|
||||
// Our source data is providing one material index per vertex, but PhysX wants one material index
|
||||
// per triangle. The heuristic that we'll go with for selecting the material index is to choose
|
||||
// the material for the vertex that's not on the diagonal of each triangle.
|
||||
// Ex: A *---* B
|
||||
// | / | For this, we'll use A for index0 and D for index1.
|
||||
// C *---* D
|
||||
//
|
||||
// Ex: A *---* B
|
||||
// | \ | For this, we'll use C for index0 and B for index1.
|
||||
// C *---* D
|
||||
//
|
||||
// This is a pretty arbitrary choice, so the heuristic might need to be revisited over time if this
|
||||
// causes incorrect or unpredictable physics material mappings.
|
||||
|
||||
const Physics::HeightMaterialPoint& currentSample = samples[GetIndex(row, col)];
|
||||
|
||||
switch (currentSample.m_quadMeshType)
|
||||
{
|
||||
case Physics::QuadMeshType::SubdivideUpperLeftToBottomRight:
|
||||
materialIndex0 = samples[GetIndex(row + 1, col)].m_materialIndex;
|
||||
materialIndex1 = samples[GetIndex(row, col + 1)].m_materialIndex;
|
||||
break;
|
||||
case Physics::QuadMeshType::SubdivideBottomLeftToUpperRight:
|
||||
materialIndex0 = currentSample.m_materialIndex;
|
||||
materialIndex1 = samples[GetIndex(row + 1, col + 1)].m_materialIndex;
|
||||
break;
|
||||
case Physics::QuadMeshType::Hole:
|
||||
materialIndex0 = physx::PxHeightFieldMaterial::eHOLE;
|
||||
materialIndex1 = physx::PxHeightFieldMaterial::eHOLE;
|
||||
break;
|
||||
default:
|
||||
AZ_Assert(false, "Unhandled case in GetPhysXMaterialIndicesFromHeightfieldSamples");
|
||||
break;
|
||||
}
|
||||
|
||||
return { materialIndex0, materialIndex1 };
|
||||
}
|
||||
|
||||
|
||||
@@ -139,9 +139,9 @@ namespace PhysXEditorTests
|
||||
// Create an asset out of our Script Event
|
||||
Physics::MaterialLibraryAsset* matLibAsset = aznew Physics::MaterialLibraryAsset;
|
||||
{
|
||||
AZStd::vector<Physics::MaterialId> matIds = GetMaterialList();
|
||||
const AZStd::vector<Physics::MaterialId> matIds = GetMaterialList();
|
||||
|
||||
for (Physics::MaterialId matId : matIds)
|
||||
for (const Physics::MaterialId& matId : matIds)
|
||||
{
|
||||
Physics::MaterialFromAssetConfiguration matConfig;
|
||||
matConfig.m_id = matId;
|
||||
@@ -336,7 +336,7 @@ namespace PhysXEditorTests
|
||||
|
||||
// PhysX Heightfield cooking doesn't map 1-1 sample material indices to triangle material indices
|
||||
// Hence hardcoding the expected material indices in the test
|
||||
const int physicsMaterialsValidationDataIndex[] = {0, 2, 1, 1};
|
||||
const AZStd::array<int, 4> physicsMaterialsValidationDataIndex = {0, 2, 1, 1};
|
||||
|
||||
for (int sampleRow = 0; sampleRow < numRows; ++sampleRow)
|
||||
{
|
||||
@@ -364,8 +364,11 @@ namespace PhysXEditorTests
|
||||
Physics::Material* mat2 = GetMaterialFromRaycast(rayX + secondRayOffset, rayY + secondRayOffset);
|
||||
EXPECT_NE(mat2, nullptr);
|
||||
|
||||
AZStd::string expectedMaterialName = physicsSurfaceTypes[physicsMaterialsValidationDataIndex[sampleRow * 2 + sampleColumn]];
|
||||
EXPECT_EQ(mat1->GetSurfaceTypeName(), expectedMaterialName);
|
||||
if (mat1)
|
||||
{
|
||||
AZStd::string expectedMaterialName = physicsSurfaceTypes[physicsMaterialsValidationDataIndex[sampleRow * 2 + sampleColumn]];
|
||||
EXPECT_EQ(mat1->GetSurfaceTypeName(), expectedMaterialName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user