starling-framework
Version:
A fast, productive library for 2D cross-platform development.
233 lines (206 loc) • 11.6 kB
TypeScript
import EventDispatcher from "./../../starling/events/EventDispatcher";
import Starling from "./../../starling/core/Starling";
import IllegalOperationError from "openfl/errors/IllegalOperationError";
import FilterHelper from "./../../starling/filters/FilterHelper";
import FilterQuad from "./../../starling/filters/FilterQuad";
import Pool from "./../../starling/utils/Pool";
import Stage from "./../../starling/display/Stage";
import RectangleUtil from "./../../starling/utils/RectangleUtil";
import MatrixUtil from "./../../starling/utils/MatrixUtil";
import FilterEffect from "./../../starling/rendering/FilterEffect";
import VertexData from "./../../starling/rendering/VertexData";
import IndexData from "./../../starling/rendering/IndexData";
import Padding from "./../../starling/utils/Padding";
import ArgumentError from "openfl/errors/ArgumentError";
import Matrix3D from "openfl/geom/Matrix3D";
import FilterEffect from "./../rendering/FilterEffect";
import Mesh from "./../display/Mesh";
import Texture from "./../textures/Texture";
import Painter from "./../rendering/Painter";
import IFilterHelper from "./IFilterHelper";
import DisplayObject from "./../display/DisplayObject";
import Rectangle from "openfl/geom/Rectangle";
declare namespace starling.filters
{
/** Dispatched when the settings change in a way that requires a redraw. */
// @:meta(Event(name="change", type="starling.events.Event"))
/** Dispatched every frame on filters assigned to display objects connected to the stage. */
// @:meta(Event(name="enterFrame", type="starling.events.EnterFrameEvent"))
/** The FragmentFilter class is the base class for all filter effects in Starling.
* All filters must extend this class. You can attach them to any display object through the
* <code>filter</code> property.
*
* <p>A fragment filter works in the following way:</p>
* <ol>
* <li>The object to be filtered is rendered into a texture.</li>
* <li>That texture is passed to the <code>process</code> method.</li>
* <li>This method processes the texture using a <code>FilterEffect</code> subclass
* that processes the input via fragment and vertex shaders to achieve a certain
* effect.</li>
* <li>If the filter requires several passes, the process method may execute the
* effect several times, or even make use of other filters in the process.</li>
* <li>In the end, a quad with the output texture is added to the batch renderer.
* In the next frame, if the object hasn't changed, the filter is drawn directly
* from the render cache.</li>
* <li>Alternatively, the last pass may be drawn directly to the back buffer. That saves
* one draw call, but means that the object may not be drawn from the render cache in
* the next frame. Starling makes an educated guess if that makes sense, but you can
* also force it to do so via the <code>alwaysDrawToBackBuffer</code> property.</li>
* </ol>
*
* <p>All of this is set up by the basic FragmentFilter class. Concrete subclasses
* just need to override the protected method <code>createEffect</code> and (optionally)
* <code>process</code>. Multi-pass filters must also override <code>numPasses</code>.</p>
*
* <p>Typically, any properties on the filter are just forwarded to an effect instance,
* which is then used automatically by <code>process</code> to render the filter pass.
* For a simple example on how to write a single-pass filter, look at the implementation of
* the <code>ColorMatrixFilter</code>; for a composite filter (i.e. a filter that combines
* several others), look at the <code>GlowFilter</code>.
* </p>
*
* <p>Beware that a filter instance may only be used on one object at a time!</p>
*
* <p><strong>Animated filters</strong></p>
*
* <p>The <code>process</code> method of a filter is only called when it's necessary, i.e.
* when the filter properties or the target display object changes. This means that you cannot
* rely on the method to be called on a regular basis, as needed when creating an animated
* filter class. Instead, you can do so by listening for an <code>ENTER_FRAME</code>-event.
* It is dispatched on the filter once every frame, as long as the filter is assigned to
* a display object that is connected to the stage.</p>
*
* <p><strong>Caching</strong></p>
*
* <p>Per default, whenever the target display object is changed in any way (i.e. the render
* cache fails), the filter is reprocessed. However, you can manually cache the filter output
* via the method of the same name: this will let the filter redraw the current output texture,
* even if the target object changes later on. That's especially useful if you add a filter
* to an object that changes only rarely, e.g. a TextField or an Image. Keep in mind, though,
* that you have to call <code>cache()</code> again in order for any changes to show up.</p>
*
* @see starling.rendering.FilterEffect
*/
export class FragmentFilter extends EventDispatcher
{
/** Creates a new instance. The base class' implementation just draws the unmodified
* input texture. */
public constructor();
/** Disposes all resources that have been created by the filter. */
public dispose():void;
/** Renders the filtered target object. Most users will never have to call this manually;
* it's executed automatically in the rendering process of the filtered display object.
*/
public render(painter:Painter):void;
/** Does the actual filter processing. This method will be called with up to four input
* textures and must return a new texture (acquired from the <code>helper</code>) that
* contains the filtered output. To to do this, it configures the FilterEffect
* (provided via <code>createEffect</code>) and calls its <code>render</code> method.
*
* <p>In a standard filter, only <code>input0</code> will contain a texture; that's the
* object the filter was applied to, rendered into an appropriately sized texture.
* However, filters may also accept multiple textures; that's useful when you need to
* combine the output of several filters into one. For example, the DropShadowFilter
* uses a BlurFilter to create the shadow and then feeds both input and shadow texture
* into a CompositeFilter.</p>
*
* <p>Never create or dispose any textures manually within this method; instead, get
* new textures from the provided helper object, and pass them to the helper when you do
* not need them any longer. Ownership of both input textures and returned texture
* lies at the caller; only temporary textures should be put into the helper.</p>
*/
public process(painter:Painter, helper:IFilterHelper,
input0?:Texture, input1?:Texture,
input2?:Texture, input3?:Texture):Texture;
/** Caches the filter output into a texture.
*
* <p>An uncached filter is rendered every frame (except if it can be rendered from the
* global render cache, which happens if the target object does not change its appearance
* or location relative to the stage). A cached filter is only rendered once; the output
* stays unchanged until you call <code>cache</code> again or change the filter settings.
* </p>
*
* <p>Beware: you cannot cache filters on 3D objects; if the object the filter is attached
* to is a Sprite3D or has a Sprite3D as (grand-) parent, the request will be silently
* ignored. However, you <em>can</em> cache a 2D object that has 3D children!</p>
*/
public cache():void;
/** Clears the cached output of the filter. After calling this method, the filter will be
* processed once per frame again. */
public clearCache():void;
// enter frame event
/** @protected */
/*override*/ public addEventListener(type:string, listener:Function):void;
/** @protected */
/*override*/ public removeEventListener(type:string, listener:Function):void;
// properties
/** Padding can extend the size of the filter texture in all directions.
* That's useful when the filter "grows" the bounds of the object in any direction. */
public padding:Padding;
protected get_padding():Padding;
protected set_padding(value:Padding):Padding;
/** Indicates if the filter is cached (via the <code>cache</code> method). */
public readonly isCached:boolean;
protected get_isCached():boolean;
/** The resolution of the filter texture. "1" means stage resolution, "0.5" half the stage
* resolution. A lower resolution saves memory and execution time, but results in a lower
* output quality. Values greater than 1 are allowed; such values might make sense for a
* cached filter when it is scaled up. @default 1
*/
public resolution:number;
protected get_resolution():number;
protected set_resolution(value:number):number;
/** Indicates if the filter requires all passes to be processed with the exact same
* resolution.
*
* <p>Some filters must use the same resolution for input and output; e.g. the blur filter
* is very sensitive to changes of pixel / texel sizes. When the filter is used as part
* of a filter chain, or if its last pass is drawn directly to the back buffer, such a
* filter produces artifacts. In that case, the filter author must set this property
* to <code>true</code>.</p>
*
* @default false
*/
protected maintainResolutionAcrossPasses:boolean;
protected get_maintainResolutionAcrossPasses():boolean;
protected set_maintainResolutionAcrossPasses(value:boolean):boolean;
/** The anti-aliasing level. This is only used for rendering the target object
* into a texture, not for the filter passes. 0 - none, 4 - maximum. @default 0 */
public antiAliasing:number;
protected get_antiAliasing():number;
protected set_antiAliasing(value:number):number;
/** The smoothing mode of the filter texture. @default bilinear */
public textureSmoothing:string;
protected get_textureSmoothing():string;
protected set_textureSmoothing(value:string):string;
/** The format of the filter texture. @default BGRA */
public textureFormat:string;
protected get_textureFormat():string;
protected set_textureFormat(value:string):string;
/** Indicates if the last filter pass is always drawn directly to the back buffer.
*
* <p>Per default, the filter tries to automatically render in a smart way: objects that
* are currently moving are rendered to the back buffer, objects that are static are
* rendered into a texture first, which allows the filter to be drawn directly from the
* render cache in the next frame (in case the object remains static).</p>
*
* <p>However, this fails when filters are added to an object that does not support the
* render cache, or to a container with such a child (e.g. a Sprite3D object or a masked
* display object). In such a case, enable this property for maximum performance.</p>
*
* @default false
*/
public alwaysDrawToBackBuffer:boolean;
protected get_alwaysDrawToBackBuffer():boolean;
protected set_alwaysDrawToBackBuffer(value:boolean):boolean;
}
export class FilterQuad extends Mesh
{
public constructor(smoothing:string);
/*override*/ public dispose():void;
public disposeTexture():void;
public moveVertices(sourceSpace:DisplayObject, targetSpace:DisplayObject):void;
public setBounds(bounds:Rectangle):void;
}
}
export default starling.filters.FragmentFilter;