mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-10 00:58:43 +08:00
[c] Fixed Path/TransformConstraint handling of reflection
This commit is contained in:
parent
dbcc54fac4
commit
d84f9d8330
@ -89,6 +89,7 @@ void spPathConstraint_apply (spPathConstraint* self) {
|
||||
int tangents = rotateMode == SP_ROTATE_MODE_TANGENT, scale = rotateMode == SP_ROTATE_MODE_CHAIN_SCALE;
|
||||
int boneCount = self->bonesCount, spacesCount = tangents ? boneCount : boneCount + 1;
|
||||
spBone** bones = self->bones;
|
||||
spBone* pa;
|
||||
|
||||
if (!translate && !rotate) return;
|
||||
if ((attachment == 0) || (attachment->super.super.type != SP_ATTACHMENT_PATH)) return;
|
||||
@ -127,7 +128,14 @@ void spPathConstraint_apply (spPathConstraint* self) {
|
||||
positions = spPathConstraint_computeWorldPositions(self, attachment, spacesCount, tangents,
|
||||
data->positionMode == SP_POSITION_MODE_PERCENT, spacingMode == SP_SPACING_MODE_PERCENT);
|
||||
boneX = positions[0], boneY = positions[1], offsetRotation = self->data->offsetRotation;
|
||||
tip = rotateMode == SP_ROTATE_MODE_CHAIN_SCALE && offsetRotation == 0;
|
||||
tip = 0;
|
||||
if (offsetRotation == 0)
|
||||
tip = rotateMode == SP_ROTATE_MODE_CHAIN;
|
||||
else {
|
||||
tip = 0;
|
||||
pa = self->target->bone;
|
||||
offsetRotation *= pa->a * pa->d - pa->b * pa->c > 0 ? DEG_RAD : -DEG_RAD;
|
||||
}
|
||||
for (i = 0, p = 3; i < boneCount; i++, p += 3) {
|
||||
spBone* bone = bones[i];
|
||||
CONST_CAST(float, bone->worldX) += (boneX - bone->worldX) * translateMix;
|
||||
@ -158,7 +166,8 @@ void spPathConstraint_apply (spPathConstraint* self) {
|
||||
length = bone->data->length;
|
||||
boneX += (length * (cosine * a - sine * c) - dx) * rotateMix;
|
||||
boneY += (length * (sine * a + cosine * c) - dy) * rotateMix;
|
||||
}
|
||||
} else
|
||||
r += offsetRotation;
|
||||
if (r > PI)
|
||||
r -= PI2;
|
||||
else if (r < -PI)
|
||||
|
||||
@ -57,6 +57,8 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
|
||||
float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
|
||||
spBone* target = self->target;
|
||||
float ta = target->a, tb = target->b, tc = target->c, td = target->d;
|
||||
float degRadReflect = ta * td - tb * tc > 0 ? DEG_RAD : -DEG_RAD;
|
||||
float offsetRotation = self->data->offsetRotation * degRadReflect, offsetShearY = self->data->offsetShearY * degRadReflect;
|
||||
int /*bool*/ modified;
|
||||
int i;
|
||||
for (i = 0; i < self->bonesCount; ++i) {
|
||||
@ -65,7 +67,7 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
|
||||
|
||||
if (rotateMix != 0) {
|
||||
float a = bone->a, b = bone->b, c = bone->c, d = bone->d;
|
||||
float r = ATAN2(tc, ta) - ATAN2(c, a) + self->data->offsetRotation * DEG_RAD;
|
||||
float r = ATAN2(tc, ta) - ATAN2(c, a) + offsetRotation;
|
||||
float cosine, sine;
|
||||
if (r > PI) r -= PI2;
|
||||
else if (r < -PI) r += PI2;
|
||||
@ -108,7 +110,7 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
|
||||
float s = SQRT(b * b + d * d);
|
||||
if (r > PI) r -= PI2;
|
||||
else if (r < -PI) r += PI2;
|
||||
r = by + (r + self->data->offsetShearY * DEG_RAD) * shearMix;
|
||||
r = by + (r + offsetShearY) * shearMix;
|
||||
CONST_CAST(float, bone->b) = COS(r) * s;
|
||||
CONST_CAST(float, bone->d) = SIN(r) * s;
|
||||
modified = 1;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user