mirror of
https://github.com/visgl/luma.gl.git
synced 2025-12-08 17:36:19 +00:00
6.8 KiB
6.8 KiB
AnimationLoop
Manages an animation loop and optionally a WebGL context and a WebGL canvas. It provides a number of features related to initialization and animation of a WebGL context.
- Provides a number of commonly needed variables as part of the
contextobject which is passed toonRenderandonFinalizecallbacks. - Objects returned by
onInitailizewill be appended tocontextobject hence available toonRenderandonFinalize. - To avoid problems with page load timing, move context creation to the
onCreateContextmethod. - By default,
onRendermethod manages resizing of canvas, viewport and framebuffer. - Makes it easy to wait for the HTML page to load before creating a canvas and WebGL resources.
References:
- WebGL Fundamentals contains excellent information on the subtleties of the how the WebGL context's drawing buffer and the HTML canvas interact.
- When running in the browser, this class uses
requestAnimationFrame
Usage
Autocreates a canvas/context
import {AnimationLoop} from 'luma.gl';
const animationLoop = new AnimationLoop({
onInitialize({gl}) {
// Keys in the object returned here will be available in onRenderFrame
return {
clipSpaceQuad: new ClipSpaceQuad({gl, fs: FRAGMENT_SHADER})
};
},
onRender({tick, clipSpaceQuad}) {
// Tick is autoupdated by AnimationLoop
clipSpaceQuad.render({uTime: tick * 0.01});
}
});
animationLoop.start();
Use a canvas in the existing DOM through its HTML id
animationLoop.start({id: 'my-canvas'});
Methods
constructor
new AnimationLoop({
onCreateContext,
onInitialize,
onFinalize,
onRenderFrame,
autoResizeViewport,
autoResizeDrawingBuffer
});
onCreateContext=null(callback) - function without parameters that returns aWebGLRenderingContext. This callback will be called exactly once, after page load completes.onInitialize(callback) - if supplied, will be called once after firststart()has been called, after page load completes and a context has been created.onRender=null(callback) - Called on every animation frame.onFinalize=null(callback) - Called once when animation is stopped. Can be used to delete objects or free any resources created duringonInitialize.autoResizeViewport=true- If true, callsgl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)each frame beforeonRenderFrameis called. Set to false to control viewport size.autoResizeDrawingBuffer=true- If true, checks the canvas size every frame and updates the drawing buffer size if needed.useDevicePixels- Whether to usewindow.devicePixelRatioas a multiplier, e.g. inautoResizeDrawingBufferetc.gl=null(WebGLContext) - If supplied, will render into this external context instead of creating a new one.glOptions={}(object) - Options to create the WebGLContext with. See createGLContext.debug=false(bool) - Enable debug mode will provide more validations and error messages, but less performant.createFramebuffer=false(bool) - If true, will make aframebuffer(FrameBuffer) parameter available toonInitializeandonRendercallbacks.
start
Restarts the animation
animationLoop.start(options)
options={}(object) - Options to create the WebGLContext with. See createGLContext.
stop
Stops the animation
animationLoop.stop()
setNeedsRedraw
animationLoop.setNeedsRedraw(reason)
reason(String) - A human readable string giving a hint as to why redraw was needed (e.g. "geometry changed").
If set, the value will be provided as the needsRedraw field to the onRenderFrame callback.
Notes:
onRenderFramewill be called for each animation frame regardless of whether this flag is set, and the redraw reason is automatically cleared.- If called multiple times, the
reasonprovided in the first call will be remembered. AnimationLoopautomatically sets this flag if the WebGL context's drawing buffer size changes.
setProps
animationLoop.setProps({...props})
autoResizeViewport- Callgl.viewportbefore each call toonRenderFrame()autoResizeDrawingBuffer- Update the drawing buffer size to match the canvas size before each call toonRenderFrame()useDevicePixels- Whether to usewindow.devicePixelRatioas a multiplier, e.g. inautoResizeDrawingBufferetc.
Callback Parameters
The callbacks onInitialize, onRender and onFinalize that the app supplies to the AnimationLoop, will be called with an object containing named parameters:
| Parameter | Type | Description |
|---|---|---|
_animationLoop |
AnimationLoop |
(experimental) The calling AnimationLoop instance |
gl |
WebGLRenderingContext |
This AnimationLoop's gl context. |
canvas |
HTMLCanvasElement or OffscreenCanvas |
The canvas associated with this context. |
width |
The drawing buffer width, in "device" pixels (can be different from canvas.width). | |
height |
The drawing buffer height, in "device" pixels (can be different from canvas.width). | |
aspect |
The canvas aspect ratio (width/height) to update projection matrices | |
useDevicePixels |
Boolean indicating if canvas is utilizes full resolution of Retina/ | |
needsRedraw |
String |
Redraw flag (will be automatically set if drawingBuffer resizes) |
time |
Number |
Milliseconds since AnimationLoop was created (monotonic). |
tick |
Number |
Counter that updates for every frame rendered (monotonic). |
framebuffer |
FrameBuffer |
Availabel if createFrameBuffer: true was passed to the constructor. |
_mousePosition |
[x, y] or null |
(experimental) Current mouse position over the canvas. |
_offScreen |
Boolean |
(experimental) If the animation loop is rendering to an OffscreenCanvas. |
| ... | Any fields in the object that was returned by the onInitialize method. |
Remarks
- You can instantiate multiple
AnimationLoopclasses in parallel, rendering into the same or differentWebGLRenderingContexts. - Works both in browser and under Node.js.
- All
AnimationLoopmethods can be chained. - Postpones context creation until the page (i.e. all HTML) has been loaded. At this time it is safe to specify canvas ids when calling
createGLContext. - The supplied callback function must return a WebGLRenderingContext or an error will be thrown.
- This callback registration function should not be called if a
WebGLRenderingContextwas supplied to the AnimationLoop constructor.