UNPKG

starling-framework

Version:

A fast, productive library for 2D cross-platform development.

383 lines (329 loc) 18.4 kB
import RenderUtil from "./../../starling/utils/RenderUtil"; import SystemUtil from "./../../starling/utils/SystemUtil"; import RenderState from "./../../starling/rendering/RenderState"; import MatrixUtil from "./../../starling/utils/MatrixUtil"; import IllegalOperationError from "openfl/errors/IllegalOperationError"; import RectangleUtil from "./../../starling/utils/RectangleUtil"; import Pool from "./../../starling/utils/Pool"; import Error from "openfl/errors/Error"; import Quad from "./../../starling/display/Quad"; import MathUtil from "./../../starling/utils/MathUtil"; import BlendMode from "./../../starling/display/BlendMode"; import Matrix from "openfl/geom/Matrix"; import Vector3D from "openfl/geom/Vector3D"; import Matrix3D from "openfl/geom/Matrix3D"; import Rectangle from "openfl/geom/Rectangle"; import MeshSubset from "./../../starling/utils/MeshSubset"; import Vector from "openfl/Vector"; import BatchProcessor from "./../../starling/rendering/BatchProcessor"; import Stage3D from "openfl/display/Stage3D"; import Program from "openfl/display3D/Program"; import BatchToken from "./BatchToken"; import Context3D from "openfl/display3D/Context3D"; import DisplayObject from "./../display/DisplayObject"; import Mesh from "./../display/Mesh"; declare namespace starling.rendering { /** A class that orchestrates rendering of all Starling display objects. * * <p>A Starling instance contains exactly one 'Painter' instance that should be used for all * rendering purposes. Each frame, it is passed to the render methods of all rendered display * objects. To access it outside a render method, call <code>Starling.painter</code>.</p> * * <p>The painter is responsible for drawing all display objects to the screen. At its * core, it is a wrapper for many Context3D methods, but that's not all: it also provides * a convenient state mechanism, supports masking and acts as __iddleman between display * objects and renderers.</p> * * <strong>The State Stack</strong> * * <p>The most important concept of the Painter class is the state stack. A RenderState * stores a combination of settings that are currently used for rendering, e.g. the current * projection- and modelview-matrices and context-related settings. It can be accessed * and manipulated via the <code>state</code> property. Use the methods * <code>pushState</code> and <code>popState</code> to store a specific state and restore * it later. That makes it easy to write rendering code that doesn't have any side effects.</p> * * <listing> * painter.pushState(); // save a copy of the current state on the stack * painter.state.renderTarget = renderTexture; * painter.state.transformModelviewMatrix(object.transformationMatrix); * painter.state.alpha = 0.5; * painter.prepareToDraw(); // apply all state settings at the render context * drawSomething(); // insert Stage3D rendering code here * painter.popState(); // restores previous state</listing> * * @see RenderState */ export class Painter { /** The value with which the stencil buffer will be cleared, * and the default reference value used for stencil tests. */ public static DEFAULT_STENCIL_VALUE:number; // construction /** Creates a new Painter object. Normally, it's not necessary to create any custom * painters; instead, use the global painter found on the Starling instance. */ public constructor(stage3D:Stage3D, sharedContext?:null | boolean); /** Disposes all mesh batches, programs, and - if it is not being shared - * the render context. */ public dispose():void; // context handling /** Requests a context3D object from the stage3D object. * This is called by Starling internally during the initialization process. * You normally don't need to call this method yourself. (For a detailed description * of the parameters, look at the documentation of the method with the same name in the * "RenderUtil" class.) * * @see starling.utils.RenderUtil */ public requestContext3D(renderMode:string, profile:any):void; /** Sets the viewport dimensions and other attributes of the rendering buffer. * Starling will call this method internally, so most apps won't need to mess with this. * * <p>Beware: if <code>shareContext</code> is enabled, the method will only update the * painter's context-related information (like the size of the back buffer), but won't * make any actual changes to the context.</p> * * @param viewPort the position and size of the area that should be rendered * into, in pixels. * @param contentScaleFactor only relevant for Desktop (!) HiDPI screens. If you want * to support high resolutions, pass the 'contentScaleFactor' * of the Flash stage; otherwise, '1.0'. * @param antiAlias from 0 (none) to 16 (very high quality). * @param enableDepthAndStencil indicates whether the depth and stencil buffers should * be enabled. Note that on AIR, you also have to enable * this setting in the app-xml (application descriptor); * otherwise, this setting will be silently ignored. * @param supportBrowserZoom if enabled, zooming a website will adapt the size of * the back buffer. */ public configureBackBuffer(viewPort:Rectangle, contentScaleFactor:number, antiAlias:number, enableDepthAndStencil:boolean, supportBrowserZoom?:boolean):void; // program management /** Registers a program under a certain name. * If the name was already used, the previous program is overwritten. */ public registerProgram(name:string, program:Program):void; /** Deletes the program of a certain name. */ public deleteProgram(name:string):void; /** Returns the program registered under a certain name, or null if no program with * this name has been registered. */ public getProgram(name:string):Program; /** Indicates if a program is registered under a certain name. */ public hasProgram(name:string):boolean; // state stack /** Pushes the current render state to a stack from which it can be restored later. * * <p>If you pass a BatchToken, it will be updated to point to the current location within * the render cache. That way, you can later reference this location to render a subset of * the cache.</p> */ public pushState(token?:BatchToken):void; /** Modifies the current state with a transformation matrix, alpha factor, and blend mode. * * @param transformationMatrix Used to transform the current <code>modelviewMatrix</code>. * @param alphaFactor Multiplied with the current alpha value. * @param blendMode Replaces the current blend mode; except for "auto", which * means the current value remains unchanged. */ public setStateTo(transformationMatrix:Matrix, alphaFactor?:number, blendMode?:string):void; /** Restores the render state that was last pushed to the stack. If this changes * blend mode, clipping rectangle, render target or culling, the current batch * will be drawn right away. * * <p>If you pass a BatchToken, it will be updated to point to the current location within * the render cache. That way, you can later reference this location to render a subset of * the cache.</p> */ public popState(token?:BatchToken):void; /** Restores the render state that was last pushed to the stack, but does NOT remove * it from the stack. */ public restoreState():void; /** Updates all properties of the given token so that it describes the current position * within the render cache. */ public fillToken(token:BatchToken):void; // masks /** Draws a display object into the stencil buffer, incrementing the buffer on each * used pixel. The stencil reference value is incremented as well; thus, any subsequent * stencil tests outside of this area will fail. * * <p>If 'mask' is part of the display list, it will be drawn at its conventional stage * coordinates. Otherwise, it will be drawn with the current modelview matrix.</p> * * <p>As an optimization, this method might update the clipping rectangle of the render * state instead of utilizing the stencil buffer. This is possible when the mask object * is of type <code>starling.display.Quad</code> and is aligned parallel to the stage * axes.</p> * * <p>Note that masking breaks the render cache; the masked object must be redrawn anew * in the next frame. If you pass <code>maskee</code>, the method will automatically * call <code>excludeFromCache(maskee)</code> for you.</p> */ public drawMask(mask:DisplayObject, maskee?:DisplayObject):void; /** Draws a display object into the stencil buffer, decrementing the * buffer on each used pixel. This effectively erases the object from the stencil buffer, * restoring the previous state. The stencil reference value will be decremented. * * <p>Note: if the mask object meets the requirements of using the clipping rectangle, * it will be assumed that this erase operation undoes the clipping rectangle change * caused by the corresponding <code>drawMask()</code> call.</p> */ public eraseMask(mask:DisplayObject, maskee?:DisplayObject):void; // mesh rendering /** Adds a mesh to the current batch of unrendered meshes. If the current batch is not * compatible with the mesh, all previous meshes are rendered at once and the batch * is cleared. * * @param mesh The mesh to batch. * @param subset The range of vertices to be batched. If <code>null</code>, the complete * mesh will be used. */ public batchMesh(mesh:Mesh, subset?:MeshSubset):void; /** Finishes the current mesh batch and prepares the next one. */ public finishMeshBatch():void; /** Indicate how often the internally used batches are being trimmed to save memory. * * <p>While rendering, the internally used MeshBatches are used in a different way in each * frame. To save memory, they should be trimmed every once in a while. This method defines * how often that happens, if at all. (Default: enabled = true, interval = 250)</p> * * @param enabled If trimming happens at all. Only disable temporarily! * @param interval The number of frames between each trim operation. */ public enableBatchTrimming(enabled?:boolean, interval?:number):void; /** Completes all unfinished batches, cleanup procedures. */ public finishFrame():void; /** Makes sure that the default context settings Starling relies on will be refreshed * before the next 'draw' operation. This includes blend mode, culling, and depth test. */ public setupContextDefaults():void; /** Resets the current state, state stack, batch processor, stencil reference value, * clipping rectangle, and draw count. Furthermore, depth testing is disabled. */ public nextFrame():void; /** Draws all meshes from the render cache between <code>startToken</code> and * (but not including) <code>endToken</code>. The render cache contains all meshes * rendered in the previous frame. */ public drawFromCache(startToken:BatchToken, endToken:BatchToken):void; /** Prevents the object from being drawn from the render cache in the next frame. * Different to <code>setRequiresRedraw()</code>, this does not indicate that the object * has changed in any way, but just that it doesn't support being drawn from cache. * * <p>Note that when a container is excluded from the render cache, its children will * still be cached! This just means that batching is interrupted at this object when * the display tree is traversed.</p> */ public excludeFromCache(object:DisplayObject):void; // helper methods /** Applies all relevant state settings to at the render context. This includes * blend mode, render target and clipping rectangle. Always call this method before * <code>context.drawTriangles()</code>. */ public prepareToDraw():void; /** Clears the render context with a certain color and alpha value. Since this also * clears the stencil buffer, the stencil reference value is also reset to '0'. */ public clear(rgb?:number, alpha?:number):void; /** Resets the render target to the back buffer and displays its contents. */ public present():void; /** Refreshes the values of "backBufferWidth" and "backBufferHeight" from the current * context dimensions and stores the given "backBufferScaleFactor". This method is * called by Starling when the browser zoom factor changes (in case "supportBrowserZoom" * is enabled). */ public refreshBackBufferSize(scaleFactor:number):void; // properties /** Indicates the number of stage3D draw calls. */ public drawCount:number; protected get_drawCount():number; protected set_drawCount(value:number):number; /** The current stencil reference value of the active render target. This value * is typically incremented when drawing a mask and decrementing when erasing it. * The painter keeps track of one stencil reference value per render target. * Only change this value if you know what you're doing! */ public stencilReferenceValue:number; protected get_stencilReferenceValue():number; protected set_stencilReferenceValue(value:number):number; /** Indicates if the render cache is enabled. Normally, this should be left at the default; * however, some custom rendering logic might require to change this property temporarily. * Also note that the cache is automatically reactivated each frame, right before the * render process. * * @default true */ public cacheEnabled:boolean; protected get_cacheEnabled():boolean; protected set_cacheEnabled(value:boolean):boolean; /** The current render state, containing some of the context settings, projection- and * modelview-matrix, etc. Always returns the same instance, even after calls to "pushState" * and "popState". * * <p>When you change the current RenderState, and this change is not compatible with * the current render batch, the batch will be concluded right away. Thus, watch out * for changes of blend mode, clipping rectangle, render target or culling.</p> */ public readonly state:RenderState; protected get_state():RenderState; /** The Stage3D instance this painter renders into. */ public readonly stage3D:Stage3D; protected get_stage3D():Stage3D; /** The Context3D instance this painter renders into. */ public readonly context:Context3D; protected get_context():Context3D; /** Returns the index of the current frame <strong>if</strong> the render cache is enabled; * otherwise, returns zero. To get the frameID regardless of the render cache, call * <code>Starling.frameID</code> instead. */ public frameID:number; protected set_frameID(value:number):number; protected get_frameID():number; /** The size (in points) that represents one pixel in the back buffer. */ public pixelSize:number; protected get_pixelSize():number; protected set_pixelSize(value:number):number; /** Indicates if another Starling instance (or another Stage3D framework altogether) * uses the same render context. @default false */ public shareContext:boolean; protected get_shareContext():boolean; protected set_shareContext(value:boolean):boolean; /** Indicates if Stage3D render methods will report errors. Activate only when needed, * as this has a negative impact on performance. @default false */ public enableErrorChecking:boolean; protected get_enableErrorChecking():boolean; protected set_enableErrorChecking(value:boolean):boolean; /** Returns the current width of the back buffer. In most cases, this value is in pixels; * however, if the app is running on an HiDPI display with an activated * 'supportHighResolutions' setting, you have to multiply with 'backBufferPixelsPerPoint' * for the actual pixel count. Alternatively, use the Context3D-property with the * same name: it will return the exact pixel values. */ public readonly backBufferWidth:number; protected get_backBufferWidth():number; /** Returns the current height of the back buffer. In most cases, this value is in pixels; * however, if the app is running on an HiDPI display with an activated * 'supportHighResolutions' setting, you have to multiply with 'backBufferPixelsPerPoint' * for the actual pixel count. Alternatively, use the Context3D-property with the * same name: it will return the exact pixel values. */ public readonly backBufferHeight:number; protected get_backBufferHeight():number; /** The number of pixels per point returned by the 'backBufferWidth/Height' properties. * Except for desktop HiDPI displays with an activated 'supportHighResolutions' setting, * this will always return '1'. */ public readonly backBufferScaleFactor:number; protected get_backBufferScaleFactor():number; /** Indicates if the Context3D object is currently valid (i.e. it hasn't been lost or * disposed). */ public readonly contextValid:boolean; protected get_contextValid():boolean; /** The Context3D profile of the current render context, or <code>null</code> * if the context has not been created yet. */ public readonly profile:string; protected get_profile():string; /** A dictionary that can be used to save custom data related to the render context. * If you need to share data that is bound to the render context (e.g. textures), use * this dictionary instead of creating a static class variable. That way, the data will * be available for all Starling instances that use this stage3D / context. */ public readonly sharedData:Map<string, any>; protected get_sharedData():Map<string, any>; protected readonly programs:Map<string, Program>; protected get_programs():Map<string, Program>; } } export default starling.rendering.Painter;