| #include "rive/bones/weight.hpp" | |
| #include "rive/container_component.hpp" | |
| #include "rive/shapes/vertex.hpp" | |
| using namespace rive; | |
| StatusCode Weight::onAddedDirty(CoreContext* context) { | |
| StatusCode code = Super::onAddedDirty(context); | |
| if (code != StatusCode::Ok) { | |
| return code; | |
| } | |
| if (!parent()->is<Vertex>()) { | |
| return StatusCode::MissingObject; | |
| } | |
| parent()->as<Vertex>()->weight(this); | |
| return StatusCode::Ok; | |
| } | |
| static int encodedWeightValue(unsigned int index, unsigned int data) { | |
| return (data >> (index * 8)) & 0xFF; | |
| } | |
| Mat2D Weight::deform(unsigned int indices, | |
| unsigned int weights, | |
| const float* boneTransforms) { | |
| float xx = 0, xy = 0, yx = 0, yy = 0, tx = 0, ty = 0; | |
| for (int i = 0; i < 4; i++) { | |
| int weight = encodedWeightValue(i, weights); | |
| if (weight == 0) { | |
| continue; | |
| } | |
| float normalizedWeight = weight / 255.0f; | |
| int index = encodedWeightValue(i, indices); | |
| int startBoneTransformIndex = index * 6; | |
| xx += boneTransforms[startBoneTransformIndex++] * normalizedWeight; | |
| xy += boneTransforms[startBoneTransformIndex++] * normalizedWeight; | |
| yx += boneTransforms[startBoneTransformIndex++] * normalizedWeight; | |
| yy += boneTransforms[startBoneTransformIndex++] * normalizedWeight; | |
| tx += boneTransforms[startBoneTransformIndex++] * normalizedWeight; | |
| ty += boneTransforms[startBoneTransformIndex++] * normalizedWeight; | |
| } | |
| return Mat2D(xx, xy, yx, yy, tx, ty); | |
| } |