@luma.gl/engine 8.5.10 → 8.6.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/key-frames.d.ts +18 -0
- package/dist/animation/key-frames.d.ts.map +1 -0
- package/dist/{esm/animation → animation}/key-frames.js +13 -6
- package/dist/animation/key-frames.js.map +1 -0
- package/dist/animation/timeline.d.ts +51 -0
- package/dist/animation/timeline.d.ts.map +1 -0
- package/dist/{esm/animation → animation}/timeline.js +10 -5
- package/dist/animation/timeline.js.map +1 -0
- package/dist/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +5 -0
- package/dist/bundle.js.map +1 -0
- package/dist/geometries/cone-geometry.d.ts +10 -0
- package/dist/geometries/cone-geometry.d.ts.map +1 -0
- package/dist/{esm/geometries → geometries}/cone-geometry.js +2 -2
- package/dist/geometries/cone-geometry.js.map +1 -0
- package/dist/geometries/cube-geometry.d.ts +9 -0
- package/dist/geometries/cube-geometry.d.ts.map +1 -0
- package/dist/{esm/geometries → geometries}/cube-geometry.js +18 -18
- package/dist/geometries/cube-geometry.js.map +1 -0
- package/dist/geometries/cylinder-geometry.d.ts +10 -0
- package/dist/geometries/cylinder-geometry.d.ts.map +1 -0
- package/dist/{esm/geometries → geometries}/cylinder-geometry.js +2 -2
- package/dist/geometries/cylinder-geometry.js.map +1 -0
- package/dist/geometries/ico-sphere-geometry.d.ts +11 -0
- package/dist/geometries/ico-sphere-geometry.d.ts.map +1 -0
- package/dist/{esm/geometries → geometries}/ico-sphere-geometry.js +2 -2
- package/dist/geometries/ico-sphere-geometry.js.map +1 -0
- package/dist/geometries/plane-geometry.d.ts +10 -0
- package/dist/geometries/plane-geometry.d.ts.map +1 -0
- package/dist/{esm/geometries → geometries}/plane-geometry.js +5 -5
- package/dist/geometries/plane-geometry.js.map +1 -0
- package/dist/geometries/sphere-geometry.d.ts +12 -0
- package/dist/geometries/sphere-geometry.d.ts.map +1 -0
- package/dist/{esm/geometries → geometries}/sphere-geometry.js +2 -9
- package/dist/geometries/sphere-geometry.js.map +1 -0
- package/dist/geometries/truncated-cone-geometry.d.ts +13 -0
- package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -0
- package/dist/{esm/geometries → geometries}/truncated-cone-geometry.js +1 -1
- package/dist/geometries/truncated-cone-geometry.js.map +1 -0
- package/dist/geometry/geometry-utils.d.ts +2 -0
- package/dist/geometry/geometry-utils.d.ts.map +1 -0
- package/dist/{esm/geometry → geometry}/geometry-utils.js +0 -0
- package/dist/geometry/geometry-utils.js.map +1 -0
- package/dist/geometry/geometry.d.ts +44 -0
- package/dist/geometry/geometry.d.ts.map +1 -0
- package/dist/{esm/geometry → geometry}/geometry.js +28 -19
- package/dist/geometry/geometry.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/animation-loop.d.ts +120 -0
- package/dist/lib/animation-loop.d.ts.map +1 -0
- package/dist/{esm/lib → lib}/animation-loop.js +135 -97
- package/dist/lib/animation-loop.js.map +1 -0
- package/dist/lib/model-utils.d.ts +4 -0
- package/dist/lib/model-utils.d.ts.map +1 -0
- package/dist/{esm/lib → lib}/model-utils.js +3 -2
- package/dist/lib/model-utils.js.map +1 -0
- package/dist/lib/model.d.ts +97 -0
- package/dist/lib/model.d.ts.map +1 -0
- package/dist/{esm/lib → lib}/model.js +63 -13
- package/dist/lib/model.js.map +1 -0
- package/dist/lib/program-manager.d.ts +38 -0
- package/dist/lib/program-manager.d.ts.map +1 -0
- package/dist/{esm/lib → lib}/program-manager.js +22 -10
- package/dist/lib/program-manager.js.map +1 -0
- package/dist/transform/buffer-transform.d.ts +36 -0
- package/dist/transform/buffer-transform.d.ts.map +1 -0
- package/dist/{esm/transform → transform}/buffer-transform.js +13 -5
- package/dist/transform/buffer-transform.js.map +1 -0
- package/dist/transform/texture-transform.d.ts +57 -0
- package/dist/transform/texture-transform.d.ts.map +1 -0
- package/dist/{esm/transform → transform}/texture-transform.js +48 -16
- package/dist/transform/texture-transform.js.map +1 -0
- package/dist/transform/transform-shader-utils.d.ts +26 -0
- package/dist/transform/transform-shader-utils.d.ts.map +1 -0
- package/dist/{esm/transform → transform}/transform-shader-utils.js +38 -46
- package/dist/transform/transform-shader-utils.js.map +1 -0
- package/dist/transform/transform-types.d.ts +43 -0
- package/dist/transform/transform-types.d.ts.map +1 -0
- package/dist/transform/transform-types.js +2 -0
- package/dist/transform/transform-types.js.map +1 -0
- package/dist/transform/transform.d.ts +28 -0
- package/dist/transform/transform.d.ts.map +1 -0
- package/dist/{esm/transform → transform}/transform.js +39 -34
- package/dist/transform/transform.js.map +1 -0
- package/dist/utils/clip-space.d.ts +5 -0
- package/dist/utils/clip-space.d.ts.map +1 -0
- package/dist/{esm/utils → utils}/clip-space.js +3 -17
- package/dist/utils/clip-space.js.map +1 -0
- package/package.json +10 -10
- package/src/animation/{key-frames.js → key-frames.ts} +18 -16
- package/src/animation/{timeline.js → timeline.ts} +54 -18
- package/src/bundle.ts +4 -0
- package/src/geometries/{cone-geometry.js → cone-geometry.ts} +9 -3
- package/src/geometries/{cube-geometry.js → cube-geometry.ts} +17 -12
- package/src/geometries/cylinder-geometry.ts +20 -0
- package/src/geometries/{ico-sphere-geometry.js → ico-sphere-geometry.ts} +10 -3
- package/src/geometries/{plane-geometry.js → plane-geometry.ts} +11 -6
- package/src/geometries/{sphere-geometry.js → sphere-geometry.ts} +15 -11
- package/src/geometries/{truncated-cone-geometry.js → truncated-cone-geometry.ts} +14 -5
- package/src/geometry/{geometry-utils.js → geometry-utils.ts} +2 -0
- package/src/geometry/{geometry.js → geometry.ts} +47 -34
- package/src/index.ts +30 -0
- package/src/lib/{animation-loop.js → animation-loop.ts} +237 -130
- package/src/lib/{model-utils.js → model-utils.ts} +2 -2
- package/src/lib/{model.js → model.ts} +148 -57
- package/src/lib/{program-manager.js → program-manager.ts} +46 -26
- package/src/transform/{buffer-transform.js → buffer-transform.ts} +40 -24
- package/src/transform/{texture-transform.js → texture-transform.ts} +34 -23
- package/src/transform/{transform-shader-utils.js → transform-shader-utils.ts} +55 -27
- package/src/transform/transform-types.ts +41 -0
- package/src/transform/{transform.js → transform.ts} +45 -49
- package/src/utils/{clip-space.js → clip-space.ts} +4 -3
- package/dist/dist.js +0 -32249
- package/dist/dist.min.js +0 -1
- package/dist/es5/animation/key-frames.d.ts +0 -19
- package/dist/es5/animation/key-frames.js +0 -95
- package/dist/es5/animation/key-frames.js.map +0 -1
- package/dist/es5/animation/timeline.d.ts +0 -39
- package/dist/es5/animation/timeline.js +0 -211
- package/dist/es5/animation/timeline.js.map +0 -1
- package/dist/es5/bundle.js +0 -9
- package/dist/es5/bundle.js.map +0 -1
- package/dist/es5/geometries/cone-geometry.d.ts +0 -5
- package/dist/es5/geometries/cone-geometry.js +0 -59
- package/dist/es5/geometries/cone-geometry.js.map +0 -1
- package/dist/es5/geometries/cube-geometry.d.ts +0 -5
- package/dist/es5/geometries/cube-geometry.js +0 -75
- package/dist/es5/geometries/cube-geometry.js.map +0 -1
- package/dist/es5/geometries/cylinder-geometry.d.ts +0 -5
- package/dist/es5/geometries/cylinder-geometry.js +0 -55
- package/dist/es5/geometries/cylinder-geometry.js.map +0 -1
- package/dist/es5/geometries/ico-sphere-geometry.d.ts +0 -5
- package/dist/es5/geometries/ico-sphere-geometry.js +0 -217
- package/dist/es5/geometries/ico-sphere-geometry.js.map +0 -1
- package/dist/es5/geometries/index.d.ts +0 -7
- package/dist/es5/geometries/index.js +0 -64
- package/dist/es5/geometries/index.js.map +0 -1
- package/dist/es5/geometries/plane-geometry.d.ts +0 -5
- package/dist/es5/geometries/plane-geometry.js +0 -168
- package/dist/es5/geometries/plane-geometry.js.map +0 -1
- package/dist/es5/geometries/sphere-geometry.d.ts +0 -5
- package/dist/es5/geometries/sphere-geometry.js +0 -152
- package/dist/es5/geometries/sphere-geometry.js.map +0 -1
- package/dist/es5/geometries/truncated-cone-geometry.d.ts +0 -5
- package/dist/es5/geometries/truncated-cone-geometry.js +0 -171
- package/dist/es5/geometries/truncated-cone-geometry.js.map +0 -1
- package/dist/es5/geometry/geometry-utils.d.ts +0 -1
- package/dist/es5/geometry/geometry-utils.js +0 -49
- package/dist/es5/geometry/geometry-utils.js.map +0 -1
- package/dist/es5/geometry/geometry.d.ts +0 -25
- package/dist/es5/geometry/geometry.js +0 -150
- package/dist/es5/geometry/geometry.js.map +0 -1
- package/dist/es5/index.d.ts +0 -19
- package/dist/es5/index.js +0 -128
- package/dist/es5/index.js.map +0 -1
- package/dist/es5/lib/animation-loop.d.ts +0 -158
- package/dist/es5/lib/animation-loop.js +0 -642
- package/dist/es5/lib/animation-loop.js.map +0 -1
- package/dist/es5/lib/model-utils.d.ts +0 -3
- package/dist/es5/lib/model-utils.js +0 -110
- package/dist/es5/lib/model-utils.js.map +0 -1
- package/dist/es5/lib/model.d.ts +0 -214
- package/dist/es5/lib/model.js +0 -584
- package/dist/es5/lib/model.js.map +0 -1
- package/dist/es5/lib/program-manager.d.ts +0 -79
- package/dist/es5/lib/program-manager.js +0 -238
- package/dist/es5/lib/program-manager.js.map +0 -1
- package/dist/es5/transform/buffer-transform.d.ts +0 -13
- package/dist/es5/transform/buffer-transform.js +0 -294
- package/dist/es5/transform/buffer-transform.js.map +0 -1
- package/dist/es5/transform/resource-transform.d.ts +0 -16
- package/dist/es5/transform/texture-transform.d.ts +0 -16
- package/dist/es5/transform/texture-transform.js +0 -405
- package/dist/es5/transform/texture-transform.js.map +0 -1
- package/dist/es5/transform/transform-shader-utils.d.ts +0 -31
- package/dist/es5/transform/transform-shader-utils.js +0 -160
- package/dist/es5/transform/transform-shader-utils.js.map +0 -1
- package/dist/es5/transform/transform.d.ts +0 -33
- package/dist/es5/transform/transform.js +0 -274
- package/dist/es5/transform/transform.js.map +0 -1
- package/dist/es5/utils/clip-space.d.ts +0 -5
- package/dist/es5/utils/clip-space.js +0 -72
- package/dist/es5/utils/clip-space.js.map +0 -1
- package/dist/esm/animation/key-frames.d.ts +0 -19
- package/dist/esm/animation/key-frames.js.map +0 -1
- package/dist/esm/animation/timeline.d.ts +0 -39
- package/dist/esm/animation/timeline.js.map +0 -1
- package/dist/esm/bundle.js +0 -7
- package/dist/esm/bundle.js.map +0 -1
- package/dist/esm/geometries/cone-geometry.d.ts +0 -5
- package/dist/esm/geometries/cone-geometry.js.map +0 -1
- package/dist/esm/geometries/cube-geometry.d.ts +0 -5
- package/dist/esm/geometries/cube-geometry.js.map +0 -1
- package/dist/esm/geometries/cylinder-geometry.d.ts +0 -5
- package/dist/esm/geometries/cylinder-geometry.js.map +0 -1
- package/dist/esm/geometries/ico-sphere-geometry.d.ts +0 -5
- package/dist/esm/geometries/ico-sphere-geometry.js.map +0 -1
- package/dist/esm/geometries/index.d.ts +0 -7
- package/dist/esm/geometries/index.js +0 -8
- package/dist/esm/geometries/index.js.map +0 -1
- package/dist/esm/geometries/plane-geometry.d.ts +0 -5
- package/dist/esm/geometries/plane-geometry.js.map +0 -1
- package/dist/esm/geometries/sphere-geometry.d.ts +0 -5
- package/dist/esm/geometries/sphere-geometry.js.map +0 -1
- package/dist/esm/geometries/truncated-cone-geometry.d.ts +0 -5
- package/dist/esm/geometries/truncated-cone-geometry.js.map +0 -1
- package/dist/esm/geometry/geometry-utils.d.ts +0 -1
- package/dist/esm/geometry/geometry-utils.js.map +0 -1
- package/dist/esm/geometry/geometry.d.ts +0 -25
- package/dist/esm/geometry/geometry.js.map +0 -1
- package/dist/esm/index.d.ts +0 -19
- package/dist/esm/index.js +0 -16
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/lib/animation-loop.d.ts +0 -158
- package/dist/esm/lib/animation-loop.js.map +0 -1
- package/dist/esm/lib/model-utils.d.ts +0 -3
- package/dist/esm/lib/model-utils.js.map +0 -1
- package/dist/esm/lib/model.d.ts +0 -214
- package/dist/esm/lib/model.js.map +0 -1
- package/dist/esm/lib/program-manager.d.ts +0 -79
- package/dist/esm/lib/program-manager.js.map +0 -1
- package/dist/esm/transform/buffer-transform.d.ts +0 -13
- package/dist/esm/transform/buffer-transform.js.map +0 -1
- package/dist/esm/transform/resource-transform.d.ts +0 -16
- package/dist/esm/transform/texture-transform.d.ts +0 -16
- package/dist/esm/transform/texture-transform.js.map +0 -1
- package/dist/esm/transform/transform-shader-utils.d.ts +0 -31
- package/dist/esm/transform/transform-shader-utils.js.map +0 -1
- package/dist/esm/transform/transform.d.ts +0 -33
- package/dist/esm/transform/transform.js.map +0 -1
- package/dist/esm/utils/clip-space.d.ts +0 -5
- package/dist/esm/utils/clip-space.js.map +0 -1
- package/src/animation/key-frames.d.ts +0 -19
- package/src/animation/timeline.d.ts +0 -39
- package/src/bundle.js +0 -7
- package/src/geometries/cone-geometry.d.ts +0 -5
- package/src/geometries/cube-geometry.d.ts +0 -5
- package/src/geometries/cylinder-geometry.d.ts +0 -5
- package/src/geometries/cylinder-geometry.js +0 -14
- package/src/geometries/ico-sphere-geometry.d.ts +0 -5
- package/src/geometries/index.d.ts +0 -7
- package/src/geometries/index.js +0 -7
- package/src/geometries/plane-geometry.d.ts +0 -5
- package/src/geometries/sphere-geometry.d.ts +0 -5
- package/src/geometries/truncated-cone-geometry.d.ts +0 -5
- package/src/geometry/geometry-utils.d.ts +0 -1
- package/src/geometry/geometry.d.ts +0 -25
- package/src/index.d.ts +0 -19
- package/src/index.js +0 -22
- package/src/lib/animation-loop.d.ts +0 -158
- package/src/lib/model-utils.d.ts +0 -3
- package/src/lib/model.d.ts +0 -214
- package/src/lib/program-manager.d.ts +0 -79
- package/src/transform/buffer-transform.d.ts +0 -13
- package/src/transform/resource-transform.d.ts +0 -16
- package/src/transform/texture-transform.d.ts +0 -16
- package/src/transform/transform-shader-utils.d.ts +0 -31
- package/src/transform/transform.d.ts +0 -33
- package/src/utils/clip-space.d.ts +0 -5
|
@@ -17,38 +17,144 @@ import {
|
|
|
17
17
|
assert
|
|
18
18
|
} from '@luma.gl/webgl';
|
|
19
19
|
|
|
20
|
+
import { Stats } from 'probe.gl'
|
|
21
|
+
import { Timeline } from '../animation/timeline'
|
|
22
|
+
|
|
23
|
+
import type {GLContextOptions} from '@luma.gl/gltools'
|
|
24
|
+
|
|
20
25
|
import {isBrowser} from 'probe.gl/env';
|
|
21
26
|
|
|
27
|
+
|
|
22
28
|
const isPage = isBrowser() && typeof document !== 'undefined';
|
|
23
29
|
|
|
24
30
|
let statIdCounter = 0;
|
|
25
31
|
|
|
32
|
+
/** AnimationLoop properties */
|
|
33
|
+
export type AnimationLoopProps = {
|
|
34
|
+
onCreateContext?: (opts: GLContextOptions) => WebGLRenderingContext; // TODO: signature from createGLContext
|
|
35
|
+
onAddHTML?: (div: HTMLDivElement) => string; // innerHTML
|
|
36
|
+
onInitialize?: ((animationProps: AnimationProps) => {}) | ((animationProps: AnimationProps) => {});
|
|
37
|
+
onRender?: (animationProps: AnimationProps) => void;
|
|
38
|
+
onFinalize?: (animationProps: AnimationProps) => void;
|
|
39
|
+
onError?: (reason: any) => void;
|
|
40
|
+
|
|
41
|
+
stats?: Stats;
|
|
42
|
+
|
|
43
|
+
gl?: WebGLRenderingContext
|
|
44
|
+
glOptions?: GLContextOptions // createGLContext options
|
|
45
|
+
debug?: boolean;
|
|
46
|
+
|
|
47
|
+
// view parameters
|
|
48
|
+
autoResizeViewport?: boolean;
|
|
49
|
+
autoResizeDrawingBuffer?: boolean;
|
|
50
|
+
useDevicePixels?: number | boolean;
|
|
51
|
+
|
|
52
|
+
/** @deprecated */
|
|
53
|
+
createFramebuffer?: boolean;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export type AnimationProps = {
|
|
57
|
+
gl: WebGLRenderingContext
|
|
58
|
+
|
|
59
|
+
stop: () => AnimationLoop
|
|
60
|
+
canvas: HTMLCanvasElement | OffscreenCanvas
|
|
61
|
+
framebuffer: Framebuffer
|
|
62
|
+
// Initial values
|
|
63
|
+
useDevicePixels: number | boolean
|
|
64
|
+
needsRedraw?: string
|
|
65
|
+
// Animation props
|
|
66
|
+
startTime: number
|
|
67
|
+
engineTime: number
|
|
68
|
+
tick: number
|
|
69
|
+
tock: number
|
|
70
|
+
|
|
71
|
+
// Timeline time for back compatibility
|
|
72
|
+
time: number
|
|
73
|
+
|
|
74
|
+
width: number
|
|
75
|
+
height: number
|
|
76
|
+
aspect: number
|
|
77
|
+
|
|
78
|
+
// Experimental
|
|
79
|
+
_timeline: Timeline
|
|
80
|
+
_loop: AnimationLoop
|
|
81
|
+
_animationLoop: AnimationLoop
|
|
82
|
+
_mousePosition?: [number, number] // [offsetX, offsetY]
|
|
83
|
+
_offScreen: boolean
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* instance of parameters after construction
|
|
87
|
+
type AnimationLoopPropsInternal = {
|
|
88
|
+
onCreateContext: (opts: GLContextOptions) => WebGLRenderingContext // TODO: signature from createGLContext
|
|
89
|
+
onAddHTML?: (div: HTMLDivElement) => string // innerHTML
|
|
90
|
+
onInitialize: (animationProps: AnimationProps) => AnimationProps | Promise<AnimationProps>
|
|
91
|
+
onRender: (animationProps: AnimationProps) => void
|
|
92
|
+
onFinalize: (animationProps: AnimationProps) => void
|
|
93
|
+
onError: (reason: any) => PromiseLike<never>
|
|
94
|
+
gl?: WebGLRenderingContext
|
|
95
|
+
glOptions: GLContextOptions // createGLContext options
|
|
96
|
+
debug: boolean
|
|
97
|
+
createFramebuffer: boolean
|
|
98
|
+
}
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
const DEFAULT_ANIMATION_LOOP_PROPS: Required<AnimationLoopProps> = {
|
|
102
|
+
onCreateContext: (opts) => createGLContext(opts),
|
|
103
|
+
onAddHTML: null,
|
|
104
|
+
onInitialize: () => ({}),
|
|
105
|
+
onRender: () => {},
|
|
106
|
+
onFinalize: () => {},
|
|
107
|
+
// eslint-disable-next-line no-console
|
|
108
|
+
onError: (error) => console.error(error),
|
|
109
|
+
|
|
110
|
+
gl: null,
|
|
111
|
+
glOptions: {},
|
|
112
|
+
debug: false,
|
|
113
|
+
|
|
114
|
+
createFramebuffer: false,
|
|
115
|
+
|
|
116
|
+
// view parameters
|
|
117
|
+
useDevicePixels: true,
|
|
118
|
+
autoResizeViewport: true,
|
|
119
|
+
autoResizeDrawingBuffer: true,
|
|
120
|
+
stats: lumaStats.get(`animation-loop-${statIdCounter++}`)
|
|
121
|
+
};
|
|
122
|
+
|
|
26
123
|
export default class AnimationLoop {
|
|
124
|
+
animationProps: AnimationProps;
|
|
125
|
+
props: Required<AnimationLoopProps>;
|
|
126
|
+
gl: WebGLRenderingContext;
|
|
127
|
+
canvas: HTMLCanvasElement | OffscreenCanvas;
|
|
128
|
+
framebuffer: Framebuffer = null;
|
|
129
|
+
timeline: Timeline = null;
|
|
130
|
+
stats: Stats;
|
|
131
|
+
cpuTime: Stats;
|
|
132
|
+
gpuTime: Stats;
|
|
133
|
+
frameRate: Stats;
|
|
134
|
+
offScreen: boolean;
|
|
135
|
+
|
|
136
|
+
display: any;
|
|
137
|
+
|
|
138
|
+
needsRedraw: string | null = 'initialized';
|
|
139
|
+
|
|
140
|
+
_initialized: boolean = false;
|
|
141
|
+
_running: boolean = false;
|
|
142
|
+
_animationFrameId = null;
|
|
143
|
+
_pageLoadPromise: Promise<{}> | null = null;
|
|
144
|
+
_nextFramePromise: Promise<AnimationLoop> | null = null;
|
|
145
|
+
_resolveNextFrame: ((AnimationLoop) => void) | null = null;
|
|
146
|
+
_cpuStartTime: number = 0;
|
|
147
|
+
|
|
148
|
+
_gpuTimeQuery: Query | null = null;
|
|
149
|
+
|
|
27
150
|
/*
|
|
28
151
|
* @param {HTMLCanvasElement} canvas - if provided, width and height will be passed to context
|
|
29
152
|
*/
|
|
30
|
-
constructor(props = {}) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
onAddHTML = null,
|
|
34
|
-
onInitialize = () => {},
|
|
35
|
-
onRender = () => {},
|
|
36
|
-
onFinalize = () => {},
|
|
37
|
-
onError,
|
|
38
|
-
|
|
39
|
-
gl = null,
|
|
40
|
-
glOptions = {},
|
|
41
|
-
debug = false,
|
|
42
|
-
|
|
43
|
-
createFramebuffer = false,
|
|
44
|
-
|
|
45
|
-
// view parameters
|
|
46
|
-
autoResizeViewport = true,
|
|
47
|
-
autoResizeDrawingBuffer = true,
|
|
48
|
-
stats = lumaStats.get(`animation-loop-${statIdCounter++}`)
|
|
49
|
-
} = props;
|
|
153
|
+
constructor(props: AnimationLoopProps = {}) {
|
|
154
|
+
this.props = {...DEFAULT_ANIMATION_LOOP_PROPS, ...props};
|
|
155
|
+
props = this.props;
|
|
50
156
|
|
|
51
|
-
let {useDevicePixels = true} = props;
|
|
157
|
+
let {useDevicePixels = true} = this.props;
|
|
52
158
|
|
|
53
159
|
if ('useDevicePixelRatio' in props) {
|
|
54
160
|
log.deprecated('useDevicePixelRatio', 'useDevicePixels')();
|
|
@@ -56,39 +162,16 @@ export default class AnimationLoop {
|
|
|
56
162
|
useDevicePixels = props.useDevicePixelRatio;
|
|
57
163
|
}
|
|
58
164
|
|
|
59
|
-
this.props = {
|
|
60
|
-
onCreateContext,
|
|
61
|
-
onAddHTML,
|
|
62
|
-
onInitialize,
|
|
63
|
-
onRender,
|
|
64
|
-
onFinalize,
|
|
65
|
-
onError,
|
|
66
|
-
|
|
67
|
-
gl,
|
|
68
|
-
glOptions,
|
|
69
|
-
debug,
|
|
70
|
-
createFramebuffer
|
|
71
|
-
};
|
|
72
|
-
|
|
73
165
|
// state
|
|
74
|
-
this.gl = gl;
|
|
75
|
-
this.
|
|
76
|
-
this.timeline = null;
|
|
77
|
-
this.stats = stats;
|
|
166
|
+
this.gl = props.gl;
|
|
167
|
+
this.stats = props.stats;
|
|
78
168
|
this.cpuTime = this.stats.get('CPU Time');
|
|
79
169
|
this.gpuTime = this.stats.get('GPU Time');
|
|
80
170
|
this.frameRate = this.stats.get('Frame Rate');
|
|
81
171
|
|
|
82
|
-
this._initialized = false;
|
|
83
|
-
this._running = false;
|
|
84
|
-
this._animationFrameId = null;
|
|
85
|
-
this._nextFramePromise = null;
|
|
86
|
-
this._resolveNextFrame = null;
|
|
87
|
-
this._cpuStartTime = 0;
|
|
88
|
-
|
|
89
172
|
this.setProps({
|
|
90
|
-
autoResizeViewport,
|
|
91
|
-
autoResizeDrawingBuffer,
|
|
173
|
+
autoResizeViewport: props.autoResizeViewport,
|
|
174
|
+
autoResizeDrawingBuffer: props.autoResizeDrawingBuffer,
|
|
92
175
|
useDevicePixels
|
|
93
176
|
});
|
|
94
177
|
|
|
@@ -96,89 +179,90 @@ export default class AnimationLoop {
|
|
|
96
179
|
this.start = this.start.bind(this);
|
|
97
180
|
this.stop = this.stop.bind(this);
|
|
98
181
|
|
|
99
|
-
this._pageLoadPromise = null;
|
|
100
182
|
|
|
101
183
|
this._onMousemove = this._onMousemove.bind(this);
|
|
102
184
|
this._onMouseleave = this._onMouseleave.bind(this);
|
|
103
185
|
}
|
|
104
186
|
|
|
105
|
-
delete() {
|
|
187
|
+
delete(): void {
|
|
106
188
|
this.stop();
|
|
107
189
|
this._setDisplay(null);
|
|
108
190
|
}
|
|
109
191
|
|
|
110
|
-
setNeedsRedraw(reason) {
|
|
111
|
-
assert(typeof reason === 'string');
|
|
192
|
+
setNeedsRedraw(reason: string): this {
|
|
112
193
|
this.needsRedraw = this.needsRedraw || reason;
|
|
113
194
|
return this;
|
|
114
195
|
}
|
|
115
196
|
|
|
116
|
-
setProps(props) {
|
|
197
|
+
setProps(props: AnimationLoopProps): this {
|
|
117
198
|
if ('autoResizeViewport' in props) {
|
|
118
|
-
this.autoResizeViewport = props.autoResizeViewport;
|
|
199
|
+
this.props.autoResizeViewport = props.autoResizeViewport;
|
|
119
200
|
}
|
|
120
201
|
if ('autoResizeDrawingBuffer' in props) {
|
|
121
|
-
this.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;
|
|
202
|
+
this.props.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;
|
|
122
203
|
}
|
|
123
204
|
if ('useDevicePixels' in props) {
|
|
124
|
-
this.useDevicePixels = props.useDevicePixels;
|
|
205
|
+
this.props.useDevicePixels = props.useDevicePixels;
|
|
125
206
|
}
|
|
126
207
|
return this;
|
|
127
208
|
}
|
|
128
209
|
|
|
129
|
-
// Starts a render loop if not already running
|
|
130
|
-
// @param {Object} context - contains frame specific info (E.g. tick, width, height, etc)
|
|
131
210
|
start(opts = {}) {
|
|
211
|
+
this._start(opts);
|
|
212
|
+
return this;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Starts a render loop if not already running
|
|
216
|
+
* @param {Object} context - contains frame specific info (E.g. tick, width, height, etc)
|
|
217
|
+
*/
|
|
218
|
+
async _start(opts) {
|
|
132
219
|
if (this._running) {
|
|
133
220
|
return this;
|
|
134
221
|
}
|
|
135
222
|
this._running = true;
|
|
223
|
+
|
|
136
224
|
// console.debug(`Starting ${this.constructor.name}`);
|
|
137
225
|
// Wait for start promise before rendering frame
|
|
138
|
-
|
|
139
|
-
.
|
|
140
|
-
if (!this._running || this._initialized) {
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
226
|
+
try {
|
|
227
|
+
await this._getPageLoadPromise();
|
|
143
228
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// Initialize the callback data
|
|
150
|
-
this._initializeCallbackData();
|
|
151
|
-
this._updateCallbackData();
|
|
229
|
+
// check that we haven't been stopped
|
|
230
|
+
if (!this._running) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
152
233
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
this.
|
|
234
|
+
let appContext;
|
|
235
|
+
if (!this._initialized) {
|
|
236
|
+
this._initialized = true;
|
|
237
|
+
this._initialize(opts);
|
|
156
238
|
|
|
157
|
-
|
|
239
|
+
// Note: onIntialize can return a promise (in case app needs to load resources)
|
|
240
|
+
appContext = await this.onInitialize(this.animationProps);
|
|
241
|
+
this._addCallbackData(appContext || {});
|
|
242
|
+
}
|
|
158
243
|
|
|
159
|
-
|
|
244
|
+
// check that we haven't been stopped
|
|
245
|
+
if (!this._running) {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
160
248
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if (appContext !== false) {
|
|
168
|
-
this._startLoop();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
});
|
|
249
|
+
// Start the loop
|
|
250
|
+
if (appContext !== false) {
|
|
251
|
+
// cancel any pending renders to ensure only one loop can ever run
|
|
252
|
+
this._cancelAnimationFrame();
|
|
253
|
+
this._requestAnimationFrame();
|
|
254
|
+
}
|
|
172
255
|
|
|
173
|
-
|
|
174
|
-
|
|
256
|
+
return this;
|
|
257
|
+
} catch (error) {
|
|
258
|
+
this.props.onError(error);
|
|
259
|
+
// this._running = false; // TODO
|
|
260
|
+
return null;
|
|
175
261
|
}
|
|
176
|
-
|
|
177
|
-
return this;
|
|
178
262
|
}
|
|
179
263
|
|
|
180
|
-
|
|
181
|
-
redraw() {
|
|
264
|
+
/** Explicitly draw a frame */
|
|
265
|
+
redraw(): this {
|
|
182
266
|
if (this.isContextLost()) {
|
|
183
267
|
return this;
|
|
184
268
|
}
|
|
@@ -193,9 +277,12 @@ export default class AnimationLoop {
|
|
|
193
277
|
// clear needsRedraw flag
|
|
194
278
|
this._clearNeedsRedraw();
|
|
195
279
|
|
|
280
|
+
// Offscreen Canvas Support: Commit the frame
|
|
196
281
|
// https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/commit
|
|
197
282
|
// Chrome's offscreen canvas does not require gl.commit
|
|
283
|
+
// @ts-expect-error gl.commit is not officially part of WebGLRenderingContext
|
|
198
284
|
if (this.offScreen && this.gl.commit) {
|
|
285
|
+
// @ts-expect-error gl.commit is not officially part of WebGLRenderingContext
|
|
199
286
|
this.gl.commit();
|
|
200
287
|
}
|
|
201
288
|
|
|
@@ -215,30 +302,28 @@ export default class AnimationLoop {
|
|
|
215
302
|
// console.debug(`Stopping ${this.constructor.name}`);
|
|
216
303
|
if (this._running) {
|
|
217
304
|
this._finalizeCallbackData();
|
|
218
|
-
this._cancelAnimationFrame(
|
|
305
|
+
this._cancelAnimationFrame();
|
|
219
306
|
this._nextFramePromise = null;
|
|
220
307
|
this._resolveNextFrame = null;
|
|
221
|
-
this._animationFrameId = null;
|
|
222
308
|
this._running = false;
|
|
223
309
|
}
|
|
224
310
|
return this;
|
|
225
311
|
}
|
|
226
312
|
|
|
227
|
-
attachTimeline(timeline) {
|
|
313
|
+
attachTimeline(timeline: Timeline): Timeline {
|
|
228
314
|
this.timeline = timeline;
|
|
229
|
-
|
|
230
315
|
return this.timeline;
|
|
231
316
|
}
|
|
232
317
|
|
|
233
|
-
detachTimeline() {
|
|
318
|
+
detachTimeline(): void {
|
|
234
319
|
this.timeline = null;
|
|
235
320
|
}
|
|
236
321
|
|
|
237
|
-
waitForRender() {
|
|
322
|
+
waitForRender(): Promise<AnimationLoop> {
|
|
238
323
|
this.setNeedsRedraw('waitForRender');
|
|
239
324
|
|
|
240
325
|
if (!this._nextFramePromise) {
|
|
241
|
-
this._nextFramePromise = new Promise(resolve => {
|
|
326
|
+
this._nextFramePromise = new Promise((resolve) => {
|
|
242
327
|
this._resolveNextFrame = resolve;
|
|
243
328
|
});
|
|
244
329
|
}
|
|
@@ -258,18 +343,22 @@ export default class AnimationLoop {
|
|
|
258
343
|
}
|
|
259
344
|
|
|
260
345
|
onCreateContext(...args) {
|
|
346
|
+
// @ts-expect-error
|
|
261
347
|
return this.props.onCreateContext(...args);
|
|
262
348
|
}
|
|
263
349
|
|
|
264
350
|
onInitialize(...args) {
|
|
351
|
+
// @ts-expect-error
|
|
265
352
|
return this.props.onInitialize(...args);
|
|
266
353
|
}
|
|
267
354
|
|
|
268
355
|
onRender(...args) {
|
|
356
|
+
// @ts-expect-error
|
|
269
357
|
return this.props.onRender(...args);
|
|
270
358
|
}
|
|
271
359
|
|
|
272
360
|
onFinalize(...args) {
|
|
361
|
+
// @ts-expect-error
|
|
273
362
|
return this.props.onFinalize(...args);
|
|
274
363
|
}
|
|
275
364
|
|
|
@@ -289,21 +378,22 @@ export default class AnimationLoop {
|
|
|
289
378
|
|
|
290
379
|
// PRIVATE METHODS
|
|
291
380
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
this.redraw();
|
|
298
|
-
this._animationFrameId = this._requestAnimationFrame(renderFrame);
|
|
299
|
-
};
|
|
381
|
+
_initialize(opts) {
|
|
382
|
+
// Create the WebGL context
|
|
383
|
+
this._createWebGLContext(opts);
|
|
384
|
+
this._createFramebuffer();
|
|
385
|
+
this._startEventHandling();
|
|
300
386
|
|
|
301
|
-
//
|
|
302
|
-
this.
|
|
303
|
-
this.
|
|
304
|
-
}
|
|
387
|
+
// Initialize the callback data
|
|
388
|
+
this._initializeCallbackData();
|
|
389
|
+
this._updateCallbackData();
|
|
305
390
|
|
|
306
|
-
|
|
391
|
+
// Default viewport setup, in case onInitialize wants to render
|
|
392
|
+
this._resizeCanvasDrawingBuffer();
|
|
393
|
+
this._resizeViewport();
|
|
394
|
+
|
|
395
|
+
this._gpuTimeQuery = Query.isSupported(this.gl, ['timers']) ? new Query(this.gl) : null;
|
|
396
|
+
}
|
|
307
397
|
|
|
308
398
|
_getPageLoadPromise() {
|
|
309
399
|
if (!this._pageLoadPromise) {
|
|
@@ -336,25 +426,41 @@ export default class AnimationLoop {
|
|
|
336
426
|
this.display = display;
|
|
337
427
|
}
|
|
338
428
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
return this.display.cancelAnimationFrame(animationFrameId);
|
|
429
|
+
_requestAnimationFrame() {
|
|
430
|
+
if (!this._running) {
|
|
431
|
+
return;
|
|
343
432
|
}
|
|
344
433
|
|
|
345
|
-
|
|
434
|
+
// VR display has a separate animation frame to sync with headset
|
|
435
|
+
// TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/
|
|
436
|
+
// See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame
|
|
437
|
+
// if (this.display && this.display.requestAnimationFrame) {
|
|
438
|
+
// this._animationFrameId = this.display.requestAnimationFrame(this._animationFrame.bind(this));
|
|
439
|
+
// }
|
|
440
|
+
this._animationFrameId = requestAnimationFrame(this._animationFrame.bind(this));
|
|
346
441
|
}
|
|
347
442
|
|
|
348
|
-
|
|
349
|
-
if (this.
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
return this.display.requestAnimationFrame(renderFrameCallback);
|
|
353
|
-
}
|
|
443
|
+
_cancelAnimationFrame() {
|
|
444
|
+
if (this._animationFrameId !== null) {
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
354
447
|
|
|
355
|
-
|
|
448
|
+
// VR display has a separate animation frame to sync with headset
|
|
449
|
+
// TODO WebVR API discontinued, replaced by WebXR: https://immersive-web.github.io/webxr/
|
|
450
|
+
// See https://developer.mozilla.org/en-US/docs/Web/API/VRDisplay/requestAnimationFrame
|
|
451
|
+
// if (this.display && this.display.cancelAnimationFrame) {
|
|
452
|
+
// this.display.cancelAnimationFrame(this._animationFrameId);
|
|
453
|
+
// }
|
|
454
|
+
cancelAnimationFrame(this._animationFrameId);
|
|
455
|
+
this._animationFrameId = null;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
_animationFrame() {
|
|
459
|
+
if (!this._running) {
|
|
460
|
+
return;
|
|
356
461
|
}
|
|
357
|
-
|
|
462
|
+
this.redraw();
|
|
463
|
+
this._requestAnimationFrame();
|
|
358
464
|
}
|
|
359
465
|
|
|
360
466
|
// Called on each frame, can be overridden to call onRender multiple times
|
|
@@ -383,6 +489,7 @@ export default class AnimationLoop {
|
|
|
383
489
|
|
|
384
490
|
// Initialize the object that will be passed to app callbacks
|
|
385
491
|
_initializeCallbackData() {
|
|
492
|
+
// @ts-expect-error
|
|
386
493
|
this.animationProps = {
|
|
387
494
|
gl: this.gl,
|
|
388
495
|
|
|
@@ -391,7 +498,7 @@ export default class AnimationLoop {
|
|
|
391
498
|
framebuffer: this.framebuffer,
|
|
392
499
|
|
|
393
500
|
// Initial values
|
|
394
|
-
useDevicePixels: this.useDevicePixels,
|
|
501
|
+
useDevicePixels: this.props.useDevicePixels,
|
|
395
502
|
needsRedraw: null,
|
|
396
503
|
|
|
397
504
|
// Animation props
|
|
@@ -520,7 +627,7 @@ export default class AnimationLoop {
|
|
|
520
627
|
|
|
521
628
|
// Default viewport setup
|
|
522
629
|
_resizeViewport() {
|
|
523
|
-
if (this.autoResizeViewport) {
|
|
630
|
+
if (this.props.autoResizeViewport) {
|
|
524
631
|
this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight);
|
|
525
632
|
}
|
|
526
633
|
}
|
|
@@ -528,8 +635,8 @@ export default class AnimationLoop {
|
|
|
528
635
|
// Resize the render buffer of the canvas to match canvas client size
|
|
529
636
|
// Optionally multiplying with devicePixel ratio
|
|
530
637
|
_resizeCanvasDrawingBuffer() {
|
|
531
|
-
if (this.autoResizeDrawingBuffer) {
|
|
532
|
-
resizeGLContext(this.gl, {useDevicePixels: this.useDevicePixels});
|
|
638
|
+
if (this.props.autoResizeDrawingBuffer) {
|
|
639
|
+
resizeGLContext(this.gl, {useDevicePixels: this.props.useDevicePixels});
|
|
533
640
|
}
|
|
534
641
|
}
|
|
535
642
|
|
|
@@ -11,8 +11,8 @@ const GLTF_TO_LUMA_ATTRIBUTE_MAP = {
|
|
|
11
11
|
TEXCOORD_2: 'texCoords2'
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
export function getBuffersFromGeometry(gl, geometry, options) {
|
|
15
|
-
const buffers = {};
|
|
14
|
+
export function getBuffersFromGeometry(gl: WebGLRenderingContext, geometry, options?) {
|
|
15
|
+
const buffers: Record<string, Buffer | [Buffer, {}]> = {};
|
|
16
16
|
let indices = geometry.indices;
|
|
17
17
|
|
|
18
18
|
for (const name in geometry.attributes) {
|