31
31
32
32
package com .esotericsoftware .spine ;
33
33
34
+ import static com .badlogic .gdx .math .MathUtils .*;
34
35
import static com .badlogic .gdx .math .Matrix3 .*;
35
36
36
- import com .badlogic .gdx .math .MathUtils ;
37
37
import com .badlogic .gdx .math .Matrix3 ;
38
38
import com .badlogic .gdx .math .Vector2 ;
39
39
40
40
public class Bone implements Updatable {
41
41
final BoneData data ;
42
42
final Skeleton skeleton ;
43
43
final Bone parent ;
44
- float x , y , rotation , scaleX , scaleY ;
44
+ float x , y , rotation , scaleX , scaleY , shearX , shearY ;
45
45
float appliedRotation , appliedScaleX , appliedScaleY ;
46
46
47
47
float a , b , worldX ;
@@ -76,26 +76,30 @@ public Bone (Bone bone, Skeleton skeleton, Bone parent) {
76
76
rotation = bone .rotation ;
77
77
scaleX = bone .scaleX ;
78
78
scaleY = bone .scaleY ;
79
+ shearX = bone .shearX ;
80
+ shearY = bone .shearY ;
79
81
}
80
82
81
83
/** Same as {@link #updateWorldTransform()}. This method exists for Bone to implement {@link Updatable}. */
82
84
public void update () {
83
- updateWorldTransform (x , y , rotation , scaleX , scaleY );
85
+ updateWorldTransform (x , y , rotation , scaleX , scaleY , shearX , shearY );
84
86
}
85
87
86
88
/** Computes the world SRT using the parent bone and this bone's local SRT. */
87
89
public void updateWorldTransform () {
88
- updateWorldTransform (x , y , rotation , scaleX , scaleY );
90
+ updateWorldTransform (x , y , rotation , scaleX , scaleY , shearX , shearY );
89
91
}
90
92
91
93
/** Computes the world SRT using the parent bone and the specified local SRT. */
92
- public void updateWorldTransform (float x , float y , float rotation , float scaleX , float scaleY ) {
94
+ public void updateWorldTransform (float x , float y , float rotation , float scaleX , float scaleY , float shearX , float shearY ) {
93
95
appliedRotation = rotation ;
94
96
appliedScaleX = scaleX ;
95
97
appliedScaleY = scaleY ;
96
98
97
- float cos = MathUtils .cosDeg (rotation ), sin = MathUtils .sinDeg (rotation );
98
- float la = cos * scaleX , lb = -sin * scaleY , lc = sin * scaleX , ld = cos * scaleY ;
99
+ float rotationY = rotation + 90 + shearY ;
100
+ float la = cosDeg (rotation + shearX ) * scaleX , lb = cosDeg (rotationY ) * scaleY ;
101
+ float lc = sinDeg (rotation + shearX ) * scaleX , ld = sinDeg (rotationY ) * scaleY ;
102
+
99
103
Bone parent = this .parent ;
100
104
if (parent == null ) { // Root bone.
101
105
Skeleton skeleton = this .skeleton ;
@@ -131,68 +135,67 @@ public void updateWorldTransform (float x, float y, float rotation, float scaleX
131
135
b = pa * lb + pb * ld ;
132
136
c = pc * la + pd * lc ;
133
137
d = pc * lb + pd * ld ;
134
- } else if (data .inheritRotation ) { // No scale inheritance.
135
- pa = 1 ;
136
- pb = 0 ;
137
- pc = 0 ;
138
- pd = 1 ;
139
- do {
140
- cos = MathUtils .cosDeg (parent .appliedRotation );
141
- sin = MathUtils .sinDeg (parent .appliedRotation );
142
- float temp = pa * cos + pb * sin ;
143
- pb = pa * -sin + pb * cos ;
144
- pa = temp ;
145
- temp = pc * cos + pd * sin ;
146
- pd = pc * -sin + pd * cos ;
147
- pc = temp ;
148
- parent = parent .parent ;
149
- } while (parent != null );
150
- a = pa * la + pb * lc ;
151
- b = pa * lb + pb * ld ;
152
- c = pc * la + pd * lc ;
153
- d = pc * lb + pd * ld ;
154
- if (skeleton .flipX ) {
155
- a = -a ;
156
- b = -b ;
157
- }
158
- if (skeleton .flipY ) {
159
- c = -c ;
160
- d = -d ;
138
+ } else {
139
+ if (data .inheritRotation ) { // No scale inheritance.
140
+ pa = 1 ;
141
+ pb = 0 ;
142
+ pc = 0 ;
143
+ pd = 1 ;
144
+ do {
145
+ float cos = cosDeg (parent .appliedRotation ), sin = sinDeg (parent .appliedRotation );
146
+ float temp = pa * cos + pb * sin ;
147
+ pb = pa * -sin + pb * cos ;
148
+ pa = temp ;
149
+ temp = pc * cos + pd * sin ;
150
+ pd = pc * -sin + pd * cos ;
151
+ pc = temp ;
152
+
153
+ if (!parent .data .inheritRotation ) break ;
154
+ parent = parent .parent ;
155
+ } while (parent != null );
156
+ a = pa * la + pb * lc ;
157
+ b = pa * lb + pb * ld ;
158
+ c = pc * la + pd * lc ;
159
+ d = pc * lb + pd * ld ;
160
+ } else if (data .inheritScale ) { // No rotation inheritance.
161
+ pa = 1 ;
162
+ pb = 0 ;
163
+ pc = 0 ;
164
+ pd = 1 ;
165
+ do {
166
+ float r = parent .appliedRotation , cos = cosDeg (r ), sin = sinDeg (r );
167
+ float psx = parent .appliedScaleX , psy = parent .appliedScaleY ;
168
+ float za = cos * psx , zb = -sin * psy , zc = sin * psx , zd = cos * psy ;
169
+ float temp = pa * za + pb * zc ;
170
+ pb = pa * zb + pb * zd ;
171
+ pa = temp ;
172
+ temp = pc * za + pd * zc ;
173
+ pd = pc * zb + pd * zd ;
174
+ pc = temp ;
175
+
176
+ if (psx < 0 ) r = -r ;
177
+ cos = cosDeg (-r );
178
+ sin = sinDeg (-r );
179
+ temp = pa * cos + pb * sin ;
180
+ pb = pa * -sin + pb * cos ;
181
+ pa = temp ;
182
+ temp = pc * cos + pd * sin ;
183
+ pd = pc * -sin + pd * cos ;
184
+ pc = temp ;
185
+
186
+ if (!parent .data .inheritScale ) break ;
187
+ parent = parent .parent ;
188
+ } while (parent != null );
189
+ a = pa * la + pb * lc ;
190
+ b = pa * lb + pb * ld ;
191
+ c = pc * la + pd * lc ;
192
+ d = pc * lb + pd * ld ;
193
+ } else {
194
+ a = la ;
195
+ b = lb ;
196
+ c = lc ;
197
+ d = ld ;
161
198
}
162
- } else if (data .inheritScale ) { // No rotation inheritance.
163
- pa = 1 ;
164
- pb = 0 ;
165
- pc = 0 ;
166
- pd = 1 ;
167
- do {
168
- float r = parent .rotation ;
169
- cos = MathUtils .cosDeg (r );
170
- sin = MathUtils .sinDeg (r );
171
- float psx = parent .appliedScaleX , psy = parent .appliedScaleY ;
172
- float za = cos * psx , zb = -sin * psy , zc = sin * psx , zd = cos * psy ;
173
- float temp = pa * za + pb * zc ;
174
- pb = pa * zb + pb * zd ;
175
- pa = temp ;
176
- temp = pc * za + pd * zc ;
177
- pd = pc * zb + pd * zd ;
178
- pc = temp ;
179
-
180
- if (psx < 0 ) r = -r ;
181
- cos = MathUtils .cosDeg (-r );
182
- sin = MathUtils .sinDeg (-r );
183
- temp = pa * cos + pb * sin ;
184
- pb = pa * -sin + pb * cos ;
185
- pa = temp ;
186
- temp = pc * cos + pd * sin ;
187
- pd = pc * -sin + pd * cos ;
188
- pc = temp ;
189
-
190
- parent = parent .parent ;
191
- } while (parent != null );
192
- a = pa * la + pb * lc ;
193
- b = pa * lb + pb * ld ;
194
- c = pc * la + pd * lc ;
195
- d = pc * lb + pd * ld ;
196
199
if (skeleton .flipX ) {
197
200
a = -a ;
198
201
b = -b ;
@@ -201,11 +204,6 @@ public void updateWorldTransform (float x, float y, float rotation, float scaleX
201
204
c = -c ;
202
205
d = -d ;
203
206
}
204
- } else {
205
- a = la ;
206
- b = lb ;
207
- c = lc ;
208
- d = ld ;
209
207
}
210
208
}
211
209
@@ -216,6 +214,8 @@ public void setToSetupPose () {
216
214
rotation = data .rotation ;
217
215
scaleX = data .scaleX ;
218
216
scaleY = data .scaleY ;
217
+ shearX = data .shearX ;
218
+ shearY = data .shearY ;
219
219
}
220
220
221
221
public BoneData getData () {
@@ -251,7 +251,6 @@ public void setPosition (float x, float y) {
251
251
this .y = y ;
252
252
}
253
253
254
- /** Returns the forward kinetics rotation. */
255
254
public float getRotation () {
256
255
return rotation ;
257
256
}
@@ -286,6 +285,22 @@ public void setScale (float scale) {
286
285
scaleY = scale ;
287
286
}
288
287
288
+ public float getShearX () {
289
+ return shearX ;
290
+ }
291
+
292
+ public void setShearX (float shearX ) {
293
+ this .shearX = shearX ;
294
+ }
295
+
296
+ public float getShearY () {
297
+ return shearY ;
298
+ }
299
+
300
+ public void setShearY (float shearY ) {
301
+ this .shearY = shearY ;
302
+ }
303
+
289
304
public float getA () {
290
305
return a ;
291
306
}
@@ -319,11 +334,11 @@ public float getWorldSignY () {
319
334
}
320
335
321
336
public float getWorldRotationX () {
322
- return MathUtils . atan2 (c , a ) * MathUtils . radDeg ;
337
+ return atan2 (c , a ) * radDeg ;
323
338
}
324
339
325
340
public float getWorldRotationY () {
326
- return MathUtils . atan2 (d , b ) * MathUtils . radDeg ;
341
+ return atan2 (d , b ) * radDeg ;
327
342
}
328
343
329
344
public float getWorldScaleX () {
@@ -353,8 +368,8 @@ public Vector2 worldToLocal (Vector2 world) {
353
368
float x = world .x - worldX , y = world .y - worldY ;
354
369
float a = this .a , b = this .b , c = this .c , d = this .d ;
355
370
float invDet = 1 / (a * d - b * c );
356
- world .x = (x * a * invDet - y * b * invDet );
357
- world .y = (y * d * invDet - x * c * invDet );
371
+ world .x = (x * d * invDet - y * b * invDet );
372
+ world .y = (y * a * invDet - x * c * invDet );
358
373
return world ;
359
374
}
360
375
0 commit comments