minecraft-renderer 0.1.79 → 0.1.81

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 (205) hide show
  1. package/README.md +66 -26
  2. package/dist/mesher.js +36 -36
  3. package/dist/mesher.js.map +4 -4
  4. package/dist/mesherWasm.js +217 -217
  5. package/dist/minecraft-renderer.js +66 -66
  6. package/dist/minecraft-renderer.js.meta.json +1 -1
  7. package/dist/threeWorker.js +450 -450
  8. package/package.json +5 -2
  9. package/src/bundler/bundlePrepare.ts +3 -8
  10. package/src/graphicsBackend/appViewer.ts +10 -7
  11. package/src/graphicsBackend/config.ts +1 -5
  12. package/src/graphicsBackend/playerState.ts +35 -34
  13. package/src/graphicsBackend/preloadWorkers.ts +43 -41
  14. package/src/graphicsBackend/rendererDefaultOptions.ts +68 -70
  15. package/src/graphicsBackend/rendererOptionsSync.ts +24 -50
  16. package/src/graphicsBackend/types.ts +2 -2
  17. package/src/index.ts +6 -27
  18. package/src/lib/DebugGui.ts +34 -31
  19. package/src/lib/animationController.ts +9 -9
  20. package/src/lib/bakeLegacyLight.ts +1 -6
  21. package/src/lib/bindAbortableListener.test.ts +32 -12
  22. package/src/lib/bindAbortableListener.ts +14 -6
  23. package/src/lib/blockEntityLightRegistry.ts +11 -20
  24. package/src/lib/blockEntityLighting.test.ts +1 -6
  25. package/src/lib/blockEntityLighting.ts +5 -5
  26. package/src/lib/buildSharedConfig.mjs +4 -4
  27. package/src/lib/buildWorkerMcDataIndexes.test.ts +4 -4
  28. package/src/lib/buildWorkerMcDataIndexes.ts +11 -19
  29. package/src/lib/cameraBobbing.ts +1 -1
  30. package/src/lib/canvas2DOverlay.example.ts +13 -33
  31. package/src/lib/canvas2DOverlay.quickstart.ts +24 -54
  32. package/src/lib/canvas2DOverlay.ts +28 -47
  33. package/src/lib/cleanupDecorator.ts +2 -2
  34. package/src/lib/createPlayerObject.test.ts +2 -7
  35. package/src/lib/createPlayerObject.ts +18 -25
  36. package/src/lib/frameTimingCollector.ts +2 -5
  37. package/src/lib/guiRenderer.ts +57 -42
  38. package/src/lib/items.ts +15 -9
  39. package/src/lib/mesherlogReader.ts +5 -6
  40. package/src/lib/simpleUtils.ts +5 -5
  41. package/src/lib/skyLight.ts +3 -3
  42. package/src/lib/smoothSwitcher.ts +11 -18
  43. package/src/lib/ui/newStats.ts +10 -12
  44. package/src/lib/utils/proxy.ts +7 -1
  45. package/src/lib/utils/skins.ts +4 -4
  46. package/src/lib/utils.ts +1 -1
  47. package/src/lib/workerMessageSanitize.ts +5 -12
  48. package/src/lib/workerProxy.ts +52 -42
  49. package/src/lib/workerSyncOps.test.ts +58 -41
  50. package/src/lib/worldrendererCommon.reconfigure.test.ts +24 -21
  51. package/src/lib/worldrendererCommon.removeColumn.test.ts +11 -13
  52. package/src/lib/worldrendererCommon.ts +349 -211
  53. package/src/mesher-legacy/mesher.ts +9 -4
  54. package/src/mesher-legacy/test/a.ts +1 -1
  55. package/src/mesher-legacy/test/mesherTester.ts +2 -2
  56. package/src/mesher-legacy/test/playground.ts +1 -1
  57. package/src/mesher-legacy/test/run/test-js.ts +1 -1
  58. package/src/mesher-legacy/test/snapshotUtils.ts +3 -8
  59. package/src/mesher-legacy/test/test-perf.ts +1 -1
  60. package/src/mesher-legacy/test/tests.test.ts +2 -2
  61. package/src/mesher-shared/blockEntityMetadata.test.ts +7 -5
  62. package/src/mesher-shared/blockEntityMetadata.ts +28 -19
  63. package/src/mesher-shared/blockPropertiesForMeshing.ts +2 -2
  64. package/src/mesher-shared/computeHeightmap.ts +2 -4
  65. package/src/mesher-shared/exportedGeometryTypes.ts +3 -3
  66. package/src/mesher-shared/faceOcclusion.ts +324 -0
  67. package/src/mesher-shared/models.ts +80 -131
  68. package/src/mesher-shared/modelsGeometryCommon.ts +30 -15
  69. package/src/mesher-shared/shared.ts +46 -46
  70. package/src/mesher-shared/standaloneRenderer.ts +40 -44
  71. package/src/mesher-shared/tests/faceOcclusion.test.ts +179 -0
  72. package/src/mesher-shared/tests/liquidQuadInvariant.test.ts +12 -8
  73. package/src/mesher-shared/vertexShading.ts +2 -11
  74. package/src/mesher-shared/world.ts +19 -19
  75. package/src/mesher-shared/worldLighting.test.ts +2 -2
  76. package/src/performanceMonitor/PerformanceMonitor.ts +4 -13
  77. package/src/performanceMonitor/formatPerformanceFactorsDebug.ts +2 -2
  78. package/src/performanceMonitor/index.ts +1 -5
  79. package/src/performanceMonitor/types.ts +1 -1
  80. package/src/playerState/playerState.ts +55 -50
  81. package/src/playerState/types.ts +2 -8
  82. package/src/playground/allEntitiesDebug.ts +19 -16
  83. package/src/playground/baseScene.ts +29 -32
  84. package/src/playground/mobileControls.tsx +133 -129
  85. package/src/playground/playground.html +76 -73
  86. package/src/playground/playground.ts +14 -1
  87. package/src/playground/playgroundUi.tsx +100 -74
  88. package/src/playground/reactUtils.ts +3 -7
  89. package/src/playground/scenes/entities.ts +10 -7
  90. package/src/playground/scenes/frequentUpdates.ts +5 -5
  91. package/src/playground/scenes/geometryExport.ts +6 -20
  92. package/src/playground/scenes/highPosEntityUpdates.ts +2 -10
  93. package/src/playground/scenes/index.ts +1 -1
  94. package/src/playground/scenes/lightingStarfield.ts +18 -12
  95. package/src/playground/scenes/main.ts +15 -11
  96. package/src/playground/scenes/partialBlockCulling.ts +31 -0
  97. package/src/playground/scenes/railsCobweb.ts +1 -1
  98. package/src/playground/scenes/rotationIssue.ts +1 -1
  99. package/src/playground/scenes/slabsOptimization.ts +1 -2
  100. package/src/playground/scenes/transparencyIssue.ts +1 -1
  101. package/src/playground/shared.ts +2 -2
  102. package/src/resourcesManager/resourcesManager.ts +29 -54
  103. package/src/resourcesManager/resourcesManager.worker.test.ts +6 -10
  104. package/src/shims/minecraftData.ts +70 -24
  105. package/src/sign-renderer/index.html +10 -12
  106. package/src/sign-renderer/index.ts +29 -29
  107. package/src/sign-renderer/playground.ts +22 -15
  108. package/src/sign-renderer/tests.test.ts +16 -13
  109. package/src/sign-renderer/vite.config.ts +2 -2
  110. package/src/three/appShared.ts +46 -25
  111. package/src/three/bannerRenderer.ts +33 -61
  112. package/src/three/cameraCollisionBlockCache.ts +156 -0
  113. package/src/three/cameraCollisionSolidity.ts +50 -0
  114. package/src/three/cameraShake.ts +15 -6
  115. package/src/three/chunkMeshManager.ts +223 -390
  116. package/src/three/cinimaticScript.ts +26 -15
  117. package/src/three/cubeDrawSpans.ts +27 -37
  118. package/src/three/cubeMultiDraw.ts +9 -22
  119. package/src/three/documentRenderer.ts +15 -18
  120. package/src/three/entities.ts +175 -150
  121. package/src/three/entity/EntityMesh.ts +114 -108
  122. package/src/three/entity/animations.js +3 -3
  123. package/src/three/entity/armorModels.ts +15 -15
  124. package/src/three/entity/gltfAnimationUtils.ts +2 -5
  125. package/src/three/fireworks.ts +34 -32
  126. package/src/three/fireworksRenderer.ts +32 -29
  127. package/src/three/globalBlockBuffer.ts +167 -100
  128. package/src/three/globalLegacyBuffer.ts +248 -264
  129. package/src/three/graphicsBackendBase.ts +19 -25
  130. package/src/three/graphicsBackendOffThread.ts +12 -15
  131. package/src/three/hand.ts +21 -21
  132. package/src/three/handLegacy.ts +3 -13
  133. package/src/three/holdingBlock.ts +116 -79
  134. package/src/three/holdingBlockFactory.ts +1 -4
  135. package/src/three/holdingBlockItemIdentity.test.ts +25 -17
  136. package/src/three/holdingBlockItemIdentity.ts +9 -6
  137. package/src/three/holdingBlockLegacy.ts +113 -132
  138. package/src/three/itemMesh.ts +20 -29
  139. package/src/three/legacyMultiDraw.ts +10 -16
  140. package/src/three/legacySectionCull.ts +8 -14
  141. package/src/three/menuBackground/activeView.ts +1 -4
  142. package/src/three/menuBackground/assetUrl.ts +1 -1
  143. package/src/three/menuBackground/classic.ts +4 -12
  144. package/src/three/menuBackground/gpuPreference.ts +1 -3
  145. package/src/three/menuBackground/index.ts +2 -11
  146. package/src/three/menuBackground/renderer.ts +1 -5
  147. package/src/three/menuBackground/types.ts +1 -4
  148. package/src/three/menuBackground/v2.ts +196 -96
  149. package/src/three/menuBackground/v2Meta.ts +3 -3
  150. package/src/three/menuBackground/worldBlocks.ts +37 -35
  151. package/src/three/modules/blockBreakParticles.ts +59 -28
  152. package/src/three/modules/cameraBobbing.ts +3 -6
  153. package/src/three/modules/index.ts +1 -1
  154. package/src/three/modules/rain.ts +10 -23
  155. package/src/three/modules/sciFiWorldReveal.ts +11 -25
  156. package/src/three/modules/starfield.ts +7 -13
  157. package/src/three/renderSlot.ts +28 -16
  158. package/src/three/rendererModuleSystem.ts +1 -3
  159. package/src/three/sceneOrigin.ts +96 -33
  160. package/src/three/sectionRaycastAabb.ts +24 -110
  161. package/src/three/shaderCubeMesh.ts +6 -17
  162. package/src/three/shaders/cubeBlockShader.ts +85 -96
  163. package/src/three/shaders/legacyBlockShader.ts +21 -43
  164. package/src/three/shaders/textureIndexMapping.ts +89 -95
  165. package/src/three/shaders/tintPalette.ts +156 -170
  166. package/src/three/signTextureCache.ts +9 -12
  167. package/src/three/skyboxRenderer.ts +62 -70
  168. package/src/three/tests/chunkMeshManagerLegacy.test.ts +34 -64
  169. package/src/three/tests/cubeDrawSpans.test.ts +55 -25
  170. package/src/three/tests/globalBlockBuffer.test.ts +217 -0
  171. package/src/three/tests/globalLegacyBuffer.test.ts +300 -41
  172. package/src/three/tests/legacyMultiDraw.test.ts +8 -29
  173. package/src/three/tests/pr3PerFrameCpuCuts.test.ts +106 -29
  174. package/src/three/tests/signTextureCache.test.ts +4 -4
  175. package/src/three/thirdPersonVoxelRaycast.ts +120 -0
  176. package/src/three/threeJsMedia.ts +55 -72
  177. package/src/three/threeJsParticles.ts +32 -41
  178. package/src/three/threeJsSound.ts +3 -3
  179. package/src/three/threeJsUtils.ts +3 -3
  180. package/src/three/threeWorker.ts +2 -2
  181. package/src/three/waypointSprite.ts +55 -82
  182. package/src/three/waypoints.ts +20 -23
  183. package/src/three/world/cursorBlock.ts +25 -12
  184. package/src/three/world/vr.ts +11 -17
  185. package/src/three/worldGeometryExport.ts +15 -34
  186. package/src/three/worldRendererThree.ts +144 -166
  187. package/src/wasm-mesher/bridge/convertChunk.ts +3 -9
  188. package/src/wasm-mesher/bridge/render-from-wasm.ts +204 -229
  189. package/src/wasm-mesher/bridge/shaderCubeBridge.ts +26 -67
  190. package/src/wasm-mesher/tests/cameraCollisionBlockCache.test.ts +82 -0
  191. package/src/wasm-mesher/tests/cullingRegression.test.ts +307 -0
  192. package/src/wasm-mesher/tests/heightmapParity.test.ts +8 -18
  193. package/src/wasm-mesher/tests/mesherWasmConversionCache.test.ts +2 -2
  194. package/src/wasm-mesher/tests/sectionRaycastAabb.test.ts +1 -93
  195. package/src/wasm-mesher/tests/shaderCubeInstances.test.ts +103 -141
  196. package/src/wasm-mesher/tests/splitColumnWasmOutput.test.ts +14 -22
  197. package/src/wasm-mesher/tests/thirdPersonVoxelRaycast.test.ts +63 -0
  198. package/src/wasm-mesher/worker/mesherWasm.ts +150 -141
  199. package/src/wasm-mesher/worker/mesherWasmConversionCache.ts +2 -8
  200. package/src/wasm-mesher/worker/mesherWasmLightDirty.test.ts +1 -3
  201. package/src/wasm-mesher/worker/mesherWasmLightDirty.ts +1 -5
  202. package/src/wasm-mesher/worker/mesherWasmRequestTracker.ts +42 -42
  203. package/src/worldView/worldView.spiral.test.ts +1 -1
  204. package/src/worldView/worldView.ts +34 -39
  205. package/src/worldView/worldViewWorkerBridge.test.ts +4 -4
@@ -9,7 +9,7 @@ export function createWorkerProxy<T extends Record<string, (...args: any[]) => v
9
9
  if (handlers[type]) {
10
10
  const result = handlers[type](...args)
11
11
  if (result instanceof Promise) {
12
- void result.then((result) => {
12
+ void result.then(result => {
13
13
  target.postMessage({
14
14
  type: 'result',
15
15
  msgId,
@@ -33,7 +33,10 @@ export function createWorkerProxy<T extends Record<string, (...args: any[]) => v
33
33
  * const workerChannel = useWorkerProxy<typeof importedTypeWorkerProxy>(worker)
34
34
  * ```
35
35
  */
36
- export const useWorkerProxy = <T extends { __workerProxy: Record<string, (...args: any[]) => void> }>(worker: Worker | MessagePort, autoTransfer = true): T['__workerProxy'] & {
36
+ export const useWorkerProxy = <T extends { __workerProxy: Record<string, (...args: any[]) => void> }>(
37
+ worker: Worker | MessagePort,
38
+ autoTransfer = true
39
+ ): T['__workerProxy'] & {
37
40
  transfer: (...args: Transferable[]) => T['__workerProxy']
38
41
  } => {
39
42
  let messageId = 0
@@ -42,31 +45,45 @@ export const useWorkerProxy = <T extends { __workerProxy: Record<string, (...arg
42
45
  get(target, prop) {
43
46
  if (prop === 'transfer') {
44
47
  return (...transferable: Transferable[]) => {
45
- return new Proxy({}, {
46
- get(target, prop) {
47
- return (...args: any[]) => {
48
- worker.postMessage({
49
- type: prop,
50
- args,
51
- }, transferable)
48
+ return new Proxy(
49
+ {},
50
+ {
51
+ get(target, prop) {
52
+ return (...args: any[]) => {
53
+ worker.postMessage(
54
+ {
55
+ type: prop,
56
+ args
57
+ },
58
+ transferable
59
+ )
60
+ }
52
61
  }
53
62
  }
54
- })
63
+ )
55
64
  }
56
65
  }
57
66
  return (...args: any[]) => {
58
67
  const msgId = messageId++
59
- const transfer = autoTransfer ? args.filter(arg => {
60
- return arg instanceof ArrayBuffer || arg instanceof MessagePort
61
- || (typeof ImageBitmap !== 'undefined' && arg instanceof ImageBitmap)
62
- || (typeof OffscreenCanvas !== 'undefined' && arg instanceof OffscreenCanvas)
63
- || (typeof ImageData !== 'undefined' && arg instanceof ImageData)
64
- }) : []
65
- worker.postMessage({
66
- type: prop,
67
- msgId,
68
- args,
69
- }, transfer)
68
+ const transfer = autoTransfer
69
+ ? args.filter(arg => {
70
+ return (
71
+ arg instanceof ArrayBuffer ||
72
+ arg instanceof MessagePort ||
73
+ (typeof ImageBitmap !== 'undefined' && arg instanceof ImageBitmap) ||
74
+ (typeof OffscreenCanvas !== 'undefined' && arg instanceof OffscreenCanvas) ||
75
+ (typeof ImageData !== 'undefined' && arg instanceof ImageData)
76
+ )
77
+ })
78
+ : []
79
+ worker.postMessage(
80
+ {
81
+ type: prop,
82
+ msgId,
83
+ args
84
+ },
85
+ transfer
86
+ )
70
87
  return {
71
88
  // eslint-disable-next-line unicorn/no-thenable
72
89
  then(onfulfilled: (value: any) => void) {
@@ -91,9 +108,7 @@ const DEBUG_SYNC = false
91
108
 
92
109
  type SyncDirection = 'toWorker' | 'fromWorker'
93
110
 
94
- export type WireSyncOp =
95
- | { kind: 'set', path: (string | number | symbol)[], value: unknown }
96
- | { kind: 'delete', path: (string | number | symbol)[] }
111
+ export type WireSyncOp = { kind: 'set'; path: (string | number | symbol)[]; value: unknown } | { kind: 'delete'; path: (string | number | symbol)[] }
97
112
 
98
113
  type ValtioOp = readonly unknown[]
99
114
 
@@ -211,13 +226,7 @@ const wireOpsFromValtioOps = (ops: ValtioOp[], worker: Worker): WireSyncOp[] =>
211
226
  return wire
212
227
  }
213
228
 
214
- export const sendWorkerSyncOps = (
215
- syncId: string,
216
- ops: ValtioOp[],
217
- worker: Worker,
218
- direction: SyncDirection,
219
- debugKey: string
220
- ) => {
229
+ export const sendWorkerSyncOps = (syncId: string, ops: ValtioOp[], worker: Worker, direction: SyncDirection, debugKey: string) => {
221
230
  if (ops.length === 0) return
222
231
  const wire = wireOpsFromValtioOps(ops, worker)
223
232
  if (wire.length === 0) return
@@ -235,12 +244,7 @@ export const sendWorkerSyncOps = (
235
244
  }
236
245
  }
237
246
 
238
- export const applySyncOps = (
239
- target: any,
240
- wireOps: WireSyncOp[],
241
- worker: Worker,
242
- countReceive: 'fromWorker' | false = false
243
- ) => {
247
+ export const applySyncOps = (target: any, wireOps: WireSyncOp[], worker: Worker, countReceive: 'fromWorker' | false = false) => {
244
248
  for (const op of wireOps) {
245
249
  if (op.kind === 'delete') {
246
250
  deleteByPath(target, op.path)
@@ -285,7 +289,7 @@ const setupObjectSync = (obj: any, originalObj: any, worker: Worker, isValtio: b
285
289
 
286
290
  if (syncToWorker || isValtio) {
287
291
  if (isValtio && syncToWorker !== false) {
288
- subscribe(originalObj, (ops) => {
292
+ subscribe(originalObj, ops => {
289
293
  sendWorkerSyncOps(syncId, ops as ValtioOp[], worker, 'toWorker', `toWorker:${debugKey}`)
290
294
  })
291
295
  }
@@ -344,7 +348,14 @@ export const deepPrepareForTransfer = (obj: any, worker: Worker, autoRemoveMetho
344
348
  }
345
349
 
346
350
  // print a warning for Date, RegExp, Map, Set, WeakMap, WeakSet
347
- if (obj[key] instanceof Date || obj[key] instanceof RegExp || obj[key] instanceof Map || obj[key] instanceof Set || obj[key] instanceof WeakMap || obj[key] instanceof WeakSet) {
351
+ if (
352
+ obj[key] instanceof Date ||
353
+ obj[key] instanceof RegExp ||
354
+ obj[key] instanceof Map ||
355
+ obj[key] instanceof Set ||
356
+ obj[key] instanceof WeakMap ||
357
+ obj[key] instanceof WeakSet
358
+ ) {
348
359
  console.warn(`Warning: ${key} is a ${typeof obj[key]}, which is not supported for transfer.`)
349
360
  }
350
361
 
@@ -395,7 +406,6 @@ export const deepPrepareForTransfer = (obj: any, worker: Worker, autoRemoveMetho
395
406
  }
396
407
  setupObjectSync(newObj[key], originalObj[key], worker, false, key)
397
408
 
398
-
399
409
  newObj[key] = deepPrepareForTransfer(newObj[key], worker, autoRemoveMethods, false, isValtio)
400
410
  }
401
411
  }
@@ -451,7 +461,7 @@ const receiveSyncedObject = (obj: any, worker: Worker, debugKey: string) => {
451
461
 
452
462
  if (obj['__syncFromWorker']) {
453
463
  if (obj['__valtio']) {
454
- subscribe(obj, (ops) => {
464
+ subscribe(obj, ops => {
455
465
  sendWorkerSyncOps(syncId, ops as ValtioOp[], worker, 'fromWorker', `fromWorker:${debugKey}`)
456
466
  })
457
467
  }
@@ -474,7 +484,7 @@ const defaultRestorers = [
474
484
  }
475
485
  ]
476
486
 
477
- export const addDefaultRestorer = (restorer: { restorerName: string, restoreTransferred: (obj: any, worker: Worker) => any }) => {
487
+ export const addDefaultRestorer = (restorer: { restorerName: string; restoreTransferred: (obj: any, worker: Worker) => any }) => {
478
488
  defaultRestorers.unshift(restorer)
479
489
  }
480
490
 
@@ -2,14 +2,7 @@
2
2
  import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'
3
3
  import { proxy, subscribe } from 'valtio'
4
4
  import { Vec3 } from 'vec3'
5
- import {
6
- applySyncOps,
7
- getWorkerSyncStatsForTest,
8
- resetWorkerSyncStatsForTest,
9
- sendWorkerSyncOps,
10
- setByPath,
11
- type WireSyncOp,
12
- } from './workerProxy'
5
+ import { applySyncOps, getWorkerSyncStatsForTest, resetWorkerSyncStatsForTest, sendWorkerSyncOps, setByPath, type WireSyncOp } from './workerProxy'
13
6
  import { defaultPerformanceInstabilityFactors } from '../performanceMonitor'
14
7
 
15
8
  const fakeWorker = () => {
@@ -23,22 +16,23 @@ const fakeWorker = () => {
23
16
  addEventListener: vi.fn((_type: string, listener: (event: { data: any }) => void) => {
24
17
  listeners.push(listener)
25
18
  }),
26
- removeEventListener: vi.fn(),
19
+ removeEventListener: vi.fn()
27
20
  } as unknown as Worker
28
21
  }
29
22
 
30
- const makeRendererState = () => proxy({
31
- world: {
32
- chunksLoaded: {} as Record<string, true>,
33
- heightmaps: {} as Record<string, Int16Array>,
34
- allChunksLoaded: false,
35
- mesherWork: false,
36
- instabilityFactors: defaultPerformanceInstabilityFactors(),
37
- intersectMedia: null as null | object,
38
- },
39
- renderer: '...',
40
- preventEscapeMenu: false,
41
- })
23
+ const makeRendererState = () =>
24
+ proxy({
25
+ world: {
26
+ chunksLoaded: {} as Record<string, true>,
27
+ heightmaps: {} as Record<string, Int16Array>,
28
+ allChunksLoaded: false,
29
+ mesherWork: false,
30
+ instabilityFactors: defaultPerformanceInstabilityFactors(),
31
+ intersectMedia: null as null | object
32
+ },
33
+ renderer: '...',
34
+ preventEscapeMenu: false
35
+ })
42
36
 
43
37
  describe('workerSyncOps', () => {
44
38
  it('set op round-trips mesherWork', () => {
@@ -75,11 +69,17 @@ describe('workerSyncOps', () => {
75
69
  sender.world.heightmaps['0,0'] = source
76
70
  const receiver = makeRendererState()
77
71
  const buf = sender.world.heightmaps['0,0']!
78
- applySyncOps(receiver, [{
79
- kind: 'set',
80
- path: ['world', 'heightmaps', '0,0'],
81
- value: new Int16Array(buf),
82
- }], fakeWorker())
72
+ applySyncOps(
73
+ receiver,
74
+ [
75
+ {
76
+ kind: 'set',
77
+ path: ['world', 'heightmaps', '0,0'],
78
+ value: new Int16Array(buf)
79
+ }
80
+ ],
81
+ fakeWorker()
82
+ )
83
83
  expect([...receiver.world.heightmaps['0,0']!]).toEqual([1, 2, 3])
84
84
  expect(sender.world.heightmaps['0,0']![0]).toBe(1)
85
85
  })
@@ -87,11 +87,17 @@ describe('workerSyncOps', () => {
87
87
  it('Vec3 value survives via restorer', () => {
88
88
  const target = makeRendererState() as any
89
89
  const vec = new Vec3(1, 2, 3)
90
- applySyncOps(target, [{
91
- kind: 'set',
92
- path: ['world', 'intersectMedia'],
93
- value: { pos: { x: 1, y: 2, z: 3, __restorer: 'Vec3' } },
94
- }], fakeWorker())
90
+ applySyncOps(
91
+ target,
92
+ [
93
+ {
94
+ kind: 'set',
95
+ path: ['world', 'intersectMedia'],
96
+ value: { pos: { x: 1, y: 2, z: 3, __restorer: 'Vec3' } }
97
+ }
98
+ ],
99
+ fakeWorker()
100
+ )
95
101
  expect(target.world.intersectMedia.pos).toBeInstanceOf(Vec3)
96
102
  expect(target.world.intersectMedia.pos.x).toBe(1)
97
103
  })
@@ -105,8 +111,8 @@ describe('workerSyncOps', () => {
105
111
  messageCount++
106
112
  expect(data.ops.length).toBeGreaterThanOrEqual(2)
107
113
  })
108
- await new Promise<void>((resolve) => {
109
- subscribe(source, (ops) => {
114
+ await new Promise<void>(resolve => {
115
+ subscribe(source, ops => {
110
116
  sendWorkerSyncOps(syncId, ops, worker, 'toWorker', 'test')
111
117
  resolve()
112
118
  })
@@ -128,20 +134,31 @@ describe('workerSyncOps', () => {
128
134
 
129
135
  it('one postMessage increments toWorker by 1 regardless of op count', () => {
130
136
  const worker = fakeWorker()
131
- sendWorkerSyncOps('id', [
132
- ['set', ['world', 'mesherWork'], true, false],
133
- ['set', ['renderer'], 'x', '...'],
134
- ], worker, 'toWorker', 'test')
137
+ sendWorkerSyncOps(
138
+ 'id',
139
+ [
140
+ ['set', ['world', 'mesherWork'], true, false],
141
+ ['set', ['renderer'], 'x', '...']
142
+ ],
143
+ worker,
144
+ 'toWorker',
145
+ 'test'
146
+ )
135
147
  expect(worker.postMessage).toHaveBeenCalledTimes(1)
136
148
  expect(getWorkerSyncStatsForTest().toWorker).toBe(1)
137
149
  })
138
150
 
139
151
  it('applySyncOps with fromWorker counts one receive per message', () => {
140
152
  const target = makeRendererState()
141
- applySyncOps(target, [
142
- { kind: 'set', path: ['world', 'mesherWork'], value: true },
143
- { kind: 'set', path: ['renderer'], value: 'y' },
144
- ], fakeWorker(), 'fromWorker')
153
+ applySyncOps(
154
+ target,
155
+ [
156
+ { kind: 'set', path: ['world', 'mesherWork'], value: true },
157
+ { kind: 'set', path: ['renderer'], value: 'y' }
158
+ ],
159
+ fakeWorker(),
160
+ 'fromWorker'
161
+ )
145
162
  expect(getWorkerSyncStatsForTest().fromWorker).toBe(1)
146
163
  })
147
164
  })
@@ -15,13 +15,13 @@ vi.mock('./ui/newStats', () => ({
15
15
  updateStatText: vi.fn(),
16
16
  removeAllStats: vi.fn(),
17
17
  updatePanesVisibility: vi.fn(),
18
- MC_RENDERER_DEBUG_OVERLAY_CLASS: 'mc-renderer-debug-overlay',
18
+ MC_RENDERER_DEBUG_OVERLAY_CLASS: 'mc-renderer-debug-overlay'
19
19
  }))
20
20
 
21
21
  vi.mock('./utils/skins', () => ({
22
22
  setSkinsConfig: vi.fn(),
23
23
  steveTexture: {},
24
- stevePngUrl: '',
24
+ stevePngUrl: ''
25
25
  }))
26
26
 
27
27
  function ensurePromiseWithResolvers() {
@@ -60,10 +60,10 @@ function createRenderer(workerCount = 2, worldView?: DisplayWorldOptions['worldV
60
60
  allChunksLoaded: false,
61
61
  mesherWork: false,
62
62
  instabilityFactors: defaultPerformanceInstabilityFactors(),
63
- intersectMedia: null,
63
+ intersectMedia: null
64
64
  },
65
65
  renderer: '',
66
- preventEscapeMenu: false,
66
+ preventEscapeMenu: false
67
67
  })
68
68
 
69
69
  const displayOptions: DisplayWorldOptions = {
@@ -79,19 +79,19 @@ function createRenderer(workerCount = 2, worldView?: DisplayWorldOptions['worldV
79
79
  world: {
80
80
  chunksLoadedCount: 0,
81
81
  chunksTotalNumber: 0,
82
- chunksFullInfo: '',
82
+ chunksFullInfo: ''
83
83
  },
84
84
  renderer: {
85
- timeline: { live: [], frozen: [], lastSecond: [] },
86
- },
85
+ timeline: { live: [], frozen: [], lastSecond: [] }
86
+ }
87
87
  },
88
88
  resourcesManager: {
89
89
  currentResources: {
90
90
  mcData: { version: {} },
91
91
  blocksAtlasJson: {},
92
- blockstatesModels: {},
93
- },
94
- } as DisplayWorldOptions['resourcesManager'],
92
+ blockstatesModels: {}
93
+ }
94
+ } as DisplayWorldOptions['resourcesManager']
95
95
  }
96
96
 
97
97
  const initOptions: GraphicsInitOptions = {
@@ -100,15 +100,15 @@ function createRenderer(workerCount = 2, worldView?: DisplayWorldOptions['worldV
100
100
  callbacks: {
101
101
  displayCriticalError: vi.fn(),
102
102
  setRendererSpecificSettings: vi.fn(),
103
- fireCustomEvent: vi.fn(),
104
- },
103
+ fireCustomEvent: vi.fn()
104
+ }
105
105
  }
106
106
 
107
107
  const renderer = new TestWorldRenderer(displayOptions.resourcesManager, displayOptions, initOptions)
108
108
  renderer.active = true
109
109
  renderer.workers = Array.from({ length: workerCount }, () => ({
110
110
  postMessage: vi.fn(),
111
- terminate: vi.fn(),
111
+ terminate: vi.fn()
112
112
  }))
113
113
  renderer['syncMesherPoolSnapshot']()
114
114
  renderer.viewDistance = 8
@@ -121,12 +121,15 @@ describe('WorldRendererCommon.reconfigureMesherWorkers', () => {
121
121
  beforeEach(() => {
122
122
  ensurePromiseWithResolvers()
123
123
  vi.stubGlobal('location', { href: 'http://localhost/' })
124
- vi.stubGlobal('Worker', class MockWorker {
125
- postMessage = vi.fn()
126
- terminate = vi.fn()
127
- addEventListener = vi.fn()
128
- onmessage: ((event: MessageEvent) => void) | null = null
129
- })
124
+ vi.stubGlobal(
125
+ 'Worker',
126
+ class MockWorker {
127
+ postMessage = vi.fn()
128
+ terminate = vi.fn()
129
+ addEventListener = vi.fn()
130
+ onmessage: ((event: MessageEvent) => void) | null = null
131
+ }
132
+ )
130
133
  vi.spyOn(worldRendererModule, 'meshersSendMcData').mockImplementation(() => {})
131
134
  })
132
135
 
@@ -137,7 +140,7 @@ describe('WorldRendererCommon.reconfigureMesherWorkers', () => {
137
140
 
138
141
  test('recreates workers with new count and reloads chunks', async () => {
139
142
  const { renderer, reloadLoadedChunks } = createRenderer(3)
140
- const terminated = renderer.workers.map((worker) => worker.terminate)
143
+ const terminated = renderer.workers.map(worker => worker.terminate)
141
144
  renderer.worldRendererConfig.mesherWorkers = 1
142
145
 
143
146
  await renderer.reconfigureMesherWorkers()
@@ -151,7 +154,7 @@ describe('WorldRendererCommon.reconfigureMesherWorkers', () => {
151
154
 
152
155
  test('recreates workers when mesher pipeline changes', async () => {
153
156
  const { renderer, reloadLoadedChunks } = createRenderer(2)
154
- const terminated = renderer.workers.map((worker) => worker.terminate)
157
+ const terminated = renderer.workers.map(worker => worker.terminate)
155
158
  renderer.worldRendererConfig.wasmMesher = false
156
159
 
157
160
  await renderer.reconfigureMesherWorkers()
@@ -14,13 +14,13 @@ vi.mock('./ui/newStats', () => ({
14
14
  updateStatText: vi.fn(),
15
15
  removeAllStats: vi.fn(),
16
16
  updatePanesVisibility: vi.fn(),
17
- MC_RENDERER_DEBUG_OVERLAY_CLASS: 'mc-renderer-debug-overlay',
17
+ MC_RENDERER_DEBUG_OVERLAY_CLASS: 'mc-renderer-debug-overlay'
18
18
  }))
19
19
 
20
20
  vi.mock('./utils/skins', () => ({
21
21
  setSkinsConfig: vi.fn(),
22
22
  steveTexture: {},
23
- stevePngUrl: '',
23
+ stevePngUrl: ''
24
24
  }))
25
25
 
26
26
  function ensurePromiseWithResolvers() {
@@ -58,10 +58,10 @@ function createRenderer() {
58
58
  allChunksLoaded: false,
59
59
  mesherWork: false,
60
60
  instabilityFactors: defaultPerformanceInstabilityFactors(),
61
- intersectMedia: null,
61
+ intersectMedia: null
62
62
  },
63
63
  renderer: '',
64
- preventEscapeMenu: false,
64
+ preventEscapeMenu: false
65
65
  })
66
66
 
67
67
  const displayOptions = {
@@ -78,13 +78,13 @@ function createRenderer() {
78
78
  chunksLoaded: new Set<string>(),
79
79
  chunksLoadedCount: 0,
80
80
  chunksTotalNumber: 0,
81
- chunksFullInfo: '',
81
+ chunksFullInfo: ''
82
82
  },
83
83
  renderer: {
84
- timeline: { live: [], frozen: [], lastSecond: [] },
85
- },
84
+ timeline: { live: [], frozen: [], lastSecond: [] }
85
+ }
86
86
  },
87
- resourcesManager: {} as DisplayWorldOptions['resourcesManager'],
87
+ resourcesManager: {} as DisplayWorldOptions['resourcesManager']
88
88
  }
89
89
 
90
90
  const initOptions: GraphicsInitOptions = {
@@ -93,8 +93,8 @@ function createRenderer() {
93
93
  callbacks: {
94
94
  displayCriticalError: vi.fn(),
95
95
  setRendererSpecificSettings: vi.fn(),
96
- fireCustomEvent: vi.fn(),
97
- },
96
+ fireCustomEvent: vi.fn()
97
+ }
98
98
  }
99
99
 
100
100
  const renderer = new TestWorldRenderer(displayOptions.resourcesManager, displayOptions as DisplayWorldOptions, initOptions)
@@ -159,9 +159,7 @@ describe('WorldRendererCommon.removeColumn sectionsWaiting reconciliation', () =
159
159
  }).not.toThrow()
160
160
 
161
161
  expect(renderer.sectionsWaiting.has(sectionKey)).toBe(false)
162
- expect(debugSpy).toHaveBeenCalledWith(
163
- expect.stringContaining('sectionFinished for non-outstanding section'),
164
- )
162
+ expect(debugSpy).toHaveBeenCalledWith(expect.stringContaining('sectionFinished for non-outstanding section'))
165
163
 
166
164
  debugSpy.mockRestore()
167
165
  })