mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-10 17:18:44 +08:00
[libgdx] Added physics limit, smaller binary size.
This commit is contained in:
parent
0ffc316793
commit
254a4847fa
@ -37,9 +37,9 @@ import com.badlogic.gdx.utils.Array;
|
||||
public class IkConstraintData extends ConstraintData {
|
||||
final Array<BoneData> bones = new Array();
|
||||
BoneData target;
|
||||
int bendDirection = 1;
|
||||
int bendDirection;
|
||||
boolean compress, stretch, uniform;
|
||||
float mix = 1, softness;
|
||||
float mix, softness;
|
||||
|
||||
public IkConstraintData (String name) {
|
||||
super(name);
|
||||
|
||||
@ -150,14 +150,16 @@ public class PhysicsConstraint implements Updatable {
|
||||
ux = bx;
|
||||
uy = by;
|
||||
} else {
|
||||
float a = remaining, i = inertia, t = data.step, f = skeleton.data.referenceScale, d = -1;
|
||||
float a = remaining, i = inertia, q = data.limit, t = data.step, f = skeleton.data.referenceScale, d = -1;
|
||||
if (x || y) {
|
||||
if (x) {
|
||||
xOffset += (ux - bx) * i;
|
||||
float u = (ux - bx) * i;
|
||||
xOffset += u > q ? q : u < -q ? -q : u;
|
||||
ux = bx;
|
||||
}
|
||||
if (y) {
|
||||
yOffset += (uy - by) * i;
|
||||
float u = (uy - by) * i;
|
||||
yOffset += u > q ? q : u < -q ? -q : u;
|
||||
uy = by;
|
||||
}
|
||||
if (a >= t) {
|
||||
@ -184,7 +186,9 @@ public class PhysicsConstraint implements Updatable {
|
||||
float ca = atan2(bone.c, bone.a), c, s, mr = 0;
|
||||
if (rotateOrShearX) {
|
||||
mr = (data.rotate + data.shearX) * mix;
|
||||
float dx = cx - bone.worldX, dy = cy - bone.worldY, r = atan2(dy + ty, dx + tx) - ca - rotateOffset * mr;
|
||||
float dx = cx - bone.worldX, dy = cy - bone.worldY;
|
||||
float r = atan2((dy > q ? q : dy < -q ? -q : dy) + ty, (dx > q ? q : dx < -q ? -q : dx) + tx) - ca
|
||||
- rotateOffset * mr;
|
||||
rotateOffset += (r - (float)Math.ceil(r * invPI2 - 0.5f) * PI2) * i;
|
||||
r = rotateOffset * mr + ca;
|
||||
c = cos(r);
|
||||
|
||||
@ -34,7 +34,7 @@ package com.esotericsoftware.spine;
|
||||
* See <a href="http://esotericsoftware.com/spine-physics-constraints">Physics constraints</a> in the Spine User Guide. */
|
||||
public class PhysicsConstraintData extends ConstraintData {
|
||||
BoneData bone;
|
||||
float x, y, rotate, scaleX, shearX;
|
||||
float x, y, rotate, scaleX, shearX, limit;
|
||||
float step, inertia, strength, damping, massInverse, wind, gravity, mix;
|
||||
boolean inertiaGlobal, strengthGlobal, dampingGlobal, massGlobal, windGlobal, gravityGlobal, mixGlobal;
|
||||
|
||||
@ -99,6 +99,14 @@ public class PhysicsConstraintData extends ConstraintData {
|
||||
this.shearX = shearX;
|
||||
}
|
||||
|
||||
public float getLimit () {
|
||||
return limit;
|
||||
}
|
||||
|
||||
public void setLimit (float limit) {
|
||||
this.limit = limit;
|
||||
}
|
||||
|
||||
public float getInertia () {
|
||||
return inertia;
|
||||
}
|
||||
|
||||
@ -256,14 +256,14 @@ public class SkeletonBinary extends SkeletonLoader {
|
||||
for (int ii = 0; ii < nn; ii++)
|
||||
constraintBones[ii] = bones[input.readInt(true)];
|
||||
data.target = (BoneData)bones[input.readInt(true)];
|
||||
data.mix = input.readFloat();
|
||||
data.softness = input.readFloat() * scale;
|
||||
int flags = input.read();
|
||||
data.skinRequired = (flags & 1) != 0;
|
||||
data.bendDirection = (flags & 2) != 0 ? 1 : -1;
|
||||
data.compress = (flags & 4) != 0;
|
||||
data.stretch = (flags & 8) != 0;
|
||||
data.uniform = (flags & 16) != 0;
|
||||
if ((flags & 32) != 0) data.mix = (flags & 64) != 0 ? input.readFloat() : 1;
|
||||
if ((flags & 128) != 0) data.softness = input.readFloat() * scale;
|
||||
o[i] = data;
|
||||
}
|
||||
|
||||
@ -280,18 +280,19 @@ public class SkeletonBinary extends SkeletonLoader {
|
||||
data.skinRequired = (flags & 1) != 0;
|
||||
data.local = (flags & 2) != 0;
|
||||
data.relative = (flags & 4) != 0;
|
||||
data.offsetRotation = input.readFloat();
|
||||
data.offsetX = input.readFloat() * scale;
|
||||
data.offsetY = input.readFloat() * scale;
|
||||
data.offsetScaleX = input.readFloat();
|
||||
data.offsetScaleY = input.readFloat();
|
||||
data.offsetShearY = input.readFloat();
|
||||
data.mixRotate = input.readFloat();
|
||||
data.mixX = input.readFloat();
|
||||
data.mixY = input.readFloat();
|
||||
data.mixScaleX = input.readFloat();
|
||||
data.mixScaleY = input.readFloat();
|
||||
data.mixShearY = input.readFloat();
|
||||
if ((flags & 8) != 0) data.offsetRotation = input.readFloat();
|
||||
if ((flags & 16) != 0) data.offsetX = input.readFloat() * scale;
|
||||
if ((flags & 32) != 0) data.offsetY = input.readFloat() * scale;
|
||||
if ((flags & 64) != 0) data.offsetScaleX = input.readFloat();
|
||||
if ((flags & 128) != 0) data.offsetScaleY = input.readFloat();
|
||||
flags = input.read();
|
||||
if ((flags & 1) != 0) data.offsetShearY = input.readFloat();
|
||||
if ((flags & 2) != 0) data.mixRotate = input.readFloat();
|
||||
if ((flags & 4) != 0) data.mixX = input.readFloat();
|
||||
if ((flags & 8) != 0) data.mixY = input.readFloat();
|
||||
if ((flags & 16) != 0) data.mixScaleX = input.readFloat();
|
||||
if ((flags & 32) != 0) data.mixScaleY = input.readFloat();
|
||||
if ((flags & 64) != 0) data.mixShearY = input.readFloat();
|
||||
o[i] = data;
|
||||
}
|
||||
|
||||
@ -305,10 +306,11 @@ public class SkeletonBinary extends SkeletonLoader {
|
||||
for (int ii = 0; ii < nn; ii++)
|
||||
constraintBones[ii] = bones[input.readInt(true)];
|
||||
data.target = (SlotData)slots[input.readInt(true)];
|
||||
data.positionMode = PositionMode.values[input.readInt(true)];
|
||||
data.spacingMode = SpacingMode.values[input.readInt(true)];
|
||||
data.rotateMode = RotateMode.values[input.readInt(true)];
|
||||
data.offsetRotation = input.readFloat();
|
||||
int flags = input.read();
|
||||
data.positionMode = PositionMode.values[flags & 1];
|
||||
data.spacingMode = SpacingMode.values[(flags >> 1) & 2];
|
||||
data.rotateMode = RotateMode.values[(flags >> 3) & 2];
|
||||
if ((flags & 128) != 0) data.offsetRotation = input.readFloat();
|
||||
data.position = input.readFloat();
|
||||
if (data.positionMode == PositionMode.fixed) data.position *= scale;
|
||||
data.spacing = input.readFloat();
|
||||
@ -332,14 +334,14 @@ public class SkeletonBinary extends SkeletonLoader {
|
||||
if ((flags & 8) != 0) data.rotate = input.readFloat();
|
||||
if ((flags & 16) != 0) data.scaleX = input.readFloat();
|
||||
if ((flags & 32) != 0) data.shearX = input.readFloat();
|
||||
data.limit = ((flags & 64) != 0 ? input.readFloat() : 500) * scale;
|
||||
data.step = 1f / input.readByte();
|
||||
data.inertia = input.readFloat();
|
||||
data.strength = input.readFloat();
|
||||
data.damping = input.readFloat();
|
||||
data.massInverse = input.readFloat();
|
||||
data.massInverse = (flags & 128) != 0 ? input.readFloat() : 1;
|
||||
data.wind = input.readFloat();
|
||||
data.gravity = input.readFloat();
|
||||
data.mix = input.readFloat();
|
||||
flags = input.read();
|
||||
if ((flags & 1) != 0) data.inertiaGlobal = true;
|
||||
if ((flags & 2) != 0) data.strengthGlobal = true;
|
||||
@ -348,6 +350,7 @@ public class SkeletonBinary extends SkeletonLoader {
|
||||
if ((flags & 16) != 0) data.windGlobal = true;
|
||||
if ((flags & 32) != 0) data.gravityGlobal = true;
|
||||
if ((flags & 64) != 0) data.mixGlobal = true;
|
||||
data.mix = (flags & 128) != 0 ? input.readFloat() : 1;
|
||||
o[i] = data;
|
||||
}
|
||||
|
||||
@ -468,7 +471,7 @@ public class SkeletonBinary extends SkeletonLoader {
|
||||
String path = (flags & 16) != 0 ? input.readStringRef() : null;
|
||||
int color = (flags & 32) != 0 ? input.readInt() : 0xffffffff;
|
||||
Sequence sequence = (flags & 64) != 0 ? readSequence(input) : null;
|
||||
float rotation = input.readFloat();
|
||||
float rotation = (flags & 128) != 0 ? input.readFloat() : 0;
|
||||
float x = input.readFloat();
|
||||
float y = input.readFloat();
|
||||
float scaleX = input.readFloat();
|
||||
@ -880,17 +883,18 @@ public class SkeletonBinary extends SkeletonLoader {
|
||||
for (int i = 0, n = input.readInt(true); i < n; i++) {
|
||||
int index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1;
|
||||
IkConstraintTimeline timeline = new IkConstraintTimeline(frameCount, input.readInt(true), index);
|
||||
float time = input.readFloat(), mix = input.readFloat(), softness = input.readFloat() * scale;
|
||||
int flags = input.read();
|
||||
float time = input.readFloat(), mix = (flags & 1) != 0 ? ((flags & 2) != 0 ? input.readFloat() : 1) : 0;
|
||||
float softness = (flags & 4) != 0 ? input.readFloat() * scale : 0;
|
||||
for (int frame = 0, bezier = 0;; frame++) {
|
||||
int flags = input.read();
|
||||
timeline.setFrame(frame, time, mix, softness, input.readByte(), (flags & 1) != 0, (flags & 2) != 0);
|
||||
timeline.setFrame(frame, time, mix, softness, (flags & 8) != 0 ? 1 : -1, (flags & 16) != 0, (flags & 32) != 0);
|
||||
if (frame == frameLast) break;
|
||||
float time2 = input.readFloat(), mix2 = input.readFloat(), softness2 = input.readFloat() * scale;
|
||||
switch (input.readByte()) {
|
||||
case CURVE_STEPPED:
|
||||
flags = input.read();
|
||||
float time2 = input.readFloat(), mix2 = (flags & 1) != 0 ? ((flags & 2) != 0 ? input.readFloat() : 1) : 0;
|
||||
float softness2 = (flags & 4) != 0 ? input.readFloat() * scale : 0;
|
||||
if ((flags & 64) != 0)
|
||||
timeline.setStepped(frame);
|
||||
break;
|
||||
case CURVE_BEZIER:
|
||||
else if ((flags & 128) != 0) {
|
||||
setBezier(input, timeline, bezier++, frame, 0, time, time2, mix, mix2, 1);
|
||||
setBezier(input, timeline, bezier++, frame, 1, time, time2, softness, softness2, scale);
|
||||
}
|
||||
|
||||
@ -314,6 +314,7 @@ public class SkeletonJson extends SkeletonLoader {
|
||||
data.rotate = constraintMap.getFloat("rotate", 0);
|
||||
data.scaleX = constraintMap.getFloat("scaleX", 0);
|
||||
data.shearX = constraintMap.getFloat("shearX", 0);
|
||||
data.limit = constraintMap.getFloat("limit", 500) * scale;
|
||||
data.step = 1f / constraintMap.getInt("fps", 60);
|
||||
data.inertia = constraintMap.getFloat("inertia", 1);
|
||||
data.strength = constraintMap.getFloat("strength", 100);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user