mirror of https://github.com/axmolengine/axmol.git
75 lines
1.8 KiB
C++
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
|