diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as index 6ecc3907f..4cd6be0a2 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as @@ -60,12 +60,16 @@ public class SkeletonSprite extends DisplayObject { private var _skeleton:Skeleton; public var batchable:Boolean = true; - private var _smoothing:String = "bilinear"; + private var _smoothing:String = "bilinear"; + private static var _twoColorStyle:TwoColorMeshStyle; public function SkeletonSprite (skeletonData:SkeletonData) { Bone.yDown = true; _skeleton = new Skeleton(skeletonData); _skeleton.updateWorldTransform(); + if (_twoColorStyle == null) { + _twoColorStyle = new TwoColorMeshStyle(); + } } override public function render (painter:Painter) : void { @@ -78,10 +82,11 @@ public class SkeletonSprite extends DisplayObject { var worldVertices:Vector. = _tempVertices; var ii:int, iii:int; var rgb:uint, a:Number; + var dark:uint; var mesh:SkeletonMesh; var verticesLength:int, verticesCount:int, indicesLength:int; var indexData:IndexData, indices:Vector., vertexData:VertexData; - var uvs: Vector.; + var uvs: Vector.; for (var i:int = 0, n:int = drawOrder.length; i < n; ++i) { var slot:Slot = drawOrder[i]; @@ -94,19 +99,23 @@ public class SkeletonSprite extends DisplayObject { g * slot.color.g * region.color.g, b * slot.color.b * region.color.b); - var image:Image = region.rendererObject as Image; + var image:Image = region.rendererObject as Image; if (image == null) { - var origImage:Image = Image(AtlasRegion(region.rendererObject).rendererObject); + var origImage:Image = Image(AtlasRegion(region.rendererObject).rendererObject); region.rendererObject = image = new Image(origImage.texture); + image.style = _twoColorStyle; for (var j:int = 0; j < 4; j++) { var p: Point = origImage.getTexCoords(j); image.setTexCoords(j, p.x, p.y); } } + + if (slot.darkColor == null) dark = Color.rgb(0, 0, 0); + else dark = Color.rgb(slot.darkColor.r * 255, slot.darkColor.g * 255, slot.darkColor.b * 255); image.setVertexPosition(0, worldVertices[2], worldVertices[3]); image.setVertexColor(0, rgb); - image.setVertexAlpha(0, a); + image.setVertexAlpha(0, a); image.setVertexPosition(1, worldVertices[4], worldVertices[5]); image.setVertexColor(1, rgb); @@ -135,7 +144,7 @@ public class SkeletonSprite extends DisplayObject { if (meshAttachment.rendererObject is Image) meshAttachment.rendererObject = mesh = new SkeletonMesh(Image(meshAttachment.rendererObject).texture); if (meshAttachment.rendererObject is AtlasRegion) - meshAttachment.rendererObject = mesh = new SkeletonMesh(Image(AtlasRegion(meshAttachment.rendererObject).rendererObject).texture); + meshAttachment.rendererObject = mesh = new SkeletonMesh(Image(AtlasRegion(meshAttachment.rendererObject).rendererObject).texture); } if (mesh.numIndices != meshAttachment.triangles.length) { @@ -155,13 +164,19 @@ public class SkeletonSprite extends DisplayObject { r * slot.color.r * meshAttachment.color.r, g * slot.color.g * meshAttachment.color.g, b * slot.color.b * meshAttachment.color.b); + + if (slot.darkColor == null) dark = Color.rgb(0, 0, 0); + else dark = Color.rgb(slot.darkColor.r * 255, slot.darkColor.g * 255, slot.darkColor.b * 255); + if (mesh.style.vertexFormat != _twoColorStyle.vertexFormat) + mesh.style = _twoColorStyle; vertexData = mesh.getVertexData(); - uvs = meshAttachment.uvs; - vertexData.colorize("color", rgb, a); + uvs = meshAttachment.uvs; + vertexData.colorize("color", rgb, a); + vertexData.colorize("color2", dark); for (ii = 0, iii = 0; ii < verticesCount; ii++, iii+=2) { mesh.setVertexPosition(ii, worldVertices[iii], worldVertices[iii+1]); - mesh.setTexCoords(ii, uvs[iii], uvs[iii+1]); + mesh.setTexCoords(ii, uvs[iii], uvs[iii+1]); } vertexData.numVertices = verticesCount; painter.state.blendMode = blendModes[slot.data.blendMode.ordinal]; diff --git a/spine-starling/spine-starling/src/spine/starling/TwoColorEffect.as b/spine-starling/spine-starling/src/spine/starling/TwoColorEffect.as new file mode 100644 index 000000000..d77f83894 --- /dev/null +++ b/spine-starling/spine-starling/src/spine/starling/TwoColorEffect.as @@ -0,0 +1,73 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "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 ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) 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 spine.starling { + import starling.rendering.Program; +import flash.display3D.Context3D; +import starling.rendering.VertexDataFormat; +import starling.rendering.MeshEffect; + +public class TwoColorEffect extends MeshEffect { + public static const VERTEX_FORMAT:VertexDataFormat = TwoColorMeshStyle.VERTEX_FORMAT; + + override protected function createProgram():Program { + var vertexShader:String = [ + "m44 op, va0, vc0", // 4x4 matrix transform to output clip-space + "mov v0, va1 ", // pass texture coordinates to fragment program + "mul v1, va2, vc4", // multiply alpha (vc4) with color (va2), pass to fp + "mov v2, va3 " // pass offset to fp + ].join("\n"); + + var fragmentShader:String = [ + tex("ft0", "v0", 0, texture) + // get color from texture + "mul ft0, ft0, v1", // multiply color with texel color + "mov ft1, v2", // copy complete offset to ft1 + "mul ft1.xyz, v2.xyz, ft0.www", // multiply offset.rgb with alpha (pma!) + "add oc, ft0, ft1" // add offset, copy to output + ].join("\n"); + + return Program.fromSource(vertexShader, fragmentShader); + } + + override public function get vertexFormat():VertexDataFormat { + return VERTEX_FORMAT; + } + + override protected function beforeDraw(context:Context3D):void { + super.beforeDraw(context); + vertexFormat.setVertexBufferAt(3, vertexBuffer, "color2"); + } + + override protected function afterDraw(context:Context3D):void { + context.setVertexBufferAt(3, null); + super.afterDraw(context); + } +} +} \ No newline at end of file diff --git a/spine-starling/spine-starling/src/spine/starling/TwoColorMeshStyle.as b/spine-starling/spine-starling/src/spine/starling/TwoColorMeshStyle.as new file mode 100644 index 000000000..325318445 --- /dev/null +++ b/spine-starling/spine-starling/src/spine/starling/TwoColorMeshStyle.as @@ -0,0 +1,47 @@ +/****************************************************************************** + * Spine Runtimes Software License v2.5 + * + * Copyright (c) 2013-2016, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable, and + * non-transferable license to use, install, execute, and perform the Spine + * Runtimes software and derivative works solely for personal or internal + * use. Without the written permission of Esoteric Software (see Section 2 of + * the Spine Software License Agreement), you may not (a) modify, translate, + * adapt, or develop new applications using the Spine Runtimes or otherwise + * create derivative works or improvements of the Spine Runtimes or (b) remove, + * delete, alter, or obscure any trademarks or any copyright, trademark, patent, + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "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 ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS INTERRUPTION, OR LOSS OF + * USE, DATA, OR PROFITS) 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 spine.starling { + import starling.rendering.MeshEffect; +import starling.rendering.VertexDataFormat; +import starling.styles.MeshStyle; + +public class TwoColorMeshStyle extends MeshStyle { + public static const VERTEX_FORMAT:VertexDataFormat = MeshStyle.VERTEX_FORMAT.extend("color2:bytes4"); + + override public function get vertexFormat():VertexDataFormat { + return VERTEX_FORMAT; + } + + override public function createEffect():MeshEffect { + return new TwoColorEffect(); + } +} +} \ No newline at end of file