diff --git a/CHANGELOG.md b/CHANGELOG.md index d88f246d1..503c43256 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,12 +17,14 @@ * Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface. * `AnimationState#apply` returns boolean indicating if any timeline was applied or not. * `Animation#apply` and `Timeline#apply`` now take enums `MixPose` and `MixDirection` instead of booleans + * Added `VertexEffect` and implementations `JitterEffect` and `SwirlEffect`. Allows you to modify vertices before they are submitted for drawing. See Starling changes. ### Starling * Fixed renderer to work with 3.6 changes. * Added support for two color tinting. * Added support for clipping. * Added support for rotated regions in texture atlas loaded via StarlingAtlasAttachmentLoader. + * Added support for vertex effects. See `RaptorExample.as` ## C * **Breaking changes** diff --git a/spine-as3/spine-as3-example/lib/spine-as3.swc b/spine-as3/spine-as3-example/lib/spine-as3.swc index 73544b0ca..da3d29b61 100644 Binary files a/spine-as3/spine-as3-example/lib/spine-as3.swc and b/spine-as3/spine-as3-example/lib/spine-as3.swc differ diff --git a/spine-as3/spine-as3/.settings/org.eclipse.core.resources.prefs b/spine-as3/spine-as3/.settings/org.eclipse.core.resources.prefs index 059a93513..bfbdea40e 100644 --- a/spine-as3/spine-as3/.settings/org.eclipse.core.resources.prefs +++ b/spine-as3/spine-as3/.settings/org.eclipse.core.resources.prefs @@ -1,10 +1,18 @@ eclipse.preferences.version=1 +encoding//src/spine/Interpolation.as=UTF-8 +encoding//src/spine/MathUtils.as=UTF-8 encoding//src/spine/SkeletonClipping.as=UTF-8 encoding//src/spine/SkeletonJson.as=UTF-8 encoding//src/spine/Triangulator.as=UTF-8 +encoding//src/spine/Vertex.as=UTF-8 +encoding//src/spine/VertexEffect.as=UTF-8 encoding//src/spine/animation/MixDirection.as=UTF-8 encoding//src/spine/animation/MixPose.as=UTF-8 encoding//src/spine/animation/TwoColorTimeline.as=UTF-8 encoding//src/spine/attachments/ClippingAttachment.as=UTF-8 encoding//src/spine/attachments/PointAttachment.as=UTF-8 +encoding//src/spine/interpolation/Pow.as=UTF-8 +encoding//src/spine/interpolation/PowOut.as=UTF-8 +encoding//src/spine/vertexeffects/JitterEffect.as=UTF-8 +encoding//src/spine/vertexeffects/SwirlEffect.as=UTF-8 encoding/=UTF-8 diff --git a/spine-as3/spine-as3/src/spine/Interpolation.as b/spine-as3/spine-as3/src/spine/Interpolation.as new file mode 100644 index 000000000..e3b0b3a81 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/Interpolation.as @@ -0,0 +1,41 @@ +/****************************************************************************** + * 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 { + public class Interpolation { + protected function applyInternal (a : Number) : Number { + return a; + } + + public function apply (start : Number, end : Number, a : Number) : Number { + return start + (end - start) * applyInternal(a); + } + } +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/MathUtils.as b/spine-as3/spine-as3/src/spine/MathUtils.as index bb5d5b83c..0b2f10f38 100644 --- a/spine-as3/spine-as3/src/spine/MathUtils.as +++ b/spine-as3/spine-as3/src/spine/MathUtils.as @@ -27,7 +27,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ - + package spine { public class MathUtils { static public var PI : Number = Math.PI; @@ -52,5 +52,16 @@ package spine { static public function signum(value : Number) : Number { return value > 0 ? 1 : value < 0 ? -1 : 0; } + + static public function randomTriangular(min : Number, max : Number) : Number { + return randomTriangularWith(min, max, (min + max) * 0.5); + } + + static public function randomTriangularWith(min : Number, max : Number, mode : Number) : Number { + var u : Number = Math.random(); + var d : Number = max - min; + if (u <= (mode - min) / d) return min + Math.sqrt(u * d * (mode - min)); + return max - Math.sqrt((1 - u) * d * (max - mode)); + } } } \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/Vertex.as b/spine-as3/spine-as3/src/spine/Vertex.as new file mode 100644 index 000000000..3e04395af --- /dev/null +++ b/spine-as3/spine-as3/src/spine/Vertex.as @@ -0,0 +1,43 @@ +/****************************************************************************** + * 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 { + /** + * @author badlogic + */ + public class Vertex { + public var x : Number; + public var y : Number; + public var u : Number; + public var v : Number; + public var light : Color = new spine.Color(0, 0, 0); + public var dark : Color = new spine.Color(0, 0, 0); + } +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/VertexEffect.as b/spine-as3/spine-as3/src/spine/VertexEffect.as new file mode 100644 index 000000000..5b4e18bd7 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/VertexEffect.as @@ -0,0 +1,39 @@ +/****************************************************************************** + * 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 { + public interface VertexEffect { + function begin(skeleton : Skeleton) : void; + + function transform(vertex : Vertex) : void; + + function end() : void; + } +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/interpolation/Pow.as b/spine-as3/spine-as3/src/spine/interpolation/Pow.as new file mode 100644 index 000000000..a6b600303 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/interpolation/Pow.as @@ -0,0 +1,46 @@ +/****************************************************************************** + * 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.interpolation { + import spine.Interpolation; + + public class Pow extends Interpolation { + protected var power : Number; + + public function Pow(power : Number) { + this.power = power; + } + + protected override function applyInternal(a : Number) : Number { + if (a <= 0.5) return Math.pow(a * 2, power) / 2; + return Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1; + } + } +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/interpolation/PowOut.as b/spine-as3/spine-as3/src/spine/interpolation/PowOut.as new file mode 100644 index 000000000..26141e104 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/interpolation/PowOut.as @@ -0,0 +1,41 @@ +/****************************************************************************** + * 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.interpolation { + public class PowOut extends Pow { + public function PowOut(power : Number) { + super(power); + } + + protected override function applyInternal(a : Number) : Number { + return Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1; + } + } +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/vertexeffects/JitterEffect.as b/spine-as3/spine-as3/src/spine/vertexeffects/JitterEffect.as new file mode 100644 index 000000000..fa2b7059e --- /dev/null +++ b/spine-as3/spine-as3/src/spine/vertexeffects/JitterEffect.as @@ -0,0 +1,57 @@ +/****************************************************************************** + * 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.vertexeffects { + import spine.MathUtils; + import spine.Skeleton; + import spine.Vertex; + import spine.VertexEffect; + + public class JitterEffect implements VertexEffect { + public var jitterX : Number; + public var jitterY : Number; + + public function JitterEffect(jitterX: Number, jitterY: Number) { + this.jitterX = jitterX; + this.jitterY = jitterY; + } + + public function begin(skeleton : Skeleton) : void { + } + + public function transform(vertex : Vertex) : void { + vertex.x += MathUtils.randomTriangular(-jitterX, jitterY); + vertex.y += MathUtils.randomTriangular(-jitterX, jitterY); + } + + public function end() : void { + } + } +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/vertexeffects/SwirlEffect.as b/spine-as3/spine-as3/src/spine/vertexeffects/SwirlEffect.as new file mode 100644 index 000000000..66561cfd4 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/vertexeffects/SwirlEffect.as @@ -0,0 +1,84 @@ +/****************************************************************************** + * 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.vertexeffects { + import spine.interpolation.Pow; + import spine.MathUtils; + import spine.Interpolation; + import spine.Skeleton; + import spine.Vertex; + import spine.VertexEffect; + + public class SwirlEffect implements VertexEffect { + private var worldX : Number, worldY : Number, _radius : Number = 0, _angle : Number = 0; + private var _interpolation : Interpolation; + private var _centerX : Number = 0, _centerY : Number = 0; + + public function SwirlEffect(radius : Number) { + this._interpolation = new Pow(2);; + this._radius = radius; + } + + public function begin(skeleton : Skeleton) : void { + worldX = skeleton.x + _centerX; + worldY = skeleton.y + _centerY; + } + + public function transform(vertex : Vertex) : void { + var x : Number = vertex.x - worldX; + var y : Number = vertex.y - worldY; + var dist : Number = Math.sqrt(x * x + y * y); + if (dist < radius) { + var theta : Number = interpolation.apply(0, angle, (radius - dist) / radius); + var cos : Number = Math.cos(theta), sin : Number = Math.sin(theta); + vertex.x = cos * x - sin * y + worldX; + vertex.y = sin * x + cos * y + worldY; + } + } + + public function end() : void { + } + + public function get radius () : Number { return _radius; } + public function set radius (radius : Number) : void { _radius = radius; } + + public function get angle () : Number { return _angle; } + public function set angle (angle : Number) : void { _angle = angle * MathUtils.degRad; } + + public function get centerX () : Number { return _centerX; } + public function set centerX (centerX : Number) : void { _centerX = centerX; } + + public function get centerY () : Number { return _centerY; } + public function set centerY (centerY : Number) : void { _centerY = centerY; } + + public function get interpolation () : Interpolation { return _interpolation; } + public function set interpolation (interpolation : Interpolation) : void { _interpolation = interpolation; } + } +} \ No newline at end of file diff --git a/spine-starling/spine-starling-example/lib/spine-as3.swc b/spine-starling/spine-starling-example/lib/spine-as3.swc index 73544b0ca..da3d29b61 100644 Binary files a/spine-starling/spine-starling-example/lib/spine-as3.swc and b/spine-starling/spine-starling-example/lib/spine-as3.swc differ diff --git a/spine-starling/spine-starling-example/lib/spine-starling.swc b/spine-starling/spine-starling-example/lib/spine-starling.swc index 813bae7b4..5250309d8 100644 Binary files a/spine-starling/spine-starling-example/lib/spine-starling.swc and b/spine-starling/spine-starling-example/lib/spine-starling.swc differ diff --git a/spine-starling/spine-starling-example/src/spine/examples/RaptorExample.as b/spine-starling/spine-starling-example/src/spine/examples/RaptorExample.as index b5a750e94..9a956c417 100644 --- a/spine-starling/spine-starling-example/src/spine/examples/RaptorExample.as +++ b/spine-starling/spine-starling-example/src/spine/examples/RaptorExample.as @@ -29,6 +29,10 @@ *****************************************************************************/ package spine.examples { + import spine.interpolation.Pow; + import starling.animation.IAnimatable; + import spine.vertexeffects.SwirlEffect; + import spine.vertexeffects.JitterEffect; import starling.display.DisplayObjectContainer; import spine.atlas.Atlas; import spine.*; @@ -43,7 +47,7 @@ package spine.examples { import starling.events.TouchEvent; import starling.events.TouchPhase; - public class RaptorExample extends Sprite { + public class RaptorExample extends Sprite implements IAnimatable { [Embed(source = "/raptor-pro.json", mimeType = "application/octet-stream")] static public const RaptorJson : Class; @@ -55,6 +59,10 @@ package spine.examples { private var skeleton : SkeletonAnimation; private var gunGrabbed : Boolean; private var gunGrabCount : Number = 0; + + private var swirl : SwirlEffect; + private var swirlTime : Number = 0; + private var pow2 : Interpolation = new Pow(2); public function RaptorExample() { var attachmentLoader : AttachmentLoader; @@ -74,9 +82,15 @@ package spine.examples { skeleton.state.apply(skeleton.skeleton); skeleton.skeleton.updateWorldTransform(); this.setRequiresRedraw(); + + // skeleton.vertexEffect = new JitterEffect(10, 10); + swirl = new SwirlEffect(400); + swirl.centerY = -200; + skeleton.vertexEffect = swirl; addChild(skeleton); Starling.juggler.add(skeleton); + Starling.juggler.add(this); addEventListener(TouchEvent.TOUCH, onClick); } @@ -98,5 +112,12 @@ package spine.examples { } } } + + public function advanceTime(time : Number) : void { + swirlTime += time; + var percent : Number = swirlTime % 2; + if (percent > 1) percent = 1 - (percent - 1); + swirl.angle = pow2.apply(-60, 60, percent); + } } } \ No newline at end of file diff --git a/spine-starling/spine-starling/lib/spine-as3.swc b/spine-starling/spine-starling/lib/spine-as3.swc index 73544b0ca..da3d29b61 100644 Binary files a/spine-starling/spine-starling/lib/spine-as3.swc and b/spine-starling/spine-starling/lib/spine-as3.swc differ diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as index b2f12953b..7c4c885c7 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as @@ -39,6 +39,7 @@ package spine.starling { import spine.attachments.Attachment; import spine.attachments.MeshAttachment; import spine.attachments.RegionAttachment; + import spine.VertexEffect; import starling.display.BlendMode; import starling.display.DisplayObject; @@ -63,6 +64,11 @@ package spine.starling { private var _smoothing : String = "bilinear"; private static var clipper: SkeletonClipping = new SkeletonClipping(); private static var QUAD_INDICES : Vector. = new [0, 1, 2, 2, 3, 0]; + + public var vertexEffect : VertexEffect; + private var tempLight : spine.Color = new spine.Color(0, 0, 0); + private var tempDark : spine.Color = new spine.Color(0, 0, 0); + private var tempVertex : spine.Vertex = new spine.Vertex(); public function SkeletonSprite(skeletonData : SkeletonData) { Bone.yDown = true; @@ -86,6 +92,8 @@ package spine.starling { var verticesLength : int, verticesCount : int, indicesLength : int; var indexData : IndexData, indices : Vector., vertexData : VertexData; var uvs : Vector.; + + if (vertexEffect != null) vertexEffect.begin(skeleton); for (var i : int = 0, n : int = drawOrder.length; i < n; ++i) { var worldVertices : Vector. = _tempVertices; @@ -171,13 +179,37 @@ package spine.starling { } vertexData = mesh.getVertexData(); - vertexData.numVertices = verticesCount; - 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]); - } + vertexData.numVertices = verticesCount; + if (vertexEffect != null) { + tempLight.r = ((rgb >> 16) & 0xff) / 255.0; + tempLight.g = ((rgb >> 8) & 0xff) / 255.0; + tempLight.b = (rgb & 0xff) / 255.0; + tempLight.a = a; + tempDark.r = ((dark >> 16) & 0xff) / 255.0; + tempDark.g = ((dark >> 8) & 0xff) / 255.0; + tempDark.b = (dark & 0xff) / 255.0; + tempDark.a = 0; + for (ii = 0, iii = 0; ii < verticesCount; ii++, iii += 2) { + tempVertex.x = worldVertices[iii]; + tempVertex.y = worldVertices[iii + 1]; + tempVertex.u = uvs[iii]; + tempVertex.v = uvs[iii + 1]; + tempVertex.light.setFromColor(tempLight); + tempVertex.dark.setFromColor(tempDark); + vertexEffect.transform(tempVertex); + vertexData.colorize("color", Color.rgb(tempVertex.light.r * 255, tempVertex.light.g * 255, tempVertex.light.b * 255), tempVertex.light.a, ii, 1); + vertexData.colorize("color2", Color.rgb(tempVertex.dark.r * 255, tempVertex.dark.g * 255, tempVertex.dark.b * 255), a, ii, 1); + mesh.setVertexPosition(ii, tempVertex.x, tempVertex.y); + mesh.setTexCoords(ii, tempVertex.u, tempVertex.v); + } + } else { + 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]); + } + } painter.state.blendMode = blendModes[slot.data.blendMode.ordinal]; painter.batchMesh(mesh); @@ -185,6 +217,8 @@ package spine.starling { } painter.state.blendMode = originalBlendMode; clipper.clipEnd(); + + if (vertexEffect != null) vertexEffect.end(); } override public function hitTest(localPoint : Point) : DisplayObject {