Better disable inherit rotation.

But not good, flips with negative scale.
This commit is contained in:
NathanSweet 2016-08-15 16:19:33 +02:00
parent 3160077207
commit c5d3d84f71

View File

@ -158,71 +158,63 @@ public class Bone implements Updatable {
b = cos(r) * s; b = cos(r) * s;
d = sin(r) * s; d = sin(r) * s;
} else if (data.inheritScale) { // No rotation inheritance. } else if (data.inheritScale) { // No rotation inheritance.
// float psx = (float)Math.sqrt(pa * pa + pc * pc), psy, pr; float psx = (float)Math.sqrt(pa * pa + pc * pc), psy, pr;
// if (psx > 0.0001f) { if (psx > 0.0001f) {
// float det = pa * pd - pb * pc; float det = pa * pd - pb * pc;
// psy = det / psx; psy = det / psx;
// rotationY = atan2(pa * pb + pc * pd, det) * radDeg + 90; pr = atan2(pc, pa) * radDeg;
// pr = atan2(pc, pa) * radDeg; } else {
// } else { psx = 0;
// psx = 0; psy = (float)Math.sqrt(pb * pb + pd * pd);
// psy = (float)Math.sqrt(pb * pb + pd * pd); pr = 90 - atan2(pd, pb) * radDeg;
// rotationY = 90; }
// pr = 90 - atan2(pd, pb) * radDeg; float blend;
// } if (pr < -90)
// blend = 1 + (pr + 90) / 90;
// float blend; else if (pr < 0)
// if (pr < -90) blend = -pr / 90;
// blend = 1 + (pr + 90) / 90; else if (pr < 90)
// else if (pr < 0) blend = pr / 90;
// blend = -pr / 90; else
// else if (pr < 90) blend = 1 - (pr - 90) / 90;
// blend = pr / 90; pa = lerp(psx, Math.abs(psy) * Math.signum(psx), blend);
// else pd = lerp(psy, Math.abs(psx) * Math.signum(psy), blend);
// blend = 1f - (pr - 90) / 90; a = pa * la;
// b = pa * lb;
// pa = lerp(psx, Math.abs(psy) * Math.signum(psx), blend); c = pd * lc;
// psy = lerp(psy, Math.abs(psx) * Math.signum(psy), blend); d = pd * ld;
// pb = cosDeg(rotationY) * psy;
// pc = 0;
// pd = sinDeg(rotationY) * psy;
//
// a = pa * la + pb * lc;
// b = pa * lb + pb * ld;
// c = pc * la + pd * lc;
// d = pc * lb + pd * ld;
pa = 1; // pa = 1;
pb = 0; // pb = 0;
pc = 0; // pc = 0;
pd = 1; // pd = 1;
do { // do {
float cos = cosDeg(parent.arotation), sin = sinDeg(parent.arotation); // if (!parent.appliedValid) parent.updateAppliedTransform();
float psx = parent.ascaleX, psy = parent.ascaleY; // float cos = cosDeg(parent.arotation), sin = sinDeg(parent.arotation);
float za = cos * psx, zb = sin * psy, zc = sin * psx, zd = cos * psy; // float psx = parent.ascaleX, psy = parent.ascaleY;
float temp = pa * za + pb * zc; // float za = cos * psx, zb = sin * psy, zc = sin * psx, zd = cos * psy;
pb = pb * zd - pa * zb; // float temp = pa * za + pb * zc;
pa = temp; // pb = pb * zd - pa * zb;
temp = pc * za + pd * zc; // pa = temp;
pd = pd * zd - pc * zb; // temp = pc * za + pd * zc;
pc = temp; // pd = pd * zd - pc * zb;
// pc = temp;
if (psx >= 0) // BOZO! - Why? Should always do this? Fix in new code? //
sin = -sin; // if (psx >= 0) sin = -sin;
temp = pa * cos + pb * sin; // temp = pa * cos + pb * sin;
pb = pb * cos - pa * sin; // pb = pb * cos - pa * sin;
pa = temp; // pa = temp;
temp = pc * cos + pd * sin; // temp = pc * cos + pd * sin;
pd = pd * cos - pc * sin; // pd = pd * cos - pc * sin;
pc = temp; // pc = temp;
//
if (!parent.data.inheritScale) break; // if (!parent.data.inheritScale) break;
parent = parent.parent; // parent = parent.parent;
} while (parent != null); // } while (parent != null);
a = pa * la + pb * lc; // a = pa * la + pb * lc;
b = pa * lb + pb * ld; // b = pa * lb + pb * ld;
c = pc * la + pd * lc; // c = pc * la + pd * lc;
d = pc * lb + pd * ld; // d = pc * lb + pd * ld;
} else { } else {
a = la; a = la;
b = lb; b = lb;