mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-25 11:11:24 +08:00
Added bone inherit rotation and scale, and slot additive blending.
This commit is contained in:
parent
27d6766289
commit
8c3a4e4761
@ -69,9 +69,14 @@ public class Bone {
|
|||||||
if (parent != null) {
|
if (parent != null) {
|
||||||
worldX = x * parent.m00 + y * parent.m01 + parent.worldX;
|
worldX = x * parent.m00 + y * parent.m01 + parent.worldX;
|
||||||
worldY = x * parent.m10 + y * parent.m11 + parent.worldY;
|
worldY = x * parent.m10 + y * parent.m11 + parent.worldY;
|
||||||
worldScaleX = parent.worldScaleX * scaleX;
|
if (data.inheritScale) {
|
||||||
worldScaleY = parent.worldScaleY * scaleY;
|
worldScaleX = parent.worldScaleX * scaleX;
|
||||||
worldRotation = parent.worldRotation + rotation;
|
worldScaleY = parent.worldScaleY * scaleY;
|
||||||
|
} else {
|
||||||
|
worldScaleX = scaleX;
|
||||||
|
worldScaleY = scaleY;
|
||||||
|
}
|
||||||
|
worldRotation = data.inheritRotation ? parent.worldRotation + rotation : rotation;
|
||||||
} else {
|
} else {
|
||||||
worldX = x;
|
worldX = x;
|
||||||
worldY = y;
|
worldY = y;
|
||||||
|
|||||||
@ -32,6 +32,7 @@ public class BoneData {
|
|||||||
float x, y;
|
float x, y;
|
||||||
float rotation;
|
float rotation;
|
||||||
float scaleX = 1, scaleY = 1;
|
float scaleX = 1, scaleY = 1;
|
||||||
|
boolean inheritScale = true, inheritRotation = true;
|
||||||
|
|
||||||
/** @param parent May be null. */
|
/** @param parent May be null. */
|
||||||
public BoneData (String name, BoneData parent) {
|
public BoneData (String name, BoneData parent) {
|
||||||
@ -111,6 +112,22 @@ public class BoneData {
|
|||||||
this.scaleY = scaleY;
|
this.scaleY = scaleY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getInheritScale () {
|
||||||
|
return inheritScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInheritScale (boolean inheritScale) {
|
||||||
|
this.inheritScale = inheritScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getInheritRotation () {
|
||||||
|
return inheritRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInheritRotation (boolean inheritRotation) {
|
||||||
|
this.inheritRotation = inheritRotation;
|
||||||
|
}
|
||||||
|
|
||||||
public String toString () {
|
public String toString () {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -98,7 +98,7 @@ public class SkeletonBinary {
|
|||||||
String parentName = input.readString();
|
String parentName = input.readString();
|
||||||
if (parentName != null) {
|
if (parentName != null) {
|
||||||
parent = skeletonData.findBone(parentName);
|
parent = skeletonData.findBone(parentName);
|
||||||
if (parent == null) throw new SerializationException("Bone not found: " + parentName);
|
if (parent == null) throw new SerializationException("Parent bone not found: " + parentName);
|
||||||
}
|
}
|
||||||
BoneData boneData = new BoneData(name, parent);
|
BoneData boneData = new BoneData(name, parent);
|
||||||
boneData.x = input.readFloat() * scale;
|
boneData.x = input.readFloat() * scale;
|
||||||
@ -107,6 +107,8 @@ public class SkeletonBinary {
|
|||||||
boneData.scaleY = input.readFloat();
|
boneData.scaleY = input.readFloat();
|
||||||
boneData.rotation = input.readFloat();
|
boneData.rotation = input.readFloat();
|
||||||
boneData.length = input.readFloat() * scale;
|
boneData.length = input.readFloat() * scale;
|
||||||
|
boneData.inheritScale = input.readByte() == 1;
|
||||||
|
boneData.inheritRotation = input.readByte() == 1;
|
||||||
skeletonData.addBone(boneData);
|
skeletonData.addBone(boneData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +121,7 @@ public class SkeletonBinary {
|
|||||||
SlotData slotData = new SlotData(slotName, boneData);
|
SlotData slotData = new SlotData(slotName, boneData);
|
||||||
Color.rgba8888ToColor(slotData.getColor(), input.readInt());
|
Color.rgba8888ToColor(slotData.getColor(), input.readInt());
|
||||||
slotData.setAttachmentName(input.readString());
|
slotData.setAttachmentName(input.readString());
|
||||||
|
slotData.additiveBlending = input.readByte() == 1;
|
||||||
skeletonData.addSlot(slotData);
|
skeletonData.addSlot(slotData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -100,6 +100,8 @@ public class SkeletonJson {
|
|||||||
boneData.rotation = boneMap.getFloat("rotation", 0);
|
boneData.rotation = boneMap.getFloat("rotation", 0);
|
||||||
boneData.scaleX = boneMap.getFloat("scaleX", 1);
|
boneData.scaleX = boneMap.getFloat("scaleX", 1);
|
||||||
boneData.scaleY = boneMap.getFloat("scaleY", 1);
|
boneData.scaleY = boneMap.getFloat("scaleY", 1);
|
||||||
|
boneData.inheritScale = boneMap.getBoolean("inheritScale", true);
|
||||||
|
boneData.inheritRotation = boneMap.getBoolean("inheritRotation", true);
|
||||||
skeletonData.addBone(boneData);
|
skeletonData.addBone(boneData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,6 +118,8 @@ public class SkeletonJson {
|
|||||||
|
|
||||||
slotData.setAttachmentName(slotMap.getString("attachment", null));
|
slotData.setAttachmentName(slotMap.getString("attachment", null));
|
||||||
|
|
||||||
|
slotData.additiveBlending = slotMap.getBoolean("additive", false);
|
||||||
|
|
||||||
skeletonData.addSlot(slotData);
|
skeletonData.addSlot(slotData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,12 +4,14 @@ package com.esotericsoftware.spine;
|
|||||||
import com.esotericsoftware.spine.attachments.Attachment;
|
import com.esotericsoftware.spine.attachments.Attachment;
|
||||||
import com.esotericsoftware.spine.attachments.RegionAttachment;
|
import com.esotericsoftware.spine.attachments.RegionAttachment;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.GL11;
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
|
|
||||||
public class SkeletonRenderer {
|
public class SkeletonRenderer {
|
||||||
public void draw (SpriteBatch batch, Skeleton skeleton) {
|
public void draw (SpriteBatch batch, Skeleton skeleton) {
|
||||||
Array<Slot> drawOrder = skeleton.drawOrder;
|
Array<Slot> drawOrder = skeleton.drawOrder;
|
||||||
|
boolean additive = false;
|
||||||
for (int i = 0, n = drawOrder.size; i < n; i++) {
|
for (int i = 0, n = drawOrder.size; i < n; i++) {
|
||||||
Slot slot = drawOrder.get(i);
|
Slot slot = drawOrder.get(i);
|
||||||
Attachment attachment = slot.attachment;
|
Attachment attachment = slot.attachment;
|
||||||
@ -17,8 +19,16 @@ public class SkeletonRenderer {
|
|||||||
RegionAttachment regionAttachment = (RegionAttachment)attachment;
|
RegionAttachment regionAttachment = (RegionAttachment)attachment;
|
||||||
regionAttachment.updateVertices(slot);
|
regionAttachment.updateVertices(slot);
|
||||||
float[] vertices = regionAttachment.getVertices();
|
float[] vertices = regionAttachment.getVertices();
|
||||||
|
if (slot.data.getAdditiveBlending() != additive) {
|
||||||
|
additive = !additive;
|
||||||
|
if (additive)
|
||||||
|
batch.setBlendFunction(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
|
||||||
|
else
|
||||||
|
batch.setBlendFunction(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
}
|
||||||
batch.draw(regionAttachment.getRegion().getTexture(), vertices, 0, vertices.length);
|
batch.draw(regionAttachment.getRegion().getTexture(), vertices, 0, vertices.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (additive) batch.setBlendFunction(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,6 +32,7 @@ public class SlotData {
|
|||||||
final BoneData boneData;
|
final BoneData boneData;
|
||||||
final Color color = new Color(1, 1, 1, 1);
|
final Color color = new Color(1, 1, 1, 1);
|
||||||
String attachmentName;
|
String attachmentName;
|
||||||
|
boolean additiveBlending;
|
||||||
|
|
||||||
SlotData () {
|
SlotData () {
|
||||||
name = null;
|
name = null;
|
||||||
@ -67,6 +68,14 @@ public class SlotData {
|
|||||||
return attachmentName;
|
return attachmentName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getAdditiveBlending () {
|
||||||
|
return additiveBlending;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdditiveBlending (boolean additiveBlending) {
|
||||||
|
this.additiveBlending = additiveBlending;
|
||||||
|
}
|
||||||
|
|
||||||
public String toString () {
|
public String toString () {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ import com.badlogic.gdx.utils.NumberUtils;
|
|||||||
/** Attachment that displays a texture region. */
|
/** Attachment that displays a texture region. */
|
||||||
public class RegionAttachment extends Attachment {
|
public class RegionAttachment extends Attachment {
|
||||||
private TextureRegion region;
|
private TextureRegion region;
|
||||||
private float x, y, scaleX, scaleY, rotation, width, height;
|
private float x, y, scaleX = 1, scaleY = 1, rotation, width, height;
|
||||||
private final float[] vertices = new float[20];
|
private final float[] vertices = new float[20];
|
||||||
private final float[] offset = new float[8];
|
private final float[] offset = new float[8];
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user