diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java index d3210dd6e..f482870a4 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java +++ b/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; @@ -5,12 +37,51 @@ import com.esotericsoftware.spine.attachments.Attachment; import com.esotericsoftware.spine.attachments.RegionAttachment; 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.utils.Array; public class SkeletonRenderer { + static private final short[] quadTriangle = {0, 1, 2, 2, 3, 0}; + 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 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) { boolean premultipliedAlpha = this.premultipliedAlpha; int srcFunc = premultipliedAlpha ? GL11.GL_ONE : GL11.GL_SRC_ALPHA; @@ -24,8 +95,8 @@ public class SkeletonRenderer { Attachment attachment = slot.attachment; if (attachment instanceof RegionAttachment) { 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) { additive = !additive; if (additive) diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java index 7ea5a29c4..4ff9ce604 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java +++ b/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; import com.esotericsoftware.spine.attachments.Attachment; -import com.esotericsoftware.spine.attachments.BoundingBoxAttachment; import com.esotericsoftware.spine.attachments.RegionAttachment; 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.ShapeType; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.FloatArray; public class SkeletonRendererDebug { static private final Color boneLineColor = Color.RED; @@ -57,8 +89,8 @@ public class SkeletonRendererDebug { Attachment attachment = slot.attachment; if (attachment instanceof RegionAttachment) { 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[X2], vertices[Y2], vertices[X3], vertices[Y3]); renderer.line(vertices[X3], vertices[Y3], vertices[X4], vertices[Y4]); @@ -73,9 +105,11 @@ public class SkeletonRendererDebug { renderer.setColor(aabbColor); renderer.rect(bounds.getMinX(), bounds.getMinY(), bounds.getWidth(), bounds.getHeight()); renderer.setColor(boundingBoxColor); - Array boundingBoxes = bounds.getBoundingBoxAttachments(); - for (int i = 0, n = boundingBoxes.size; i < n; i++) - renderer.polygon(boundingBoxes.get(i).getVertices()); + Array 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();