axmol/extensions/DragonBones/armature/DeformVertices.cpp

75 lines
1.8 KiB
C++

#include "DeformVertices.h"
#include "../model/DragonBonesData.h"
#include "../model/DisplayData.h"
#include "../armature/Armature.h"
#include "../armature/Bone.h"
DRAGONBONES_NAMESPACE_BEGIN
void DeformVertices::_onClear()
{
verticesDirty = false;
vertices.clear();
bones.clear();
verticesData = nullptr;
}
void DeformVertices::init(const VerticesData* verticesDataValue, Armature* armature)
{
verticesData = verticesDataValue;
if (verticesData != nullptr)
{
unsigned vertexCount = 0;
if (verticesData->weight != nullptr)
{
vertexCount = verticesData->weight->count * 2;
}
else {
vertexCount = verticesData->data->intArray[verticesData->offset + (unsigned)BinaryOffset::MeshVertexCount] * 2;
}
verticesDirty = true;
vertices.resize(vertexCount);
bones.clear();
//
for (std::size_t i = 0, l = vertices.size(); i < l; ++i)
{
vertices[i] = 0.0f;
}
if (verticesData->weight != nullptr)
{
for (std::size_t i = 0, l = verticesData->weight->bones.size(); i < l; ++i)
{
const auto bone = armature->getBone(verticesData->weight->bones[i]->name);
if (bone != nullptr)
{
bones.push_back(bone);
}
}
}
}
else
{
verticesDirty = false;
vertices.clear();
bones.clear();
verticesData = nullptr;
}
}
bool DeformVertices::isBonesUpdate() const
{
for (const auto bone : bones)
{
if (bone != nullptr && bone->_childrenTransformDirty)
{
return true;
}
}
return false;
}
DRAGONBONES_NAMESPACE_END