From f087d56da64dee7af94ac01049fee5ae78b8d59d Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Sat, 21 Dec 2013 18:46:24 +0100 Subject: [PATCH] Added SkeletonAttachment. Spine doesn't export this attachment type, but it can be used at runtime. --- .../spine/SkeletonRenderer.java | 64 ++++++++++++++++--- .../spine/attachments/SkeletonAttachment.java | 55 ++++++++++++++++ 2 files changed, 109 insertions(+), 10 deletions(-) create mode 100644 spine-libgdx/src/com/esotericsoftware/spine/attachments/SkeletonAttachment.java diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java index b7fce5d56..31d1e448a 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java @@ -35,6 +35,7 @@ package com.esotericsoftware.spine; import com.esotericsoftware.spine.attachments.Attachment; import com.esotericsoftware.spine.attachments.RegionAttachment; +import com.esotericsoftware.spine.attachments.SkeletonAttachment; import com.badlogic.gdx.graphics.GL11; import com.badlogic.gdx.graphics.Texture; @@ -67,18 +68,39 @@ public class SkeletonRenderer { vertices = region.getWorldVertices(); triangles = quadTriangle; texture = region.getRegion().getTexture(); - } else - continue; - if (slot.data.getAdditiveBlending() != additive) { - additive = !additive; - if (additive) - batch.setBlendFunction(srcFunc, GL11.GL_ONE); - else - batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA); + if (slot.data.getAdditiveBlending() != additive) { + additive = !additive; + if (additive) + batch.setBlendFunction(srcFunc, GL11.GL_ONE); + else + batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA); + } + + batch.draw(texture, vertices, 0, vertices.length, triangles, 0, triangles.length); + } else if (attachment instanceof SkeletonAttachment) { + Skeleton attachmentSkeleton = ((SkeletonAttachment)attachment).getSkeleton(); + if (attachmentSkeleton == null) continue; + Bone bone = slot.getBone(); + Bone rootBone = attachmentSkeleton.getRootBone(); + float oldScaleX = rootBone.getScaleX(); + float oldScaleY = rootBone.getScaleY(); + float oldRotation = rootBone.getRotation(); + attachmentSkeleton.setX(bone.getWorldX()); + attachmentSkeleton.setY(bone.getWorldY()); + rootBone.setScaleX(1 + bone.getWorldScaleX() - oldScaleX); + rootBone.setScaleY(1 + bone.getWorldScaleY() - oldScaleY); + rootBone.setRotation(oldRotation + bone.getWorldRotation()); + attachmentSkeleton.updateWorldTransform(); + + draw(batch, attachmentSkeleton); + + attachmentSkeleton.setX(0); + attachmentSkeleton.setY(0); + rootBone.setScaleX(oldScaleX); + rootBone.setScaleY(oldScaleY); + rootBone.setRotation(oldRotation); } - - batch.draw(texture, vertices, 0, vertices.length, triangles, 0, triangles.length); } } @@ -105,6 +127,28 @@ public class SkeletonRenderer { batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA); } batch.draw(regionAttachment.getRegion().getTexture(), vertices, 0, 20); + } else if (attachment instanceof SkeletonAttachment) { + Skeleton attachmentSkeleton = ((SkeletonAttachment)attachment).getSkeleton(); + if (attachmentSkeleton == null) continue; + Bone bone = slot.getBone(); + Bone rootBone = attachmentSkeleton.getRootBone(); + float oldScaleX = rootBone.getScaleX(); + float oldScaleY = rootBone.getScaleY(); + float oldRotation = rootBone.getRotation(); + attachmentSkeleton.setX(bone.getWorldX()); + attachmentSkeleton.setY(bone.getWorldY()); + rootBone.setScaleX(1 + bone.getWorldScaleX() - oldScaleX); + rootBone.setScaleY(1 + bone.getWorldScaleY() - oldScaleY); + rootBone.setRotation(oldRotation + bone.getWorldRotation()); + attachmentSkeleton.updateWorldTransform(); + + draw(batch, attachmentSkeleton); + + attachmentSkeleton.setX(0); + attachmentSkeleton.setY(0); + rootBone.setScaleX(oldScaleX); + rootBone.setScaleY(oldScaleY); + rootBone.setRotation(oldRotation); } } } diff --git a/spine-libgdx/src/com/esotericsoftware/spine/attachments/SkeletonAttachment.java b/spine-libgdx/src/com/esotericsoftware/spine/attachments/SkeletonAttachment.java new file mode 100644 index 000000000..91f0a3032 --- /dev/null +++ b/spine-libgdx/src/com/esotericsoftware/spine/attachments/SkeletonAttachment.java @@ -0,0 +1,55 @@ +/****************************************************************************** + * Spine Runtime Software License - Version 1.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * Redistribution and use in source and binary forms in whole or in part, with + * or without modification, are permitted provided that the following conditions + * are met: + * + * 1. A Spine Essential, Professional, Enterprise, or Education License must + * be purchased from Esoteric Software and the license must remain valid: + * http://esotericsoftware.com/ + * 2. Redistributions of source code must retain this license, which is the + * above copyright notice, this declaration of conditions and the following + * disclaimer. + * 3. Redistributions in binary form must reproduce this license, which is the + * above copyright notice, this declaration of conditions and the following + * disclaimer, in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +package com.esotericsoftware.spine.attachments; + +import com.esotericsoftware.spine.Skeleton; + +/** Attachment that displays a texture region. */ +public class SkeletonAttachment extends Attachment { + private Skeleton skeleton; + + public SkeletonAttachment (String name) { + super(name); + } + + /** @return May return null. */ + public Skeleton getSkeleton () { + return skeleton; + } + + /** @param skeleton May be null. */ + public void setSkeleton (Skeleton skeleton) { + this.skeleton = skeleton; + } +}