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.
- package/README.md +66 -26
- package/dist/mesher.js +36 -36
- package/dist/mesher.js.map +4 -4
- package/dist/mesherWasm.js +217 -217
- package/dist/minecraft-renderer.js +66 -66
- package/dist/minecraft-renderer.js.meta.json +1 -1
- package/dist/threeWorker.js +450 -450
- package/package.json +5 -2
- package/src/bundler/bundlePrepare.ts +3 -8
- package/src/graphicsBackend/appViewer.ts +10 -7
- package/src/graphicsBackend/config.ts +1 -5
- package/src/graphicsBackend/playerState.ts +35 -34
- package/src/graphicsBackend/preloadWorkers.ts +43 -41
- package/src/graphicsBackend/rendererDefaultOptions.ts +68 -70
- package/src/graphicsBackend/rendererOptionsSync.ts +24 -50
- package/src/graphicsBackend/types.ts +2 -2
- package/src/index.ts +6 -27
- package/src/lib/DebugGui.ts +34 -31
- package/src/lib/animationController.ts +9 -9
- package/src/lib/bakeLegacyLight.ts +1 -6
- package/src/lib/bindAbortableListener.test.ts +32 -12
- package/src/lib/bindAbortableListener.ts +14 -6
- package/src/lib/blockEntityLightRegistry.ts +11 -20
- package/src/lib/blockEntityLighting.test.ts +1 -6
- package/src/lib/blockEntityLighting.ts +5 -5
- package/src/lib/buildSharedConfig.mjs +4 -4
- package/src/lib/buildWorkerMcDataIndexes.test.ts +4 -4
- package/src/lib/buildWorkerMcDataIndexes.ts +11 -19
- package/src/lib/cameraBobbing.ts +1 -1
- package/src/lib/canvas2DOverlay.example.ts +13 -33
- package/src/lib/canvas2DOverlay.quickstart.ts +24 -54
- package/src/lib/canvas2DOverlay.ts +28 -47
- package/src/lib/cleanupDecorator.ts +2 -2
- package/src/lib/createPlayerObject.test.ts +2 -7
- package/src/lib/createPlayerObject.ts +18 -25
- package/src/lib/frameTimingCollector.ts +2 -5
- package/src/lib/guiRenderer.ts +57 -42
- package/src/lib/items.ts +15 -9
- package/src/lib/mesherlogReader.ts +5 -6
- package/src/lib/simpleUtils.ts +5 -5
- package/src/lib/skyLight.ts +3 -3
- package/src/lib/smoothSwitcher.ts +11 -18
- package/src/lib/ui/newStats.ts +10 -12
- package/src/lib/utils/proxy.ts +7 -1
- package/src/lib/utils/skins.ts +4 -4
- package/src/lib/utils.ts +1 -1
- package/src/lib/workerMessageSanitize.ts +5 -12
- package/src/lib/workerProxy.ts +52 -42
- package/src/lib/workerSyncOps.test.ts +58 -41
- package/src/lib/worldrendererCommon.reconfigure.test.ts +24 -21
- package/src/lib/worldrendererCommon.removeColumn.test.ts +11 -13
- package/src/lib/worldrendererCommon.ts +349 -211
- package/src/mesher-legacy/mesher.ts +9 -4
- package/src/mesher-legacy/test/a.ts +1 -1
- package/src/mesher-legacy/test/mesherTester.ts +2 -2
- package/src/mesher-legacy/test/playground.ts +1 -1
- package/src/mesher-legacy/test/run/test-js.ts +1 -1
- package/src/mesher-legacy/test/snapshotUtils.ts +3 -8
- package/src/mesher-legacy/test/test-perf.ts +1 -1
- package/src/mesher-legacy/test/tests.test.ts +2 -2
- package/src/mesher-shared/blockEntityMetadata.test.ts +7 -5
- package/src/mesher-shared/blockEntityMetadata.ts +28 -19
- package/src/mesher-shared/blockPropertiesForMeshing.ts +2 -2
- package/src/mesher-shared/computeHeightmap.ts +2 -4
- package/src/mesher-shared/exportedGeometryTypes.ts +3 -3
- package/src/mesher-shared/faceOcclusion.ts +324 -0
- package/src/mesher-shared/models.ts +80 -131
- package/src/mesher-shared/modelsGeometryCommon.ts +30 -15
- package/src/mesher-shared/shared.ts +46 -46
- package/src/mesher-shared/standaloneRenderer.ts +40 -44
- package/src/mesher-shared/tests/faceOcclusion.test.ts +179 -0
- package/src/mesher-shared/tests/liquidQuadInvariant.test.ts +12 -8
- package/src/mesher-shared/vertexShading.ts +2 -11
- package/src/mesher-shared/world.ts +19 -19
- package/src/mesher-shared/worldLighting.test.ts +2 -2
- package/src/performanceMonitor/PerformanceMonitor.ts +4 -13
- package/src/performanceMonitor/formatPerformanceFactorsDebug.ts +2 -2
- package/src/performanceMonitor/index.ts +1 -5
- package/src/performanceMonitor/types.ts +1 -1
- package/src/playerState/playerState.ts +55 -50
- package/src/playerState/types.ts +2 -8
- package/src/playground/allEntitiesDebug.ts +19 -16
- package/src/playground/baseScene.ts +29 -32
- package/src/playground/mobileControls.tsx +133 -129
- package/src/playground/playground.html +76 -73
- package/src/playground/playground.ts +14 -1
- package/src/playground/playgroundUi.tsx +100 -74
- package/src/playground/reactUtils.ts +3 -7
- package/src/playground/scenes/entities.ts +10 -7
- package/src/playground/scenes/frequentUpdates.ts +5 -5
- package/src/playground/scenes/geometryExport.ts +6 -20
- package/src/playground/scenes/highPosEntityUpdates.ts +2 -10
- package/src/playground/scenes/index.ts +1 -1
- package/src/playground/scenes/lightingStarfield.ts +18 -12
- package/src/playground/scenes/main.ts +15 -11
- package/src/playground/scenes/partialBlockCulling.ts +31 -0
- package/src/playground/scenes/railsCobweb.ts +1 -1
- package/src/playground/scenes/rotationIssue.ts +1 -1
- package/src/playground/scenes/slabsOptimization.ts +1 -2
- package/src/playground/scenes/transparencyIssue.ts +1 -1
- package/src/playground/shared.ts +2 -2
- package/src/resourcesManager/resourcesManager.ts +29 -54
- package/src/resourcesManager/resourcesManager.worker.test.ts +6 -10
- package/src/shims/minecraftData.ts +70 -24
- package/src/sign-renderer/index.html +10 -12
- package/src/sign-renderer/index.ts +29 -29
- package/src/sign-renderer/playground.ts +22 -15
- package/src/sign-renderer/tests.test.ts +16 -13
- package/src/sign-renderer/vite.config.ts +2 -2
- package/src/three/appShared.ts +46 -25
- package/src/three/bannerRenderer.ts +33 -61
- package/src/three/cameraCollisionBlockCache.ts +156 -0
- package/src/three/cameraCollisionSolidity.ts +50 -0
- package/src/three/cameraShake.ts +15 -6
- package/src/three/chunkMeshManager.ts +223 -390
- package/src/three/cinimaticScript.ts +26 -15
- package/src/three/cubeDrawSpans.ts +27 -37
- package/src/three/cubeMultiDraw.ts +9 -22
- package/src/three/documentRenderer.ts +15 -18
- package/src/three/entities.ts +175 -150
- package/src/three/entity/EntityMesh.ts +114 -108
- package/src/three/entity/animations.js +3 -3
- package/src/three/entity/armorModels.ts +15 -15
- package/src/three/entity/gltfAnimationUtils.ts +2 -5
- package/src/three/fireworks.ts +34 -32
- package/src/three/fireworksRenderer.ts +32 -29
- package/src/three/globalBlockBuffer.ts +167 -100
- package/src/three/globalLegacyBuffer.ts +248 -264
- package/src/three/graphicsBackendBase.ts +19 -25
- package/src/three/graphicsBackendOffThread.ts +12 -15
- package/src/three/hand.ts +21 -21
- package/src/three/handLegacy.ts +3 -13
- package/src/three/holdingBlock.ts +116 -79
- package/src/three/holdingBlockFactory.ts +1 -4
- package/src/three/holdingBlockItemIdentity.test.ts +25 -17
- package/src/three/holdingBlockItemIdentity.ts +9 -6
- package/src/three/holdingBlockLegacy.ts +113 -132
- package/src/three/itemMesh.ts +20 -29
- package/src/three/legacyMultiDraw.ts +10 -16
- package/src/three/legacySectionCull.ts +8 -14
- package/src/three/menuBackground/activeView.ts +1 -4
- package/src/three/menuBackground/assetUrl.ts +1 -1
- package/src/three/menuBackground/classic.ts +4 -12
- package/src/three/menuBackground/gpuPreference.ts +1 -3
- package/src/three/menuBackground/index.ts +2 -11
- package/src/three/menuBackground/renderer.ts +1 -5
- package/src/three/menuBackground/types.ts +1 -4
- package/src/three/menuBackground/v2.ts +196 -96
- package/src/three/menuBackground/v2Meta.ts +3 -3
- package/src/three/menuBackground/worldBlocks.ts +37 -35
- package/src/three/modules/blockBreakParticles.ts +59 -28
- package/src/three/modules/cameraBobbing.ts +3 -6
- package/src/three/modules/index.ts +1 -1
- package/src/three/modules/rain.ts +10 -23
- package/src/three/modules/sciFiWorldReveal.ts +11 -25
- package/src/three/modules/starfield.ts +7 -13
- package/src/three/renderSlot.ts +28 -16
- package/src/three/rendererModuleSystem.ts +1 -3
- package/src/three/sceneOrigin.ts +96 -33
- package/src/three/sectionRaycastAabb.ts +24 -110
- package/src/three/shaderCubeMesh.ts +6 -17
- package/src/three/shaders/cubeBlockShader.ts +85 -96
- package/src/three/shaders/legacyBlockShader.ts +21 -43
- package/src/three/shaders/textureIndexMapping.ts +89 -95
- package/src/three/shaders/tintPalette.ts +156 -170
- package/src/three/signTextureCache.ts +9 -12
- package/src/three/skyboxRenderer.ts +62 -70
- package/src/three/tests/chunkMeshManagerLegacy.test.ts +34 -64
- package/src/three/tests/cubeDrawSpans.test.ts +55 -25
- package/src/three/tests/globalBlockBuffer.test.ts +217 -0
- package/src/three/tests/globalLegacyBuffer.test.ts +300 -41
- package/src/three/tests/legacyMultiDraw.test.ts +8 -29
- package/src/three/tests/pr3PerFrameCpuCuts.test.ts +106 -29
- package/src/three/tests/signTextureCache.test.ts +4 -4
- package/src/three/thirdPersonVoxelRaycast.ts +120 -0
- package/src/three/threeJsMedia.ts +55 -72
- package/src/three/threeJsParticles.ts +32 -41
- package/src/three/threeJsSound.ts +3 -3
- package/src/three/threeJsUtils.ts +3 -3
- package/src/three/threeWorker.ts +2 -2
- package/src/three/waypointSprite.ts +55 -82
- package/src/three/waypoints.ts +20 -23
- package/src/three/world/cursorBlock.ts +25 -12
- package/src/three/world/vr.ts +11 -17
- package/src/three/worldGeometryExport.ts +15 -34
- package/src/three/worldRendererThree.ts +144 -166
- package/src/wasm-mesher/bridge/convertChunk.ts +3 -9
- package/src/wasm-mesher/bridge/render-from-wasm.ts +204 -229
- package/src/wasm-mesher/bridge/shaderCubeBridge.ts +26 -67
- package/src/wasm-mesher/tests/cameraCollisionBlockCache.test.ts +82 -0
- package/src/wasm-mesher/tests/cullingRegression.test.ts +307 -0
- package/src/wasm-mesher/tests/heightmapParity.test.ts +8 -18
- package/src/wasm-mesher/tests/mesherWasmConversionCache.test.ts +2 -2
- package/src/wasm-mesher/tests/sectionRaycastAabb.test.ts +1 -93
- package/src/wasm-mesher/tests/shaderCubeInstances.test.ts +103 -141
- package/src/wasm-mesher/tests/splitColumnWasmOutput.test.ts +14 -22
- package/src/wasm-mesher/tests/thirdPersonVoxelRaycast.test.ts +63 -0
- package/src/wasm-mesher/worker/mesherWasm.ts +150 -141
- package/src/wasm-mesher/worker/mesherWasmConversionCache.ts +2 -8
- package/src/wasm-mesher/worker/mesherWasmLightDirty.test.ts +1 -3
- package/src/wasm-mesher/worker/mesherWasmLightDirty.ts +1 -5
- package/src/wasm-mesher/worker/mesherWasmRequestTracker.ts +42 -42
- package/src/worldView/worldView.spiral.test.ts +1 -1
- package/src/worldView/worldView.ts +34 -39
- package/src/worldView/worldViewWorkerBridge.test.ts +4 -4
package/src/lib/workerProxy.ts
CHANGED
|
@@ -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(
|
|
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> }>(
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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,
|
|
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 (
|
|
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,
|
|
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
|
|
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 = () =>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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>(
|
|
109
|
-
subscribe(source,
|
|
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(
|
|
132
|
-
|
|
133
|
-
[
|
|
134
|
-
|
|
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(
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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(
|
|
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(
|
|
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
|
})
|