Fix Actor lod levels and material indexes uint32->size_t

Signed-off-by: Chris Burel <burelc@amazon.com>
This commit is contained in:
Chris Burel
2021-05-24 12:04:11 -07:00
parent 382ca192c8
commit 225798480c
40 changed files with 311 additions and 416 deletions
@@ -430,7 +430,7 @@ namespace ExporterLib
MCore::LogInfo("============================================================");
// get all nodes that are affected by the skin
AZStd::vector<uint32> bones;
AZStd::vector<size_t> bones;
if (actor)
{
actor->ExtractBoneList(0, &bones);
@@ -653,7 +653,7 @@ namespace MCommon
// render the advanced skeleton
void RenderUtil::RenderSkeleton(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<uint32>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices, const AZStd::unordered_set<AZ::u32>* selectedJointIndices, const MCore::RGBAColor& color, const MCore::RGBAColor& selectedColor)
void RenderUtil::RenderSkeleton(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<size_t>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices, const AZStd::unordered_set<AZ::u32>* selectedJointIndices, const MCore::RGBAColor& color, const MCore::RGBAColor& selectedColor)
{
// check if our render util supports rendering meshes, if not render the fallback skeleton using lines only
if (GetIsMeshRenderingSupported() == false)
@@ -670,15 +670,15 @@ namespace MCommon
// iterate through all enabled nodes
MCore::RGBAColor tempColor;
const uint32 numEnabled = actorInstance->GetNumEnabledNodes();
for (uint32 i = 0; i < numEnabled; ++i)
const size_t numEnabled = actorInstance->GetNumEnabledNodes();
for (size_t i = 0; i < numEnabled; ++i)
{
EMotionFX::Node* joint = skeleton->GetNode(actorInstance->GetEnabledNode(i));
const AZ::u32 jointIndex = joint->GetNodeIndex();
const AZ::u32 parentIndex = joint->GetParentIndex();
const size_t jointIndex = joint->GetNodeIndex();
const size_t parentIndex = joint->GetParentIndex();
// check if this node has a parent and is a bone, if not skip it
if (parentIndex == MCORE_INVALIDINDEX32 || AZStd::find(begin(boneList), end(boneList), jointIndex) == end(boneList))
if (parentIndex == InvalidIndex || AZStd::find(begin(boneList), end(boneList), jointIndex) == end(boneList))
{
continue;
}
@@ -715,7 +715,7 @@ namespace MCommon
// render node orientations
void RenderUtil::RenderNodeOrientations(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<uint32>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices, const AZStd::unordered_set<AZ::u32>* selectedJointIndices, float scale, bool scaleBonesOnLength)
void RenderUtil::RenderNodeOrientations(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<size_t>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices, const AZStd::unordered_set<AZ::u32>* selectedJointIndices, float scale, bool scaleBonesOnLength)
{
// get the actor and the transform data
const float unitScale = 1.0f / (float)MCore::Distance::ConvertValue(1.0f, MCore::Distance::UNITTYPE_METERS, EMotionFX::GetEMotionFX().GetUnitType());
@@ -726,18 +726,18 @@ namespace MCommon
const float constPreScale = scale * unitScale * 3.0f;
AxisRenderingSettings axisRenderingSettings;
const uint32 numEnabled = actorInstance->GetNumEnabledNodes();
for (uint32 i = 0; i < numEnabled; ++i)
const size_t numEnabled = actorInstance->GetNumEnabledNodes();
for (size_t i = 0; i < numEnabled; ++i)
{
EMotionFX::Node* joint = skeleton->GetNode(actorInstance->GetEnabledNode(i));
const AZ::u32 jointIndex = joint->GetNodeIndex();
const AZ::u32 parentIndex = joint->GetParentIndex();
const size_t jointIndex = joint->GetNodeIndex();
const size_t parentIndex = joint->GetParentIndex();
if (!visibleJointIndices || visibleJointIndices->empty() ||
(visibleJointIndices->find(jointIndex) != visibleJointIndices->end()))
{
// either scale the bones based on their length or use the normal size
if (scaleBonesOnLength && parentIndex != MCORE_INVALIDINDEX32 && AZStd::find(begin(boneList), end(boneList), jointIndex) != end(boneList))
if (scaleBonesOnLength && parentIndex != InvalidIndex && AZStd::find(begin(boneList), end(boneList), jointIndex) != end(boneList))
{
static const float axisBoneScale = 50.0f;
axisRenderingSettings.mSize = GetBoneScale(actorInstance, joint) * constPreScale * axisBoneScale;
@@ -191,7 +191,7 @@ namespace MCommon
* @param[in] color The desired skeleton color.
* @param[in] selectedColor The color of the selected bones.
*/
void RenderSkeleton(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<uint32>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices = nullptr, const AZStd::unordered_set<AZ::u32>* selectedJointIndices = nullptr, const MCore::RGBAColor& color = MCore::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f), const MCore::RGBAColor& selectedColor = MCore::RGBAColor(1.0f, 0.647f, 0.0f));
void RenderSkeleton(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<size_t>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices = nullptr, const AZStd::unordered_set<AZ::u32>* selectedJointIndices = nullptr, const MCore::RGBAColor& color = MCore::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f), const MCore::RGBAColor& selectedColor = MCore::RGBAColor(1.0f, 0.647f, 0.0f));
/**
* Render node orientations.
@@ -202,7 +202,7 @@ namespace MCommon
* @param[in] scale The scaling value in units. Axes of normal nodes will use the scaling value as unit length, skinned bones will use the scaling value as multiplier.
* @param[in] scaleBonesOnLength Automatically scales the bone orientations based on the bone length. This means finger node orientations will be rendered smaller than foot bones as the bone length is a lot smaller as well.
*/
void RenderNodeOrientations(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<uint32>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices = nullptr, const AZStd::unordered_set<AZ::u32>* selectedJointIndices = nullptr, float scale = 1.0f, bool scaleBonesOnLength = true);
void RenderNodeOrientations(EMotionFX::ActorInstance* actorInstance, const AZStd::vector<size_t>& boneList, const AZStd::unordered_set<AZ::u32>* visibleJointIndices = nullptr, const AZStd::unordered_set<AZ::u32>* selectedJointIndices = nullptr, float scale = 1.0f, bool scaleBonesOnLength = true);
/**
* Render the bind pose of the given actor.
+63 -89
View File
@@ -79,7 +79,7 @@ namespace EMotionFX
mRetargetRootNode = InvalidIndex;
mThreadIndex = 0;
mCustomData = nullptr;
mID = MCore::GetIDGenerator().GenerateID();
mID = aznumeric_caster(MCore::GetIDGenerator().GenerateID());
mUnitType = GetEMotionFX().GetUnitType();
mFileUnitType = mUnitType;
m_staticAabb = AZ::Aabb::CreateNull();
@@ -149,21 +149,13 @@ namespace EMotionFX
// clone the materials
result->mMaterials.resize(mMaterials.size());
for (uint32 i = 0; i < mMaterials.size(); ++i)
for (size_t i = 0; i < mMaterials.size(); ++i)
{
// get the number of materials in the current LOD
const uint32 numMaterials = mMaterials[i].size();
result->mMaterials[i].reserve(numMaterials);
for (uint32 m = 0; m < numMaterials; ++m)
result->mMaterials[i].reserve(mMaterials[i].size());
for (const Material* material : mMaterials[i])
{
// retrieve the current material
Material* material = mMaterials[i][m];
// clone the material
Material* clone = material->Clone();
// add the cloned material to the cloned actor
result->AddMaterial(i, clone);
result->AddMaterial(i, material->Clone());
}
}
@@ -195,7 +187,7 @@ namespace EMotionFX
// clone the morph setups
result->mMorphSetups.resize(mMorphSetups.size());
for (uint32 i = 0; i < mMorphSetups.size(); ++i)
for (size_t i = 0; i < mMorphSetups.size(); ++i)
{
if (mMorphSetups[i])
{
@@ -326,13 +318,13 @@ namespace EMotionFX
}
// insert a LOD level at a given position
void Actor::InsertLODLevel(uint32 insertAt)
void Actor::InsertLODLevel(size_t insertAt)
{
AZStd::vector<LODLevel>& lodLevels = m_meshLodData.m_lodLevels;
lodLevels.emplace(lodLevels.begin()+insertAt);
LODLevel& newLOD = lodLevels[insertAt];
const uint32 lodIndex = insertAt;
const size_t lodIndex = insertAt;
const size_t numNodes = mSkeleton->GetNumNodes();
newLOD.mNodeInfos.resize(numNodes);
@@ -352,7 +344,7 @@ namespace EMotionFX
}
// replace existing LOD level with the current actor
void Actor::CopyLODLevel(Actor* copyActor, uint32 copyLODLevel, uint32 replaceLODLevel, bool copySkeletalLODFlags)
void Actor::CopyLODLevel(Actor* copyActor, size_t copyLODLevel, size_t replaceLODLevel, bool copySkeletalLODFlags)
{
AZStd::vector<LODLevel>& lodLevels = m_meshLodData.m_lodLevels;
AZStd::vector<LODLevel>& copyLodLevels = copyActor->m_meshLodData.m_lodLevels;
@@ -433,7 +425,7 @@ namespace EMotionFX
}
// preallocate memory for all LOD levels
void Actor::SetNumLODLevels(uint32 numLODs, bool adjustMorphSetup)
void Actor::SetNumLODLevels(size_t numLODs, bool adjustMorphSetup)
{
m_meshLodData.m_lodLevels.resize(numLODs);
@@ -467,7 +459,7 @@ namespace EMotionFX
}
void Actor::CalcMeshTotals(uint32 lodLevel, uint32* outNumPolygons, uint32* outNumVertices, uint32* outNumIndices) const
void Actor::CalcMeshTotals(size_t lodLevel, uint32* outNumPolygons, uint32* outNumVertices, uint32* outNumIndices) const
{
uint32 totalPolys = 0;
uint32 totalVerts = 0;
@@ -504,7 +496,7 @@ namespace EMotionFX
}
void Actor::CalcStaticMeshTotals(uint32 lodLevel, uint32* outNumVertices, uint32* outNumIndices)
void Actor::CalcStaticMeshTotals(size_t lodLevel, uint32* outNumVertices, uint32* outNumIndices)
{
// the totals
uint32 totalVerts = 0;
@@ -548,7 +540,7 @@ namespace EMotionFX
}
void Actor::CalcDeformableMeshTotals(uint32 lodLevel, uint32* outNumVertices, uint32* outNumIndices)
void Actor::CalcDeformableMeshTotals(size_t lodLevel, uint32* outNumVertices, uint32* outNumIndices)
{
// the totals
uint32 totalVerts = 0;
@@ -592,9 +584,9 @@ namespace EMotionFX
}
uint32 Actor::CalcMaxNumInfluences(uint32 lodLevel) const
size_t Actor::CalcMaxNumInfluences(size_t lodLevel) const
{
uint32 maxInfluences = 0;
size_t maxInfluences = 0;
const size_t numNodes = mSkeleton->GetNumNodes();
for (size_t i = 0; i < numNodes; ++i)
@@ -605,7 +597,7 @@ namespace EMotionFX
continue;
}
maxInfluences = MCore::Max<uint32>(maxInfluences, mesh->CalcMaxNumInfluences());
maxInfluences = AZStd::max(maxInfluences, mesh->CalcMaxNumInfluences());
}
return maxInfluences;
@@ -613,10 +605,8 @@ namespace EMotionFX
// verify if the skinning will look correctly in the given geometry LOD for a given skeletal LOD level
void Actor::VerifySkinning(AZStd::vector<uint8>& conflictNodeFlags, uint32 skeletalLODLevel, uint32 geometryLODLevel)
void Actor::VerifySkinning(AZStd::vector<uint8>& conflictNodeFlags, size_t skeletalLODLevel, size_t geometryLODLevel)
{
uint32 n;
// get the number of nodes
const size_t numNodes = mSkeleton->GetNumNodes();
@@ -630,7 +620,7 @@ namespace EMotionFX
MCore::MemSet(conflictNodeFlags.data(), 0, numNodes * sizeof(int8));
// iterate over the all nodes in the actor
for (n = 0; n < numNodes; ++n)
for (size_t n = 0; n < numNodes; ++n)
{
// get the current node and the pointer to the mesh for the given lod level
Node* node = mSkeleton->GetNode(n);
@@ -672,19 +662,15 @@ namespace EMotionFX
}
uint32 Actor::CalcMaxNumInfluences(uint32 lodLevel, AZStd::vector<uint32>& outVertexCounts) const
size_t Actor::CalcMaxNumInfluences(size_t lodLevel, AZStd::vector<size_t>& outVertexCounts) const
{
uint32 maxInfluences = 0;
// Reset the values.
outVertexCounts.resize(CalcMaxNumInfluences(lodLevel) + 1);
for (size_t k = 0; k < outVertexCounts.size(); ++k)
{
outVertexCounts[k] = 0;
}
AZStd::fill(begin(outVertexCounts), end(outVertexCounts), 0);
// Get the vertex counts for the influences. (e.g. 500 vertices have 1 skinning influence, 300 vertices have 2 skinning influences etc.)
AZStd::vector<uint32> meshVertexCounts;
size_t maxInfluences = 0;
AZStd::vector<size_t> meshVertexCounts;
const size_t numNodes = GetNumNodes();
for (size_t i = 0; i < numNodes; ++i)
{
@@ -694,8 +680,8 @@ namespace EMotionFX
continue;
}
const uint32 meshMaxInfluences = mesh->CalcMaxNumInfluences(meshVertexCounts);
maxInfluences = MCore::Max<uint32>(maxInfluences, meshMaxInfluences);
const size_t meshMaxInfluences = mesh->CalcMaxNumInfluences(meshVertexCounts);
maxInfluences = AZStd::max(maxInfluences, meshMaxInfluences);
for (size_t j = 0; j < meshVertexCounts.size(); ++j)
{
@@ -724,7 +710,7 @@ namespace EMotionFX
}
bool Actor::CheckIfHasSkinnedMeshes(AZ::u32 lodLevel) const
bool Actor::CheckIfHasSkinnedMeshes(size_t lodLevel) const
{
const size_t numNodes = mSkeleton->GetNumNodes();
for (size_t i = 0; i < numNodes; ++i)
@@ -763,14 +749,14 @@ namespace EMotionFX
const size_t numLODs = GetNumLODLevels();
// for all LODs, get rid of all the morph setups for each geometry LOD
for (uint32 i = 0; i < mMorphSetups.size(); ++i)
for (MorphSetup* mMorphSetup : mMorphSetups)
{
if (mMorphSetups[i])
if (mMorphSetup)
{
mMorphSetups[i]->Destroy();
mMorphSetup->Destroy();
}
mMorphSetups[i] = nullptr;
mMorphSetup = nullptr;
}
// remove all modifiers from the stacks for each lod in all nodes
@@ -781,7 +767,7 @@ namespace EMotionFX
for (size_t i = 0; i < numNodes; ++i)
{
// process all LOD levels
for (uint32 lod = 0; lod < numLODs; ++lod)
for (size_t lod = 0; lod < numLODs; ++lod)
{
// if we have a modifier stack
MeshDeformerStack* stack = GetMeshDeformerStack(lod, i);
@@ -805,7 +791,7 @@ namespace EMotionFX
// check if the material is used by the given mesh
bool Actor::CheckIfIsMaterialUsed(Mesh* mesh, uint32 materialIndex) const
bool Actor::CheckIfIsMaterialUsed(Mesh* mesh, size_t materialIndex) const
{
// check if the mesh is valid
if (mesh == nullptr)
@@ -829,7 +815,7 @@ namespace EMotionFX
// check if the material is used by a mesh of this actor
bool Actor::CheckIfIsMaterialUsed(uint32 lodLevel, uint32 index) const
bool Actor::CheckIfIsMaterialUsed(size_t lodLevel, size_t index) const
{
// iterate through all nodes of the actor and check its meshes
const size_t numNodes = mSkeleton->GetNumNodes();
@@ -848,7 +834,7 @@ namespace EMotionFX
// remove the given material and reassign all material numbers of the submeshes
void Actor::RemoveMaterial(uint32 lodLevel, uint32 index)
void Actor::RemoveMaterial(size_t lodLevel, size_t index)
{
MCORE_ASSERT(lodLevel < mMaterials.size());
@@ -865,7 +851,7 @@ namespace EMotionFX
// the maximum number of children of a root node, the node with the most children
// will become our repositioning node
uint32 maxNumChilds = 0;
size_t maxNumChilds = 0;
// traverse through all root nodes
const size_t numRootNodes = mSkeleton->GetNumRootNodes();
@@ -898,7 +884,7 @@ namespace EMotionFX
// extract a bone list
void Actor::ExtractBoneList(uint32 lodLevel, AZStd::vector<uint32>* outBoneList) const
void Actor::ExtractBoneList(size_t lodLevel, AZStd::vector<size_t>* outBoneList) const
{
// clear the existing items
outBoneList->clear();
@@ -927,8 +913,8 @@ namespace EMotionFX
for (uint32 v = 0; v < numOrgVerts; ++v)
{
// for all influences for this vertex
const uint32 numInfluences = aznumeric_cast<uint32>(skinningLayer->GetNumInfluences(v));
for (uint32 i = 0; i < numInfluences; ++i)
const size_t numInfluences = skinningLayer->GetNumInfluences(v);
for (size_t i = 0; i < numInfluences; ++i)
{
// get the node number of the bone
uint16 nodeNr = skinningLayer->GetInfluence(v, i)->GetNodeNr();
@@ -1122,7 +1108,7 @@ namespace EMotionFX
// find the first active parent node in a given skeletal LOD
size_t Actor::FindFirstActiveParentBone(uint32 skeletalLOD, size_t startNodeIndex) const
size_t Actor::FindFirstActiveParentBone(size_t skeletalLOD, size_t startNodeIndex) const
{
size_t curNodeIndex = startNodeIndex;
@@ -1290,7 +1276,7 @@ namespace EMotionFX
Node* node = mSkeleton->GetNode(i);
// iterate through all LOD levels
for (uint32 lodLevel = 0; lodLevel < numLODLevels; ++lodLevel)
for (size_t lodLevel = 0; lodLevel < numLODLevels; ++lodLevel)
{
// reinit the mesh deformer stacks
MeshDeformerStack* stack = GetMeshDeformerStack(lodLevel, i);
@@ -1493,10 +1479,10 @@ namespace EMotionFX
{
outPoints.clear();
const uint32 geomLODLevel = 0;
const size_t geomLODLevel = 0;
const size_t numNodes = mSkeleton->GetNumNodes();
for (int nodeIndex = 0; nodeIndex < numNodes; nodeIndex++)
for (size_t nodeIndex = 0; nodeIndex < numNodes; nodeIndex++)
{
// check if this node has a mesh, if not we can skip it
Mesh* mesh = GetMesh(geomLODLevel, nodeIndex);
@@ -1744,7 +1730,7 @@ namespace EMotionFX
const Transform nodeTransform = pose.GetModelSpaceTransform(nodeIndex);
const Transform mirroredTransform = nodeTransform.Mirrored(AZ::Vector3(1.0f, 0.0f, 0.0f));
uint32 numMatches = 0;
size_t numMatches = 0;
uint16 result = MCORE_INVALIDINDEX16;
// find nodes that have the mirrored transform
@@ -1793,8 +1779,8 @@ namespace EMotionFX
Pose& bindPose = *mSkeleton->GetBindPose();
bindPose.LinkToActor(this, Pose::FLAG_LOCALTRANSFORMREADY, false);
const AZ::u32 numMorphs = bindPose.GetNumMorphWeights();
for (AZ::u32 i = 0; i < numMorphs; ++i)
const size_t numMorphs = bindPose.GetNumMorphWeights();
for (size_t i = 0; i < numMorphs; ++i)
{
bindPose.SetMorphWeight(i, 0.0f);
}
@@ -1889,13 +1875,13 @@ namespace EMotionFX
}
}
void Actor::ReserveMaterials(uint32 lodLevel, uint32 numMaterials)
void Actor::ReserveMaterials(size_t lodLevel, size_t numMaterials)
{
mMaterials[lodLevel].reserve(numMaterials);
}
// get a material
Material* Actor::GetMaterial(uint32 lodLevel, uint32 nr) const
Material* Actor::GetMaterial(size_t lodLevel, size_t nr) const
{
MCORE_ASSERT(lodLevel < mMaterials.size());
MCORE_ASSERT(nr < mMaterials[lodLevel].size());
@@ -1904,41 +1890,29 @@ namespace EMotionFX
// get a material by name
uint32 Actor::FindMaterialIndexByName(uint32 lodLevel, const char* name) const
size_t Actor::FindMaterialIndexByName(size_t lodLevel, const char* name) const
{
MCORE_ASSERT(lodLevel < mMaterials.size());
// search through all materials
const uint32 numMaterials = mMaterials[lodLevel].size();
for (uint32 i = 0; i < numMaterials; ++i)
const auto foundMaterial = AZStd::find_if(mMaterials[lodLevel].begin(), mMaterials[lodLevel].end(), [name](const Material* material)
{
if (mMaterials[lodLevel][i]->GetNameString() == name)
{
return i;
}
}
// no material found
return MCORE_INVALIDINDEX32;
return material->GetNameString() == name;
});
return foundMaterial != mMaterials[lodLevel].end() ? AZStd::distance(mMaterials[lodLevel].begin(), foundMaterial) : InvalidIndex;
}
// set a material
void Actor::SetMaterial(uint32 lodLevel, uint32 nr, Material* mat)
void Actor::SetMaterial(size_t lodLevel, size_t nr, Material* mat)
{
MCORE_ASSERT(lodLevel < mMaterials.size());
MCORE_ASSERT(nr < mMaterials[lodLevel].size());
mMaterials[lodLevel][nr] = mat;
}
void Actor::AddMaterial(uint32 lodLevel, Material* mat)
void Actor::AddMaterial(size_t lodLevel, Material* mat)
{
MCORE_ASSERT(lodLevel < mMaterials.size());
mMaterials[lodLevel].emplace_back(mat);
}
size_t Actor::GetNumMaterials(uint32 lodLevel) const
size_t Actor::GetNumMaterials(size_t lodLevel) const
{
MCORE_ASSERT(lodLevel < mMaterials.size());
return mMaterials[lodLevel].size();
}
@@ -1990,7 +1964,7 @@ namespace EMotionFX
}
void Actor::SetMorphSetup(uint32 lodLevel, MorphSetup* setup)
void Actor::SetMorphSetup(size_t lodLevel, MorphSetup* setup)
{
mMorphSetups[lodLevel] = setup;
}
@@ -2157,14 +2131,14 @@ namespace EMotionFX
return lodLevels[lodLevel].mNodeInfos[nodeIndex].mMesh;
}
MeshDeformerStack* Actor::GetMeshDeformerStack(uint32 lodLevel, size_t nodeIndex) const
MeshDeformerStack* Actor::GetMeshDeformerStack(size_t lodLevel, size_t nodeIndex) const
{
const AZStd::vector<LODLevel>& lodLevels = m_meshLodData.m_lodLevels;
return lodLevels[lodLevel].mNodeInfos[nodeIndex].mStack;
}
// set the mesh for a given node in a given LOD
void Actor::SetMesh(uint32 lodLevel, size_t nodeIndex, Mesh* mesh)
void Actor::SetMesh(size_t lodLevel, size_t nodeIndex, Mesh* mesh)
{
AZStd::vector<LODLevel>& lodLevels = m_meshLodData.m_lodLevels;
lodLevels[lodLevel].mNodeInfos[nodeIndex].mMesh = mesh;
@@ -2172,14 +2146,14 @@ namespace EMotionFX
// set the mesh deformer stack for a given node in a given LOD
void Actor::SetMeshDeformerStack(uint32 lodLevel, size_t nodeIndex, MeshDeformerStack* stack)
void Actor::SetMeshDeformerStack(size_t lodLevel, size_t nodeIndex, MeshDeformerStack* stack)
{
AZStd::vector<LODLevel>& lodLevels = m_meshLodData.m_lodLevels;
lodLevels[lodLevel].mNodeInfos[nodeIndex].mStack = stack;
}
// check if the mesh has a skinning deformer (either linear or dual quat)
bool Actor::CheckIfHasSkinningDeformer(uint32 lodLevel, size_t nodeIndex) const
bool Actor::CheckIfHasSkinningDeformer(size_t lodLevel, size_t nodeIndex) const
{
// check if there is a mesh
Mesh* mesh = GetMesh(lodLevel, nodeIndex);
@@ -2199,7 +2173,7 @@ namespace EMotionFX
}
// remove the mesh for a given node in a given LOD
void Actor::RemoveNodeMeshForLOD(uint32 lodLevel, size_t nodeIndex, bool destroyMesh)
void Actor::RemoveNodeMeshForLOD(size_t lodLevel, size_t nodeIndex, bool destroyMesh)
{
AZStd::vector<LODLevel>& lodLevels = m_meshLodData.m_lodLevels;
@@ -2289,7 +2263,7 @@ namespace EMotionFX
}
// scale morph target data
for (uint32 lod = 0; lod < numLODs; ++lod)
for (size_t lod = 0; lod < numLODs; ++lod)
{
MorphSetup* morphSetup = GetMorphSetup(lod);
if (morphSetup)
@@ -2819,8 +2793,8 @@ namespace EMotionFX
AZ_Assert(morphTargetDeltaView.data(), "Unable to find MORPHTARGET_VERTEXDELTAS buffer");
const AZ::RPI::PackedCompressedMorphTargetDelta* vertexDeltas = reinterpret_cast<const AZ::RPI::PackedCompressedMorphTargetDelta*>(morphTargetDeltaView.data());
const AZ::u32 numMorphTargets = morphSetup->GetNumMorphTargets();
for (AZ::u32 mtIndex = 0; mtIndex < numMorphTargets; ++mtIndex)
const size_t numMorphTargets = morphSetup->GetNumMorphTargets();
for (size_t mtIndex = 0; mtIndex < numMorphTargets; ++mtIndex)
{
MorphTargetStandard* morphTarget = static_cast<MorphTargetStandard*>(morphSetup->GetMorphTarget(mtIndex));
+29 -29
View File
@@ -234,7 +234,7 @@ namespace EMotionFX
* @param lodLevel The LOD level to check for.
* @result Returns true when skinned meshes are present in the specified LOD level, otherwise false is returned.
*/
bool CheckIfHasSkinnedMeshes(AZ::u32 lodLevel) const;
bool CheckIfHasSkinnedMeshes(size_t lodLevel) const;
/**
* Extract a list with nodes that represent bones.
@@ -245,7 +245,7 @@ namespace EMotionFX
* @param outBoneList The array of indices to nodes that will be filled with the nodes that are bones. When the outBoneList array
* already contains items, the array will first be cleared, so all existing contents will be lost.
*/
void ExtractBoneList(uint32 lodLevel, AZStd::vector<uint32>* outBoneList) const;
void ExtractBoneList(size_t lodLevel, AZStd::vector<size_t>* outBoneList) const;
//------------------------------------------------
void SetPhysicsSetup(const AZStd::shared_ptr<PhysicsSetup>& physicsSetup);
@@ -261,7 +261,7 @@ namespace EMotionFX
* @param lodLevel The geometry LOD level to work on.
* @param numMaterials The amount of materials to pre-allocate space for.
*/
void ReserveMaterials(uint32 lodLevel, uint32 numMaterials);
void ReserveMaterials(size_t lodLevel, size_t numMaterials);
/**
* Get a given material.
@@ -269,7 +269,7 @@ namespace EMotionFX
* @param nr The material number to get.
* @result A pointer to the material.
*/
Material* GetMaterial(uint32 lodLevel, uint32 nr) const;
Material* GetMaterial(size_t lodLevel, size_t nr) const;
/**
* Find the material number/index of the material with the specified name.
@@ -279,7 +279,7 @@ namespace EMotionFX
* @result Returns the material number/index, which you can use to GetMaterial. When no material with the given name
* can be found, a value of MCORE_INVALIDINDEX32 is returned.
*/
uint32 FindMaterialIndexByName(uint32 lodLevel, const char* name) const;
size_t FindMaterialIndexByName(size_t lodLevel, const char* name) const;
/**
* Set a given material.
@@ -287,14 +287,14 @@ namespace EMotionFX
* @param nr The material number to set.
* @param mat The material to set at this index.
*/
void SetMaterial(uint32 lodLevel, uint32 nr, Material* mat);
void SetMaterial(size_t lodLevel, size_t nr, Material* mat);
/**
* Add a material to the back of the material list.
* @param lodLevel The LOD level add the material to.
* @param mat The material to add to the back of the list.
*/
void AddMaterial(uint32 lodLevel, Material* mat);
void AddMaterial(size_t lodLevel, Material* mat);
/**
* Remove the given material from the material list and reassign all material numbers of the sub meshes
@@ -306,14 +306,14 @@ namespace EMotionFX
* @param lodLevel The LOD level add the material to.
* @param index The material index of the material to remove.
*/
void RemoveMaterial(uint32 lodLevel, uint32 index);
void RemoveMaterial(size_t lodLevel, size_t index);
/**
* Get the number of materials.
* @param lodLevel The LOD level to get the number of material from.
* @result The number of materials this actor has/uses.
*/
size_t GetNumMaterials(uint32 lodLevel) const;
size_t GetNumMaterials(size_t lodLevel) const;
/**
* Removes all materials from this actor.
@@ -329,7 +329,7 @@ namespace EMotionFX
* @param index The material number to check.
* @result Returns true when there are meshes using the material, otherwise false is returned.
*/
bool CheckIfIsMaterialUsed(uint32 lodLevel, uint32 index) const;
bool CheckIfIsMaterialUsed(size_t lodLevel, size_t index) const;
//------------------------------------------------
@@ -348,20 +348,20 @@ namespace EMotionFX
* @param[in] copySkeletalLODFlags Copy over the skeletal LOD flags in case of true, skip them in case of false.
* @param[in] delLODActorFromMem When set to true, the method will automatically delete the given copyActor from memory.
*/
void CopyLODLevel(Actor* copyActor, uint32 copyLODLevel, uint32 replaceLODLevel, bool copySkeletalLODFlags);
void CopyLODLevel(Actor* copyActor, size_t copyLODLevel, size_t replaceLODLevel, bool copySkeletalLODFlags);
/**
* Insert LOD level at the given position.
* This function will not copy any meshes, deformer, morph targets or materials but just insert an empty LOD level.
* @param[in] insertAt The position to insert the new LOD level.
*/
void InsertLODLevel(uint32 insertAt);
void InsertLODLevel(size_t insertAt);
/**
* Set the number of LOD levels.
* This will be called by the importer. Do not use manually.
*/
void SetNumLODLevels(uint32 numLODs, bool adjustMorphSetup = true);
void SetNumLODLevels(size_t numLODs, bool adjustMorphSetup = true);
/**
* Get the number of LOD levels inside this actor.
@@ -385,7 +385,7 @@ namespace EMotionFX
* @param outNumVertices The integer to write the number of vertices in.
* @param outNumIndices The integer to write the number of indices in.
*/
void CalcMeshTotals(uint32 lodLevel, uint32* outNumPolygons, uint32* outNumVertices, uint32* outNumIndices) const;
void CalcMeshTotals(size_t lodLevel, uint32* outNumPolygons, uint32* outNumVertices, uint32* outNumIndices) const;
/**
* Calculates the total number of vertices and indices of all STATIC node meshes for the given LOD.
@@ -394,7 +394,7 @@ namespace EMotionFX
* @param outNumVertices The integer to write the number of vertices in.
* @param outNumIndices The integer to write the number of indices in.
*/
void CalcStaticMeshTotals(uint32 lodLevel, uint32* outNumVertices, uint32* outNumIndices);
void CalcStaticMeshTotals(size_t lodLevel, uint32* outNumVertices, uint32* outNumIndices);
/**
* Calculates the total number of vertices and indices of all DEFORMABLE node meshes for the given LOD.
@@ -404,7 +404,7 @@ namespace EMotionFX
* @param outNumVertices The integer to write the number of vertices in.
* @param outNumIndices The integer to write the number of indices in.
*/
void CalcDeformableMeshTotals(uint32 lodLevel, uint32* outNumVertices, uint32* outNumIndices);
void CalcDeformableMeshTotals(size_t lodLevel, uint32* outNumVertices, uint32* outNumIndices);
/**
* Calculates the maximum number of bone influences.
@@ -412,7 +412,7 @@ namespace EMotionFX
* @param lodLevel The LOD level, where 0 is the highest detail LOD level. This value must be in range of [0..GetNumLODLevels()-1].
* @result The maximum number of influences. This will be 0 for non-softskinned objects.
*/
uint32 CalcMaxNumInfluences(uint32 lodLevel) const;
size_t CalcMaxNumInfluences(size_t lodLevel) const;
/**
* Calculates the maximum number of bone influences.
@@ -424,7 +424,7 @@ namespace EMotionFX
* @param lodLevel The detail level to calculate the results for. A value of 0 is the highest detail.
* @result The maximum number of vertex/bone influences. This will be 0 for rigid, non-skinned objects.
*/
uint32 CalcMaxNumInfluences(uint32 lodLevel, AZStd::vector<uint32>& outVertexCounts) const;
size_t CalcMaxNumInfluences(size_t lodLevel, AZStd::vector<size_t>& outVertexCounts) const;
/**
* Verify if the skinning will look correctly in the given geometry LOD for a given skeletal LOD level.
@@ -438,7 +438,7 @@ namespace EMotionFX
* disabled nodes from the given skeletal LOD level.
* @param geometryLODLevel The geometry LOD level to test the skeletal LOD against with.
*/
void VerifySkinning(AZStd::vector<uint8>& conflictNodeFlags, uint32 skeletalLODLevel, uint32 geometryLODLevel);
void VerifySkinning(AZStd::vector<uint8>& conflictNodeFlags, size_t skeletalLODLevel, size_t geometryLODLevel);
/**
* Checks if the given material is used by a given mesh.
@@ -446,7 +446,7 @@ namespace EMotionFX
* @param materialIndex The index of the material to check.
* @return True if one of the submeshes of the given mesh uses the given material, false if not.
*/
bool CheckIfIsMaterialUsed(Mesh* mesh, uint32 materialIndex) const;
bool CheckIfIsMaterialUsed(Mesh* mesh, size_t materialIndex) const;
//------------------
@@ -546,7 +546,7 @@ namespace EMotionFX
* @result A smart pointer object to the morph setup. Use the MCore::Pointer<MorphSetup>::GetPointer() to get the actual pointer.
* That GetPointer() method will return nullptr when there is no morph setup for the given LOD level.
*/
MCORE_INLINE MorphSetup* GetMorphSetup(uint32 geomLODLevel) const { return mMorphSetups[geomLODLevel]; }
MCORE_INLINE MorphSetup* GetMorphSetup(size_t geomLODLevel) const { return mMorphSetups[geomLODLevel]; }
/**
* Remove all morph setups. Morph setups contain all morph targtets.
@@ -561,7 +561,7 @@ namespace EMotionFX
* @param lodLevel The LOD level, which must be in range of [0..GetNumLODLevels()-1].
* @param setup The morph setup for this LOD.
*/
void SetMorphSetup(uint32 lodLevel, MorphSetup* setup);
void SetMorphSetup(size_t lodLevel, MorphSetup* setup);
/**
* Get the number of node groups inside this actor object.
@@ -735,7 +735,7 @@ namespace EMotionFX
* @param startNodeIndex The node to start looking at, for example the node index of the finger bone.
* @result Returns the index of the first active node, when moving up the hierarchy towards the root node. Returns MCORE_INVALIDINDEX32 when not found.
*/
size_t FindFirstActiveParentBone(uint32 skeletalLOD, size_t startNodeIndex) const;
size_t FindFirstActiveParentBone(size_t skeletalLOD, size_t startNodeIndex) const;
/**
* Make the geometry LOD levels compatible with the skinning LOD levels.
@@ -777,7 +777,7 @@ namespace EMotionFX
uint32 GetThreadIndex() const { return mThreadIndex; }
Mesh* GetMesh(size_t lodLevel, size_t nodeIndex) const;
MeshDeformerStack* GetMeshDeformerStack(uint32 lodLevel, size_t nodeIndex) const;
MeshDeformerStack* GetMeshDeformerStack(size_t lodLevel, size_t nodeIndex) const;
/** Finds the mesh points for which the specified node is the node with the highest influence.
* This is a pretty expensive function which is only intended for use in the editor.
@@ -790,13 +790,13 @@ namespace EMotionFX
MCORE_INLINE Skeleton* GetSkeleton() const { return mSkeleton; }
MCORE_INLINE size_t GetNumNodes() const { return mSkeleton->GetNumNodes(); }
void SetMesh(uint32 lodLevel, size_t nodeIndex, Mesh* mesh);
void SetMeshDeformerStack(uint32 lodLevel, size_t nodeIndex, MeshDeformerStack* stack);
void SetMesh(size_t lodLevel, size_t nodeIndex, Mesh* mesh);
void SetMeshDeformerStack(size_t lodLevel, size_t nodeIndex, MeshDeformerStack* stack);
bool CheckIfHasMorphDeformer(uint32 lodLevel, size_t nodeIndex) const;
bool CheckIfHasSkinningDeformer(uint32 lodLevel, size_t nodeIndex) const;
bool CheckIfHasMorphDeformer(size_t lodLevel, size_t nodeIndex) const;
bool CheckIfHasSkinningDeformer(size_t lodLevel, size_t nodeIndex) const;
void RemoveNodeMeshForLOD(uint32 lodLevel, size_t nodeIndex, bool destroyMesh = true);
void RemoveNodeMeshForLOD(size_t lodLevel, size_t nodeIndex, bool destroyMesh = true);
void SetNumNodes(size_t numNodes);
@@ -801,7 +801,7 @@ namespace EMotionFX
* @param index An index in the array of enabled nodes. This must be in range of [0..GetNumEnabledNodes()-1].
* @result The node number, which relates to Actor::GetNode( returnValue ).
*/
MCORE_INLINE uint16 GetEnabledNode(uint32 index) const { return mEnabledNodes[index]; }
MCORE_INLINE uint16 GetEnabledNode(size_t index) const { return mEnabledNodes[index]; }
/**
* Enable all nodes inside the actor instance.
@@ -294,7 +294,7 @@ namespace EMotionFX
}
// initialize the mesh deformer
void DualQuatSkinDeformer::Reinitialize(Actor* actor, Node* node, uint32 lodLevel)
void DualQuatSkinDeformer::Reinitialize(Actor* actor, Node* node, size_t lodLevel)
{
MCORE_UNUSED(actor);
MCORE_UNUSED(node);
@@ -68,7 +68,7 @@ namespace EMotionFX
* @param node The node where the mesh belongs to during this initialization.
* @param lodLevel The LOD level of the mesh the mesh deformer works on.
*/
void Reinitialize(Actor* actor, Node* node, uint32 lodLevel) override;
void Reinitialize(Actor* actor, Node* node, size_t lodLevel) override;
/**
* Creates an exact clone (copy) of this deformer, and returns a pointer to it.
+9 -13
View File
@@ -740,7 +740,7 @@ namespace EMotionFX
// returns the maximum number of weights/influences for this mesh
uint32 Mesh::CalcMaxNumInfluences() const
size_t Mesh::CalcMaxNumInfluences() const
{
// try to locate the skinning attribute information
SkinningInfoVertexAttributeLayer* skinningLayer = (SkinningInfoVertexAttributeLayer*)FindSharedVertexAttributeLayer(SkinningInfoVertexAttributeLayer::TYPE_ID);
@@ -760,37 +760,33 @@ namespace EMotionFX
}
// return the maximum number of influences
return aznumeric_cast<uint32>(maxInfluences);
return maxInfluences;
}
// returns the maximum number of weights/influences for this mesh plus some extra information
uint32 Mesh::CalcMaxNumInfluences(AZStd::vector<uint32>& outVertexCounts) const
size_t Mesh::CalcMaxNumInfluences(AZStd::vector<size_t>& outVertexCounts) const
{
size_t maxInfluences = 0;
// Reset values.
outVertexCounts.resize(CalcMaxNumInfluences() + 1);
for (size_t j = 0; j < outVertexCounts.size(); ++j)
{
outVertexCounts[j] = 0;
}
AZStd::fill(begin(outVertexCounts), end(outVertexCounts), 0);
// Does the mesh have a skinning layer? If no we can quit directly as this means there are only unskinned vertices.
SkinningInfoVertexAttributeLayer* skinningLayer = (SkinningInfoVertexAttributeLayer*)FindSharedVertexAttributeLayer(SkinningInfoVertexAttributeLayer::TYPE_ID);
if (!skinningLayer)
{
outVertexCounts[0] = GetNumVertices();
return aznumeric_cast<uint32>(maxInfluences);
return 0;
}
uint32* orgVerts = (uint32*)FindVertexData(Mesh::ATTRIB_ORGVTXNUMBERS);
const uint32* orgVerts = (uint32*)FindVertexData(Mesh::ATTRIB_ORGVTXNUMBERS);
// Get the vertex counts for the influences.
size_t maxInfluences = 0;
const uint32 numVerts = GetNumVertices();
for (uint32 i = 0; i < numVerts; ++i)
{
uint32 orgVertex = orgVerts[i];
const uint32 orgVertex = orgVerts[i];
// Increase the number of vertices for the given influence value.
const size_t numInfluences = skinningLayer->GetNumInfluences(orgVertex);
@@ -800,7 +796,7 @@ namespace EMotionFX
maxInfluences = AZStd::max(maxInfluences, numInfluences);
}
return aznumeric_cast<uint32>(maxInfluences);
return maxInfluences;
}
+2 -2
View File
@@ -462,7 +462,7 @@ namespace EMotionFX
* This is calculated by for each vertex checking the number of bone influences, and take the maximum of that amount.
* @result The maximum number of influences. This will be 0 for non-softskinned objects.
*/
uint32 CalcMaxNumInfluences() const;
size_t CalcMaxNumInfluences() const;
/**
* Calculates the maximum number of bone influences.
@@ -472,7 +472,7 @@ namespace EMotionFX
* which are effected by 4 bones.
* @result The maximum number of influences. This will be 0 for non-softskinned objects.
*/
uint32 CalcMaxNumInfluences(AZStd::vector<uint32>& outVertexCounts) const;
size_t CalcMaxNumInfluences(AZStd::vector<size_t>& outVertexCounts) const;
/**
* Extract a list of positions of the original vertices.
@@ -45,7 +45,7 @@ namespace EMotionFX
// reinitialize the mesh deformer
void MeshDeformer::Reinitialize(Actor* actor, Node* node, uint32 lodLevel)
void MeshDeformer::Reinitialize(Actor* actor, Node* node, size_t lodLevel)
{
MCORE_UNUSED(actor);
MCORE_UNUSED(node);
@@ -49,7 +49,7 @@ namespace EMotionFX
* @param node The node where the mesh belongs to during this initialization.
* @param lodLevel The LOD level of the mesh the mesh deformer works on.
*/
virtual void Reinitialize(Actor* actor, Node* node, uint32 lodLevel);
virtual void Reinitialize(Actor* actor, Node* node, size_t lodLevel);
/**
* Creates an exact clone (copy) of this deformer, and returns a pointer to it.
@@ -114,13 +114,13 @@ namespace EMotionFX
// reinitialize mesh deformers
void MeshDeformerStack::ReinitializeDeformers(Actor* actor, Node* node, uint32 lodLevel)
void MeshDeformerStack::ReinitializeDeformers(Actor* actor, Node* node, size_t lodLevel)
{
// if we have deformers in the stack
const uint32 numDeformers = mDeformers.size();
const size_t numDeformers = mDeformers.size();
// iterate through the deformers and reinitialize them
for (uint32 i = 0; i < numDeformers; ++i)
for (size_t i = 0; i < numDeformers; ++i)
{
mDeformers[i]->Reinitialize(actor, node, lodLevel);
}
@@ -74,7 +74,7 @@ namespace EMotionFX
* @param node The node to use for the reinitialize, so the node where the mesh belongs to during this initialization.
* @param lodLevel The LOD level the mesh deformers work on.
*/
void ReinitializeDeformers(Actor* actor, Node* node, uint32 lodLevel);
void ReinitializeDeformers(Actor* actor, Node* node, size_t lodLevel);
/**
* Add a given deformer to the back of the stack.
@@ -194,7 +194,7 @@ namespace EMotionFX
// initialize the mesh deformer
void MorphMeshDeformer::Reinitialize(Actor* actor, Node* node, uint32 lodLevel)
void MorphMeshDeformer::Reinitialize(Actor* actor, Node* node, size_t lodLevel)
{
// clear the deform passes, but don't free the currently allocated/reserved memory
mDeformPasses.clear();
@@ -103,7 +103,7 @@ namespace EMotionFX
* @param node The node where the mesh belongs to during this initialization.
* @param lodLevel The LOD level of the mesh the mesh deformer works on.
*/
void Reinitialize(Actor* actor, Node* node, uint32 lodLevel) override;
void Reinitialize(Actor* actor, Node* node, size_t lodLevel) override;
/**
* Creates an exact clone (copy) of this deformer, and returns a pointer to it.
@@ -196,7 +196,7 @@ namespace EMotionFX
}
void MorphSetup::ReserveMorphTargets(uint32 numMorphTargets)
void MorphSetup::ReserveMorphTargets(size_t numMorphTargets)
{
mMorphTargets.reserve(numMorphTargets);
}
@@ -34,7 +34,7 @@ namespace EMotionFX
* This does not influence the return value of GetNumMorphTargets().
* @param numMorphTargets The number of morph targets to pre-allocate space for.
*/
void ReserveMorphTargets(uint32 numMorphTargets);
void ReserveMorphTargets(size_t numMorphTargets);
/**
* Get the number of morph targets inside this morph setup.
@@ -47,7 +47,7 @@ namespace EMotionFX
* @param nr The morph target number, must be in range of [0..GetNumMorphTargets()-1].
* @result A pointer to the morph target.
*/
MCORE_INLINE MorphTarget* GetMorphTarget(uint32 nr) const { return mMorphTargets[nr]; }
MCORE_INLINE MorphTarget* GetMorphTarget(size_t nr) const { return mMorphTargets[nr]; }
/**
* Add a morph target to this morph setup.
@@ -68,7 +68,7 @@ namespace EMotionFX
* @param scale This must contain the initial scale, and will be modified inside this method as well.
* @param weight The absolute weight value.
*/
virtual void ApplyTransformation(ActorInstance* actorInstance, uint32 nodeIndex, AZ::Vector3& position, AZ::Quaternion& rotation, AZ::Vector3& scale, float weight) = 0;
virtual void ApplyTransformation(ActorInstance* actorInstance, size_t nodeIndex, AZ::Vector3& position, AZ::Quaternion& rotation, AZ::Vector3& scale, float weight) = 0;
/**
* Get the unique ID of this morph target.
@@ -212,7 +212,7 @@ namespace EMotionFX
* @param nodeIndex The node number to perform the check on.
* @result Returns true if the given node will be modified by this morph target, otherwise false is returned.
*/
virtual bool Influences(uint32 nodeIndex) const = 0;
virtual bool Influences(size_t nodeIndex) const = 0;
/**
* Calculate the range based weight value from a normalized weight value given by a facial animation key frame.
@@ -170,7 +170,7 @@ namespace EMotionFX
// apply the relative transformation to the specified node
// store the result in the position, rotation and scale parameters
void MorphTargetStandard::ApplyTransformation(ActorInstance* actorInstance, uint32 nodeIndex, AZ::Vector3& position, AZ::Quaternion& rotation, AZ::Vector3& scale, float weight)
void MorphTargetStandard::ApplyTransformation(ActorInstance* actorInstance, size_t nodeIndex, AZ::Vector3& position, AZ::Quaternion& rotation, AZ::Vector3& scale, float weight)
{
// calculate the normalized weight (in range of 0..1)
const float newWeight = MCore::Clamp<float>(weight, mRangeMin, mRangeMax); // make sure its within the range
@@ -202,7 +202,7 @@ namespace EMotionFX
// check if this morph target influences the specified node or not
bool MorphTargetStandard::Influences(uint32 nodeIndex) const
bool MorphTargetStandard::Influences(size_t nodeIndex) const
{
// check if there is a deform data object, which works on the specified node
for (const DeformData* deformData : mDeformDatas)
@@ -338,7 +338,7 @@ namespace EMotionFX
//---------------------------------------------------
// constructor
MorphTargetStandard::DeformData::DeformData(uint32 nodeIndex, uint32 numVerts)
MorphTargetStandard::DeformData::DeformData(size_t nodeIndex, uint32 numVerts)
{
mNodeIndex = nodeIndex;
mNumVerts = numVerts;
@@ -356,7 +356,7 @@ namespace EMotionFX
// create
MorphTargetStandard::DeformData* MorphTargetStandard::DeformData::Create(uint32 nodeIndex, uint32 numVerts)
MorphTargetStandard::DeformData* MorphTargetStandard::DeformData::Create(size_t nodeIndex, uint32 numVerts)
{
return aznew MorphTargetStandard::DeformData(nodeIndex, numVerts);
}
@@ -66,7 +66,7 @@ namespace EMotionFX
uint32 mVertexNr; /**< The vertex number inside the mesh to apply this to. */
};
static DeformData* Create(uint32 nodeIndex, uint32 numVerts);
static DeformData* Create(size_t nodeIndex, uint32 numVerts);
// creates a clone
DeformData* Clone();
@@ -74,7 +74,7 @@ namespace EMotionFX
public:
VertexDelta* mDeltas; /**< The delta values. */
uint32 mNumVerts; /**< The number of vertices in the mDeltas and mVertexNumbers arrays. */
uint32 mNodeIndex; /**< The node which this data works on. */
size_t mNodeIndex; /**< The node which this data works on. */
float mMinValue; /**< The compression/decompression minimum value for the delta positions. */
float mMaxValue; /**< The compression/decompression maximum value for the delta positions. */
@@ -83,7 +83,7 @@ namespace EMotionFX
* @param nodeIndex The node number on which the deformations should work.
* @param numVerts The number of vertices modified by this deform.
*/
DeformData(uint32 nodeIndex, uint32 numVerts);
DeformData(size_t nodeIndex, uint32 numVerts);
/**
* The destructor.
@@ -155,14 +155,14 @@ namespace EMotionFX
* @param scale The input scale to which relative adjustments will be applied.
* @param weight The absolute weight value.
*/
void ApplyTransformation(ActorInstance* actorInstance, uint32 nodeIndex, AZ::Vector3& position, AZ::Quaternion& rotation, AZ::Vector3& scale, float weight) override;
void ApplyTransformation(ActorInstance* actorInstance, size_t nodeIndex, AZ::Vector3& position, AZ::Quaternion& rotation, AZ::Vector3& scale, float weight) override;
/**
* Checks if this morph target would influence the given node.
* @param nodeIndex The node to perform the check with.
* @result Returns true if the given node will be modified by this morph target, otherwise false is returned.
*/
bool Influences(uint32 nodeIndex) const override;
bool Influences(size_t nodeIndex) const override;
/**
* Apply the relative deformations for this morph target to the given actor instance.
@@ -400,22 +400,22 @@ namespace EMotionFX
void Node::SetSkeletalLODLevelBits(uint32 bitValues)
void Node::SetSkeletalLODLevelBits(size_t bitValues)
{
mSkeletalLODs = bitValues;
}
void Node::SetSkeletalLODStatus(uint32 lodLevel, bool enabled)
void Node::SetSkeletalLODStatus(size_t lodLevel, bool enabled)
{
MCORE_ASSERT(lodLevel <= 31);
MCORE_ASSERT(lodLevel <= 63);
if (enabled)
{
mSkeletalLODs |= (1 << lodLevel);
mSkeletalLODs |= (1ull << lodLevel);
}
else
{
mSkeletalLODs &= ~(1 << lodLevel);
mSkeletalLODs &= ~(1ull << lodLevel);
}
}
+4 -4
View File
@@ -346,7 +346,7 @@ namespace EMotionFX
* Bit 0 represents LOD 0, bit 1 represents LOD 1, etc.
* @param bitValues The unsigned 32-bits integer that contains the settings for each LOD.
*/
void SetSkeletalLODLevelBits(uint32 bitValues);
void SetSkeletalLODLevelBits(size_t bitValues);
/**
* Set the skeletal LOD status for a given LOD level.
@@ -357,14 +357,14 @@ namespace EMotionFX
* @param lodLevel The skeletal LOD level to change the settings for. This must be in range of [0..31].
* @param enabled Set to true when you wish the node to be enabled in the given LOD, or false when you wish to disable it in the given LOD.
*/
void SetSkeletalLODStatus(uint32 lodLevel, bool enabled);
void SetSkeletalLODStatus(size_t lodLevel, bool enabled);
/**
* Get the skeletal LOD status for this node at a given skeletal LOD.
* @param lodLevel The skeletal LOD level to check.
* @result Returns true when this node is enabled in the specified LOD level. Otherwise false is returned.
*/
MCORE_INLINE bool GetSkeletalLODStatus(size_t lodLevel) const { return (mSkeletalLODs & (1 << lodLevel)) != 0; }
MCORE_INLINE bool GetSkeletalLODStatus(size_t lodLevel) const { return (mSkeletalLODs & (1ull << lodLevel)) != 0; }
//--------------------------------------------
@@ -417,7 +417,7 @@ namespace EMotionFX
private:
size_t mNodeIndex; /**< The node index, which is the index into the array of nodes inside the Skeleton class. */
size_t mParentIndex; /**< The parent node index, or MCORE_INVALIDINDEX32 when there is no parent. */
uint32 mSkeletalLODs; /**< The skeletal LOD status values. Each bit represents if this node is enabled or disabled in the given LOD. */
size_t mSkeletalLODs; /**< The skeletal LOD status values. Each bit represents if this node is enabled or disabled in the given LOD. */
size_t mNameID; /**< The ID, which is generated from the name. You can use this for fast compares between nodes. */
size_t mSemanticNameID; /**< The semantic name ID, for example "LeftHand" or "RightFoot" or so, this can be used for retargeting. */
Skeleton* mSkeleton; /**< The skeleton where this node belongs to. */
@@ -39,35 +39,35 @@ namespace EMotionFX
// preallocate space
void NodeMap::Reserve(uint32 numEntries)
void NodeMap::Reserve(size_t numEntries)
{
mEntries.reserve(numEntries);
}
// resize the entries array
void NodeMap::Resize(uint32 numEntries)
void NodeMap::Resize(size_t numEntries)
{
mEntries.resize(numEntries);
}
// modify the first name of a given entry
void NodeMap::SetFirstName(uint32 entryIndex, const char* name)
void NodeMap::SetFirstName(size_t entryIndex, const char* name)
{
mEntries[entryIndex].mFirstNameID = MCore::GetStringIdPool().GenerateIdForString(name);
}
// modify the second name
void NodeMap::SetSecondName(uint32 entryIndex, const char* name)
void NodeMap::SetSecondName(size_t entryIndex, const char* name)
{
mEntries[entryIndex].mSecondNameID = MCore::GetStringIdPool().GenerateIdForString(name);
}
// modify a given entry
void NodeMap::SetEntry(uint32 entryIndex, const char* firstName, const char* secondName)
void NodeMap::SetEntry(size_t entryIndex, const char* firstName, const char* secondName)
{
mEntries[entryIndex].mFirstNameID = MCore::GetStringIdPool().GenerateIdForString(firstName);
mEntries[entryIndex].mSecondNameID = MCore::GetStringIdPool().GenerateIdForString(secondName);
@@ -78,8 +78,8 @@ namespace EMotionFX
void NodeMap::SetEntry(const char* firstName, const char* secondName, bool addIfNotExists)
{
// check if there is already an entry for this name
const uint32 entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == MCORE_INVALIDINDEX32)
const size_t entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == InvalidIndex)
{
// if there is no such entry yet, and we also don't want to add a new one, then there is nothing to do
if (addIfNotExists == false)
@@ -107,7 +107,7 @@ namespace EMotionFX
// remove a given entry by its index
void NodeMap::RemoveEntryByIndex(uint32 entryIndex)
void NodeMap::RemoveEntryByIndex(size_t entryIndex)
{
mEntries.erase(AZStd::next(begin(mEntries), entryIndex));
}
@@ -116,8 +116,8 @@ namespace EMotionFX
// remove a given entry by its name
void NodeMap::RemoveEntryByName(const char* firstName)
{
const uint32 entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == MCORE_INVALIDINDEX32)
const size_t entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == InvalidIndex)
{
return;
}
@@ -127,10 +127,10 @@ namespace EMotionFX
// remove a given entry by its name ID
void NodeMap::RemoveEntryByNameID(uint32 firstNameID)
void NodeMap::RemoveEntryByNameID(size_t firstNameID)
{
const uint32 entryIndex = FindEntryIndexByNameID(firstNameID);
if (entryIndex == MCORE_INVALIDINDEX32)
const size_t entryIndex = FindEntryIndexByNameID(firstNameID);
if (entryIndex == InvalidIndex)
{
return;
}
@@ -208,18 +208,18 @@ namespace EMotionFX
uint32 NodeMap::CalcFileChunkSize() const
{
// add the node map info header
uint32 numBytes = sizeof(FileFormat::NodeMapChunk);
size_t numBytes = sizeof(FileFormat::NodeMapChunk);
// for all entries
const uint32 numEntries = mEntries.size();
for (uint32 i = 0; i < numEntries; ++i)
const size_t numEntries = mEntries.size();
for (size_t i = 0; i < numEntries; ++i)
{
numBytes += CalcFileStringSize(GetFirstNameString(i));
numBytes += CalcFileStringSize(GetSecondNameString(i));
}
// return the number of bytes
return numBytes;
return aznumeric_caster(numBytes);
}
@@ -265,7 +265,7 @@ namespace EMotionFX
// the main info
FileFormat::NodeMapChunk nodeMapChunk{};
nodeMapChunk.mNumEntries = mEntries.size();
nodeMapChunk.mNumEntries = aznumeric_caster(mEntries.size());
MCore::Endian::ConvertUnsignedInt32To(&nodeMapChunk.mNumEntries, targetEndianType);
if (f.Write(&nodeMapChunk, sizeof(FileFormat::NodeMapChunk)) == 0)
{
@@ -282,7 +282,7 @@ namespace EMotionFX
}
// for all entries
const uint32 numEntries = mEntries.size();
const uint32 numEntries = aznumeric_caster(mEntries.size());
for (uint32 i = 0; i < numEntries; ++i)
{
if (WriteFileString(&f, GetFirstNameString(i), targetEndianType) == false)
@@ -327,28 +327,28 @@ namespace EMotionFX
// get the first name as char pointer
const char* NodeMap::GetFirstName(uint32 entryIndex) const
const char* NodeMap::GetFirstName(size_t entryIndex) const
{
return MCore::GetStringIdPool().GetName(mEntries[entryIndex].mFirstNameID).c_str();
}
// get the second node name as char pointer
const char* NodeMap::GetSecondName(uint32 entryIndex) const
const char* NodeMap::GetSecondName(size_t entryIndex) const
{
return MCore::GetStringIdPool().GetName(mEntries[entryIndex].mSecondNameID).c_str();
}
// get the first node name as string
const AZStd::string& NodeMap::GetFirstNameString(uint32 entryIndex) const
const AZStd::string& NodeMap::GetFirstNameString(size_t entryIndex) const
{
return MCore::GetStringIdPool().GetName(mEntries[entryIndex].mFirstNameID);
}
// get the second node name as string
const AZStd::string& NodeMap::GetSecondNameString(uint32 entryIndex) const
const AZStd::string& NodeMap::GetSecondNameString(size_t entryIndex) const
{
return MCore::GetStringIdPool().GetName(mEntries[entryIndex].mSecondNameID);
}
@@ -357,48 +357,37 @@ namespace EMotionFX
// check if we already have an entry for this name
bool NodeMap::GetHasEntry(const char* firstName) const
{
return (FindEntryIndexByName(firstName) != MCORE_INVALIDINDEX32);
return (FindEntryIndexByName(firstName) != InvalidIndex);
}
// find an entry index by its name
uint32 NodeMap::FindEntryIndexByName(const char* firstName) const
size_t NodeMap::FindEntryIndexByName(const char* firstName) const
{
const uint32 numEntries = mEntries.size();
for (uint32 i = 0; i < numEntries; ++i)
const auto foundEntry = AZStd::find_if(begin(mEntries), end(mEntries), [firstName](const MapEntry& entry)
{
const AZStd::string& firstNameEntry = GetFirstName(i);
if (firstNameEntry == firstName)
{
return i;
}
}
return MCORE_INVALIDINDEX32;
return MCore::GetStringIdPool().GetName(entry.mFirstNameID) == firstName;
});
return foundEntry != end(mEntries) ? AZStd::distance(begin(mEntries), foundEntry) : InvalidIndex;
}
// find an entry index by its name ID
uint32 NodeMap::FindEntryIndexByNameID(uint32 firstNameID) const
size_t NodeMap::FindEntryIndexByNameID(size_t firstNameID) const
{
const uint32 numEntries = mEntries.size();
for (uint32 i = 0; i < numEntries; ++i)
const auto foundEntry = AZStd::find_if(begin(mEntries), end(mEntries), [firstNameID](const MapEntry& entry)
{
if (mEntries[i].mFirstNameID == firstNameID)
{
return i;
}
}
return MCORE_INVALIDINDEX32;
return entry.mFirstNameID == firstNameID;
});
return foundEntry != end(mEntries) ? AZStd::distance(begin(mEntries), foundEntry) : InvalidIndex;
}
// find the second name for a given first name
const char* NodeMap::FindSecondName(const char* firstName) const
{
const uint32 entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == MCORE_INVALIDINDEX32)
const size_t entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == InvalidIndex)
{
return nullptr;
}
@@ -410,8 +399,8 @@ namespace EMotionFX
// find the second name based on a first given name
void NodeMap::FindSecondName(const char* firstName, AZStd::string* outString)
{
const uint32 entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == MCORE_INVALIDINDEX32)
const size_t entryIndex = FindEntryIndexByName(firstName);
if (entryIndex == InvalidIndex)
{
outString->clear();
return;
+15 -19
View File
@@ -39,41 +39,37 @@ namespace EMotionFX
public:
struct MapEntry
{
uint32 mFirstNameID; /**< The first name ID, which is the primary key in the map. */
uint32 mSecondNameID; /**< The second name ID. */
MapEntry()
: mFirstNameID(MCORE_INVALIDINDEX32)
, mSecondNameID(MCORE_INVALIDINDEX32) {}
size_t mFirstNameID = InvalidIndex; /**< The first name ID, which is the primary key in the map. */
size_t mSecondNameID = InvalidIndex; /**< The second name ID. */
};
static NodeMap* Create();
// prealloc space in the map
void Reserve(uint32 numEntries);
void Resize(uint32 numEntries);
void Reserve(size_t numEntries);
void Resize(size_t numEntries);
// get data
size_t GetNumEntries() const;
const char* GetFirstName(uint32 entryIndex) const;
const char* GetSecondName(uint32 entryIndex) const;
const AZStd::string& GetFirstNameString(uint32 entryIndex) const;
const AZStd::string& GetSecondNameString(uint32 entryIndex) const;
const char* GetFirstName(size_t entryIndex) const;
const char* GetSecondName(size_t entryIndex) const;
const AZStd::string& GetFirstNameString(size_t entryIndex) const;
const AZStd::string& GetSecondNameString(size_t entryIndex) const;
bool GetHasEntry(const char* firstName) const;
uint32 FindEntryIndexByName(const char* firstName) const;
uint32 FindEntryIndexByNameID(uint32 firstNameID) const;
size_t FindEntryIndexByName(const char* firstName) const;
size_t FindEntryIndexByNameID(size_t firstNameID) const;
const char* FindSecondName(const char* firstName) const;
void FindSecondName(const char* firstName, AZStd::string* outString);
// set/modify
void SetFirstName(uint32 entryIndex, const char* name);
void SetSecondName(uint32 entryIndex, const char* name);
void SetEntry(uint32 entryIndex, const char* firstName, const char* secondName);
void SetFirstName(size_t entryIndex, const char* name);
void SetSecondName(size_t entryIndex, const char* name);
void SetEntry(size_t entryIndex, const char* firstName, const char* secondName);
void AddEntry(const char* firstName, const char* secondName);
void SetEntry(const char* firstName, const char* secondName, bool addIfNotExists);
void RemoveEntryByIndex(uint32 entryIndex);
void RemoveEntryByIndex(size_t entryIndex);
void RemoveEntryByName(const char* firstName);
void RemoveEntryByNameID(uint32 firstNameID);
void RemoveEntryByNameID(size_t firstNameID);
// filename
void SetFileName(const char* fileName);
@@ -1334,7 +1334,7 @@ namespace EMotionFX
}
void Pose::ResizeNumMorphs(uint32 numMorphTargets)
void Pose::ResizeNumMorphs(size_t numMorphTargets)
{
mMorphWeights.Resize(numMorphTargets);
}
+15 -15
View File
@@ -100,24 +100,24 @@ namespace EMotionFX
MCORE_INLINE const Transform* GetLocalSpaceTransforms() const { return mLocalSpaceTransforms.GetReadPtr(); }
MCORE_INLINE const Transform* GetModelSpaceTransforms() const { return mModelSpaceTransforms.GetReadPtr(); }
MCORE_INLINE uint32 GetNumTransforms() const { return mLocalSpaceTransforms.GetLength(); }
MCORE_INLINE size_t GetNumTransforms() const { return mLocalSpaceTransforms.GetLength(); }
MCORE_INLINE const ActorInstance* GetActorInstance() const { return mActorInstance; }
MCORE_INLINE const Actor* GetActor() const { return mActor; }
MCORE_INLINE const Skeleton* GetSkeleton() const { return mSkeleton; }
MCORE_INLINE Transform& GetLocalSpaceTransformDirect(uint32 nodeIndex) { return mLocalSpaceTransforms[nodeIndex]; }
MCORE_INLINE Transform& GetModelSpaceTransformDirect(uint32 nodeIndex) { return mModelSpaceTransforms[nodeIndex]; }
MCORE_INLINE const Transform& GetLocalSpaceTransformDirect(uint32 nodeIndex) const { return mLocalSpaceTransforms[nodeIndex]; }
MCORE_INLINE const Transform& GetModelSpaceTransformDirect(uint32 nodeIndex) const { return mModelSpaceTransforms[nodeIndex]; }
MCORE_INLINE void SetLocalSpaceTransformDirect(uint32 nodeIndex, const Transform& transform){ mLocalSpaceTransforms[nodeIndex] = transform; mFlags[nodeIndex] |= FLAG_LOCALTRANSFORMREADY; }
MCORE_INLINE void SetModelSpaceTransformDirect(uint32 nodeIndex, const Transform& transform){ mModelSpaceTransforms[nodeIndex] = transform; mFlags[nodeIndex] |= FLAG_MODELTRANSFORMREADY; }
MCORE_INLINE void InvalidateLocalSpaceTransform(uint32 nodeIndex) { mFlags[nodeIndex] &= ~FLAG_LOCALTRANSFORMREADY; }
MCORE_INLINE void InvalidateModelSpaceTransform(uint32 nodeIndex) { mFlags[nodeIndex] &= ~FLAG_MODELTRANSFORMREADY; }
MCORE_INLINE Transform& GetLocalSpaceTransformDirect(size_t nodeIndex) { return mLocalSpaceTransforms[nodeIndex]; }
MCORE_INLINE Transform& GetModelSpaceTransformDirect(size_t nodeIndex) { return mModelSpaceTransforms[nodeIndex]; }
MCORE_INLINE const Transform& GetLocalSpaceTransformDirect(size_t nodeIndex) const { return mLocalSpaceTransforms[nodeIndex]; }
MCORE_INLINE const Transform& GetModelSpaceTransformDirect(size_t nodeIndex) const { return mModelSpaceTransforms[nodeIndex]; }
MCORE_INLINE void SetLocalSpaceTransformDirect(size_t nodeIndex, const Transform& transform){ mLocalSpaceTransforms[nodeIndex] = transform; mFlags[nodeIndex] |= FLAG_LOCALTRANSFORMREADY; }
MCORE_INLINE void SetModelSpaceTransformDirect(size_t nodeIndex, const Transform& transform){ mModelSpaceTransforms[nodeIndex] = transform; mFlags[nodeIndex] |= FLAG_MODELTRANSFORMREADY; }
MCORE_INLINE void InvalidateLocalSpaceTransform(size_t nodeIndex) { mFlags[nodeIndex] &= ~FLAG_LOCALTRANSFORMREADY; }
MCORE_INLINE void InvalidateModelSpaceTransform(size_t nodeIndex) { mFlags[nodeIndex] &= ~FLAG_MODELTRANSFORMREADY; }
MCORE_INLINE void SetMorphWeight(uint32 index, float weight) { mMorphWeights[index] = weight; }
MCORE_INLINE float GetMorphWeight(uint32 index) const { return mMorphWeights[index]; }
MCORE_INLINE uint32 GetNumMorphWeights() const { return mMorphWeights.GetLength(); }
void ResizeNumMorphs(uint32 numMorphTargets);
MCORE_INLINE void SetMorphWeight(size_t index, float weight) { mMorphWeights[index] = weight; }
MCORE_INLINE float GetMorphWeight(size_t index) const { return mMorphWeights[index]; }
MCORE_INLINE size_t GetNumMorphWeights() const { return mMorphWeights.GetLength(); }
void ResizeNumMorphs(size_t numMorphTargets);
/**
* Blend this pose into a specified destination pose.
@@ -168,8 +168,8 @@ namespace EMotionFX
Pose& operator=(const Pose& other);
MCORE_INLINE uint8 GetFlags(uint32 nodeIndex) const { return mFlags[nodeIndex]; }
MCORE_INLINE void SetFlags(uint32 nodeIndex, uint8 flags) { mFlags[nodeIndex] = flags; }
MCORE_INLINE uint8 GetFlags(size_t nodeIndex) const { return mFlags[nodeIndex]; }
MCORE_INLINE void SetFlags(size_t nodeIndex, uint8 flags) { mFlags[nodeIndex] = flags; }
bool HasPoseData(const AZ::TypeId& typeId) const;
PoseData* GetPoseDataByType(const AZ::TypeId& typeId) const;
@@ -202,7 +202,7 @@ namespace EMotionFX
// initialize the mesh deformer
void SoftSkinDeformer::Reinitialize(Actor* actor, Node* node, uint32 lodLevel)
void SoftSkinDeformer::Reinitialize(Actor* actor, Node* node, size_t lodLevel)
{
MCORE_UNUSED(actor);
MCORE_UNUSED(node);
@@ -71,7 +71,7 @@ namespace EMotionFX
* @param node The node where the mesh belongs to during this initialization.
* @param lodLevel The LOD level of the mesh the mesh deformer works on.
*/
void Reinitialize(Actor* actor, Node* node, uint32 lodLevel) override;
void Reinitialize(Actor* actor, Node* node, size_t lodLevel) override;
/**
* Creates an exact clone (copy) of this deformer, and returns a pointer to it.
@@ -210,7 +210,7 @@ namespace EMStudio
EMotionFX::Actor* actor = actorInstance->GetActor();
AZStd::string actorName;
AzFramework::StringFunc::Path::GetFileName(actor->GetFileNameString().c_str(), actorName);
const uint32 numNodes = actor->GetNumNodes();
const size_t numNodes = actor->GetNumNodes();
// extract the bones from the actor
actor->ExtractBoneList(actorInstance->GetLODLevel(), &mBoneList);
@@ -240,11 +240,11 @@ namespace EMStudio
mHierarchy->addTopLevelItem(rootItem);
// get the number of root nodes and iterate through them
const uint32 numRootNodes = actor->GetSkeleton()->GetNumRootNodes();
const size_t numRootNodes = actor->GetSkeleton()->GetNumRootNodes();
for (uint32 i = 0; i < numRootNodes; ++i)
{
// get the root node index and the corresponding node
const uint32 rootNodeIndex = actor->GetSkeleton()->GetRootNodeIndex(i);
const size_t rootNodeIndex = actor->GetSkeleton()->GetRootNodeIndex(i);
EMotionFX::Node* rootNode = actor->GetSkeleton()->GetNode(rootNodeIndex);
// recursively add all the nodes to the hierarchy
@@ -260,7 +260,7 @@ namespace EMStudio
return false;
}
const uint32 nodeIndex = node->GetNodeIndex();
const size_t nodeIndex = node->GetNodeIndex();
AZStd::string nodeName = node->GetNameString();
AZStd::to_lower(nodeName.begin(), nodeName.end());
EMotionFX::Mesh* mesh = actorInstance->GetActor()->GetMesh(actorInstance->GetLODLevel(), nodeIndex);
@@ -288,10 +288,10 @@ namespace EMStudio
void NodeHierarchyWidget::RecursivelyAddChilds(QTreeWidgetItem* parent, EMotionFX::Actor* actor, EMotionFX::ActorInstance* actorInstance, EMotionFX::Node* node)
{
const uint32 nodeIndex = node->GetNodeIndex();
const size_t nodeIndex = node->GetNodeIndex();
AZStd::string nodeName = node->GetNameString();
AZStd::to_lower(nodeName.begin(), nodeName.end());
const uint32 numChildren = node->GetNumChildNodes();
const size_t numChildren = node->GetNumChildNodes();
EMotionFX::Mesh* mesh = actor->GetMesh(actorInstance->GetLODLevel(), nodeIndex);
const bool isMeshNode = (mesh);
const bool isBone = (AZStd::find(begin(mBoneList), end(mBoneList), nodeIndex) != end(mBoneList));
@@ -352,7 +352,7 @@ namespace EMStudio
for (uint32 i = 0; i < numChildren; ++i)
{
// get the node index and the corresponding node
const uint32 childIndex = node->GetChildIndex(i);
const size_t childIndex = node->GetChildIndex(i);
EMotionFX::Node* child = actor->GetSkeleton()->GetNode(childIndex);
// recursively add all the nodes to the hierarchy
@@ -365,7 +365,7 @@ namespace EMStudio
for (uint32 i = 0; i < numChildren; ++i)
{
// get the node index and the corresponding node
const uint32 childIndex = node->GetChildIndex(i);
const size_t childIndex = node->GetChildIndex(i);
EMotionFX::Node* child = actor->GetSkeleton()->GetNode(childIndex);
// recursively add all the nodes to the hierarchy
@@ -133,7 +133,7 @@ namespace EMStudio
QIcon* mNodeIcon;
QIcon* mMeshIcon;
QIcon* mCharacterIcon;
AZStd::vector<uint32> mBoneList;
AZStd::vector<size_t> mBoneList;
AZStd::vector<uint32> mActorInstanceIDs;
AZStd::string mItemName;
AZStd::string mActorInstanceIDString;
@@ -53,7 +53,7 @@ namespace EMStudio
MCORE_MEMORYOBJECTCATEGORY(RenderPlugin::EMStudioRenderActor, MCore::MCORE_DEFAULT_ALIGNMENT, MEMCATEGORY_EMSTUDIOSDK_RENDERPLUGINBASE);
EMotionFX::Actor* mActor;
AZStd::vector<uint32> mBoneList;
AZStd::vector<size_t> mBoneList;
RenderGL::GLActor* mRenderActor;
AZStd::vector<EMotionFX::ActorInstance*> mActorInstances;
float mNormalsScaleMultiplier;
@@ -33,7 +33,7 @@ namespace EMStudio
if (m_orgVerticesCount)
{
m_vertexDupeRatio = mesh->GetNumVertices() / (float)mesh->GetNumOrgVertices();
m_vertexDupeRatio = (float)mesh->GetNumVertices() / (float)mesh->GetNumOrgVertices();
}
else
{
@@ -44,15 +44,15 @@ namespace EMStudio
mesh->CalcMaxNumInfluences(m_verticesByInfluences);
// sub meshes
const uint32 numSubMeshes = mesh->GetNumSubMeshes();
for (uint32 i = 0; i < numSubMeshes; ++i)
const size_t numSubMeshes = mesh->GetNumSubMeshes();
for (size_t i = 0; i < numSubMeshes; ++i)
{
EMotionFX::SubMesh* subMesh = mesh->GetSubMesh(i);
m_submeshes.emplace_back(actor, lodLevel, subMesh);
}
// vertex attribute layers
const uint32 numVertexAttributeLayers = mesh->GetNumVertexAttributeLayers();
const size_t numVertexAttributeLayers = mesh->GetNumVertexAttributeLayers();
AZStd::string tmpString;
for (uint32 i = 0; i < numVertexAttributeLayers; ++i)
{
@@ -89,7 +89,7 @@ namespace EMStudio
tmpString = AZStd::string::format("Unknown data (TypeID=%d)", attributeLayerType);
}
if (attributeLayer->GetNameString().size() > 0)
if (!attributeLayer->GetNameString().empty())
{
tmpString += AZStd::string::format(" [%s]", attributeLayer->GetName());
}
@@ -99,8 +99,8 @@ namespace EMStudio
// shared vertex attribute layers
const uint32 numSharedVertexAttributeLayers = mesh->GetNumSharedVertexAttributeLayers();
for (uint32 i = 0; i < numSharedVertexAttributeLayers; ++i)
const size_t numSharedVertexAttributeLayers = mesh->GetNumSharedVertexAttributeLayers();
for (size_t i = 0; i < numSharedVertexAttributeLayers; ++i)
{
EMotionFX::VertexAttributeLayer* attributeLayer = mesh->GetSharedVertexAttributeLayer(i);
@@ -114,7 +114,7 @@ namespace EMStudio
tmpString = AZStd::string::format("Unknown data (TypeID=%d)", attributeLayerType);
}
if (attributeLayer->GetNameString().size() > 0)
if (!attributeLayer->GetNameString().empty())
{
tmpString += AZStd::string::format(" [%s]", attributeLayer->GetName());
}
@@ -44,7 +44,7 @@ namespace EMStudio
bool m_isQuadMesh;
unsigned int m_orgVerticesCount;
float m_vertexDupeRatio;
AZStd::vector<uint32> m_verticesByInfluences;
AZStd::vector<size_t> m_verticesByInfluences;
AZStd::vector<SubMeshInfo> m_submeshes;
AZStd::vector<NamedPropertyStringValue> m_attributeLayers;
AZStd::vector<NamedPropertyStringValue> m_sharedAttributeLayers;
@@ -286,18 +286,18 @@ namespace EMStudio
// get access to the actor and the number of nodes
EMotionFX::Actor* actor = actorInstance->GetActor();
const uint32 numNodes = actor->GetNumNodes();
const size_t numNodes = actor->GetNumNodes();
// reserve memory for the visible node indices
m_visibleNodeIndices.reserve(numNodes);
// extract the bones from the actor
AZStd::vector<uint32> boneList;
AZStd::vector<size_t> boneList;
actor->ExtractBoneList(actorInstance->GetLODLevel(), &boneList);
// iterate through all nodes and check if the node is visible
AZStd::string nodeName;
for (uint32 i = 0; i < numNodes; ++i)
for (size_t i = 0; i < numNodes; ++i)
{
EMotionFX::Node* node = actor->GetSkeleton()->GetNode(i);
@@ -305,7 +305,7 @@ namespace EMStudio
nodeName = node->GetNameString();
AZStd::to_lower(nodeName.begin(), nodeName.end());
const uint32 nodeIndex = node->GetNodeIndex();
const size_t nodeIndex = node->GetNodeIndex();
EMotionFX::Mesh* mesh = actor->GetMesh(actorInstance->GetLODLevel(), nodeIndex);
const bool isMeshNode = (mesh);
const bool isBone = (AZStd::find(begin(boneList), end(boneList), nodeIndex) != end(boneList));
@@ -19,7 +19,7 @@ namespace EMStudio
{
AZ_CLASS_ALLOCATOR_IMPL(SubMeshInfo, EMStudio::UIAllocator, 0)
SubMeshInfo::SubMeshInfo(EMotionFX::Actor* actor, unsigned int lodLevel, EMotionFX::SubMesh* subMesh)
SubMeshInfo::SubMeshInfo(EMotionFX::Actor* actor, size_t lodLevel, EMotionFX::SubMesh* subMesh)
{
// In EMFX studio, we are not using the subMesh index - they all uses the default material.
m_materialName = actor->GetMaterial(lodLevel, 0)->GetNameString();
@@ -26,7 +26,7 @@ namespace EMStudio
AZ_CLASS_ALLOCATOR_DECL
SubMeshInfo() {}
SubMeshInfo(EMotionFX::Actor* actor, unsigned int lodLevel, EMotionFX::SubMesh* subMesh);
SubMeshInfo(EMotionFX::Actor* actor, size_t lodLevel, EMotionFX::SubMesh* subMesh);
~SubMeshInfo() = default;
static void Reflect(AZ::ReflectContext* context);
@@ -36,7 +36,7 @@ namespace EMStudio
unsigned int m_verticesCount;
unsigned int m_indicesCount;
unsigned int m_polygonsCount;
unsigned int m_bonesCount;
size_t m_bonesCount;
};
} // namespace EMStudio
@@ -329,7 +329,7 @@ namespace EMStudio
MCORE_ASSERT(node);
// remove the mapping for this node
PerformMapping(node->GetNodeIndex(), MCORE_INVALIDINDEX32);
PerformMapping(node->GetNodeIndex(), InvalidIndex);
}
@@ -443,10 +443,7 @@ namespace EMStudio
{
const size_t numNodes = aznumeric_caster(currentActor->GetNumNodes());
mMap.resize(numNodes);
for (uint32 i = 0; i < numNodes; ++i)
{
mMap[i] = MCORE_INVALIDINDEX32;
}
AZStd::fill(mMap.begin(), mMap.end(), InvalidIndex);
}
}
@@ -490,11 +487,11 @@ namespace EMStudio
// fill the left list widget
QString currentName;
const uint32 numNodes = actor->GetNumNodes();
const size_t numNodes = actor->GetNumNodes();
// count the number of rows
uint32 numRows = 0;
for (uint32 i = 0; i < numNodes; ++i)
int numRows = 0;
for (size_t i = 0; i < numNodes; ++i)
{
currentName = actor->GetSkeleton()->GetNode(i)->GetName();
if (currentName.contains(filterString, Qt::CaseInsensitive) || filterString.isEmpty())
@@ -505,15 +502,15 @@ namespace EMStudio
mCurrentList->setRowCount(numRows);
// fill the rows
uint32 rowIndex = 0;
for (uint32 i = 0; i < numNodes; ++i)
int rowIndex = 0;
for (size_t i = 0; i < numNodes; ++i)
{
EMotionFX::Node* node = actor->GetSkeleton()->GetNode(i);
currentName = node->GetName();
if (currentName.contains(filterString, Qt::CaseInsensitive) || filterString.isEmpty())
{
// mark if there is a mapping or not
const bool mapped = (mMap[node->GetNodeIndex()] != MCORE_INVALIDINDEX32);
const bool mapped = (mMap[node->GetNodeIndex()] != InvalidIndex);
QTableWidgetItem* mappedItem = new QTableWidgetItem();
mappedItem->setIcon(mapped ? *mMappedIcon : QIcon());
mCurrentList->setItem(rowIndex, 0, mappedItem);
@@ -524,8 +521,7 @@ namespace EMStudio
{
typeItem->setIcon(*mMeshIcon);
}
else
if (AZStd::find(begin(mCurrentBoneList), end(mCurrentBoneList), node->GetNodeIndex()) != end(mCurrentBoneList))
else if (AZStd::find(begin(mCurrentBoneList), end(mCurrentBoneList), node->GetNodeIndex()) != end(mCurrentBoneList))
{
typeItem->setIcon(*mBoneIcon);
}
@@ -559,11 +555,11 @@ namespace EMStudio
// fill the left list widget
QString name;
const uint32 numNodes = actor->GetNumNodes();
const size_t numNodes = actor->GetNumNodes();
// count the number of rows
uint32 numRows = 0;
for (uint32 i = 0; i < numNodes; ++i)
int numRows = 0;
for (size_t i = 0; i < numNodes; ++i)
{
name = actor->GetSkeleton()->GetNode(i)->GetName();
if (name.contains(filterString, Qt::CaseInsensitive) || filterString.isEmpty())
@@ -574,8 +570,8 @@ namespace EMStudio
mSourceList->setRowCount(numRows);
// fill the rows
uint32 rowIndex = 0;
for (uint32 i = 0; i < numNodes; ++i)
int rowIndex = 0;
for (size_t i = 0; i < numNodes; ++i)
{
EMotionFX::Node* node = actor->GetSkeleton()->GetNode(i);
name = node->GetName();
@@ -593,8 +589,7 @@ namespace EMStudio
{
typeItem->setIcon(*mMeshIcon);
}
else
if (AZStd::find(mSourceBoneList.begin(), mSourceBoneList.end(), node->GetNodeIndex()) != mSourceBoneList.end())
else if (AZStd::find(mSourceBoneList.begin(), mSourceBoneList.end(), node->GetNodeIndex()) != mSourceBoneList.end())
{
typeItem->setIcon(*mBoneIcon);
}
@@ -629,9 +624,9 @@ namespace EMStudio
// fill the table
QString currentName;
QString sourceName;
const uint32 numNodes = currentActor->GetNumNodes();
const int numNodes = aznumeric_caster(currentActor->GetNumNodes());
mMappingTable->setRowCount(numNodes);
for (uint32 i = 0; i < numNodes; ++i)
for (int i = 0; i < numNodes; ++i)
{
currentName = currentActor->GetSkeleton()->GetNode(i)->GetName();
@@ -639,7 +634,7 @@ namespace EMStudio
mMappingTable->setItem(i, 0, currentTableItem);
mMappingTable->setRowHeight(i, 21);
if (mMap[i] != MCORE_INVALIDINDEX32)
if (mMap[i] != InvalidIndex)
{
sourceName = sourceActor->GetSkeleton()->GetNode(mMap[i])->GetName();
currentTableItem = new QTableWidgetItem(sourceName);
@@ -650,8 +645,6 @@ namespace EMStudio
mMappingTable->setItem(i, 1, new QTableWidgetItem());
}
}
//mMappingTable->resizeColumnsToContents();
//mMappingTable->setColumnWidth(0, mMappingTable->columnWidth(0) + 25);
}
@@ -694,12 +687,12 @@ namespace EMStudio
// perform the mapping
void MirrorSetupWindow::PerformMapping(uint32 currentNodeIndex, uint32 sourceNodeIndex)
void MirrorSetupWindow::PerformMapping(size_t currentNodeIndex, size_t sourceNodeIndex)
{
EMotionFX::Actor* currentActor = GetSelectedActor();
// update the map
const uint32 oldSourceIndex = mMap[currentNodeIndex];
const size_t oldSourceIndex = mMap[currentNodeIndex];
mMap[currentNodeIndex] = sourceNodeIndex;
// update the current table
@@ -707,9 +700,7 @@ namespace EMStudio
const QList<QTableWidgetItem*> currentListItems = mCurrentList->findItems(curName, Qt::MatchExactly);
for (int32 i = 0; i < currentListItems.count(); ++i)
{
const uint32 rowIndex = currentListItems[i]->row();
//if (rowIndex != mCurrentList->currentRow())
// continue;
const int rowIndex = currentListItems[i]->row();
QTableWidgetItem* mappedItem = mCurrentList->item(rowIndex, 0);
if (!mappedItem)
@@ -718,7 +709,7 @@ namespace EMStudio
mCurrentList->setItem(rowIndex, 0, mappedItem);
}
if (sourceNodeIndex == MCORE_INVALIDINDEX32)
if (sourceNodeIndex == InvalidIndex)
{
mappedItem->setIcon(QIcon());
}
@@ -729,16 +720,14 @@ namespace EMStudio
}
// update source table
if (sourceNodeIndex != MCORE_INVALIDINDEX32)
if (sourceNodeIndex != InvalidIndex)
{
const bool stillUsed = AZStd::find(mMap.begin(), mMap.end(), sourceNodeIndex) != mMap.end();
const QString sourceName = currentActor->GetSkeleton()->GetNode(sourceNodeIndex)->GetName();
const QList<QTableWidgetItem*> sourceListItems = mSourceList->findItems(sourceName, Qt::MatchExactly);
for (int32 i = 0; i < sourceListItems.count(); ++i)
{
const uint32 rowIndex = sourceListItems[i]->row();
//if (rowIndex != mSourceList->currentRow())
// continue;
const int rowIndex = sourceListItems[i]->row();
QTableWidgetItem* mappedItem = mSourceList->item(rowIndex, 0);
if (!mappedItem)
@@ -759,16 +748,14 @@ namespace EMStudio
}
else // we're clearing it
{
if (oldSourceIndex != MCORE_INVALIDINDEX32)
if (oldSourceIndex != InvalidIndex)
{
const bool stillUsed = AZStd::find(mMap.begin(), mMap.end(), sourceNodeIndex) != mMap.end();
const QString sourceName = currentActor->GetSkeleton()->GetNode(oldSourceIndex)->GetName();
const QList<QTableWidgetItem*> sourceListItems = mSourceList->findItems(sourceName, Qt::MatchExactly);
for (int32 i = 0; i < sourceListItems.count(); ++i)
{
const uint32 rowIndex = sourceListItems[i]->row();
//if (rowIndex != mSourceList->currentRow())
// continue;
const int rowIndex = sourceListItems[i]->row();
QTableWidgetItem* mappedItem = mSourceList->item(rowIndex, 0);
if (!mappedItem)
@@ -790,14 +777,14 @@ namespace EMStudio
}
// update the mapping table
QTableWidgetItem* item = mMappingTable->item(currentNodeIndex, 1);
if (!item && sourceNodeIndex != MCORE_INVALIDINDEX32)
QTableWidgetItem* item = mMappingTable->item(aznumeric_caster(currentNodeIndex), 1);
if (!item && sourceNodeIndex != InvalidIndex)
{
item = new QTableWidgetItem();
mMappingTable->setItem(currentNodeIndex, 1, item);
mMappingTable->setItem(aznumeric_caster(currentNodeIndex), 1, item);
}
if (sourceNodeIndex == MCORE_INVALIDINDEX32)
if (sourceNodeIndex == InvalidIndex)
{
if (item)
{
@@ -893,15 +880,12 @@ namespace EMStudio
}
// now update our mapping data
const uint32 numNodes = currentActor->GetNumNodes();
for (uint32 i = 0; i < numNodes; ++i)
{
mMap[i] = MCORE_INVALIDINDEX32;
}
const size_t numNodes = currentActor->GetNumNodes();
AZStd::fill(mMap.begin(), AZStd::next(mMap.begin(), numNodes), InvalidIndex);
// now apply the map we loaded to the data we have here
const uint32 numEntries = nodeMap->GetNumEntries();
for (uint32 i = 0; i < numEntries; ++i)
const size_t numEntries = nodeMap->GetNumEntries();
for (size_t i = 0; i < numEntries; ++i)
{
// find the current node
EMotionFX::Node* currentNode = currentActor->GetSkeleton()->FindNodeByName(nodeMap->GetFirstName(i));
@@ -963,12 +947,12 @@ namespace EMStudio
// create an emfx node map object
EMotionFX::NodeMap* map = EMotionFX::NodeMap::Create();
const uint32 numNodes = currentActor->GetNumNodes();
const size_t numNodes = currentActor->GetNumNodes();
map->Reserve(numNodes);
for (uint32 i = 0; i < numNodes; ++i)
for (size_t i = 0; i < numNodes; ++i)
{
// skip unmapped entries
if (mMap[i] == MCORE_INVALIDINDEX32)
if (mMap[i] == InvalidIndex)
{
continue;
}
@@ -1033,16 +1017,11 @@ namespace EMStudio
return true;
}
const uint32 numNodes = currentActor->GetNumNodes();
for (uint32 i = 0; i < numNodes; ++i)
const size_t numNodes = currentActor->GetNumNodes();
return AZStd::all_of(mMap.begin(), AZStd::next(mMap.begin(), numNodes), [](const size_t nodeIndex)
{
if (mMap[i] != MCORE_INVALIDINDEX32)
{
return false;
}
}
return true;
return nodeIndex != InvalidIndex;
});
}
@@ -1081,20 +1060,13 @@ namespace EMStudio
return;
}
// show a warning that we will overwrite the table entries
//if (QMessageBox::warning(this, "Overwrite Mapping?", "Are you sure you want to possibly overwrite items in the mapping?\nAll or some existing mapping information might be lost.", QMessageBox::Cancel|QMessageBox::Yes) != QMessageBox::Yes)
//return;
//
// currentActor->MatchNodeMotionSources( FromQtString(mLeftEdit->text()), FromQtString(mRightEdit->text()) );
// update the table and map
uint32 numGuessed = 0;
const uint32 numNodes = currentActor->GetNumNodes();
for (uint32 i = 0; i < numNodes; ++i)
const size_t numNodes = currentActor->GetNumNodes();
for (size_t i = 0; i < numNodes; ++i)
{
// skip already setup mappings
if (mMap[i] != MCORE_INVALIDINDEX32)
if (mMap[i] != InvalidIndex)
{
continue;
}
@@ -1110,28 +1082,6 @@ namespace EMStudio
// update the actor
UpdateActorMotionSources();
/*
// try a geometrical mapping
EMotionFX::Pose pose;
pose.InitFromLocalBindSpaceTransforms( currentActor );
// for all nodes in the current actor
uint32 numGuessed = 0;
const uint32 numNodes = currentActor->GetNumNodes();
for (uint32 i=0; i<numNodes; ++i)
{
// skip already setup mappings
if (mMap[i] != MCORE_INVALIDINDEX32)
continue;
const uint16 matchIndex = currentActor->FindBestMirrorMatchForNode( static_cast<uint16>(i), pose );
if (matchIndex != MCORE_INVALIDINDEX16)
{
mMap[i] = matchIndex;
numGuessed++;
}
}
*/
Reinit(false);
// show some results
@@ -1148,17 +1098,7 @@ namespace EMStudio
{
return;
}
/*
const uint32 numNodes = currentActor->GetNumNodes();
for (uint32 i=0; i<numNodes; ++i)
{
uint16 motionSource = i;
// get the motion source from the map
if (mMap[i] != MCORE_INVALIDINDEX32)
motionSource = static_cast<uint16>( mMap[i] );
}
*/
// apply the current map as command
ApplyCurrentMapAsCommand();
}
@@ -1172,8 +1112,8 @@ namespace EMStudio
return;
}
const uint32 numNodes = actor->GetNumNodes();
for (uint32 i = 0; i < numNodes; ++i)
const size_t numNodes = actor->GetNumNodes();
for (size_t i = 0; i < numNodes; ++i)
{
if (actor->GetHasMirrorInfo())
{
@@ -1184,12 +1124,12 @@ namespace EMStudio
}
else
{
mMap[i] = MCORE_INVALIDINDEX32;
mMap[i] = InvalidIndex;
}
}
else
{
mMap[i] = MCORE_INVALIDINDEX32;
mMap[i] = InvalidIndex;
}
}
}
@@ -1207,10 +1147,10 @@ namespace EMStudio
// apply mirror changes
AZStd::string commandString = AZStd::string::format("AdjustActor -actorID %d -mirrorSetup \"", currentActor->GetID());
for (uint32 i = 0; i < currentActor->GetNumNodes(); ++i)
for (size_t i = 0; i < currentActor->GetNumNodes(); ++i)
{
uint32 sourceNode = mMap[i];
if (sourceNode != MCORE_INVALIDINDEX32 && sourceNode != i)
size_t sourceNode = mMap[i];
if (sourceNode != InvalidIndex && sourceNode != i)
{
commandString += currentActor->GetSkeleton()->GetNode(i)->GetName();
commandString += ",";
@@ -79,14 +79,14 @@ namespace EMStudio
QIcon* mNodeIcon;
QIcon* mMeshIcon;
QIcon* mMappedIcon;
AZStd::vector<uint32> mCurrentBoneList;
AZStd::vector<uint32> mSourceBoneList;
AZStd::vector<uint32> mMap;
AZStd::vector<size_t> mCurrentBoneList;
AZStd::vector<size_t> mSourceBoneList;
AZStd::vector<size_t> mMap;
void FillCurrentListWidget(EMotionFX::Actor* actor, const QString& filterString);
void FillSourceListWidget(EMotionFX::Actor* actor, const QString& filterString);
void FillMappingTable(EMotionFX::Actor* currentActor, EMotionFX::Actor* sourceActor);
void PerformMapping(uint32 currentNodeIndex, uint32 sourceNodeIndex);
void PerformMapping(size_t currentNodeIndex, size_t sourceNodeIndex);
void RemoveCurrentSelectedMapping();
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);
@@ -615,31 +615,31 @@ namespace EMotionFX
return;
}
const AZ::u32 numLodLevels = actor->GetNumLODLevels();
const size_t numLodLevels = actor->GetNumLODLevels();
const Skeleton* skeleton = actor->GetSkeleton();
const AZ::u32 numNodes = skeleton->GetNumNodes();
const size_t numNodes = skeleton->GetNumNodes();
m_nodeInfos.resize(numNodes);
AZStd::vector<AZStd::vector<uint32> > boneListPerLodLevel;
AZStd::vector<AZStd::vector<size_t> > boneListPerLodLevel;
boneListPerLodLevel.resize(numLodLevels);
for (AZ::u32 lodLevel = 0; lodLevel < numLodLevels; ++lodLevel)
for (size_t lodLevel = 0; lodLevel < numLodLevels; ++lodLevel)
{
actor->ExtractBoneList(lodLevel, &boneListPerLodLevel[lodLevel]);
}
for (AZ::u32 nodeIndex = 0; nodeIndex < numNodes; ++nodeIndex)
for (size_t nodeIndex = 0; nodeIndex < numNodes; ++nodeIndex)
{
NodeInfo& nodeInfo = m_nodeInfos[nodeIndex];
// Is bone?
nodeInfo.m_isBone = AZStd::any_of(begin(boneListPerLodLevel), end(boneListPerLodLevel), [nodeIndex](const AZStd::vector<uint32>& lodLevel)
nodeInfo.m_isBone = AZStd::any_of(begin(boneListPerLodLevel), end(boneListPerLodLevel), [nodeIndex](const AZStd::vector<size_t>& lodLevel)
{
return AZStd::find(begin(lodLevel), end(lodLevel), nodeIndex) != end(lodLevel);
});
// Has mesh?
nodeInfo.m_hasMesh = false;
for (AZ::u32 lodLevel = 0; lodLevel < numLodLevels; ++lodLevel)
for (size_t lodLevel = 0; lodLevel < numLodLevels; ++lodLevel)
{
if (actor->GetMesh(lodLevel, nodeIndex))
{