lecodes-viewer 0.19.0

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 (103) hide show
  1. package/README.md +5 -0
  2. package/dist-embed/VERSION.json +5 -0
  3. package/dist-embed/assets/Roboto-Variable-DHm9jpd-.woff2 +0 -0
  4. package/dist-embed/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  5. package/dist-embed/assets/basis-C64VHDVD.js +1 -0
  6. package/dist-embed/assets/basis_transcoder-VXdx5NbI.wasm +0 -0
  7. package/dist-embed/assets/createViewer2d-D12Wy3VF.js +1 -0
  8. package/dist-embed/assets/createViewerLite-CP-WHGLg.js +707 -0
  9. package/dist-embed/assets/creator-gl-BF2CQzeI.wasm +0 -0
  10. package/dist-embed/assets/creator-gl.js-B_0GrQRe.symbols +5379 -0
  11. package/dist-embed/assets/creator-ui-BX5Fvnbt.js +1 -0
  12. package/dist-embed/assets/creator-ui-CzKHLH2Q.wasm +0 -0
  13. package/dist-embed/assets/creator2d-BtQ-1_B0.wasm +0 -0
  14. package/dist-embed/assets/draco-BiISTFcR.js +118 -0
  15. package/dist-embed/assets/draco_decoder-DsQ12WqX.wasm +0 -0
  16. package/dist-embed/assets/host-CWKB1WDd.js +162 -0
  17. package/dist-embed/assets/index-CIK8PnUA.js +2 -0
  18. package/dist-embed/assets/lit-DUE9rhY9.filamat +0 -0
  19. package/dist-embed/assets/loadCreatorUiNode-UAdhjRTd.js +1 -0
  20. package/dist-embed/assets/neutral_ibl128-D-lzdkLN.ktx +0 -0
  21. package/dist-embed/assets/particles-DxYDmI1O.filamat +0 -0
  22. package/dist-embed/assets/particles-quad-DwYo9yCK.filamat +0 -0
  23. package/dist-embed/assets/shadow-C9xJpqlY.filamat +0 -0
  24. package/dist-embed/assets/uberarchive-uXjRYa9p.bin +0 -0
  25. package/dist-embed/assets/unlit-pe4tFY5b.filamat +0 -0
  26. package/dist-embed/assets/unlit-transparent-D9OyaOBR.filamat +0 -0
  27. package/dist-embed/assets/video-eedvhMvS.filamat +0 -0
  28. package/dist-embed/assets/worker-Caf-yYEI.js +2 -0
  29. package/dist-embed/embed.html +48 -0
  30. package/dist-embed/embed.js +187 -0
  31. package/embed.html +48 -0
  32. package/package.json +35 -0
  33. package/src/assets/banner.png +0 -0
  34. package/src/assets/image2.png +0 -0
  35. package/src/assets/landing.mp4 +0 -0
  36. package/src/assets/neutral_ibl128.ktx +0 -0
  37. package/src/assets/neutral_ibl256.ktx +0 -0
  38. package/src/assets/output.mp4 +0 -0
  39. package/src/assets/output2.mp4 +0 -0
  40. package/src/assets/texture.png +0 -0
  41. package/src/assets/vue.svg +1 -0
  42. package/src/canvas/createCanvasHost.ts +2 -0
  43. package/src/createViewer.ts +103 -0
  44. package/src/embed.ts +515 -0
  45. package/src/host.ts +428 -0
  46. package/src/lite-test.ts +160 -0
  47. package/src/main.ts +77 -0
  48. package/src/sourcemapError.ts +2 -0
  49. package/src/ui/CuiProps.gen.ts +103 -0
  50. package/src/ui/UIScreen.ts +486 -0
  51. package/src/ui/createBareUI.ts +32 -0
  52. package/src/ui/createMeasureSystem.ts +220 -0
  53. package/src/ui/createNodeElement.ts +77 -0
  54. package/src/ui/createPagerSystem.ts +345 -0
  55. package/src/ui/createTouchSystem.ts +2 -0
  56. package/src/ui/createUI.ts +806 -0
  57. package/src/ui/creator-ui.js +14 -0
  58. package/src/ui/creator-ui.wasm +0 -0
  59. package/src/ui/defaultStyle.css +176 -0
  60. package/src/ui/layers.ts +9 -0
  61. package/src/ui/mountCanvasUI.ts +213 -0
  62. package/src/ui/nativeViewSystem.ts +91 -0
  63. package/src/ui/presentPlayer.ts +156 -0
  64. package/src/ui/props-apply.ts +403 -0
  65. package/src/ui/router.ts +2 -0
  66. package/src/ui/safeAreaSpec.ts +3 -0
  67. package/src/ui/shells.ts +37 -0
  68. package/src/ui/toasts.ts +2 -0
  69. package/src/ui/transitions.ts +250 -0
  70. package/src/ui/ui.d.ts +78 -0
  71. package/src/ui/vListSystem.ts +212 -0
  72. package/src/ui/viewScale.ts +2 -0
  73. package/src/utils/animate.ts +2 -0
  74. package/src/utils/createUtils.ts +2 -0
  75. package/src/utils/fetch.ts +3 -0
  76. package/src/utils/fonts.ts +2 -0
  77. package/src/utils/globals.ts +2 -0
  78. package/src/utils/imageNode.ts +260 -0
  79. package/src/utils/openFilePicker.ts +2 -0
  80. package/src/utils/svg.ts +2 -0
  81. package/src/utils/videoNode.ts +2 -0
  82. package/src/utils/ws.ts +2 -0
  83. package/src/viewer/createViewer.ts +993 -0
  84. package/src/viewer/creator-gl.js +14 -0
  85. package/src/viewer/creator-gl.js.symbols +5379 -0
  86. package/src/viewer/creator-gl.wasm +0 -0
  87. package/src/viewer/lit.filamat +0 -0
  88. package/src/viewer/mediaplayer.ts +3 -0
  89. package/src/viewer/particles-quad.filamat +0 -0
  90. package/src/viewer/particles.filamat +0 -0
  91. package/src/viewer/physics.ts +140 -0
  92. package/src/viewer/shadow.filamat +0 -0
  93. package/src/viewer/uberarchive.bin +0 -0
  94. package/src/viewer/unlit-transparent.filamat +0 -0
  95. package/src/viewer/unlit.filamat +0 -0
  96. package/src/viewer/validateGlb.ts +262 -0
  97. package/src/viewer/video.filamat +0 -0
  98. package/src/viewer/wasmCrashSymbolizer.ts +133 -0
  99. package/src/viewer2d/createViewer2d.ts +438 -0
  100. package/src/viewer2d/creator2d.js +14 -0
  101. package/src/viewer2d/creator2d.wasm +0 -0
  102. package/src/viewer2d/sprite2d.ts +80 -0
  103. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,438 @@
1
+ // Web host for the creator-2d wasm engine. Mirrors viewer/createViewer.ts but for the lightweight
2
+ // 2D stack: it creates a WebGL2 context, instantiates creator2d.wasm, drives a host-owned RAF loop
3
+ // (TS update(dt) → native render(nowMs)), and returns the `_creator2d` bridge object the worker SDK
4
+ // (packages/worker/src/2d/) calls through. A 2D-only project never loads Filament.
5
+ //
6
+ // All native entry points take plain numbers, so most methods are direct passthroughs. The few that
7
+ // move buffers (textures, animation frames, tile data, out-pointers) malloc → copy HEAP → free.
8
+ //
9
+ // ⚠ ALLOW_MEMORY_GROWTH: a cached HEAPF32/HEAPU8 view detaches when the wasm heap grows. We always
10
+ // re-read module.HEAPF32/HEAPU8 right before use (never cache a view across an allocation).
11
+
12
+ // @ts-ignore - emscripten ESM factory
13
+ import createModule from './creator2d.js'
14
+ import wasmUrl from './creator2d.wasm?url'
15
+ import { getBuffer } from '../utils/fetch'
16
+ import { viewScale } from '../ui/viewScale'
17
+ import type { CanvasHost } from '../canvas/createCanvasHost'
18
+
19
+ export type Viewer2dOptions = {
20
+ /** Pixels-per-world-unit at camera zoom 1 is the engine default (1). Linear texture filtering off
21
+ * by default (crisp pixel art). */
22
+ linearFilter?: boolean
23
+ }
24
+
25
+ export type AnimEvent = { entityId: number; clipId: number; type: number } // type: 0 loop, 1 complete
26
+
27
+ export const createViewer2d = async (canvas: HTMLCanvasElement, options: Viewer2dOptions = {}, canvasHost?: CanvasHost) => {
28
+ const wasmBinary = await fetch(wasmUrl).then(r => r.arrayBuffer())
29
+
30
+ const glOptions: WebGLContextAttributes & { majorVersion?: number; minorVersion?: number } = {
31
+ alpha: false,
32
+ depth: true,
33
+ stencil: true,
34
+ antialias: false,
35
+ premultipliedAlpha: false,
36
+ desynchronized: false,
37
+ powerPreference: 'high-performance',
38
+ failIfMajorPerformanceCaveat: false,
39
+ majorVersion: 2,
40
+ minorVersion: 0,
41
+ }
42
+ const gl = canvas.getContext('webgl2', glOptions)!
43
+ // creator-2d's c2dInit registers this context with emscripten's GL layer (see init.cpp EM_ASM).
44
+ ;(window as any).creator2d_glContext = gl
45
+ ;(window as any).creator2d_glOptions = glOptions
46
+
47
+ const module = await createModule({ wasmBinary, canvas })
48
+
49
+ module._c2dInit()
50
+ if (options.linearFilter) module._c2dSetDefaultFilter(true)
51
+ module._c2dSetViewport(canvas.width, canvas.height)
52
+
53
+ // Resolution factor (devicePixelRatio × CSS zoom) the backing store renders at, set by _onResize.
54
+ // The 2D engine couples world-units to viewport px (1 world unit == 1 px at camera zoom 1), so a
55
+ // backing grown by `factor` would shrink the world on screen. We compensate by multiplying every
56
+ // scene's camera zoom by the factor (tracking the user's own zoom per scene so a resize can
57
+ // reapply it), and by scaling screen↔world inputs. At factor 1 this is all identity — behavior is
58
+ // unchanged on a DPR-1 display with no zoom. See docs/simulator-plan.md phase 3.
59
+ let factor = 1
60
+ const userZoom = new Map<number, number>() // sceneId → the zoom the SDK set (pre-factor)
61
+
62
+ // --- malloc helpers ------------------------------------------------------------------------
63
+ const withFloats = <T>(values: ArrayLike<number>, fn: (ptr: number) => T): T => {
64
+ const ptr = module._malloc(values.length * 4)
65
+ module.HEAPF32.set(values as any, ptr / 4)
66
+ try { return fn(ptr) } finally { module._free(ptr) }
67
+ }
68
+ // readFloats returns a native float output with NO per-call allocation: one wasm scratch buffer
69
+ // (malloc'd once — its address is stable across heap growth) plus one reused JS output array. The
70
+ // returned array is SHARED and valid only until the next readFloats call, so every caller must
71
+ // consume it immediately — they do: each getter reads it straight into a Vec2 / object / fields,
72
+ // none retains it or holds two results at once. We index a FRESH module.HEAPF32 each call because
73
+ // emscripten swaps that view when the heap grows (updateMemoryViews); the scratch address survives.
74
+ const READ_SCRATCH = 192 // ≥ the largest reader (physicsRaycastAll = 32 hits × 6 floats)
75
+ const readScratchPtr = module._malloc(READ_SCRATCH * 4)
76
+ const readScratchOut = new Float32Array(READ_SCRATCH) // standalone buffer — unaffected by growth
77
+ const readFloats = (n: number, fn: (ptr: number) => void): Float32Array => {
78
+ fn(readScratchPtr)
79
+ const base = readScratchPtr >> 2
80
+ const heap = module.HEAPF32
81
+ for (let i = 0; i < n; i++) readScratchOut[i] = heap[base + i]
82
+ return readScratchOut
83
+ }
84
+
85
+ // --- host-driven loop ----------------------------------------------------------------------
86
+ // Game logic runs in TS update callbacks (worker SDK onUpdate); animations + batching run native.
87
+ const updateCallbacks = new Set<(dt: number) => void>()
88
+ let running = false
89
+ let lastNow = 0
90
+
91
+ const frame = (now: number) => {
92
+ if (!running) return
93
+ const dt = lastNow === 0 ? 0 : Math.min(0.05, (now - lastNow) / 1000)
94
+ lastNow = now
95
+ for (const cb of updateCallbacks) cb(dt)
96
+ module._c2dRender(now)
97
+ requestAnimationFrame(frame)
98
+ }
99
+
100
+ const start = () => {
101
+ if (running) return
102
+ running = true
103
+ lastNow = 0
104
+ canvas.style.display = 'block'
105
+ requestAnimationFrame(frame)
106
+ }
107
+ const stop = () => { running = false }
108
+
109
+ // --- scene pointer input ----------------------------------------------------------------------
110
+ // Deliver raw canvas pointer phases (logical px relative to the canvas) to the SDK, which hit-tests
111
+ // + tracks. pointerdown is on the canvas; move/up/cancel are on window so a drag continues outside.
112
+ let pointerCb: ((phase: number, id: number, x: number, y: number) => void) | null = null
113
+ const activePointers = new Set<number>()
114
+ const localXY = (e: PointerEvent): [number, number] => {
115
+ const r = canvas.getBoundingClientRect()
116
+ // clientX/rect are VISUAL px under the simulator's CSS zoom; deliver logical px to the SDK.
117
+ const scale = viewScale(canvas)
118
+ return [(e.clientX - r.left) / scale, (e.clientY - r.top) / scale]
119
+ }
120
+ const onPointerDown = (e: PointerEvent) => {
121
+ if (!pointerCb) return
122
+ activePointers.add(e.pointerId)
123
+ try { canvas.setPointerCapture(e.pointerId) } catch {}
124
+ const [x, y] = localXY(e); pointerCb(0, e.pointerId, x, y)
125
+ }
126
+ const onPointerMove = (e: PointerEvent) => {
127
+ if (!pointerCb || !activePointers.has(e.pointerId)) return
128
+ const [x, y] = localXY(e); pointerCb(1, e.pointerId, x, y)
129
+ }
130
+ const onPointerUp = (e: PointerEvent) => {
131
+ if (!pointerCb || !activePointers.delete(e.pointerId)) return
132
+ const [x, y] = localXY(e); pointerCb(2, e.pointerId, x, y)
133
+ }
134
+ const onPointerCancel = (e: PointerEvent) => {
135
+ if (!pointerCb || !activePointers.delete(e.pointerId)) return
136
+ const [x, y] = localXY(e); pointerCb(3, e.pointerId, x, y)
137
+ }
138
+ let pointerListenersAttached = false
139
+ const setPointerListeners = (on: boolean) => {
140
+ if (on === pointerListenersAttached) return
141
+ pointerListenersAttached = on
142
+ if (on) {
143
+ canvas.addEventListener('pointerdown', onPointerDown)
144
+ window.addEventListener('pointermove', onPointerMove)
145
+ window.addEventListener('pointerup', onPointerUp)
146
+ window.addEventListener('pointercancel', onPointerCancel)
147
+ } else {
148
+ canvas.removeEventListener('pointerdown', onPointerDown)
149
+ window.removeEventListener('pointermove', onPointerMove)
150
+ window.removeEventListener('pointerup', onPointerUp)
151
+ window.removeEventListener('pointercancel', onPointerCancel)
152
+ }
153
+ }
154
+
155
+ return {
156
+ /** Redraw the current frame synchronously; true when a frame was drawn. No update callbacks —
157
+ * logic must not double-step. Hosts call this right before reading the canvas back; see
158
+ * createViewer.ts _renderNow. */
159
+ _renderNow: (): boolean => {
160
+ if (!running) return false
161
+ module._c2dRender(performance.now())
162
+ return true
163
+ },
164
+ backend: 'sokol',
165
+
166
+ // --- lifecycle / loop ---
167
+ version: () => module._creator2dVersion(),
168
+ render: (nowMs: number) => module._c2dRender(nowMs),
169
+ onUpdate: (cb: (dt: number) => void) => { updateCallbacks.add(cb) },
170
+ offUpdate: (cb: (dt: number) => void) => { updateCallbacks.delete(cb) },
171
+ setOnAnimEvent: (cb: (e: AnimEvent) => void) => {
172
+ module.onAnimEvent = (entityId: number, clipId: number, type: number) => cb({ entityId, clipId, type })
173
+ },
174
+ // Per-frame aspect update(dt) dispatch, fired from inside c2dRender: early = before the physics
175
+ // step, late = after animations / just before draw. Single-slot (the SDK registers one dispatcher
176
+ // per phase that iterates its own updater list). See init.cpp / lib.js.
177
+ setEarlyUpdate: (cb: (dt: number) => void) => { module.onEarlyUpdate = cb },
178
+ setLateUpdate: (cb: (dt: number) => void) => { module.onLateUpdate = cb },
179
+ // Engine clock multiplier (SDK Time.scale / Time.paused). Bound only when the wasm exports it.
180
+ ...((module as any)._c2dSetTimeScale ? { setTimeScale: (scale: number) => (module as any)._c2dSetTimeScale(scale) } : {}),
181
+ setOnPointer: (cb: (phase: number, pointerId: number, x: number, y: number) => void) => {
182
+ pointerCb = cb
183
+ setPointerListeners(true)
184
+ },
185
+ setClearColor: (r: number, g: number, b: number, a: number) => module._c2dSetClearColor(r, g, b, a),
186
+
187
+ // --- scenes ---
188
+ createScene: (): number => {
189
+ const id = module._c2dCreateScene()
190
+ // Default zoom 1, pre-scaled by the factor so an app that never touches the camera still
191
+ // renders the world at native size on a HiDPI / zoomed viewport.
192
+ userZoom.set(id, 1)
193
+ module._c2dCameraSetZoom(id, factor)
194
+ return id
195
+ },
196
+ destroyScene: (sceneId: number) => { userZoom.delete(sceneId); module._c2dDestroyScene(sceneId) },
197
+ openScene: (sceneId: number) => { module._c2dOpenScene(sceneId); start() },
198
+ closeScene: () => { module._c2dCloseScene(); stop(); canvas.style.display = 'none' },
199
+ sceneSetClearColor: (sceneId: number, r: number, g: number, b: number, a: number) =>
200
+ module._c2dSceneSetClearColor(sceneId, r, g, b, a),
201
+ addEntityToScene: (sceneId: number, entityId: number) => module._c2dAddEntityToScene(sceneId, entityId),
202
+ removeEntityFromScene: (sceneId: number, entityId: number) => module._c2dRemoveEntityFromScene(sceneId, entityId),
203
+ setLayerYSort: (sceneId: number, layer: number, enabled: boolean) => module._c2dSetLayerYSort(sceneId, layer, enabled),
204
+
205
+ // --- camera ---
206
+ cameraSetPosition: (sceneId: number, x: number, y: number) => module._c2dCameraSetPosition(sceneId, x, y),
207
+ cameraSetZoom: (sceneId: number, zoom: number) => {
208
+ userZoom.set(sceneId, zoom)
209
+ module._c2dCameraSetZoom(sceneId, zoom * factor)
210
+ },
211
+ cameraSetRotation: (sceneId: number, deg: number) => module._c2dCameraSetRotation(sceneId, deg),
212
+ cameraScreenToWorld: (sceneId: number, sx: number, sy: number): Float32Array =>
213
+ // Screen inputs are logical px; the native viewport is backing px → scale up by the factor.
214
+ readFloats(2, ptr => module._c2dCameraScreenToWorld(sceneId, sx * factor, sy * factor, ptr)),
215
+ cameraWorldToScreen: (sceneId: number, wx: number, wy: number): Float32Array => {
216
+ // Native returns backing px → bring back to logical px.
217
+ const o = readFloats(2, ptr => module._c2dCameraWorldToScreen(sceneId, wx, wy, ptr))
218
+ o[0] /= factor; o[1] /= factor
219
+ return o
220
+ },
221
+
222
+ // --- entities / transforms ---
223
+ createEntity: (): number => module._c2dCreateEntity(),
224
+ destroyEntity: (entityId: number) => module._c2dDestroyEntity(entityId),
225
+ setPosition: (entityId: number, x: number, y: number) => module._c2dSetPosition(entityId, x, y),
226
+ setRotation: (entityId: number, deg: number) => module._c2dSetRotation(entityId, deg),
227
+ setScale: (entityId: number, sx: number, sy: number) => module._c2dSetScale(entityId, sx, sy),
228
+ setLayer: (entityId: number, layer: number) => module._c2dSetLayer(entityId, layer),
229
+ setZ: (entityId: number, z: number) => module._c2dSetZ(entityId, z),
230
+ setVisible: (entityId: number, visible: boolean) => module._c2dSetVisible(entityId, visible),
231
+ getPosition: (entityId: number): Float32Array => readFloats(2, ptr => module._c2dGetPosition(entityId, ptr)),
232
+
233
+ // --- hierarchy ---
234
+ setParent: (childId: number, parentId: number, keepWorld: boolean) => module._c2dSetParent(childId, parentId, keepWorld),
235
+ getParent: (entityId: number): number => module._c2dGetParent(entityId),
236
+ getChildCount: (entityId: number): number => module._c2dGetChildCount(entityId),
237
+ getChild: (entityId: number, index: number): number => module._c2dGetChild(entityId, index),
238
+ getWorldPosition: (entityId: number): Float32Array => readFloats(2, ptr => module._c2dGetWorldPosition(entityId, ptr)),
239
+ getWorldMatrix: (entityId: number): Float32Array => readFloats(6, ptr => module._c2dGetWorldMatrix(entityId, ptr)),
240
+ worldToLocal: (entityId: number, wx: number, wy: number): Float32Array =>
241
+ readFloats(2, ptr => module._c2dWorldToLocal(entityId, wx, wy, ptr)),
242
+ localToWorld: (entityId: number, lx: number, ly: number): Float32Array =>
243
+ readFloats(2, ptr => module._c2dLocalToWorld(entityId, lx, ly, ptr)),
244
+ getLocalTransform: (entityId: number): Float32Array => readFloats(5, ptr => module._c2dGetLocalTransform(entityId, ptr)),
245
+
246
+ // --- sprite component ---
247
+ setSprite: (entityId: number, textureId: number) => module._c2dSetSprite(entityId, textureId),
248
+ setSpriteFrame: (entityId: number, u0: number, v0: number, u1: number, v1: number) =>
249
+ module._c2dSetSpriteFrame(entityId, u0, v0, u1, v1),
250
+ setSpriteFramePx: (entityId: number, px: number, py: number, pw: number, ph: number) =>
251
+ module._c2dSetSpriteFramePx(entityId, px, py, pw, ph),
252
+ setSpriteSize: (entityId: number, w: number, h: number) => module._c2dSetSpriteSize(entityId, w, h),
253
+ setSpriteAnchor: (entityId: number, ax: number, ay: number) => module._c2dSetSpriteAnchor(entityId, ax, ay),
254
+ setSpriteColor: (entityId: number, r: number, g: number, b: number) => module._c2dSetSpriteColor(entityId, r, g, b),
255
+ setSpriteOpacity: (entityId: number, a: number) => module._c2dSetSpriteOpacity(entityId, a),
256
+ setSpriteFlip: (entityId: number, flipX: boolean, flipY: boolean) => module._c2dSetSpriteFlip(entityId, flipX, flipY),
257
+
258
+ // --- textures (systemId = a fetch buffer id; we hand the raw bytes to native stb_image) ---
259
+ createTexture: (systemId: number, onComplete: (texId: number, w: number, h: number) => void, onReject: (e: any) => void) => {
260
+ try {
261
+ const buf = getBuffer(systemId)
262
+ const bytes = new Uint8Array(buf)
263
+ const ptr = module._malloc(bytes.length)
264
+ module.HEAPU8.set(bytes, ptr)
265
+ const texId = module._c2dCreateTexture(ptr, bytes.length)
266
+ module._free(ptr)
267
+ if (texId === 0) { onReject(new Error('creator-2d: texture decode failed')); return }
268
+ onComplete(texId, module._c2dGetTextureWidth(texId), module._c2dGetTextureHeight(texId))
269
+ } catch (e) {
270
+ onReject(e)
271
+ }
272
+ },
273
+ getTextureWidth: (texId: number): number => module._c2dGetTextureWidth(texId),
274
+ getTextureHeight: (texId: number): number => module._c2dGetTextureHeight(texId),
275
+ destroyTexture: (texId: number) => module._c2dDestroyTexture(texId),
276
+ setDefaultFilter: (linear: boolean) => module._c2dSetDefaultFilter(linear),
277
+
278
+ // --- textures from a _creatorCanvas surface (straight RGBA8 pixels → sokol image; no decode) ---
279
+ createTextureFromCanvas: (surfaceId: number): number => {
280
+ const surf = canvasHost?.readSurface(surfaceId)
281
+ if (!surf) return 0
282
+ const bytes = new Uint8Array(surf.data.buffer, surf.data.byteOffset, surf.data.byteLength)
283
+ const ptr = module._malloc(bytes.length)
284
+ module.HEAPU8.set(bytes, ptr)
285
+ const texId = module._c2dCreateTextureFromRGBA(ptr, surf.width, surf.height)
286
+ module._free(ptr)
287
+ return texId
288
+ },
289
+ updateTextureFromCanvas: (texId: number, surfaceId: number): void => {
290
+ const surf = canvasHost?.readSurface(surfaceId)
291
+ if (!surf) return
292
+ const bytes = new Uint8Array(surf.data.buffer, surf.data.byteOffset, surf.data.byteLength)
293
+ const ptr = module._malloc(bytes.length)
294
+ module.HEAPU8.set(bytes, ptr)
295
+ module._c2dUpdateTextureFromRGBA(texId, ptr, surf.width, surf.height)
296
+ module._free(ptr)
297
+ },
298
+
299
+ // --- animation (frames = flat [u0,v0,u1,v1]*frameCount) ---
300
+ defineAnimation: (entityId: number, frames: Float32Array, fps: number, loop: boolean): number =>
301
+ withFloats(frames, ptr => module._c2dDefineAnimation(entityId, ptr, frames.length / 4, fps, loop)),
302
+ playAnimation: (entityId: number, clipId: number) => module._c2dPlayAnimation(entityId, clipId),
303
+ stopAnimation: (entityId: number) => module._c2dStopAnimation(entityId),
304
+ setAnimationSpeed: (entityId: number, speed: number) => module._c2dSetAnimationSpeed(entityId, speed),
305
+ getAnimationFrame: (entityId: number): number => module._c2dGetAnimationFrame(entityId),
306
+
307
+ // --- tilemap ---
308
+ createTilemap: (textureId: number, cols: number, rows: number, tileW: number, tileH: number,
309
+ atlasCols: number, atlasRows: number, data: Int32Array): number => {
310
+ const ptr = module._malloc(data.length * 4)
311
+ module.HEAPU32.set(new Uint32Array(data.buffer, data.byteOffset, data.length), ptr / 4)
312
+ const id = module._c2dCreateTilemap(textureId, cols, rows, tileW, tileH, atlasCols, atlasRows, ptr)
313
+ module._free(ptr)
314
+ return id
315
+ },
316
+ setTile: (tilemapId: number, x: number, y: number, index: number) => module._c2dSetTile(tilemapId, x, y, index),
317
+
318
+ // --- bulk hot-path ---
319
+ bulkSetPositions: (ids: Uint32Array, xy: Float32Array, count: number) => {
320
+ const idPtr = module._malloc(ids.length * 4)
321
+ const xyPtr = module._malloc(xy.length * 4)
322
+ module.HEAPU32.set(ids, idPtr / 4)
323
+ module.HEAPF32.set(xy, xyPtr / 4)
324
+ module._c2dBulkSetPositions(idPtr, xyPtr, count)
325
+ module._free(idPtr)
326
+ module._free(xyPtr)
327
+ },
328
+
329
+ // --- physics (Box2D v3; present only in CREATOR_2D_PHYSICS builds) ---
330
+ physicsHasSupport: (): boolean => !!module._c2dPhysicsHasSupport && !!module._c2dPhysicsHasSupport(),
331
+ physicsConfigure: (gx: number, gy: number, ppm: number, subSteps: number) => module._c2dPhysicsConfigure(gx, gy, ppm, subSteps),
332
+ setInterpolation: (enabled: boolean) => module._c2dSetInterpolation?.(enabled),
333
+ setOnPhysicsEvent: (cb: (a: number, b: number, type: number, px: number, py: number, nx: number, ny: number, speed: number) => void) => { module.onPhysicsEvent = cb },
334
+ physicsCreateBody: (entityId: number, motionType: number): number => module._c2dPhysicsCreateBody(entityId, motionType),
335
+ physicsRemoveBody: (h: number) => module._c2dPhysicsRemoveBody(h),
336
+ physicsAddBox: (h: number, hw: number, hh: number, ox: number, oy: number, friction: number, bounce: number, isSensor: boolean, category: number, mask: number) =>
337
+ module._c2dPhysicsAddBox(h, hw, hh, ox, oy, friction, bounce, isSensor, category, mask),
338
+ physicsAddCircle: (h: number, radius: number, ox: number, oy: number, friction: number, bounce: number, isSensor: boolean, category: number, mask: number) =>
339
+ module._c2dPhysicsAddCircle(h, radius, ox, oy, friction, bounce, isSensor, category, mask),
340
+ physicsAddCapsule: (h: number, x1: number, y1: number, x2: number, y2: number, radius: number, friction: number, bounce: number, isSensor: boolean, category: number, mask: number) =>
341
+ module._c2dPhysicsAddCapsule(h, x1, y1, x2, y2, radius, friction, bounce, isSensor, category, mask),
342
+ physicsAddSegment: (h: number, x1: number, y1: number, x2: number, y2: number, friction: number, bounce: number, category: number, mask: number) =>
343
+ module._c2dPhysicsAddSegment(h, x1, y1, x2, y2, friction, bounce, category, mask),
344
+ physicsAddPolygon: (h: number, pts: Float32Array, count: number, friction: number, bounce: number, isSensor: boolean, category: number, mask: number) =>
345
+ withFloats(pts, (ptr) => module._c2dPhysicsAddPolygon(h, ptr, count, friction, bounce, isSensor, category, mask)),
346
+ physicsAddChain: (h: number, pts: Float32Array, count: number, isLoop: boolean, friction: number, bounce: number, category: number, mask: number) =>
347
+ withFloats(pts, (ptr) => module._c2dPhysicsAddChain(h, ptr, count, isLoop, friction, bounce, category, mask)),
348
+ physicsClearShapes: (h: number) => module._c2dPhysicsClearShapes(h),
349
+ physicsSetContactEvents: (h: number, enabled: boolean) => module._c2dPhysicsSetContactEvents(h, enabled),
350
+ physicsSetLinearVelocity: (h: number, x: number, y: number) => module._c2dPhysicsSetLinearVelocity(h, x, y),
351
+ physicsGetLinearVelocity: (h: number): Float32Array => readFloats(2, (ptr) => module._c2dPhysicsGetLinearVelocity(h, ptr)),
352
+ physicsSetAngularVelocity: (h: number, degPerSec: number) => module._c2dPhysicsSetAngularVelocity(h, degPerSec),
353
+ physicsGetAngularVelocity: (h: number): number => module._c2dPhysicsGetAngularVelocity(h),
354
+ physicsApplyLinearImpulse: (h: number, x: number, y: number) => module._c2dPhysicsApplyLinearImpulse(h, x, y),
355
+ physicsApplyImpulseAt: (h: number, x: number, y: number, px: number, py: number) => module._c2dPhysicsApplyImpulseAt(h, x, y, px, py),
356
+ physicsApplyForce: (h: number, x: number, y: number) => module._c2dPhysicsApplyForce(h, x, y),
357
+ physicsSetFromEntity: (h: number) => module._c2dPhysicsSetFromEntity(h),
358
+ physicsSetFixedRotation: (h: number, enabled: boolean) => module._c2dPhysicsSetFixedRotation(h, enabled),
359
+ physicsSetGravityScale: (h: number, scale: number) => module._c2dPhysicsSetGravityScale(h, scale),
360
+ physicsSetLinearDamping: (h: number, damping: number) => module._c2dPhysicsSetLinearDamping(h, damping),
361
+ physicsSetAngularDamping: (h: number, damping: number) => module._c2dPhysicsSetAngularDamping(h, damping),
362
+ physicsSetBullet: (h: number, enabled: boolean) => module._c2dPhysicsSetBullet(h, enabled),
363
+ physicsSetEnabled: (h: number, enabled: boolean) => module._c2dPhysicsSetEnabled(h, enabled),
364
+ physicsSetAwake: (h: number, awake: boolean) => module._c2dPhysicsSetAwake(h, awake),
365
+ physicsSetMass: (h: number, mass: number) => module._c2dPhysicsSetMass(h, mass),
366
+ physicsGetMass: (h: number): number => module._c2dPhysicsGetMass(h),
367
+ physicsSetMotionType: (h: number, motionType: number) => module._c2dPhysicsSetMotionType(h, motionType),
368
+ physicsSetFriction: (h: number, friction: number) => module._c2dPhysicsSetFriction(h, friction),
369
+ physicsSetBounce: (h: number, bounce: number) => module._c2dPhysicsSetBounce(h, bounce),
370
+ physicsSetFilter: (h: number, category: number, mask: number) => module._c2dPhysicsSetFilter(h, category, mask),
371
+ physicsRaycastClosest: (x0: number, y0: number, x1: number, y1: number, mask: number, ignore: Float32Array, ignoreCount: number): Float32Array =>
372
+ withFloats(ignore, (ig) => readFloats(7, (out) => module._c2dPhysicsRaycastClosest(x0, y0, x1, y1, mask, ig, ignoreCount, out))),
373
+ physicsRaycastAll: (x0: number, y0: number, x1: number, y1: number, mask: number, ignore: Float32Array, ignoreCount: number, maxHits: number): Float32Array =>
374
+ withFloats(ignore, (ig) => {
375
+ let n = 0
376
+ const r = readFloats(maxHits * 6, (out) => { n = module._c2dPhysicsRaycastAll(x0, y0, x1, y1, mask, ig, ignoreCount, out, maxHits) })
377
+ return r.subarray(0, n * 6) // trim: the scratch is shared and only the first n*6 are ours
378
+ }),
379
+ physicsOverlap: (pts: Float32Array, count: number, radius: number, mask: number, ignore: Float32Array, ignoreCount: number, maxHits: number): Float32Array =>
380
+ withFloats(pts, (p) => withFloats(ignore, (ig) => {
381
+ let n = 0
382
+ const r = readFloats(maxHits, (out) => { n = module._c2dPhysicsOverlap(p, count, radius, mask, ig, ignoreCount, out, maxHits) })
383
+ return r.subarray(0, n)
384
+ })),
385
+ characterCreate: (entityId: number, x1: number, y1: number, x2: number, y2: number, radius: number, maxSlopeDeg: number, category: number, mask: number): number =>
386
+ module._c2dCharacterCreate(entityId, x1, y1, x2, y2, radius, maxSlopeDeg, category, mask),
387
+ characterDestroy: (id: number) => module._c2dCharacterDestroy(id),
388
+ characterMove: (id: number, x: number) => module._c2dCharacterMove(id, x),
389
+ characterMoveFree: (id: number, x: number, y: number) => module._c2dCharacterMoveFree(id, x, y),
390
+ characterSetVerticalVelocity: (id: number, vy: number) => module._c2dCharacterSetVerticalVelocity(id, vy),
391
+ characterSetVelocity: (id: number, x: number, y: number) => module._c2dCharacterSetVelocity(id, x, y),
392
+ characterSetGravityScale: (id: number, s: number) => module._c2dCharacterSetGravityScale(id, s),
393
+ characterSetMaxSlope: (id: number, deg: number) => module._c2dCharacterSetMaxSlope(id, deg),
394
+ characterSetFilter: (id: number, category: number, mask: number) => module._c2dCharacterSetFilter(id, category, mask),
395
+ characterSetDropThrough: (id: number, entityId: number) => module._c2dCharacterSetDropThrough(id, entityId),
396
+ characterSetCapsule: (id: number, x1: number, y1: number, x2: number, y2: number, radius: number): boolean =>
397
+ !!module._c2dCharacterSetCapsule(id, x1, y1, x2, y2, radius),
398
+ characterSetFromEntity: (id: number) => module._c2dCharacterSetFromEntity(id),
399
+ characterGetState: (id: number, out: Float32Array) => { out.set(readFloats(8, (ptr) => module._c2dCharacterGetState(id, ptr)).subarray(0, 8)) },
400
+ characterGetCollisions: (id: number, maxN: number): Float32Array => {
401
+ let n = 0
402
+ const r = readFloats(maxN * 3, (out) => { n = module._c2dCharacterGetCollisions(id, out, maxN) })
403
+ return r.subarray(0, n * 3)
404
+ },
405
+ physicsSetOneWay: (h: number, nx: number, ny: number, arcDeg: number, enabled: boolean) =>
406
+ module._c2dPhysicsSetOneWay(h, nx, ny, arcDeg, enabled),
407
+ physicsOverlapPoint: (x: number, y: number, mask: number, ignore: Float32Array, ignoreCount: number): number =>
408
+ withFloats(ignore, (ig) => module._c2dPhysicsOverlapPoint(x, y, mask, ig, ignoreCount)),
409
+ pickSprite: (sceneId: number, wx: number, wy: number): number => module._c2dPickSprite(sceneId, wx, wy),
410
+
411
+ // --- host plumbing ---
412
+ _onResize(width: number, height: number, resFactor = 1) {
413
+ factor = resFactor
414
+ // Backing store in device px, CSS box pinned to logical px (host-shared crispness pattern).
415
+ canvas.width = Math.max(1, Math.round(width * resFactor))
416
+ canvas.height = Math.max(1, Math.round(height * resFactor))
417
+ canvas.style.width = width + "px"
418
+ canvas.style.height = height + "px"
419
+ module._c2dSetViewport(canvas.width, canvas.height)
420
+ // Re-apply every scene's camera zoom against the new factor so the world keeps its on-screen size.
421
+ for (const [sid, z] of userZoom) module._c2dCameraSetZoom(sid, z * factor)
422
+ },
423
+ _dispose() {
424
+ stop()
425
+ setPointerListeners(false)
426
+ pointerCb = null
427
+ module._c2dCloseScene()
428
+ try { module._c2dShutdown() } catch {}
429
+ gl.getExtension('WEBGL_lose_context')?.loseContext()
430
+ if ((window as any).creator2d_glContext === gl) {
431
+ ;(window as any).creator2d_glContext = null
432
+ ;(window as any).creator2d_glOptions = null
433
+ }
434
+ },
435
+ }
436
+ }
437
+
438
+ export type Creator2dViewer = Awaited<ReturnType<typeof createViewer2d>>
@@ -0,0 +1,14 @@
1
+ var creator2d = (() => {
2
+
3
+ return (
4
+ async function(moduleArg = {}) {
5
+ var moduleRtn;
6
+
7
+ var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var _scriptName=import.meta.url;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["cb"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module["locateFile"]){return locateFile("creator2d.wasm")}return new URL("creator2d.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["bb"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var exceptionLast=0;var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var __abort_js=()=>abort("");function _c2dAnimEvent(entityId,clipId,type){if(Module.onAnimEvent)Module.onAnimEvent(entityId,clipId,type)}function _c2dEarlyUpdate(dt){if(Module.onEarlyUpdate)Module.onEarlyUpdate(dt)}function _c2dLateUpdate(dt){if(Module.onLateUpdate)Module.onLateUpdate(dt)}function _c2dPhysicsEvent(entityA,entityB,type){if(Module.onPhysicsEvent)Module.onPhysicsEvent(entityA,entityB,type)}var _emscripten_get_now=()=>performance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>num<INT53_MIN||num>INT53_MAX?NaN:Number(num);function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==106?HEAP64[buf>>3]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var GLctx;var webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"));var webgl_enable_EXT_polygon_offset_clamp=ctx=>!!(ctx.extPolygonOffsetClamp=ctx.getExtension("EXT_polygon_offset_clamp"));var webgl_enable_EXT_clip_control=ctx=>!!(ctx.extClipControl=ctx.getExtension("EXT_clip_control"));var webgl_enable_WEBGL_polygon_mode=ctx=>!!(ctx.webglPolygonMode=ctx.getExtension("WEBGL_polygon_mode"));var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var getEmscriptenSupportedExtensions=ctx=>{var supportedExtensions=["EXT_color_buffer_float","EXT_conservative_depth","EXT_disjoint_timer_query_webgl2","EXT_texture_norm16","NV_shader_noperspective_interpolation","WEBGL_clip_cull_distance","EXT_clip_control","EXT_color_buffer_half_float","EXT_depth_clamp","EXT_float_blend","EXT_polygon_offset_clamp","EXT_texture_compression_bptc","EXT_texture_compression_rgtc","EXT_texture_filter_anisotropic","KHR_parallel_shader_compile","OES_texture_float_linear","WEBGL_blend_func_extended","WEBGL_compressed_texture_astc","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_etc1","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_s3tc_srgb","WEBGL_debug_renderer_info","WEBGL_debug_shaders","WEBGL_lose_context","WEBGL_multi_draw","WEBGL_polygon_mode"];return(ctx.getSupportedExtensions()||[]).filter(ext=>supportedExtensions.includes(ext))};var registerPreMainLoop=f=>{typeof MainLoop!="undefined"&&MainLoop.preMainLoop.push(f)};var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead=NaN)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],stringCache:{},stringiCache:{},unpackAlignment:4,unpackRowLength:0,recordError:errorCode=>{if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i<ret;i++){table[i]=null}while(table[ret]){ret=GL.counter++}return ret},genObject:(n,buffers,createFunction,objectTable)=>{for(var i=0;i<n;i++){var buffer=GLctx[createFunction]();var id=buffer&&GL.getNewId(objectTable);if(buffer){buffer.name=id;objectTable[id]=buffer}else{GL.recordError(1282)}HEAP32[buffers+i*4>>2]=id}},MAX_TEMP_BUFFER_SIZE:2097152,numTempVertexBuffersPerSize:64,log2ceilLookup:i=>32-Math.clz32(i===0?0:i-1),generateTempBuffers:(quads,context)=>{var largestIndex=GL.log2ceilLookup(GL.MAX_TEMP_BUFFER_SIZE);context.tempVertexBufferCounters1=[];context.tempVertexBufferCounters2=[];context.tempVertexBufferCounters1.length=context.tempVertexBufferCounters2.length=largestIndex+1;context.tempVertexBuffers1=[];context.tempVertexBuffers2=[];context.tempVertexBuffers1.length=context.tempVertexBuffers2.length=largestIndex+1;context.tempIndexBuffers=[];context.tempIndexBuffers.length=largestIndex+1;for(var i=0;i<=largestIndex;++i){context.tempIndexBuffers[i]=null;context.tempVertexBufferCounters1[i]=context.tempVertexBufferCounters2[i]=0;var ringbufferLength=GL.numTempVertexBuffersPerSize;context.tempVertexBuffers1[i]=[];context.tempVertexBuffers2[i]=[];var ringbuffer1=context.tempVertexBuffers1[i];var ringbuffer2=context.tempVertexBuffers2[i];ringbuffer1.length=ringbuffer2.length=ringbufferLength;for(var j=0;j<ringbufferLength;++j){ringbuffer1[j]=ringbuffer2[j]=null}}if(quads){context.tempQuadIndexBuffer=GLctx.createBuffer();context.GLctx.bindBuffer(34963,context.tempQuadIndexBuffer);var numIndexes=GL.MAX_TEMP_BUFFER_SIZE>>1;var quadIndexes=new Uint16Array(numIndexes);var i=0,v=0;while(1){quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+1;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v+3;if(i>=numIndexes)break;v+=4}context.GLctx.bufferData(34963,quadIndexes,35044);context.GLctx.bindBuffer(34963,null)}},getTempVertexBuffer:sizeBytes=>{var idx=GL.log2ceilLookup(sizeBytes);var ringbuffer=GL.currentContext.tempVertexBuffers1[idx];var nextFreeBufferIndex=GL.currentContext.tempVertexBufferCounters1[idx];GL.currentContext.tempVertexBufferCounters1[idx]=GL.currentContext.tempVertexBufferCounters1[idx]+1&GL.numTempVertexBuffersPerSize-1;var vbo=ringbuffer[nextFreeBufferIndex];if(vbo){return vbo}var prevVBO=GLctx.getParameter(34964);ringbuffer[nextFreeBufferIndex]=GLctx.createBuffer();GLctx.bindBuffer(34962,ringbuffer[nextFreeBufferIndex]);GLctx.bufferData(34962,1<<idx,35048);GLctx.bindBuffer(34962,prevVBO);return ringbuffer[nextFreeBufferIndex]},getTempIndexBuffer:sizeBytes=>{var idx=GL.log2ceilLookup(sizeBytes);var ibo=GL.currentContext.tempIndexBuffers[idx];if(ibo){return ibo}var prevIBO=GLctx.getParameter(34965);GL.currentContext.tempIndexBuffers[idx]=GLctx.createBuffer();GLctx.bindBuffer(34963,GL.currentContext.tempIndexBuffers[idx]);GLctx.bufferData(34963,1<<idx,35048);GLctx.bindBuffer(34963,prevIBO);return GL.currentContext.tempIndexBuffers[idx]},newRenderingFrameStarted:()=>{if(!GL.currentContext){return}var vb=GL.currentContext.tempVertexBuffers1;GL.currentContext.tempVertexBuffers1=GL.currentContext.tempVertexBuffers2;GL.currentContext.tempVertexBuffers2=vb;vb=GL.currentContext.tempVertexBufferCounters1;GL.currentContext.tempVertexBufferCounters1=GL.currentContext.tempVertexBufferCounters2;GL.currentContext.tempVertexBufferCounters2=vb;var largestIndex=GL.log2ceilLookup(GL.MAX_TEMP_BUFFER_SIZE);for(var i=0;i<=largestIndex;++i){GL.currentContext.tempVertexBufferCounters1[i]=0}},getSource:(shader,count,string,length)=>{var source="";for(var i=0;i<count;++i){var len=length?HEAPU32[length+i*4>>2]:undefined;source+=UTF8ToString(HEAPU32[string+i*4>>2],len)}return source},calcBufLength:(size,type,stride,count)=>{if(stride>0){return count*stride}var typeSize=GL.byteSizeByType[type-GL.byteSizeByTypeRoot];return size*typeSize*count},usedTempBuffers:[],preDrawHandleClientVertexAttribBindings:count=>{GL.resetBufferBinding=false;for(var i=0;i<GL.currentContext.maxVertexAttribs;++i){var cb=GL.currentContext.clientBuffers[i];if(!cb.clientside||!cb.enabled)continue;GL.resetBufferBinding=true;var size=GL.calcBufLength(cb.size,cb.type,cb.stride,count);var buf=GL.getTempVertexBuffer(size);GLctx.bindBuffer(34962,buf);GLctx.bufferSubData(34962,0,HEAPU8.subarray(cb.ptr,cb.ptr+size));cb.vertexAttribPointerAdaptor.call(GLctx,i,cb.size,cb.type,cb.normalized,cb.stride,0)}},postDrawHandleClientVertexAttribBindings:()=>{if(GL.resetBufferBinding){GLctx.bindBuffer(34962,GL.buffers[GLctx.currentArrayBufferBinding])}},createContext:(canvas,webGLContextAttributes)=>{if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=canvas.getContext("webgl2",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=GL.getNewId(GL.contexts);var context={handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}context.maxVertexAttribs=context.GLctx.getParameter(34921);context.clientBuffers=[];for(var i=0;i<context.maxVertexAttribs;i++){context.clientBuffers[i]={enabled:false,clientside:false,size:0,type:0,normalized:0,stride:0,ptr:0,vertexAttribPointerAdaptor:null}}GL.generateTempBuffers(false,context);return handle},makeContextCurrent:contextHandle=>{GL.currentContext=GL.contexts[contextHandle];Module["ctx"]=GLctx=GL.currentContext?.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle]){GL.currentContext=null}if(typeof JSEvents=="object"){JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas)}if(GL.contexts[contextHandle]?.GLctx.canvas){GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined}GL.contexts[contextHandle]=null},initExtensions:context=>{context||=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_WEBGL_multi_draw(GLctx);webgl_enable_EXT_polygon_offset_clamp(GLctx);webgl_enable_EXT_clip_control(GLctx);webgl_enable_WEBGL_polygon_mode(GLctx);webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}getEmscriptenSupportedExtensions(GLctx).forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var _glActiveTexture=x0=>GLctx.activeTexture(x0);var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _glBindBuffer=(target,buffer)=>{if(buffer&&!GL.buffers[buffer]){var b=GLctx.createBuffer();b.name=buffer;GL.buffers[buffer]=b}if(target==34962){GLctx.currentArrayBufferBinding=buffer}else if(target==34963){GLctx.currentElementArrayBufferBinding=buffer}if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])};var _glBindBufferBase=(target,index,buffer)=>{GLctx.bindBufferBase(target,index,GL.buffers[buffer])};var _glBindBufferRange=(target,index,buffer,offset,ptrsize)=>{GLctx.bindBufferRange(target,index,GL.buffers[buffer],offset,ptrsize)};var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _glBindSampler=(unit,sampler)=>{GLctx.bindSampler(unit,GL.samplers[sampler])};var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao]);var ibo=GLctx.getParameter(34965);GLctx.currentElementArrayBufferBinding=ibo?ibo.name|0:0};var _glBlendColor=(x0,x1,x2,x3)=>GLctx.blendColor(x0,x1,x2,x3);var _glBlendEquationSeparate=(x0,x1)=>GLctx.blendEquationSeparate(x0,x1);var _glBlendFuncSeparate=(x0,x1,x2,x3)=>GLctx.blendFuncSeparate(x0,x1,x2,x3);var _glBlitFramebuffer=(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)=>GLctx.blitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);var _glBufferData=(target,size,data,usage)=>{if(true){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}return}};var _glBufferSubData=(target,offset,size,data)=>{if(true){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}};var _glCheckFramebufferStatus=x0=>GLctx.checkFramebufferStatus(x0);var _glClearBufferfi=(x0,x1,x2,x3)=>GLctx.clearBufferfi(x0,x1,x2,x3);var _glClearBufferfv=(buffer,drawbuffer,value)=>{GLctx.clearBufferfv(buffer,drawbuffer,HEAPF32,value>>2)};var _glClearBufferiv=(buffer,drawbuffer,value)=>{GLctx.clearBufferiv(buffer,drawbuffer,HEAP32,value>>2)};var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _glCompressedTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,imageSize,data)=>{if(true){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data);return}GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize);return}};var _glCompressedTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}};var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};var _glCullFace=x0=>GLctx.cullFace(x0);var _glDeleteBuffers=(n,buffers)=>{for(var i=0;i<n;i++){var id=HEAP32[buffers+i*4>>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentArrayBufferBinding)GLctx.currentArrayBufferBinding=0;if(id==GLctx.currentElementArrayBufferBinding)GLctx.currentElementArrayBufferBinding=0;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}};var _glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i<n;++i){var id=HEAP32[framebuffers+i*4>>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i<n;i++){var id=HEAP32[renderbuffers+i*4>>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _glDeleteSamplers=(n,samplers)=>{for(var i=0;i<n;i++){var id=HEAP32[samplers+i*4>>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx.deleteSampler(sampler);sampler.name=0;GL.samplers[id]=null}};var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _glDeleteTextures=(n,textures)=>{for(var i=0;i<n;i++){var id=HEAP32[textures+i*4>>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i<n;i++){var id=HEAP32[vaos+i*4>>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};var _glDepthFunc=x0=>GLctx.depthFunc(x0);var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};var _glDisable=x0=>GLctx.disable(x0);var _glDisableVertexAttribArray=index=>{var cb=GL.currentContext.clientBuffers[index];cb.enabled=false;GLctx.disableVertexAttribArray(index)};var _glDrawArrays=(mode,first,count)=>{GL.preDrawHandleClientVertexAttribBindings(first+count);GLctx.drawArrays(mode,first,count);GL.postDrawHandleClientVertexAttribBindings()};var _glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};var tempFixedLengthArray=[];var _glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i<n;i++){bufArray[i]=HEAP32[bufs+i*4>>2]}GLctx.drawBuffers(bufArray)};var _glDrawElements=(mode,count,type,indices)=>{var buf;var vertexes=0;if(!GLctx.currentElementArrayBufferBinding){var size=GL.calcBufLength(1,type,0,count);buf=GL.getTempIndexBuffer(size);GLctx.bindBuffer(34963,buf);GLctx.bufferSubData(34963,0,HEAPU8.subarray(indices,indices+size));if(count>0){for(var i=0;i<GL.currentContext.maxVertexAttribs;++i){var cb=GL.currentContext.clientBuffers[i];if(cb.clientside&&cb.enabled){let arrayClass;switch(type){case 5121:arrayClass=Uint8Array;break;case 5123:arrayClass=Uint16Array;break;case 5125:arrayClass=Uint32Array;break;default:GL.recordError(1282);return}vertexes=new arrayClass(HEAPU8.buffer,indices,count).reduce((max,current)=>Math.max(max,current))+1;break}}}indices=0}GL.preDrawHandleClientVertexAttribBindings(vertexes);GLctx.drawElements(mode,count,type,indices);GL.postDrawHandleClientVertexAttribBindings(count);if(!GLctx.currentElementArrayBufferBinding){GLctx.bindBuffer(34963,null)}};var _glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};var _glEnable=x0=>GLctx.enable(x0);var _glEnableVertexAttribArray=index=>{var cb=GL.currentContext.clientBuffers[index];cb.enabled=true;GLctx.enableVertexAttribArray(index)};var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _glFramebufferTextureLayer=(target,attachment,texture,level,layer)=>{GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)};var _glFrontFace=x0=>GLctx.frontFace(x0);var _glGenBuffers=(n,buffers)=>{GL.genObject(n,buffers,"createBuffer",GL.buffers)};var _glGenFramebuffers=(n,ids)=>{GL.genObject(n,ids,"createFramebuffer",GL.framebuffers)};var _glGenRenderbuffers=(n,renderbuffers)=>{GL.genObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _glGenSamplers=(n,samplers)=>{GL.genObject(n,samplers,"createSampler",GL.samplers)};var _glGenTextures=(n,textures)=>{GL.genObject(n,textures,"createTexture",GL.textures)};var _glGenVertexArrays=(n,arrays)=>{GL.genObject(n,arrays,"createVertexArray",GL.vaos)};var _glGetAttribLocation=(program,name)=>GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name));var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>2]=num;var lower=HEAPU32[ptr>>2];HEAPU32[ptr+4>>2]=(num-lower)/4294967296};var webglGetExtensions=()=>{var exts=getEmscriptenSupportedExtensions(GLctx);exts=exts.concat(exts.map(e=>"GL_"+e));return exts};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}ret=webglGetExtensions().length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i<result.length;++i){switch(type){case 0:HEAP32[p+i*4>>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`);return}}break;default:GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof result}!`);return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p]=ret?1:0;break}};var _glGetIntegerv=(name_,p)=>emscriptenWebGLGet(name_,p,0);var _glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(var i=0;i<numActiveUniforms;++i){program.maxUniformLength=Math.max(program.maxUniformLength,GLctx.getActiveUniform(program,i).name.length+1)}}HEAP32[p>>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){var numActiveAttributes=GLctx.getProgramParameter(program,35721);for(var i=0;i<numActiveAttributes;++i){program.maxAttributeLength=Math.max(program.maxAttributeLength,GLctx.getActiveAttrib(program,i).name.length+1)}}HEAP32[p>>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){var numActiveUniformBlocks=GLctx.getProgramParameter(program,35382);for(var i=0;i<numActiveUniformBlocks;++i){program.maxUniformBlockNameLength=Math.max(program.maxUniformBlockNameLength,GLctx.getActiveUniformBlockName(program,i).length+1)}}HEAP32[p>>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var _glGetStringi=(name,index)=>{if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=webglGetExtensions().map(stringToNewUTF8);stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}};var jstoi_q=str=>parseInt(str);var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(i=0;i<numActiveUniforms;++i){var u=GLctx.getActiveUniform(program,i);var nm=u.name;var sz=u.size;var lb=webglGetLeftBracePos(nm);var arrayName=lb>0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j<sz;++j){uniformLocsById[id]=j;program.uniformArrayNamesById[id++]=arrayName}}}};var _glGetUniformLocation=(program,name)=>{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex<sizeAndId[0]){arrayIndex+=sizeAndId[1];if(uniformLocsById[arrayIndex]=uniformLocsById[arrayIndex]||GLctx.getUniformLocation(program,name)){return arrayIndex}}}else{GL.recordError(1281)}return-1};var _glInvalidateFramebuffer=(target,numAttachments,attachments)=>{var list=tempFixedLengthArray[numAttachments];for(var i=0;i<numAttachments;i++){list[i]=HEAP32[attachments+i*4>>2]}GLctx.invalidateFramebuffer(target,list)};var _glLinkProgram=program=>{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}else if(pname==3314){GL.unpackRowLength=param}GLctx.pixelStorei(pname,param)};var _glPolygonOffset=(x0,x1)=>GLctx.polygonOffset(x0,x1);var _glReadBuffer=x0=>GLctx.readBuffer(x0);var _glRenderbufferStorageMultisample=(x0,x1,x2,x3,x4)=>GLctx.renderbufferStorageMultisample(x0,x1,x2,x3,x4);var _glSamplerParameterf=(sampler,pname,param)=>{GLctx.samplerParameterf(GL.samplers[sampler],pname,param)};var _glSamplerParameteri=(sampler,pname,param)=>{GLctx.samplerParameteri(GL.samplers[sampler],pname,param)};var _glScissor=(x0,x1,x2,x3)=>GLctx.scissor(x0,x1,x2,x3);var _glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};var _glStencilFunc=(x0,x1,x2)=>GLctx.stencilFunc(x0,x1,x2);var _glStencilFuncSeparate=(x0,x1,x2,x3)=>GLctx.stencilFuncSeparate(x0,x1,x2,x3);var _glStencilMask=x0=>GLctx.stencilMask(x0);var _glStencilOp=(x0,x1,x2)=>GLctx.stencilOp(x0,x1,x2);var _glStencilOpSeparate=(x0,x1,x2,x3)=>GLctx.stencilOpSeparate(x0,x1,x2,x3);var _glTexStorage2D=(x0,x1,x2,x3,x4)=>GLctx.texStorage2D(x0,x1,x2,x3,x4);var _glTexStorage3D=(x0,x1,x2,x3,x4,x5)=>GLctx.texStorage3D(x0,x1,x2,x3,x4,x5);var computeUnpackAlignedImageSize=(width,height,sizePerPixel)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=(GL.unpackRowLength||width)*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,GL.unpackAlignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16};var toTypedArrayIndex=(pointer,heap)=>pointer>>>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var sizePerPixel=colorChannelsInGlTextureFormat(format)*heap.BYTES_PER_ELEMENT;var bytes=computeUnpackAlignedImageSize(width,height,sizePerPixel);return heap.subarray(toTypedArrayIndex(pixels,heap),toTypedArrayIndex(pixels+bytes,heap))};var _glTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,type,pixels)=>{if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);return}if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,toTypedArrayIndex(pixels,heap));return}}var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0):null;GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)};var _glTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,toTypedArrayIndex(pixels,heap))}else{GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}};var webglGetUniformLocation=location=>{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?`[${webglLoc}]`:""))}return webglLoc}else{GL.recordError(1282)}};var _glUniform1fv=(location,count,value)=>{count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count)};var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var _glUniform1iv=(location,count,value)=>{count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count)};var _glUniform2fv=(location,count,value)=>{count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2)};var _glUniform2iv=(location,count,value)=>{count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2)};var _glUniform3fv=(location,count,value)=>{count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3)};var _glUniform3iv=(location,count,value)=>{count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3)};var _glUniform4fv=(location,count,value)=>{count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4)};var _glUniform4iv=(location,count,value)=>{count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4)};var _glUniformMatrix4fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16)};var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};var _glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};var _glVertexAttribIPointer=(index,size,type,stride,ptr)=>{var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=false;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribIPointer(index,size,type,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribIPointer(index,size,type,stride,ptr)};var _glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=normalized;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribPointer(index,size,type,normalized,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};var _glViewport=(x0,x1,x2,x3)=>GLctx.viewport(x0,x1,x2,x3);registerPreMainLoop(()=>GL.newRenderingFrameStarted());for(let i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["GL"]=GL;var ASM_CONSTS={10156:()=>{const ctx=Module.creator2d_glContext||typeof window!=="undefined"&&window.creator2d_glContext;const opts=Module.creator2d_glOptions||typeof window!=="undefined"&&window.creator2d_glOptions||{};const handle=GL.registerContext(ctx,opts);GL.makeContextCurrent(handle)}};function slog_js_log(level,c_str){const str=UTF8ToString(c_str);switch(level){case 0:console.error(str);break;case 1:console.error(str);break;case 2:console.warn(str);break;default:console.info(str);break}}var wasmImports={K:___cxa_throw,Xa:__abort_js,Ea:_c2dAnimEvent,S:_c2dEarlyUpdate,N:_c2dLateUpdate,Ba:_c2dPhysicsEvent,Wa:_clock_time_get,ab:_emscripten_asm_const_int,Va:_emscripten_get_now,Ua:_emscripten_resize_heap,q:_glActiveTexture,t:_glAttachShader,b:_glBindBuffer,w:_glBindBufferBase,wa:_glBindBufferRange,g:_glBindFramebuffer,Ga:_glBindRenderbuffer,p:_glBindSampler,f:_glBindTexture,v:_glBindVertexArray,B:_glBlendColor,C:_glBlendEquationSeparate,D:_glBlendFuncSeparate,ba:_glBlitFramebuffer,Qa:_glBufferData,M:_glBufferSubData,Ya:_glCheckFramebufferStatus,Aa:_glClearBufferfi,F:_glClearBufferfv,za:_glClearBufferiv,n:_glColorMask,$a:_glCompileShader,Y:_glCompressedTexSubImage2D,W:_glCompressedTexSubImage3D,La:_glCreateProgram,U:_glCreateShader,A:_glCullFace,Z:_glDeleteBuffers,u:_glDeleteFramebuffers,k:_glDeleteProgram,O:_glDeleteRenderbuffers,P:_glDeleteSamplers,j:_glDeleteShader,o:_glDeleteTextures,Sa:_glDeleteVertexArrays,r:_glDepthFunc,s:_glDepthMask,c:_glDisable,y:_glDisableVertexAttribArray,da:_glDrawArrays,ea:_glDrawArraysInstanced,G:_glDrawBuffers,fa:_glDrawElements,ha:_glDrawElementsInstanced,e:_glEnable,sa:_glEnableVertexAttribArray,i:_glFramebufferRenderbuffer,h:_glFramebufferTexture2D,Za:_glFramebufferTextureLayer,z:_glFrontFace,Ra:_glGenBuffers,R:_glGenFramebuffers,Ha:_glGenRenderbuffers,Ma:_glGenSamplers,Pa:_glGenTextures,ga:_glGenVertexArrays,Ia:_glGetAttribLocation,a:_glGetIntegerv,Ka:_glGetProgramInfoLog,I:_glGetProgramiv,_a:_glGetShaderInfoLog,Q:_glGetShaderiv,ra:_glGetStringi,H:_glGetUniformLocation,aa:_glInvalidateFramebuffer,J:_glLinkProgram,Ta:_glPixelStorei,E:_glPolygonOffset,ca:_glReadBuffer,Fa:_glRenderbufferStorageMultisample,L:_glSamplerParameterf,d:_glSamplerParameteri,Ca:_glScissor,T:_glShaderSource,$:_glStencilFunc,ya:_glStencilFuncSeparate,m:_glStencilMask,_:_glStencilOp,xa:_glStencilOpSeparate,Oa:_glTexStorage2D,Na:_glTexStorage3D,X:_glTexSubImage2D,V:_glTexSubImage3D,qa:_glUniform1fv,Ja:_glUniform1i,ma:_glUniform1iv,pa:_glUniform2fv,la:_glUniform2iv,oa:_glUniform3fv,ka:_glUniform3iv,na:_glUniform4fv,ja:_glUniform4iv,ia:_glUniformMatrix4fv,l:_glUseProgram,ta:_glVertexAttribDivisor,ua:_glVertexAttribIPointer,va:_glVertexAttribPointer,Da:_glViewport,x:slog_js_log};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports["cb"];var _creator2dVersion=Module["_creator2dVersion"]=wasmExports["db"];var _c2dInit=Module["_c2dInit"]=wasmExports["eb"];var _c2dInitMetal=Module["_c2dInitMetal"]=wasmExports["fb"];var _c2dInitHeadless=Module["_c2dInitHeadless"]=wasmExports["gb"];var _c2dTickHeadless=Module["_c2dTickHeadless"]=wasmExports["hb"];var _c2dReadDrawList=Module["_c2dReadDrawList"]=wasmExports["ib"];var _c2dShutdown=Module["_c2dShutdown"]=wasmExports["jb"];var _c2dSetViewport=Module["_c2dSetViewport"]=wasmExports["kb"];var _c2dSetDensity=Module["_c2dSetDensity"]=wasmExports["lb"];var _c2dSetClearColor=Module["_c2dSetClearColor"]=wasmExports["mb"];var _c2dSetGLFramebuffer=Module["_c2dSetGLFramebuffer"]=wasmExports["nb"];var _c2dResetStateCache=Module["_c2dResetStateCache"]=wasmExports["ob"];var _c2dRender=Module["_c2dRender"]=wasmExports["pb"];var _c2dRenderMetal=Module["_c2dRenderMetal"]=wasmExports["qb"];var _c2dCreateScene=Module["_c2dCreateScene"]=wasmExports["rb"];var _c2dDestroyScene=Module["_c2dDestroyScene"]=wasmExports["sb"];var _c2dOpenScene=Module["_c2dOpenScene"]=wasmExports["tb"];var _c2dCloseScene=Module["_c2dCloseScene"]=wasmExports["ub"];var _c2dSceneSetClearColor=Module["_c2dSceneSetClearColor"]=wasmExports["vb"];var _c2dAddEntityToScene=Module["_c2dAddEntityToScene"]=wasmExports["wb"];var _c2dRemoveEntityFromScene=Module["_c2dRemoveEntityFromScene"]=wasmExports["xb"];var _c2dSetLayerYSort=Module["_c2dSetLayerYSort"]=wasmExports["yb"];var _c2dCameraSetPosition=Module["_c2dCameraSetPosition"]=wasmExports["zb"];var _c2dCameraSetZoom=Module["_c2dCameraSetZoom"]=wasmExports["Ab"];var _c2dCameraSetRotation=Module["_c2dCameraSetRotation"]=wasmExports["Bb"];var _c2dCameraScreenToWorld=Module["_c2dCameraScreenToWorld"]=wasmExports["Cb"];var _c2dCameraWorldToScreen=Module["_c2dCameraWorldToScreen"]=wasmExports["Db"];var _c2dCreateEntity=Module["_c2dCreateEntity"]=wasmExports["Eb"];var _c2dDestroyEntity=Module["_c2dDestroyEntity"]=wasmExports["Fb"];var _c2dSetParent=Module["_c2dSetParent"]=wasmExports["Gb"];var _c2dSetPosition=Module["_c2dSetPosition"]=wasmExports["Hb"];var _c2dSetRotation=Module["_c2dSetRotation"]=wasmExports["Ib"];var _c2dSetScale=Module["_c2dSetScale"]=wasmExports["Jb"];var _c2dSetLayer=Module["_c2dSetLayer"]=wasmExports["Kb"];var _c2dSetZ=Module["_c2dSetZ"]=wasmExports["Lb"];var _c2dSetVisible=Module["_c2dSetVisible"]=wasmExports["Mb"];var _c2dGetPosition=Module["_c2dGetPosition"]=wasmExports["Nb"];var _c2dGetParent=Module["_c2dGetParent"]=wasmExports["Ob"];var _c2dGetChildCount=Module["_c2dGetChildCount"]=wasmExports["Pb"];var _c2dGetChild=Module["_c2dGetChild"]=wasmExports["Qb"];var _c2dGetWorldPosition=Module["_c2dGetWorldPosition"]=wasmExports["Rb"];var _c2dGetWorldMatrix=Module["_c2dGetWorldMatrix"]=wasmExports["Sb"];var _c2dWorldToLocal=Module["_c2dWorldToLocal"]=wasmExports["Tb"];var _c2dLocalToWorld=Module["_c2dLocalToWorld"]=wasmExports["Ub"];var _c2dGetLocalTransform=Module["_c2dGetLocalTransform"]=wasmExports["Vb"];var _c2dPickSprite=Module["_c2dPickSprite"]=wasmExports["Wb"];var _c2dSetSprite=Module["_c2dSetSprite"]=wasmExports["Xb"];var _c2dSetSpriteFrame=Module["_c2dSetSpriteFrame"]=wasmExports["Yb"];var _c2dSetSpriteFramePx=Module["_c2dSetSpriteFramePx"]=wasmExports["Zb"];var _c2dSetSpriteSize=Module["_c2dSetSpriteSize"]=wasmExports["_b"];var _c2dSetSpriteAnchor=Module["_c2dSetSpriteAnchor"]=wasmExports["$b"];var _c2dSetSpriteColor=Module["_c2dSetSpriteColor"]=wasmExports["ac"];var _c2dSetSpriteOpacity=Module["_c2dSetSpriteOpacity"]=wasmExports["bc"];var _c2dSetSpriteFlip=Module["_c2dSetSpriteFlip"]=wasmExports["cc"];var _c2dSetDefaultFilter=Module["_c2dSetDefaultFilter"]=wasmExports["dc"];var _c2dBulkSetPositions=Module["_c2dBulkSetPositions"]=wasmExports["ec"];var _c2dCreateTexture=Module["_c2dCreateTexture"]=wasmExports["fc"];var _c2dCreateTextureFromRGBA=Module["_c2dCreateTextureFromRGBA"]=wasmExports["gc"];var _c2dUpdateTextureFromRGBA=Module["_c2dUpdateTextureFromRGBA"]=wasmExports["hc"];var _c2dGetTextureWidth=Module["_c2dGetTextureWidth"]=wasmExports["ic"];var _c2dGetTextureHeight=Module["_c2dGetTextureHeight"]=wasmExports["jc"];var _c2dDestroyTexture=Module["_c2dDestroyTexture"]=wasmExports["kc"];var _c2dDefineAnimation=Module["_c2dDefineAnimation"]=wasmExports["lc"];var _c2dPlayAnimation=Module["_c2dPlayAnimation"]=wasmExports["mc"];var _c2dStopAnimation=Module["_c2dStopAnimation"]=wasmExports["nc"];var _c2dSetAnimationSpeed=Module["_c2dSetAnimationSpeed"]=wasmExports["oc"];var _c2dGetAnimationFrame=Module["_c2dGetAnimationFrame"]=wasmExports["pc"];var _c2dCreateTilemap=Module["_c2dCreateTilemap"]=wasmExports["qc"];var _c2dSetTile=Module["_c2dSetTile"]=wasmExports["rc"];var _free=Module["_free"]=wasmExports["sc"];var _malloc=Module["_malloc"]=wasmExports["tc"];var _c2dPhysicsHasSupport=Module["_c2dPhysicsHasSupport"]=wasmExports["uc"];var _c2dSetInterpolation=Module["_c2dSetInterpolation"]=wasmExports["vc"];var _c2dPhysicsConfigure=Module["_c2dPhysicsConfigure"]=wasmExports["wc"];var _c2dPhysicsCreateBody=Module["_c2dPhysicsCreateBody"]=wasmExports["xc"];var _c2dPhysicsRemoveBody=Module["_c2dPhysicsRemoveBody"]=wasmExports["yc"];var _c2dPhysicsAddBox=Module["_c2dPhysicsAddBox"]=wasmExports["zc"];var _c2dPhysicsAddCircle=Module["_c2dPhysicsAddCircle"]=wasmExports["Ac"];var _c2dPhysicsAddCapsule=Module["_c2dPhysicsAddCapsule"]=wasmExports["Bc"];var _c2dPhysicsAddSegment=Module["_c2dPhysicsAddSegment"]=wasmExports["Cc"];var _c2dPhysicsAddPolygon=Module["_c2dPhysicsAddPolygon"]=wasmExports["Dc"];var _c2dPhysicsSetLinearVelocity=Module["_c2dPhysicsSetLinearVelocity"]=wasmExports["Ec"];var _c2dPhysicsGetLinearVelocity=Module["_c2dPhysicsGetLinearVelocity"]=wasmExports["Fc"];var _c2dPhysicsSetAngularVelocity=Module["_c2dPhysicsSetAngularVelocity"]=wasmExports["Gc"];var _c2dPhysicsApplyLinearImpulse=Module["_c2dPhysicsApplyLinearImpulse"]=wasmExports["Hc"];var _c2dPhysicsApplyForce=Module["_c2dPhysicsApplyForce"]=wasmExports["Ic"];var _c2dPhysicsSetTransform=Module["_c2dPhysicsSetTransform"]=wasmExports["Jc"];var _c2dPhysicsSetFixedRotation=Module["_c2dPhysicsSetFixedRotation"]=wasmExports["Kc"];var _c2dPhysicsSetGravityScale=Module["_c2dPhysicsSetGravityScale"]=wasmExports["Lc"];var _c2dPhysicsSetLinearDamping=Module["_c2dPhysicsSetLinearDamping"]=wasmExports["Mc"];var _c2dPhysicsSetBullet=Module["_c2dPhysicsSetBullet"]=wasmExports["Nc"];var _c2dPhysicsSetEnabled=Module["_c2dPhysicsSetEnabled"]=wasmExports["Oc"];var _c2dPhysicsRaycastClosest=Module["_c2dPhysicsRaycastClosest"]=wasmExports["Pc"];var _c2dPhysicsOverlapPoint=Module["_c2dPhysicsOverlapPoint"]=wasmExports["Qc"];function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();moduleRtn=readyPromise;
8
+
9
+
10
+ return moduleRtn;
11
+ }
12
+ );
13
+ })();
14
+ export default creator2d;
Binary file