소스 검색

Added SkeletonAttachment.

Spine doesn't export this attachment type, but it can be used at runtime.
NathanSweet 11 년 전
부모
커밋
f087d56da6

+ 55 - 11
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);
-			}
 
-			batch.draw(texture, vertices, 0, vertices.length, triangles, 0, triangles.length);
+				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);
+			}
 		}
 	}
 
@@ -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);
 			}
 		}
 	}

+ 55 - 0
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;
+	}
+}