@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.
Files changed (263) hide show
  1. package/dist/animation/key-frames.d.ts +18 -0
  2. package/dist/animation/key-frames.d.ts.map +1 -0
  3. package/dist/{esm/animation → animation}/key-frames.js +13 -6
  4. package/dist/animation/key-frames.js.map +1 -0
  5. package/dist/animation/timeline.d.ts +51 -0
  6. package/dist/animation/timeline.d.ts.map +1 -0
  7. package/dist/{esm/animation → animation}/timeline.js +10 -5
  8. package/dist/animation/timeline.js.map +1 -0
  9. package/dist/bundle.d.ts +2 -0
  10. package/dist/bundle.d.ts.map +1 -0
  11. package/dist/bundle.js +5 -0
  12. package/dist/bundle.js.map +1 -0
  13. package/dist/geometries/cone-geometry.d.ts +10 -0
  14. package/dist/geometries/cone-geometry.d.ts.map +1 -0
  15. package/dist/{esm/geometries → geometries}/cone-geometry.js +2 -2
  16. package/dist/geometries/cone-geometry.js.map +1 -0
  17. package/dist/geometries/cube-geometry.d.ts +9 -0
  18. package/dist/geometries/cube-geometry.d.ts.map +1 -0
  19. package/dist/{esm/geometries → geometries}/cube-geometry.js +18 -18
  20. package/dist/geometries/cube-geometry.js.map +1 -0
  21. package/dist/geometries/cylinder-geometry.d.ts +10 -0
  22. package/dist/geometries/cylinder-geometry.d.ts.map +1 -0
  23. package/dist/{esm/geometries → geometries}/cylinder-geometry.js +2 -2
  24. package/dist/geometries/cylinder-geometry.js.map +1 -0
  25. package/dist/geometries/ico-sphere-geometry.d.ts +11 -0
  26. package/dist/geometries/ico-sphere-geometry.d.ts.map +1 -0
  27. package/dist/{esm/geometries → geometries}/ico-sphere-geometry.js +2 -2
  28. package/dist/geometries/ico-sphere-geometry.js.map +1 -0
  29. package/dist/geometries/plane-geometry.d.ts +10 -0
  30. package/dist/geometries/plane-geometry.d.ts.map +1 -0
  31. package/dist/{esm/geometries → geometries}/plane-geometry.js +5 -5
  32. package/dist/geometries/plane-geometry.js.map +1 -0
  33. package/dist/geometries/sphere-geometry.d.ts +12 -0
  34. package/dist/geometries/sphere-geometry.d.ts.map +1 -0
  35. package/dist/{esm/geometries → geometries}/sphere-geometry.js +2 -9
  36. package/dist/geometries/sphere-geometry.js.map +1 -0
  37. package/dist/geometries/truncated-cone-geometry.d.ts +13 -0
  38. package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -0
  39. package/dist/{esm/geometries → geometries}/truncated-cone-geometry.js +1 -1
  40. package/dist/geometries/truncated-cone-geometry.js.map +1 -0
  41. package/dist/geometry/geometry-utils.d.ts +2 -0
  42. package/dist/geometry/geometry-utils.d.ts.map +1 -0
  43. package/dist/{esm/geometry → geometry}/geometry-utils.js +0 -0
  44. package/dist/geometry/geometry-utils.js.map +1 -0
  45. package/dist/geometry/geometry.d.ts +44 -0
  46. package/dist/geometry/geometry.d.ts.map +1 -0
  47. package/dist/{esm/geometry → geometry}/geometry.js +28 -19
  48. package/dist/geometry/geometry.js.map +1 -0
  49. package/dist/index.d.ts +16 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +16 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/lib/animation-loop.d.ts +120 -0
  54. package/dist/lib/animation-loop.d.ts.map +1 -0
  55. package/dist/{esm/lib → lib}/animation-loop.js +135 -97
  56. package/dist/lib/animation-loop.js.map +1 -0
  57. package/dist/lib/model-utils.d.ts +4 -0
  58. package/dist/lib/model-utils.d.ts.map +1 -0
  59. package/dist/{esm/lib → lib}/model-utils.js +3 -2
  60. package/dist/lib/model-utils.js.map +1 -0
  61. package/dist/lib/model.d.ts +97 -0
  62. package/dist/lib/model.d.ts.map +1 -0
  63. package/dist/{esm/lib → lib}/model.js +63 -13
  64. package/dist/lib/model.js.map +1 -0
  65. package/dist/lib/program-manager.d.ts +38 -0
  66. package/dist/lib/program-manager.d.ts.map +1 -0
  67. package/dist/{esm/lib → lib}/program-manager.js +22 -10
  68. package/dist/lib/program-manager.js.map +1 -0
  69. package/dist/transform/buffer-transform.d.ts +36 -0
  70. package/dist/transform/buffer-transform.d.ts.map +1 -0
  71. package/dist/{esm/transform → transform}/buffer-transform.js +13 -5
  72. package/dist/transform/buffer-transform.js.map +1 -0
  73. package/dist/transform/texture-transform.d.ts +57 -0
  74. package/dist/transform/texture-transform.d.ts.map +1 -0
  75. package/dist/{esm/transform → transform}/texture-transform.js +48 -16
  76. package/dist/transform/texture-transform.js.map +1 -0
  77. package/dist/transform/transform-shader-utils.d.ts +26 -0
  78. package/dist/transform/transform-shader-utils.d.ts.map +1 -0
  79. package/dist/{esm/transform → transform}/transform-shader-utils.js +38 -46
  80. package/dist/transform/transform-shader-utils.js.map +1 -0
  81. package/dist/transform/transform-types.d.ts +43 -0
  82. package/dist/transform/transform-types.d.ts.map +1 -0
  83. package/dist/transform/transform-types.js +2 -0
  84. package/dist/transform/transform-types.js.map +1 -0
  85. package/dist/transform/transform.d.ts +28 -0
  86. package/dist/transform/transform.d.ts.map +1 -0
  87. package/dist/{esm/transform → transform}/transform.js +39 -34
  88. package/dist/transform/transform.js.map +1 -0
  89. package/dist/utils/clip-space.d.ts +5 -0
  90. package/dist/utils/clip-space.d.ts.map +1 -0
  91. package/dist/{esm/utils → utils}/clip-space.js +3 -17
  92. package/dist/utils/clip-space.js.map +1 -0
  93. package/package.json +10 -10
  94. package/src/animation/{key-frames.js → key-frames.ts} +18 -16
  95. package/src/animation/{timeline.js → timeline.ts} +54 -18
  96. package/src/bundle.ts +4 -0
  97. package/src/geometries/{cone-geometry.js → cone-geometry.ts} +9 -3
  98. package/src/geometries/{cube-geometry.js → cube-geometry.ts} +17 -12
  99. package/src/geometries/cylinder-geometry.ts +20 -0
  100. package/src/geometries/{ico-sphere-geometry.js → ico-sphere-geometry.ts} +10 -3
  101. package/src/geometries/{plane-geometry.js → plane-geometry.ts} +11 -6
  102. package/src/geometries/{sphere-geometry.js → sphere-geometry.ts} +15 -11
  103. package/src/geometries/{truncated-cone-geometry.js → truncated-cone-geometry.ts} +14 -5
  104. package/src/geometry/{geometry-utils.js → geometry-utils.ts} +2 -0
  105. package/src/geometry/{geometry.js → geometry.ts} +47 -34
  106. package/src/index.ts +30 -0
  107. package/src/lib/{animation-loop.js → animation-loop.ts} +237 -130
  108. package/src/lib/{model-utils.js → model-utils.ts} +2 -2
  109. package/src/lib/{model.js → model.ts} +148 -57
  110. package/src/lib/{program-manager.js → program-manager.ts} +46 -26
  111. package/src/transform/{buffer-transform.js → buffer-transform.ts} +40 -24
  112. package/src/transform/{texture-transform.js → texture-transform.ts} +34 -23
  113. package/src/transform/{transform-shader-utils.js → transform-shader-utils.ts} +55 -27
  114. package/src/transform/transform-types.ts +41 -0
  115. package/src/transform/{transform.js → transform.ts} +45 -49
  116. package/src/utils/{clip-space.js → clip-space.ts} +4 -3
  117. package/dist/dist.js +0 -32249
  118. package/dist/dist.min.js +0 -1
  119. package/dist/es5/animation/key-frames.d.ts +0 -19
  120. package/dist/es5/animation/key-frames.js +0 -95
  121. package/dist/es5/animation/key-frames.js.map +0 -1
  122. package/dist/es5/animation/timeline.d.ts +0 -39
  123. package/dist/es5/animation/timeline.js +0 -211
  124. package/dist/es5/animation/timeline.js.map +0 -1
  125. package/dist/es5/bundle.js +0 -9
  126. package/dist/es5/bundle.js.map +0 -1
  127. package/dist/es5/geometries/cone-geometry.d.ts +0 -5
  128. package/dist/es5/geometries/cone-geometry.js +0 -59
  129. package/dist/es5/geometries/cone-geometry.js.map +0 -1
  130. package/dist/es5/geometries/cube-geometry.d.ts +0 -5
  131. package/dist/es5/geometries/cube-geometry.js +0 -75
  132. package/dist/es5/geometries/cube-geometry.js.map +0 -1
  133. package/dist/es5/geometries/cylinder-geometry.d.ts +0 -5
  134. package/dist/es5/geometries/cylinder-geometry.js +0 -55
  135. package/dist/es5/geometries/cylinder-geometry.js.map +0 -1
  136. package/dist/es5/geometries/ico-sphere-geometry.d.ts +0 -5
  137. package/dist/es5/geometries/ico-sphere-geometry.js +0 -217
  138. package/dist/es5/geometries/ico-sphere-geometry.js.map +0 -1
  139. package/dist/es5/geometries/index.d.ts +0 -7
  140. package/dist/es5/geometries/index.js +0 -64
  141. package/dist/es5/geometries/index.js.map +0 -1
  142. package/dist/es5/geometries/plane-geometry.d.ts +0 -5
  143. package/dist/es5/geometries/plane-geometry.js +0 -168
  144. package/dist/es5/geometries/plane-geometry.js.map +0 -1
  145. package/dist/es5/geometries/sphere-geometry.d.ts +0 -5
  146. package/dist/es5/geometries/sphere-geometry.js +0 -152
  147. package/dist/es5/geometries/sphere-geometry.js.map +0 -1
  148. package/dist/es5/geometries/truncated-cone-geometry.d.ts +0 -5
  149. package/dist/es5/geometries/truncated-cone-geometry.js +0 -171
  150. package/dist/es5/geometries/truncated-cone-geometry.js.map +0 -1
  151. package/dist/es5/geometry/geometry-utils.d.ts +0 -1
  152. package/dist/es5/geometry/geometry-utils.js +0 -49
  153. package/dist/es5/geometry/geometry-utils.js.map +0 -1
  154. package/dist/es5/geometry/geometry.d.ts +0 -25
  155. package/dist/es5/geometry/geometry.js +0 -150
  156. package/dist/es5/geometry/geometry.js.map +0 -1
  157. package/dist/es5/index.d.ts +0 -19
  158. package/dist/es5/index.js +0 -128
  159. package/dist/es5/index.js.map +0 -1
  160. package/dist/es5/lib/animation-loop.d.ts +0 -158
  161. package/dist/es5/lib/animation-loop.js +0 -642
  162. package/dist/es5/lib/animation-loop.js.map +0 -1
  163. package/dist/es5/lib/model-utils.d.ts +0 -3
  164. package/dist/es5/lib/model-utils.js +0 -110
  165. package/dist/es5/lib/model-utils.js.map +0 -1
  166. package/dist/es5/lib/model.d.ts +0 -214
  167. package/dist/es5/lib/model.js +0 -584
  168. package/dist/es5/lib/model.js.map +0 -1
  169. package/dist/es5/lib/program-manager.d.ts +0 -79
  170. package/dist/es5/lib/program-manager.js +0 -238
  171. package/dist/es5/lib/program-manager.js.map +0 -1
  172. package/dist/es5/transform/buffer-transform.d.ts +0 -13
  173. package/dist/es5/transform/buffer-transform.js +0 -294
  174. package/dist/es5/transform/buffer-transform.js.map +0 -1
  175. package/dist/es5/transform/resource-transform.d.ts +0 -16
  176. package/dist/es5/transform/texture-transform.d.ts +0 -16
  177. package/dist/es5/transform/texture-transform.js +0 -405
  178. package/dist/es5/transform/texture-transform.js.map +0 -1
  179. package/dist/es5/transform/transform-shader-utils.d.ts +0 -31
  180. package/dist/es5/transform/transform-shader-utils.js +0 -160
  181. package/dist/es5/transform/transform-shader-utils.js.map +0 -1
  182. package/dist/es5/transform/transform.d.ts +0 -33
  183. package/dist/es5/transform/transform.js +0 -274
  184. package/dist/es5/transform/transform.js.map +0 -1
  185. package/dist/es5/utils/clip-space.d.ts +0 -5
  186. package/dist/es5/utils/clip-space.js +0 -72
  187. package/dist/es5/utils/clip-space.js.map +0 -1
  188. package/dist/esm/animation/key-frames.d.ts +0 -19
  189. package/dist/esm/animation/key-frames.js.map +0 -1
  190. package/dist/esm/animation/timeline.d.ts +0 -39
  191. package/dist/esm/animation/timeline.js.map +0 -1
  192. package/dist/esm/bundle.js +0 -7
  193. package/dist/esm/bundle.js.map +0 -1
  194. package/dist/esm/geometries/cone-geometry.d.ts +0 -5
  195. package/dist/esm/geometries/cone-geometry.js.map +0 -1
  196. package/dist/esm/geometries/cube-geometry.d.ts +0 -5
  197. package/dist/esm/geometries/cube-geometry.js.map +0 -1
  198. package/dist/esm/geometries/cylinder-geometry.d.ts +0 -5
  199. package/dist/esm/geometries/cylinder-geometry.js.map +0 -1
  200. package/dist/esm/geometries/ico-sphere-geometry.d.ts +0 -5
  201. package/dist/esm/geometries/ico-sphere-geometry.js.map +0 -1
  202. package/dist/esm/geometries/index.d.ts +0 -7
  203. package/dist/esm/geometries/index.js +0 -8
  204. package/dist/esm/geometries/index.js.map +0 -1
  205. package/dist/esm/geometries/plane-geometry.d.ts +0 -5
  206. package/dist/esm/geometries/plane-geometry.js.map +0 -1
  207. package/dist/esm/geometries/sphere-geometry.d.ts +0 -5
  208. package/dist/esm/geometries/sphere-geometry.js.map +0 -1
  209. package/dist/esm/geometries/truncated-cone-geometry.d.ts +0 -5
  210. package/dist/esm/geometries/truncated-cone-geometry.js.map +0 -1
  211. package/dist/esm/geometry/geometry-utils.d.ts +0 -1
  212. package/dist/esm/geometry/geometry-utils.js.map +0 -1
  213. package/dist/esm/geometry/geometry.d.ts +0 -25
  214. package/dist/esm/geometry/geometry.js.map +0 -1
  215. package/dist/esm/index.d.ts +0 -19
  216. package/dist/esm/index.js +0 -16
  217. package/dist/esm/index.js.map +0 -1
  218. package/dist/esm/lib/animation-loop.d.ts +0 -158
  219. package/dist/esm/lib/animation-loop.js.map +0 -1
  220. package/dist/esm/lib/model-utils.d.ts +0 -3
  221. package/dist/esm/lib/model-utils.js.map +0 -1
  222. package/dist/esm/lib/model.d.ts +0 -214
  223. package/dist/esm/lib/model.js.map +0 -1
  224. package/dist/esm/lib/program-manager.d.ts +0 -79
  225. package/dist/esm/lib/program-manager.js.map +0 -1
  226. package/dist/esm/transform/buffer-transform.d.ts +0 -13
  227. package/dist/esm/transform/buffer-transform.js.map +0 -1
  228. package/dist/esm/transform/resource-transform.d.ts +0 -16
  229. package/dist/esm/transform/texture-transform.d.ts +0 -16
  230. package/dist/esm/transform/texture-transform.js.map +0 -1
  231. package/dist/esm/transform/transform-shader-utils.d.ts +0 -31
  232. package/dist/esm/transform/transform-shader-utils.js.map +0 -1
  233. package/dist/esm/transform/transform.d.ts +0 -33
  234. package/dist/esm/transform/transform.js.map +0 -1
  235. package/dist/esm/utils/clip-space.d.ts +0 -5
  236. package/dist/esm/utils/clip-space.js.map +0 -1
  237. package/src/animation/key-frames.d.ts +0 -19
  238. package/src/animation/timeline.d.ts +0 -39
  239. package/src/bundle.js +0 -7
  240. package/src/geometries/cone-geometry.d.ts +0 -5
  241. package/src/geometries/cube-geometry.d.ts +0 -5
  242. package/src/geometries/cylinder-geometry.d.ts +0 -5
  243. package/src/geometries/cylinder-geometry.js +0 -14
  244. package/src/geometries/ico-sphere-geometry.d.ts +0 -5
  245. package/src/geometries/index.d.ts +0 -7
  246. package/src/geometries/index.js +0 -7
  247. package/src/geometries/plane-geometry.d.ts +0 -5
  248. package/src/geometries/sphere-geometry.d.ts +0 -5
  249. package/src/geometries/truncated-cone-geometry.d.ts +0 -5
  250. package/src/geometry/geometry-utils.d.ts +0 -1
  251. package/src/geometry/geometry.d.ts +0 -25
  252. package/src/index.d.ts +0 -19
  253. package/src/index.js +0 -22
  254. package/src/lib/animation-loop.d.ts +0 -158
  255. package/src/lib/model-utils.d.ts +0 -3
  256. package/src/lib/model.d.ts +0 -214
  257. package/src/lib/program-manager.d.ts +0 -79
  258. package/src/transform/buffer-transform.d.ts +0 -13
  259. package/src/transform/resource-transform.d.ts +0 -16
  260. package/src/transform/texture-transform.d.ts +0 -16
  261. package/src/transform/transform-shader-utils.d.ts +0 -31
  262. package/src/transform/transform.d.ts +0 -33
  263. 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
- const {
32
- onCreateContext = opts => createGLContext(opts),
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.needsRedraw = null;
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
- const startPromise = this._getPageLoadPromise()
139
- .then(() => {
140
- if (!this._running || this._initialized) {
141
- return null;
142
- }
226
+ try {
227
+ await this._getPageLoadPromise();
143
228
 
144
- // Create the WebGL context
145
- this._createWebGLContext(opts);
146
- this._createFramebuffer();
147
- this._startEventHandling();
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
- // Default viewport setup, in case onInitialize wants to render
154
- this._resizeCanvasDrawingBuffer();
155
- this._resizeViewport();
234
+ let appContext;
235
+ if (!this._initialized) {
236
+ this._initialized = true;
237
+ this._initialize(opts);
156
238
 
157
- this._gpuTimeQuery = Query.isSupported(this.gl, ['timers']) ? new Query(this.gl) : null;
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
- this._initialized = true;
244
+ // check that we haven't been stopped
245
+ if (!this._running) {
246
+ return null;
247
+ }
160
248
 
161
- // Note: onIntialize can return a promise (in case it needs to load resources)
162
- return this.onInitialize(this.animationProps);
163
- })
164
- .then(appContext => {
165
- if (this._running) {
166
- this._addCallbackData(appContext || {});
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
- if (this.props.onError) {
174
- startPromise.catch(this.props.onError);
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
- // Redraw now
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(this._animationFrameId);
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
- _startLoop() {
293
- const renderFrame = () => {
294
- if (!this._running) {
295
- return;
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
- // cancel any pending renders to ensure only one loop can ever run
302
- this._cancelAnimationFrame(this._animationFrameId);
303
- this._animationFrameId = this._requestAnimationFrame(renderFrame);
304
- }
387
+ // Initialize the callback data
388
+ this._initializeCallbackData();
389
+ this._updateCallbackData();
305
390
 
306
- // PRIVATE METHODS
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
- _cancelAnimationFrame(animationFrameId) {
340
- // E.g. VR display has a separate animation frame to sync with headset
341
- if (this.display && this.display.cancelAnimationFrame) {
342
- return this.display.cancelAnimationFrame(animationFrameId);
429
+ _requestAnimationFrame() {
430
+ if (!this._running) {
431
+ return;
343
432
  }
344
433
 
345
- return cancelAnimationFrame(animationFrameId);
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
- _requestAnimationFrame(renderFrameCallback) {
349
- if (this._running) {
350
- // E.g. VR display has a separate animation frame to sync with headset
351
- if (this.display && this.display.requestAnimationFrame) {
352
- return this.display.requestAnimationFrame(renderFrameCallback);
353
- }
443
+ _cancelAnimationFrame() {
444
+ if (this._animationFrameId !== null) {
445
+ return;
446
+ }
354
447
 
355
- return requestAnimationFrame(renderFrameCallback);
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
- return undefined;
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) {