瀏覽代碼

Support for rendering via PolygonSpriteBatch.

NathanSweet 12 年之前
父節點
當前提交
19bb6a202a

+ 73 - 2
spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java

@@ -1,3 +1,35 @@
+/******************************************************************************
+ * Spine Runtime Software License - Version 1.0
+ * 
+ * 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 Single User License or Spine Professional 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;
 package com.esotericsoftware.spine;
 
 
@@ -5,12 +37,51 @@ 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.GL11;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch;
 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 {
+	static private final short[] quadTriangle = {0, 1, 2, 2, 3, 0};
+
 	private boolean premultipliedAlpha;
 	private boolean premultipliedAlpha;
 
 
+	public void draw (PolygonSpriteBatch batch, Skeleton skeleton) {
+		boolean premultipliedAlpha = this.premultipliedAlpha;
+		int srcFunc = premultipliedAlpha ? GL11.GL_ONE : GL11.GL_SRC_ALPHA;
+		batch.setBlendFunction(srcFunc, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+		boolean additive = false;
+
+		float[] vertices;
+		short[] triangles;
+		Texture texture;
+		Array<Slot> drawOrder = skeleton.drawOrder;
+		for (int i = 0, n = drawOrder.size; i < n; i++) {
+			Slot slot = drawOrder.get(i);
+			Attachment attachment = slot.attachment;
+			if (attachment instanceof RegionAttachment) {
+				RegionAttachment region = (RegionAttachment)attachment;
+				region.updateWorldVertices(slot, premultipliedAlpha);
+				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);
+		}
+	}
+
 	public void draw (SpriteBatch batch, Skeleton skeleton) {
 	public void draw (SpriteBatch batch, Skeleton skeleton) {
 		boolean premultipliedAlpha = this.premultipliedAlpha;
 		boolean premultipliedAlpha = this.premultipliedAlpha;
 		int srcFunc = premultipliedAlpha ? GL11.GL_ONE : GL11.GL_SRC_ALPHA;
 		int srcFunc = premultipliedAlpha ? GL11.GL_ONE : GL11.GL_SRC_ALPHA;
@@ -24,8 +95,8 @@ public class SkeletonRenderer {
 			Attachment attachment = slot.attachment;
 			Attachment attachment = slot.attachment;
 			if (attachment instanceof RegionAttachment) {
 			if (attachment instanceof RegionAttachment) {
 				RegionAttachment regionAttachment = (RegionAttachment)attachment;
 				RegionAttachment regionAttachment = (RegionAttachment)attachment;
-				regionAttachment.updateVertices(slot, premultipliedAlpha);
-				float[] vertices = regionAttachment.getVertices();
+				regionAttachment.updateWorldVertices(slot, premultipliedAlpha);
+				float[] vertices = regionAttachment.getWorldVertices();
 				if (slot.data.getAdditiveBlending() != additive) {
 				if (slot.data.getAdditiveBlending() != additive) {
 					additive = !additive;
 					additive = !additive;
 					if (additive)
 					if (additive)

+ 40 - 6
spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java

@@ -1,8 +1,39 @@
+/******************************************************************************
+ * Spine Runtime Software License - Version 1.0
+ * 
+ * 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 Single User License or Spine Professional 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;
 package com.esotericsoftware.spine;
 
 
 import com.esotericsoftware.spine.attachments.Attachment;
 import com.esotericsoftware.spine.attachments.Attachment;
-import com.esotericsoftware.spine.attachments.BoundingBoxAttachment;
 import com.esotericsoftware.spine.attachments.RegionAttachment;
 import com.esotericsoftware.spine.attachments.RegionAttachment;
 
 
 import static com.badlogic.gdx.graphics.g2d.SpriteBatch.*;
 import static com.badlogic.gdx.graphics.g2d.SpriteBatch.*;
@@ -13,6 +44,7 @@ import com.badlogic.gdx.graphics.GL10;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.Array;
+import com.badlogic.gdx.utils.FloatArray;
 
 
 public class SkeletonRendererDebug {
 public class SkeletonRendererDebug {
 	static private final Color boneLineColor = Color.RED;
 	static private final Color boneLineColor = Color.RED;
@@ -57,8 +89,8 @@ public class SkeletonRendererDebug {
 				Attachment attachment = slot.attachment;
 				Attachment attachment = slot.attachment;
 				if (attachment instanceof RegionAttachment) {
 				if (attachment instanceof RegionAttachment) {
 					RegionAttachment regionAttachment = (RegionAttachment)attachment;
 					RegionAttachment regionAttachment = (RegionAttachment)attachment;
-					regionAttachment.updateVertices(slot, false);
-					float[] vertices = regionAttachment.getVertices();
+					regionAttachment.updateWorldVertices(slot, false);
+					float[] vertices = regionAttachment.getWorldVertices();
 					renderer.line(vertices[X1], vertices[Y1], vertices[X2], vertices[Y2]);
 					renderer.line(vertices[X1], vertices[Y1], vertices[X2], vertices[Y2]);
 					renderer.line(vertices[X2], vertices[Y2], vertices[X3], vertices[Y3]);
 					renderer.line(vertices[X2], vertices[Y2], vertices[X3], vertices[Y3]);
 					renderer.line(vertices[X3], vertices[Y3], vertices[X4], vertices[Y4]);
 					renderer.line(vertices[X3], vertices[Y3], vertices[X4], vertices[Y4]);
@@ -73,9 +105,11 @@ public class SkeletonRendererDebug {
 			renderer.setColor(aabbColor);
 			renderer.setColor(aabbColor);
 			renderer.rect(bounds.getMinX(), bounds.getMinY(), bounds.getWidth(), bounds.getHeight());
 			renderer.rect(bounds.getMinX(), bounds.getMinY(), bounds.getWidth(), bounds.getHeight());
 			renderer.setColor(boundingBoxColor);
 			renderer.setColor(boundingBoxColor);
-			Array<BoundingBoxAttachment> boundingBoxes = bounds.getBoundingBoxAttachments();
-			for (int i = 0, n = boundingBoxes.size; i < n; i++)
-				renderer.polygon(boundingBoxes.get(i).getVertices());
+			Array<FloatArray> polygons = bounds.getPolygons();
+			for (int i = 0, n = polygons.size; i < n; i++) {
+				FloatArray polygon = polygons.get(i);
+				renderer.polygon(polygon.items, 0, polygon.size);
+			}
 		}
 		}
 
 
 		renderer.end();
 		renderer.end();