[starling] two color tint baby steps

This commit is contained in:
badlogic 2017-03-09 10:12:18 +01:00
parent aeff32bf58
commit 8eba84856e
3 changed files with 144 additions and 9 deletions

View File

@ -60,12 +60,16 @@ public class SkeletonSprite extends DisplayObject {
private var _skeleton:Skeleton; private var _skeleton:Skeleton;
public var batchable:Boolean = true; 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) { public function SkeletonSprite (skeletonData:SkeletonData) {
Bone.yDown = true; Bone.yDown = true;
_skeleton = new Skeleton(skeletonData); _skeleton = new Skeleton(skeletonData);
_skeleton.updateWorldTransform(); _skeleton.updateWorldTransform();
if (_twoColorStyle == null) {
_twoColorStyle = new TwoColorMeshStyle();
}
} }
override public function render (painter:Painter) : void { override public function render (painter:Painter) : void {
@ -78,10 +82,11 @@ public class SkeletonSprite extends DisplayObject {
var worldVertices:Vector.<Number> = _tempVertices; var worldVertices:Vector.<Number> = _tempVertices;
var ii:int, iii:int; var ii:int, iii:int;
var rgb:uint, a:Number; var rgb:uint, a:Number;
var dark:uint;
var mesh:SkeletonMesh; var mesh:SkeletonMesh;
var verticesLength:int, verticesCount:int, indicesLength:int; var verticesLength:int, verticesCount:int, indicesLength:int;
var indexData:IndexData, indices:Vector.<uint>, vertexData:VertexData; var indexData:IndexData, indices:Vector.<uint>, vertexData:VertexData;
var uvs: Vector.<Number>; var uvs: Vector.<Number>;
for (var i:int = 0, n:int = drawOrder.length; i < n; ++i) { for (var i:int = 0, n:int = drawOrder.length; i < n; ++i) {
var slot:Slot = drawOrder[i]; var slot:Slot = drawOrder[i];
@ -94,19 +99,23 @@ public class SkeletonSprite extends DisplayObject {
g * slot.color.g * region.color.g, g * slot.color.g * region.color.g,
b * slot.color.b * region.color.b); b * slot.color.b * region.color.b);
var image:Image = region.rendererObject as Image; var image:Image = region.rendererObject as Image;
if (image == null) { 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); region.rendererObject = image = new Image(origImage.texture);
image.style = _twoColorStyle;
for (var j:int = 0; j < 4; j++) { for (var j:int = 0; j < 4; j++) {
var p: Point = origImage.getTexCoords(j); var p: Point = origImage.getTexCoords(j);
image.setTexCoords(j, p.x, p.y); 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.setVertexPosition(0, worldVertices[2], worldVertices[3]);
image.setVertexColor(0, rgb); image.setVertexColor(0, rgb);
image.setVertexAlpha(0, a); image.setVertexAlpha(0, a);
image.setVertexPosition(1, worldVertices[4], worldVertices[5]); image.setVertexPosition(1, worldVertices[4], worldVertices[5]);
image.setVertexColor(1, rgb); image.setVertexColor(1, rgb);
@ -135,7 +144,7 @@ public class SkeletonSprite extends DisplayObject {
if (meshAttachment.rendererObject is Image) if (meshAttachment.rendererObject is Image)
meshAttachment.rendererObject = mesh = new SkeletonMesh(Image(meshAttachment.rendererObject).texture); meshAttachment.rendererObject = mesh = new SkeletonMesh(Image(meshAttachment.rendererObject).texture);
if (meshAttachment.rendererObject is AtlasRegion) 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) { if (mesh.numIndices != meshAttachment.triangles.length) {
@ -155,13 +164,19 @@ public class SkeletonSprite extends DisplayObject {
r * slot.color.r * meshAttachment.color.r, r * slot.color.r * meshAttachment.color.r,
g * slot.color.g * meshAttachment.color.g, g * slot.color.g * meshAttachment.color.g,
b * slot.color.b * meshAttachment.color.b); 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(); vertexData = mesh.getVertexData();
uvs = meshAttachment.uvs; uvs = meshAttachment.uvs;
vertexData.colorize("color", rgb, a); vertexData.colorize("color", rgb, a);
vertexData.colorize("color2", dark);
for (ii = 0, iii = 0; ii < verticesCount; ii++, iii+=2) { for (ii = 0, iii = 0; ii < verticesCount; ii++, iii+=2) {
mesh.setVertexPosition(ii, worldVertices[iii], worldVertices[iii+1]); 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; vertexData.numVertices = verticesCount;
painter.state.blendMode = blendModes[slot.data.blendMode.ordinal]; painter.state.blendMode = blendModes[slot.data.blendMode.ordinal];

View File

@ -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);
}
}
}

View File

@ -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();
}
}
}