You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.7 KiB
61 lines
1.7 KiB
#include "DeformVertices.h"
|
|
#include "../armature/Armature.h"
|
|
#include "../armature/Bone.h"
|
|
#include "../model/DisplayData.h"
|
|
#include "../model/DragonBonesData.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 |