minecraft-renderer 0.1.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 (187) hide show
  1. package/README.md +297 -0
  2. package/dist/index.html +83 -0
  3. package/dist/static/image/arrow.6f27b59f.png +0 -0
  4. package/dist/static/image/blocksAtlasLatest.7850afa3.png +0 -0
  5. package/dist/static/image/blocksAtlasLegacy.5c76823d.png +0 -0
  6. package/dist/static/image/itemsAtlasLatest.36036f95.png +0 -0
  7. package/dist/static/image/itemsAtlasLegacy.dcb1b58d.png +0 -0
  8. package/dist/static/image/tipped_arrow.6f27b59f.png +0 -0
  9. package/dist/static/js/365.f05233ab.js +8462 -0
  10. package/dist/static/js/365.f05233ab.js.LICENSE.txt +52 -0
  11. package/dist/static/js/async/738.efa27644.js +1 -0
  12. package/dist/static/js/index.092ec5be.js +56 -0
  13. package/dist/static/js/lib-polyfill.98986ac5.js +1 -0
  14. package/dist/static/js/lib-react.5c9129e0.js +2 -0
  15. package/dist/static/js/lib-react.5c9129e0.js.LICENSE.txt +39 -0
  16. package/package.json +104 -0
  17. package/src/assets/destroy_stage_0.png +0 -0
  18. package/src/assets/destroy_stage_1.png +0 -0
  19. package/src/assets/destroy_stage_2.png +0 -0
  20. package/src/assets/destroy_stage_3.png +0 -0
  21. package/src/assets/destroy_stage_4.png +0 -0
  22. package/src/assets/destroy_stage_5.png +0 -0
  23. package/src/assets/destroy_stage_6.png +0 -0
  24. package/src/assets/destroy_stage_7.png +0 -0
  25. package/src/assets/destroy_stage_8.png +0 -0
  26. package/src/assets/destroy_stage_9.png +0 -0
  27. package/src/examples/README.md +146 -0
  28. package/src/examples/appViewerExample.ts +205 -0
  29. package/src/examples/initialMenuStart.ts +161 -0
  30. package/src/graphicsBackend/appViewer.ts +297 -0
  31. package/src/graphicsBackend/config.ts +119 -0
  32. package/src/graphicsBackend/index.ts +10 -0
  33. package/src/graphicsBackend/playerState.ts +61 -0
  34. package/src/graphicsBackend/types.ts +143 -0
  35. package/src/index.ts +97 -0
  36. package/src/lib/DebugGui.ts +190 -0
  37. package/src/lib/animationController.ts +85 -0
  38. package/src/lib/buildSharedConfig.mjs +1 -0
  39. package/src/lib/cameraBobbing.ts +94 -0
  40. package/src/lib/canvas2DOverlay.example.ts +361 -0
  41. package/src/lib/canvas2DOverlay.quickstart.ts +242 -0
  42. package/src/lib/canvas2DOverlay.ts +381 -0
  43. package/src/lib/cleanupDecorator.ts +29 -0
  44. package/src/lib/createPlayerObject.ts +55 -0
  45. package/src/lib/frameTimingCollector.ts +164 -0
  46. package/src/lib/guiRenderer.ts +283 -0
  47. package/src/lib/items.ts +140 -0
  48. package/src/lib/mesherlogReader.ts +131 -0
  49. package/src/lib/moreBlockDataGenerated.json +714 -0
  50. package/src/lib/preflatMap.json +1741 -0
  51. package/src/lib/simpleUtils.ts +40 -0
  52. package/src/lib/smoothSwitcher.ts +168 -0
  53. package/src/lib/spiral.ts +29 -0
  54. package/src/lib/ui/newStats.ts +120 -0
  55. package/src/lib/utils/proxy.ts +23 -0
  56. package/src/lib/utils/skins.ts +63 -0
  57. package/src/lib/utils.ts +76 -0
  58. package/src/lib/workerProxy.ts +342 -0
  59. package/src/lib/worldrendererCommon.ts +1088 -0
  60. package/src/mesher/mesher.ts +253 -0
  61. package/src/mesher/models.ts +769 -0
  62. package/src/mesher/modelsGeometryCommon.ts +142 -0
  63. package/src/mesher/shared.ts +80 -0
  64. package/src/mesher/standaloneRenderer.ts +270 -0
  65. package/src/mesher/test/a.ts +3 -0
  66. package/src/mesher/test/mesherTester.ts +76 -0
  67. package/src/mesher/test/playground.ts +19 -0
  68. package/src/mesher/test/test-perf.ts +74 -0
  69. package/src/mesher/test/tests.test.ts +56 -0
  70. package/src/mesher/world.ts +294 -0
  71. package/src/mesher/worldConstants.ts +1 -0
  72. package/src/modules/index.ts +11 -0
  73. package/src/modules/starfield.ts +313 -0
  74. package/src/modules/types.ts +110 -0
  75. package/src/playerState/playerState.ts +78 -0
  76. package/src/playerState/types.ts +36 -0
  77. package/src/playground/allEntitiesDebug.ts +170 -0
  78. package/src/playground/baseScene.ts +587 -0
  79. package/src/playground/mobileControls.tsx +268 -0
  80. package/src/playground/playground.html +83 -0
  81. package/src/playground/playground.ts +11 -0
  82. package/src/playground/playgroundUi.tsx +140 -0
  83. package/src/playground/reactUtils.ts +71 -0
  84. package/src/playground/scenes/allEntities.ts +13 -0
  85. package/src/playground/scenes/entities.ts +37 -0
  86. package/src/playground/scenes/floorRandom.ts +33 -0
  87. package/src/playground/scenes/frequentUpdates.ts +148 -0
  88. package/src/playground/scenes/geometryExport.ts +142 -0
  89. package/src/playground/scenes/index.ts +12 -0
  90. package/src/playground/scenes/lightingStarfield.ts +40 -0
  91. package/src/playground/scenes/main.ts +313 -0
  92. package/src/playground/scenes/railsCobweb.ts +14 -0
  93. package/src/playground/scenes/rotationIssue.ts +7 -0
  94. package/src/playground/scenes/slabsOptimization.ts +16 -0
  95. package/src/playground/scenes/transparencyIssue.ts +11 -0
  96. package/src/playground/shared.ts +79 -0
  97. package/src/resourcesManager/index.ts +5 -0
  98. package/src/resourcesManager/resourcesManager.ts +314 -0
  99. package/src/shims/minecraftData.ts +41 -0
  100. package/src/sign-renderer/index.html +21 -0
  101. package/src/sign-renderer/index.ts +216 -0
  102. package/src/sign-renderer/noop.js +1 -0
  103. package/src/sign-renderer/playground.ts +38 -0
  104. package/src/sign-renderer/tests.test.ts +69 -0
  105. package/src/sign-renderer/vite.config.ts +10 -0
  106. package/src/three/appShared.ts +75 -0
  107. package/src/three/bannerRenderer.ts +275 -0
  108. package/src/three/cameraShake.ts +120 -0
  109. package/src/three/cinimaticScript.ts +350 -0
  110. package/src/three/documentRenderer.ts +491 -0
  111. package/src/three/entities.ts +1580 -0
  112. package/src/three/entity/EntityMesh.ts +707 -0
  113. package/src/three/entity/animations.js +171 -0
  114. package/src/three/entity/armorModels.json +204 -0
  115. package/src/three/entity/armorModels.ts +36 -0
  116. package/src/three/entity/entities.json +6230 -0
  117. package/src/three/entity/exportedModels.js +38 -0
  118. package/src/three/entity/externalTextures.json +1 -0
  119. package/src/three/entity/models/allay.obj +325 -0
  120. package/src/three/entity/models/arrow.obj +60 -0
  121. package/src/three/entity/models/axolotl.obj +509 -0
  122. package/src/three/entity/models/blaze.obj +601 -0
  123. package/src/three/entity/models/boat.obj +417 -0
  124. package/src/three/entity/models/camel.obj +1061 -0
  125. package/src/three/entity/models/cat.obj +509 -0
  126. package/src/three/entity/models/chicken.obj +371 -0
  127. package/src/three/entity/models/cod.obj +371 -0
  128. package/src/three/entity/models/creeper.obj +279 -0
  129. package/src/three/entity/models/dolphin.obj +371 -0
  130. package/src/three/entity/models/ender_dragon.obj +2993 -0
  131. package/src/three/entity/models/enderman.obj +325 -0
  132. package/src/three/entity/models/endermite.obj +187 -0
  133. package/src/three/entity/models/fox.obj +463 -0
  134. package/src/three/entity/models/frog.obj +739 -0
  135. package/src/three/entity/models/ghast.obj +463 -0
  136. package/src/three/entity/models/goat.obj +601 -0
  137. package/src/three/entity/models/guardian.obj +1015 -0
  138. package/src/three/entity/models/horse.obj +1061 -0
  139. package/src/three/entity/models/llama.obj +509 -0
  140. package/src/three/entity/models/minecart.obj +233 -0
  141. package/src/three/entity/models/parrot.obj +509 -0
  142. package/src/three/entity/models/piglin.obj +739 -0
  143. package/src/three/entity/models/pillager.obj +371 -0
  144. package/src/three/entity/models/rabbit.obj +555 -0
  145. package/src/three/entity/models/sheep.obj +555 -0
  146. package/src/three/entity/models/shulker.obj +141 -0
  147. package/src/three/entity/models/sniffer.obj +693 -0
  148. package/src/three/entity/models/spider.obj +509 -0
  149. package/src/three/entity/models/tadpole.obj +95 -0
  150. package/src/three/entity/models/turtle.obj +371 -0
  151. package/src/three/entity/models/vex.obj +325 -0
  152. package/src/three/entity/models/villager.obj +509 -0
  153. package/src/three/entity/models/warden.obj +463 -0
  154. package/src/three/entity/models/witch.obj +647 -0
  155. package/src/three/entity/models/wolf.obj +509 -0
  156. package/src/three/entity/models/zombie_villager.obj +463 -0
  157. package/src/three/entity/objModels.js +1 -0
  158. package/src/three/fireworks.ts +661 -0
  159. package/src/three/fireworksRenderer.ts +434 -0
  160. package/src/three/globals.d.ts +7 -0
  161. package/src/three/graphicsBackend.ts +274 -0
  162. package/src/three/graphicsBackendOffThread.ts +107 -0
  163. package/src/three/hand.ts +89 -0
  164. package/src/three/holdingBlock.ts +926 -0
  165. package/src/three/index.ts +20 -0
  166. package/src/three/itemMesh.ts +427 -0
  167. package/src/three/modules.d.ts +14 -0
  168. package/src/three/panorama.ts +308 -0
  169. package/src/three/panoramaShared.ts +1 -0
  170. package/src/three/renderSlot.ts +82 -0
  171. package/src/three/skyboxRenderer.ts +406 -0
  172. package/src/three/starField.ts +13 -0
  173. package/src/three/threeJsMedia.ts +731 -0
  174. package/src/three/threeJsMethods.ts +15 -0
  175. package/src/three/threeJsParticles.ts +160 -0
  176. package/src/three/threeJsSound.ts +95 -0
  177. package/src/three/threeJsUtils.ts +90 -0
  178. package/src/three/waypointSprite.ts +435 -0
  179. package/src/three/waypoints.ts +163 -0
  180. package/src/three/world/cursorBlock.ts +172 -0
  181. package/src/three/world/vr.ts +257 -0
  182. package/src/three/worldGeometryExport.ts +259 -0
  183. package/src/three/worldGeometryHandler.ts +279 -0
  184. package/src/three/worldRendererThree.ts +1381 -0
  185. package/src/worldView/index.ts +6 -0
  186. package/src/worldView/types.ts +66 -0
  187. package/src/worldView/worldView.ts +424 -0
@@ -0,0 +1,342 @@
1
+ import { proxy, getVersion, subscribe } from 'valtio'
2
+ import { Vec3 } from 'vec3'
3
+
4
+ export function createWorkerProxy<T extends Record<string, (...args: any[]) => void | Promise<any>>>(handlers: T, channel?: MessagePort): { __workerProxy: T } {
5
+ const target = channel ?? globalThis
6
+ target.addEventListener('message', (event: any) => {
7
+ const { type, args, msgId } = event.data
8
+ if (handlers[type]) {
9
+ const result = handlers[type](...args)
10
+ if (result instanceof Promise) {
11
+ void result.then((result) => {
12
+ target.postMessage({
13
+ type: 'result',
14
+ msgId,
15
+ args: [result]
16
+ })
17
+ })
18
+ }
19
+ }
20
+ })
21
+ return null as any
22
+ }
23
+
24
+ /**
25
+ * in main thread
26
+ * ```ts
27
+ * // either:
28
+ * import type { importedTypeWorkerProxy } from './worker'
29
+ * // or:
30
+ * type importedTypeWorkerProxy = import('./worker').importedTypeWorkerProxy
31
+ *
32
+ * const workerChannel = useWorkerProxy<typeof importedTypeWorkerProxy>(worker)
33
+ * ```
34
+ */
35
+ export const useWorkerProxy = <T extends { __workerProxy: Record<string, (...args: any[]) => void> }>(worker: Worker | MessagePort, autoTransfer = true): T['__workerProxy'] & {
36
+ transfer: (...args: Transferable[]) => T['__workerProxy']
37
+ } => {
38
+ let messageId = 0
39
+ // in main thread
40
+ return new Proxy({} as any, {
41
+ get(target, prop) {
42
+ if (prop === 'transfer') {
43
+ return (...transferable: Transferable[]) => {
44
+ return new Proxy({}, {
45
+ get(target, prop) {
46
+ return (...args: any[]) => {
47
+ worker.postMessage({
48
+ type: prop,
49
+ args,
50
+ }, transferable)
51
+ }
52
+ }
53
+ })
54
+ }
55
+ }
56
+ return (...args: any[]) => {
57
+ const msgId = messageId++
58
+ const transfer = autoTransfer ? args.filter(arg => {
59
+ return arg instanceof ArrayBuffer || arg instanceof MessagePort
60
+ || (typeof ImageBitmap !== 'undefined' && arg instanceof ImageBitmap)
61
+ || (typeof OffscreenCanvas !== 'undefined' && arg instanceof OffscreenCanvas)
62
+ || (typeof ImageData !== 'undefined' && arg instanceof ImageData)
63
+ }) : []
64
+ worker.postMessage({
65
+ type: prop,
66
+ msgId,
67
+ args,
68
+ }, transfer)
69
+ return {
70
+ // eslint-disable-next-line unicorn/no-thenable
71
+ then(onfulfilled: (value: any) => void) {
72
+ const handler = ({ data }: MessageEvent): void => {
73
+ if (data.type === 'result' && data.msgId === msgId) {
74
+ onfulfilled(data.args[0])
75
+ worker.removeEventListener('message', handler as EventListener)
76
+ }
77
+ }
78
+ worker.addEventListener('message', handler as EventListener)
79
+ }
80
+ }
81
+ }
82
+ }
83
+ })
84
+ }
85
+
86
+ const DEBUG_SYNC = false
87
+
88
+ const sendWorkerSync = (syncId: string, obj: any, worker: Worker, debugKey: string) => {
89
+ try {
90
+ worker.postMessage({
91
+ type: 'sync',
92
+ syncId,
93
+ value: cloneValtioObject(obj)
94
+ })
95
+ currentWorkerSyncStats.toWorker++
96
+ globalThis.debugSyncMessagesOutgoing ??= 0
97
+ globalThis.debugSyncMessagesOutgoing++
98
+ } catch (err) {
99
+ console.error('Failed to send worker sync', err)
100
+ findProblemTransfer(obj)
101
+ }
102
+ }
103
+
104
+ // Add stats tracking variables
105
+ const currentWorkerSyncStats = { toWorker: 0, fromWorker: 0 }
106
+
107
+ if (typeof window !== 'undefined') {
108
+ setInterval(() => {
109
+ globalThis.debugWorkerSyncStats = { ...currentWorkerSyncStats }
110
+ currentWorkerSyncStats.toWorker = 0
111
+ currentWorkerSyncStats.fromWorker = 0
112
+ }, 1000)
113
+ }
114
+
115
+ const getSyncId = () => {
116
+ return Math.random().toString(36).slice(2, 15) + Math.random().toString(36).slice(2, 15)
117
+ }
118
+
119
+ const setupObjectSync = (obj: any, originalObj: any, worker: Worker, isValtio: boolean, debugKey: string) => {
120
+ if (!obj['__syncToWorker'] && !obj['__syncFromWorker'] && !isValtio) return
121
+
122
+ const syncId = getSyncId()
123
+ obj['__syncId'] = syncId
124
+
125
+ if (obj['__syncToWorker'] || isValtio) {
126
+ const syncToWorker = () => {
127
+ sendWorkerSync(syncId, originalObj, worker, `toWorker:${debugKey}`)
128
+ }
129
+ if (isValtio) {
130
+ subscribe(originalObj, syncToWorker)
131
+ }
132
+
133
+ const interval = obj['__syncToWorkerInterval'] ?? 0
134
+ if (interval > 0) {
135
+ setInterval(syncToWorker, interval)
136
+ }
137
+ }
138
+
139
+ if (originalObj['__syncFromWorker']) {
140
+ worker.addEventListener('message', (event: any) => {
141
+ if (event.data.type === 'sync' && event.data.syncId === syncId) {
142
+ currentWorkerSyncStats.fromWorker++
143
+ Object.assign(originalObj, event.data.value)
144
+ }
145
+ })
146
+ }
147
+ }
148
+
149
+ const cloneValtioObject = (obj: any) => {
150
+ if (getVersion(obj) === undefined) {
151
+ return obj
152
+ }
153
+
154
+ if (Array.isArray(obj)) {
155
+ return obj.map(cloneValtioObject)
156
+ }
157
+
158
+ if (typeof obj === 'object' && obj !== null) {
159
+ const newObj = {} as any
160
+ for (const key in obj) {
161
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
162
+ newObj[key] = cloneValtioObject(obj[key])
163
+ }
164
+ }
165
+ return newObj
166
+ }
167
+
168
+ return obj
169
+ }
170
+
171
+ export const deepPrepareForTransfer = (obj: any, worker: Worker, autoRemoveMethods = true, _isRoot = true, _isInsideValtio = false) => {
172
+ const originalObj = obj
173
+ const newObj = {} as any
174
+
175
+ for (const key in obj) {
176
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
177
+ if (autoRemoveMethods && typeof obj[key] === 'function') {
178
+ continue
179
+ }
180
+
181
+ // print a warning for Date, RegExp, Map, WeakMap, WeakSet
182
+ if (obj[key] instanceof Date || obj[key] instanceof RegExp || obj[key] instanceof Map || obj[key] instanceof WeakMap || obj[key] instanceof WeakSet) {
183
+ console.warn(`Warning: ${key} is a ${typeof obj[key]}, which is not supported for transfer.`)
184
+ }
185
+
186
+ // default restorers main -> worker
187
+ // Set (only primitive values)
188
+ if (obj[key] instanceof Set) {
189
+ newObj[key] = [...obj[key]]
190
+ newObj[key]['__restorer'] = 'Set'
191
+ continue
192
+ }
193
+ if (obj[key] instanceof Vec3) {
194
+ newObj[key] = { x: obj[key].x, y: obj[key].y, z: obj[key].z }
195
+ newObj[key]['__restorer'] = 'Vec3'
196
+ continue
197
+ }
198
+
199
+ newObj[key] = obj[key]
200
+
201
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
202
+ if (obj[key]['prepareForTransfer']) {
203
+ newObj[key] = obj[key]['prepareForTransfer'](worker)
204
+ continue
205
+ }
206
+
207
+ const isValtio = getVersion(obj[key]) !== undefined
208
+ newObj[key] = isValtio ? cloneValtioObject(obj[key]) : obj[key]
209
+
210
+ // Try to enable sync main -> worker
211
+ const tryEnableDefaultSync = obj[key]['__syncToWorker'] !== false && !_isInsideValtio && isValtio && !obj[key]['__syncFromWorker']
212
+ newObj[key]['__syncToWorker'] ??= tryEnableDefaultSync
213
+ if (isValtio) {
214
+ newObj[key]['__valtio'] ??= true
215
+ }
216
+
217
+ if (newObj[key]['__syncToWorker'] && isValtio) {
218
+ setupObjectSync(newObj[key], originalObj[key], worker, true, key)
219
+ continue
220
+ }
221
+ setupObjectSync(newObj[key], originalObj[key], worker, false, key)
222
+
223
+
224
+ newObj[key] = deepPrepareForTransfer(newObj[key], worker, autoRemoveMethods, false, isValtio)
225
+ }
226
+ }
227
+ }
228
+ return newObj
229
+ }
230
+
231
+ export const findProblemTransfer = (obj: any, path: string[] = []) => {
232
+ for (const key in obj) {
233
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
234
+ if (!obj[key]) continue
235
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
236
+ findProblemTransfer(obj[key], [...path, key])
237
+ }
238
+ try {
239
+ structuredClone(obj[key])
240
+ } catch (error) {
241
+ console.error(error)
242
+ console.log('Failed to clone for transfer', path.join('.'))
243
+ }
244
+ }
245
+ }
246
+ }
247
+
248
+ const receiveSyncedObject = (obj: any, worker: Worker, debugKey: string) => {
249
+ if (!obj['__syncId']) return
250
+ const syncId = obj['__syncId']
251
+
252
+ if (obj['__syncToWorker']) {
253
+ worker.addEventListener('message', (event: any) => {
254
+ if (event.data.type === 'sync' && event.data.syncId === syncId) {
255
+ Object.assign(obj, event.data.value)
256
+ }
257
+ })
258
+ }
259
+
260
+ if (obj['__syncFromWorker']) {
261
+ const syncFromWorker = () => {
262
+ sendWorkerSync(syncId, obj, worker, `fromWorker:${debugKey}`)
263
+ }
264
+
265
+ if (obj['__valtio']) {
266
+ subscribe(obj, syncFromWorker)
267
+ }
268
+
269
+ const interval = obj['__syncFromWorkerInterval'] ?? 0
270
+ if (interval > 0) {
271
+ setInterval(syncFromWorker, interval)
272
+ }
273
+ }
274
+ }
275
+
276
+ const defaultRestorers = [
277
+ {
278
+ restorerName: 'Set',
279
+ restoreTransferred(obj, worker: Worker) {
280
+ return new Set(obj)
281
+ }
282
+ },
283
+ {
284
+ restorerName: 'Vec3',
285
+ restoreTransferred(obj, worker: Worker) {
286
+ return new Vec3(obj.x, obj.y, obj.z)
287
+ }
288
+ }
289
+ ]
290
+
291
+ export const addDefaultRestorer = (restorer: { restorerName: string, restoreTransferred: (obj: any, worker: Worker) => any }) => {
292
+ defaultRestorers.unshift(restorer)
293
+ }
294
+
295
+ export const restoreTransferred = (obj: any, restorersArg: any[], worker: Worker, errorHandler: ((error: Error) => void) | boolean = true) => {
296
+ const restorers = [...defaultRestorers, ...restorersArg]
297
+
298
+ for (const key in obj) {
299
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
300
+ if (!obj[key]) continue
301
+
302
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
303
+ restoreTransferred(obj[key], restorers, worker, errorHandler)
304
+ }
305
+
306
+ if (obj[key]['__restorer']) {
307
+ // find restorer
308
+ const restorer = restorers.find(restorer => {
309
+ return restorer.restorerName ? restorer.restorerName === obj[key]['__restorer'] : restorer.name === obj[key]['__restorer']
310
+ })
311
+ if (restorer) {
312
+ obj[key] = restorer.restoreTransferred(obj[key], worker)
313
+ } else {
314
+ const error = new Error(`Restorer ${obj[key]['__restorer']} not found`)
315
+ if (typeof errorHandler === 'function') {
316
+ errorHandler(error)
317
+ } else if (errorHandler) {
318
+ throw error
319
+ } else {
320
+ console.error(error)
321
+ }
322
+ }
323
+ }
324
+
325
+ if (obj[key]['__valtio']) {
326
+ obj[key] = proxy(obj[key])
327
+ }
328
+
329
+ receiveSyncedObject(obj[key], worker, key)
330
+ }
331
+ }
332
+ return obj
333
+ }
334
+
335
+ // const workerProxy = createWorkerProxy({
336
+ // startRender (canvas: HTMLCanvasElement) {
337
+ // },
338
+ // })
339
+
340
+ // const worker = useWorkerProxy(null, workerProxy)
341
+
342
+ // worker.