starling-framework
Version:
A fast, productive library for 2D cross-platform development.
375 lines • 17.8 kB
TypeScript
import MeshSubset from "../utils/MeshSubset";
import RenderState from "./RenderState";
import Program from "./Program";
import BatchToken from "./BatchToken";
import Mesh from "../display/Mesh";
import DisplayObject from "../display/DisplayObject";
import Rectangle from "openfl/geom/Rectangle";
import Matrix from "openfl/geom/Matrix";
import Context3DRenderMode from "openfl/display3D/Context3DRenderMode";
import Context3D from "openfl/display3D/Context3D";
import Stage3D from "openfl/display/Stage3D";
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 {
/**
* 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.
*/
constructor(stage3D: Stage3D, sharedContext?: boolean);
/**
* The value with which the stencil buffer will be cleared,
* * and the default reference value used for stencil tests.
*/
static DEFAULT_STENCIL_VALUE: number;
/**
* Disposes all mesh batches, programs, and - if it is not being shared -
* * the render context.
*/
dispose(): void;
/**
* 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
*
*/
requestContext3D(renderMode: Context3DRenderMode, 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.
*
*/
configureBackBuffer(viewPort: Rectangle, contentScaleFactor: number, antiAlias: number, enableDepthAndStencil: boolean, supportBrowserZoom?: boolean): void;
/**
* Registers a program under a certain name.
* * If the name was already used, the previous program is overwritten.
*/
registerProgram(name: string, program: Program): void;
/**
* Deletes the program of a certain name.
*/
deleteProgram(name: string): void;
/**
* Returns the program registered under a certain name, or null if no program with
* * this name has been registered.
*/
getProgram(name: string): Program;
/**
* Indicates if a program is registered under a certain name.
*/
hasProgram(name: string): boolean;
/**
* 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>
*
*/
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.
*
*/
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>
*
*/
popState(token?: BatchToken): void;
/**
* Restores the render state that was last pushed to the stack, but does NOT remove
* * it from the stack.
*/
restoreState(): void;
/**
* Updates all properties of the given token so that it describes the current position
* * within the render cache.
*/
fillToken(token: BatchToken): void;
/**
* 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>
*
*/
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>
*
*/
eraseMask(mask: DisplayObject, maskee?: DisplayObject): void;
/**
* 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.
*
*/
batchMesh(mesh: Mesh, subset?: MeshSubset): void;
/**
* Finishes the current mesh batch and prepares the next one.
*/
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.
*
*/
enableBatchTrimming(enabled?: boolean, interval?: number): void;
/**
* Completes all unfinished batches, cleanup procedures.
*/
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.
*/
setupContextDefaults(): void;
/**
* Resets the current state, state stack, batch processor, stencil reference value,
* * clipping rectangle, and draw count. Furthermore, depth testing is disabled.
*/
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.
*/
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>
*
*/
excludeFromCache(object: DisplayObject): void;
/**
* 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>.
*
*/
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'.
*/
clear(rgb?: number, alpha?: number): void;
/**
* Resets the render target to the back buffer and displays its contents.
*/
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).
*
*/
refreshBackBufferSize(scaleFactor: number): void;
/**
* Indicates the number of stage3D draw calls.
*/
get drawCount(): number;
set drawCount(value: 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!
*
*/
get stencilReferenceValue(): number;
set stencilReferenceValue(value: 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
*
*/
get cacheEnabled(): boolean;
set cacheEnabled(value: 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>
*
*/
get state(): RenderState;
/**
* The Stage3D instance this painter renders into.
*/
get stage3D(): Stage3D;
/**
* The Context3D instance this painter renders into.
*/
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.
*/
get frameID(): number;
set frameID(value: number)
/**
* The size (in points) that represents one pixel in the back buffer.
*/
get pixelSize(): number;
set pixelSize(value: number)
/**
* Indicates if another Starling instance (or another Stage3D framework altogether)
* * uses the same render context. @default false
*/
get shareContext(): boolean;
set shareContext(value: boolean)
/**
* Indicates if Stage3D render methods will report errors. Activate only when needed,
* * as this has a negative impact on performance. @default false
*/
get enableErrorChecking(): boolean;
set enableErrorChecking(value: 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 'backBufferScaleFactor'
* * for the actual pixel count. Alternatively, use the Context3D-property with the
* * same name: it will return the exact pixel values.
*/
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 'backBufferScaleFactor'
* * for the actual pixel count. Alternatively, use the Context3D-property with the
* * same name: it will return the exact pixel values.
*/
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'.
*/
get backBufferScaleFactor(): number;
/**
* Indicates if the Context3D object is currently valid (i.e. it hasn't been lost or
* * disposed).
*/
get contextValid(): boolean;
/**
* The Context3D profile of the current render context, or <code>null</code>
* * if the context has not been created yet.
*/
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.
*/
get sharedData(): any;
}
}
export default starling.rendering.Painter;