| #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; | |
| } | |
| Vec2D Weight::deform(Vec2D inPoint, | |
| unsigned int indices, | |
| unsigned int weights, | |
| const Mat2D& world, | |
| 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) * (world * inPoint); | |
| } |