blob: 642a6e4b1c2c8b3a278d76a6171a6c0fbf0a53e2 [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);
}