-
-
Save PrimaryFeather/d13b8d14d329a364c7cb to your computer and use it in GitHub Desktop.
// ================================================================================================= | |
// | |
// Starling Framework | |
// Copyright 2011-2016 Gamua. All Rights Reserved. | |
// | |
// This program is free software. You can redistribute and/or modify it | |
// in accordance with the terms of the accompanying license agreement. | |
// | |
// ================================================================================================= | |
package starling.extensions | |
{ | |
import starling.display.Mesh; | |
import starling.rendering.MeshEffect; | |
import starling.rendering.VertexDataFormat; | |
import starling.styles.MeshStyle; | |
public class TextureMaskStyle extends MeshStyle | |
{ | |
public static const VERTEX_FORMAT:VertexDataFormat = | |
MeshStyle.VERTEX_FORMAT.extend("threshold:float1"); | |
private var _threshold:Number; | |
public function TextureMaskStyle(threshold:Number=0.5) | |
{ | |
_threshold = threshold; | |
} | |
override public function copyFrom(meshStyle:MeshStyle):void | |
{ | |
var otherStyle:TextureMaskStyle = meshStyle as TextureMaskStyle; | |
if (otherStyle) _threshold = otherStyle._threshold; | |
super.copyFrom(meshStyle); | |
} | |
override public function createEffect():MeshEffect | |
{ | |
return new TextureMaskEffect(); | |
} | |
override public function get vertexFormat():VertexDataFormat | |
{ | |
return VERTEX_FORMAT; | |
} | |
override protected function onTargetAssigned(target:Mesh):void | |
{ | |
updateVertices(); | |
} | |
private function updateVertices():void | |
{ | |
var numVertices:int = vertexData.numVertices; | |
for (var i:int=0; i<numVertices; ++i) | |
vertexData.setFloat(i, "threshold", _threshold); | |
setRequiresRedraw(); | |
} | |
// properties | |
public function get threshold():Number { return _threshold; } | |
public function set threshold(value:Number):void | |
{ | |
if (_threshold != value && target) | |
{ | |
_threshold = value; | |
updateVertices(); | |
} | |
} | |
} | |
} | |
import flash.display3D.Context3D; | |
import starling.extensions.TextureMaskStyle; | |
import starling.rendering.MeshEffect; | |
import starling.rendering.Program; | |
import starling.rendering.VertexDataFormat; | |
class TextureMaskEffect extends MeshEffect | |
{ | |
public static const VERTEX_FORMAT:VertexDataFormat = TextureMaskStyle.VERTEX_FORMAT; | |
public function TextureMaskEffect() | |
{ } | |
override protected function createProgram():Program | |
{ | |
if (texture) | |
{ | |
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 threshold to fp | |
].join("\n"); | |
var fragmentShader:String = [ | |
tex("ft0", "v0", 0, texture), | |
"sub ft1, ft0, v2.xxxx", // subtract threshold | |
"kil ft1.w ", // abort if alpha < 0 | |
"mul oc, ft0, v1 " // else multiply with color & copy to output buffer | |
].join("\n"); | |
return Program.fromSource(vertexShader, fragmentShader); | |
} | |
else return super.createProgram(); | |
} | |
override protected function beforeDraw(context:Context3D):void | |
{ | |
super.beforeDraw(context); | |
if (texture) vertexFormat.setVertexBufferAt(3, vertexBuffer, "threshold"); | |
} | |
override protected function afterDraw(context:Context3D):void | |
{ | |
if (texture) context.setVertexBufferAt(3, null); | |
super.afterDraw(context); | |
} | |
override public function get vertexFormat():VertexDataFormat | |
{ | |
return VERTEX_FORMAT; | |
} | |
} |
Hi! Can you explain how to use this extension with Starling Builder if possible?
@Vabavia You can now use TextureMaskStyle in Starling Builder 2.2. Make sure to use the EmbeddedComponents.swf from the latest demo workspace, which contains the TextureMaskStyle.
Is there a version of this what will straight up copy the alpha channel without applying a threshold?
I'm trying to get smooth rounded corners over some images, without using starling.antiAliasing
. Basically copy the already anti-aliased corners from an Image
with a PNG texture and .scale9grid
.
@Adrian-S Not with this class, because it uses the GPUs stencil buffer / stencil test to achieve transparency; and that doesn't support anything else than "on" / "off".
However, there is another Starling extension that should be able to do what you're looking for: PixelMask. That should do the trick!
Hi there,
First, excuse my very poor english.
Is there a way to use your starling extension with a Sprite as a mask instead of an Image ?
I'm trying to threshold a sprite containing particles with blur effect and affect this result as a mask on an image.
I'm using Starling 2.0 and Nape.
Thanks for your advices.
Regards