mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +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 tangents = rotateMode == SP_ROTATE_MODE_TANGENT, scale = rotateMode == SP_ROTATE_MODE_CHAIN_SCALE;
|
||||||
int boneCount = self->bonesCount, spacesCount = tangents ? boneCount : boneCount + 1;
|
int boneCount = self->bonesCount, spacesCount = tangents ? boneCount : boneCount + 1;
|
||||||
spBone** bones = self->bones;
|
spBone** bones = self->bones;
|
||||||
|
spBone* pa;
|
||||||
|
|
||||||
if (!translate && !rotate) return;
|
if (!translate && !rotate) return;
|
||||||
if ((attachment == 0) || (attachment->super.super.type != SP_ATTACHMENT_PATH)) 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,
|
positions = spPathConstraint_computeWorldPositions(self, attachment, spacesCount, tangents,
|
||||||
data->positionMode == SP_POSITION_MODE_PERCENT, spacingMode == SP_SPACING_MODE_PERCENT);
|
data->positionMode == SP_POSITION_MODE_PERCENT, spacingMode == SP_SPACING_MODE_PERCENT);
|
||||||
boneX = positions[0], boneY = positions[1], offsetRotation = self->data->offsetRotation;
|
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) {
|
for (i = 0, p = 3; i < boneCount; i++, p += 3) {
|
||||||
spBone* bone = bones[i];
|
spBone* bone = bones[i];
|
||||||
CONST_CAST(float, bone->worldX) += (boneX - bone->worldX) * translateMix;
|
CONST_CAST(float, bone->worldX) += (boneX - bone->worldX) * translateMix;
|
||||||
@ -158,7 +166,8 @@ void spPathConstraint_apply (spPathConstraint* self) {
|
|||||||
length = bone->data->length;
|
length = bone->data->length;
|
||||||
boneX += (length * (cosine * a - sine * c) - dx) * rotateMix;
|
boneX += (length * (cosine * a - sine * c) - dx) * rotateMix;
|
||||||
boneY += (length * (sine * a + cosine * c) - dy) * rotateMix;
|
boneY += (length * (sine * a + cosine * c) - dy) * rotateMix;
|
||||||
}
|
} else
|
||||||
|
r += offsetRotation;
|
||||||
if (r > PI)
|
if (r > PI)
|
||||||
r -= PI2;
|
r -= PI2;
|
||||||
else if (r < -PI)
|
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;
|
float rotateMix = self->rotateMix, translateMix = self->translateMix, scaleMix = self->scaleMix, shearMix = self->shearMix;
|
||||||
spBone* target = self->target;
|
spBone* target = self->target;
|
||||||
float ta = target->a, tb = target->b, tc = target->c, td = target->d;
|
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 /*bool*/ modified;
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < self->bonesCount; ++i) {
|
for (i = 0; i < self->bonesCount; ++i) {
|
||||||
@ -65,7 +67,7 @@ void spTransformConstraint_apply (spTransformConstraint* self) {
|
|||||||
|
|
||||||
if (rotateMix != 0) {
|
if (rotateMix != 0) {
|
||||||
float a = bone->a, b = bone->b, c = bone->c, d = bone->d;
|
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;
|
float cosine, sine;
|
||||||
if (r > PI) r -= PI2;
|
if (r > PI) r -= PI2;
|
||||||
else 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);
|
float s = SQRT(b * b + d * d);
|
||||||
if (r > PI) r -= PI2;
|
if (r > PI) r -= PI2;
|
||||||
else 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->b) = COS(r) * s;
|
||||||
CONST_CAST(float, bone->d) = SIN(r) * s;
|
CONST_CAST(float, bone->d) = SIN(r) * s;
|
||||||
modified = 1;
|
modified = 1;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user