blob: 9f00714ec90d55e7d5f0d3ae47eb242d773da554 [file] [log] [blame]
#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);
}