|  | #include "rive/bones/weight.hpp" | 
|  | #include "rive/container_component.hpp" | 
|  | #include "rive/shapes/path_vertex.hpp" | 
|  |  | 
|  | using namespace rive; | 
|  |  | 
|  | StatusCode Weight::onAddedDirty(CoreContext* context) | 
|  | { | 
|  | StatusCode code = Super::onAddedDirty(context); | 
|  | if (code != StatusCode::Ok) | 
|  | { | 
|  | return code; | 
|  | } | 
|  | if (!parent()->is<PathVertex>()) | 
|  | { | 
|  | return StatusCode::MissingObject; | 
|  | } | 
|  |  | 
|  | parent()->as<PathVertex>()->weight(this); | 
|  |  | 
|  | return StatusCode::Ok; | 
|  | } | 
|  |  | 
|  | static int encodedWeightValue(unsigned int index, unsigned int data) | 
|  | { | 
|  | return (data >> (index * 8)) & 0xFF; | 
|  | } | 
|  |  | 
|  | void Weight::deform(float x, | 
|  | float y, | 
|  | unsigned int indices, | 
|  | unsigned int weights, | 
|  | const Mat2D& world, | 
|  | const float* boneTransforms, | 
|  | Vec2D& result) | 
|  | { | 
|  | float xx = 0, xy = 0, yx = 0, yy = 0, tx = 0, ty = 0; | 
|  | float rx = world[0] * x + world[2] * y + world[4]; | 
|  | float ry = world[1] * x + world[3] * y + world[5]; | 
|  | 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; | 
|  | } | 
|  | result[0] = xx * rx + yx * ry + tx; | 
|  | result[1] = xy * rx + yy * ry + ty; | 
|  | } |