Browse Source

[libgdx] Added physics limit, smaller binary size.

Nathan Sweet 1 year ago
parent
commit
254a4847fa

+ 2 - 2
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/IkConstraintData.java

@@ -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);

+ 8 - 4
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraint.java

@@ -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);

+ 9 - 1
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/PhysicsConstraintData.java

@@ -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;
 	}

+ 33 - 29
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java

@@ -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);
 				}

+ 1 - 0
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java

@@ -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);