[c] Updated noRotationOrReflection math

This commit is contained in:
badlogic 2016-10-19 14:35:23 +02:00
parent 2e04c98b9e
commit ee9d202538

View File

@ -128,29 +128,26 @@ void spBone_updateWorldTransformWith (spBone* self, float x, float y, float rota
break; break;
} }
case SP_TRANSFORMMODE_NOROTATIONORREFLECTION: { case SP_TRANSFORMMODE_NOROTATIONORREFLECTION: {
float psx = SQRT(pa * pa + pc * pc), psy, prx; float s = pa * pa + pc * pc;
float rx, ry, la, lb, lc, ld; float prx, rx, ry, la, lb, lc, ld;
if (psx > 0.0001f) { if (s > 0.0001f) {
psy = ABS((pa * pd - pb * pc) / psx); s = ABS(pa * pd - pb * pc) / s;
pb = pc * s;
pd = pa * s;
prx = ATAN2(pc, pa) * RAD_DEG; prx = ATAN2(pc, pa) * RAD_DEG;
} else { } else {
psx = 0; pa = 0;
psy = SQRT(pb * pb + pd * pd); pc = 0;
prx = 90 - atan2(pd, pb) * RAD_DEG; prx = 90 - ATAN2(pd, pb) * RAD_DEG;
} }
cosine = COS_DEG(prx), sine = SIN_DEG(prx);
pa = cosine * psx;
pb = -sine * psy;
pc = sine * psx;
pd = cosine * psy;
rx = rotation + shearX - prx; rx = rotation + shearX - prx;
ry = rotation + shearY - prx + 90; ry = rotation + shearY - prx + 90;
la = COS_DEG(rx) * scaleX; la = COS_DEG(rx) * scaleX;
lb = COS_DEG(ry) * scaleY; lb = COS_DEG(ry) * scaleY;
lc = SIN_DEG(rx) * scaleX; lc = SIN_DEG(rx) * scaleX;
ld = SIN_DEG(ry) * scaleY; ld = SIN_DEG(ry) * scaleY;
CONST_CAST(float, self->a) = pa * la + pb * lc; CONST_CAST(float, self->a) = pa * la - pb * lc;
CONST_CAST(float, self->b) = pa * lb + pb * ld; CONST_CAST(float, self->b) = pa * lb - pb * ld;
CONST_CAST(float, self->c) = pc * la + pd * lc; CONST_CAST(float, self->c) = pc * la + pd * lc;
CONST_CAST(float, self->d) = pc * lb + pd * ld; CONST_CAST(float, self->d) = pc * lb + pd * ld;
break; break;