minecraft-renderer 0.1.78 → 0.1.80

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 (200) hide show
  1. package/README.md +29 -25
  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 +32 -32
  6. package/dist/minecraft-renderer.js.meta.json +1 -1
  7. package/dist/threeWorker.js +415 -415
  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 +338 -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/cameraShake.ts +15 -6
  113. package/src/three/chunkMeshManager.ts +329 -301
  114. package/src/three/cinimaticScript.ts +26 -15
  115. package/src/three/cubeDrawSpans.ts +27 -37
  116. package/src/three/cubeMultiDraw.ts +9 -22
  117. package/src/three/documentRenderer.ts +15 -18
  118. package/src/three/entities.ts +175 -150
  119. package/src/three/entity/EntityMesh.ts +114 -108
  120. package/src/three/entity/animations.js +3 -3
  121. package/src/three/entity/armorModels.ts +15 -15
  122. package/src/three/entity/gltfAnimationUtils.ts +2 -5
  123. package/src/three/fireworks.ts +34 -32
  124. package/src/three/fireworksRenderer.ts +32 -29
  125. package/src/three/globalBlockBuffer.ts +174 -99
  126. package/src/three/globalLegacyBuffer.ts +465 -136
  127. package/src/three/graphicsBackendBase.ts +19 -25
  128. package/src/three/graphicsBackendOffThread.ts +12 -15
  129. package/src/three/hand.ts +21 -21
  130. package/src/three/handLegacy.ts +3 -13
  131. package/src/three/holdingBlock.ts +116 -79
  132. package/src/three/holdingBlockFactory.ts +1 -4
  133. package/src/three/holdingBlockItemIdentity.test.ts +25 -17
  134. package/src/three/holdingBlockItemIdentity.ts +9 -6
  135. package/src/three/holdingBlockLegacy.ts +113 -132
  136. package/src/three/itemMesh.ts +20 -29
  137. package/src/three/legacyMultiDraw.ts +93 -0
  138. package/src/three/legacySectionCull.ts +8 -14
  139. package/src/three/menuBackground/activeView.ts +1 -4
  140. package/src/three/menuBackground/assetUrl.ts +1 -1
  141. package/src/three/menuBackground/classic.ts +4 -12
  142. package/src/three/menuBackground/gpuPreference.ts +1 -3
  143. package/src/three/menuBackground/index.ts +2 -11
  144. package/src/three/menuBackground/renderer.ts +1 -5
  145. package/src/three/menuBackground/types.ts +1 -4
  146. package/src/three/menuBackground/v2.ts +196 -96
  147. package/src/three/menuBackground/v2Meta.ts +3 -3
  148. package/src/three/menuBackground/worldBlocks.ts +37 -35
  149. package/src/three/modules/blockBreakParticles.ts +59 -28
  150. package/src/three/modules/cameraBobbing.ts +3 -6
  151. package/src/three/modules/index.ts +1 -1
  152. package/src/three/modules/rain.ts +10 -23
  153. package/src/three/modules/sciFiWorldReveal.ts +11 -25
  154. package/src/three/modules/starfield.ts +7 -13
  155. package/src/three/renderSlot.ts +28 -16
  156. package/src/three/rendererModuleSystem.ts +1 -3
  157. package/src/three/sceneOrigin.ts +96 -33
  158. package/src/three/sectionRaycastAabb.ts +30 -18
  159. package/src/three/shaderCubeMesh.ts +6 -17
  160. package/src/three/shaders/cubeBlockShader.ts +85 -96
  161. package/src/three/shaders/legacyBlockShader.ts +21 -43
  162. package/src/three/shaders/textureIndexMapping.ts +89 -95
  163. package/src/three/shaders/tintPalette.ts +156 -170
  164. package/src/three/signTextureCache.ts +9 -12
  165. package/src/three/skyboxRenderer.ts +62 -70
  166. package/src/three/tests/chunkMeshManagerLegacy.test.ts +133 -25
  167. package/src/three/tests/cubeDrawSpans.test.ts +55 -25
  168. package/src/three/tests/globalBlockBuffer.test.ts +217 -0
  169. package/src/three/tests/globalLegacyBuffer.test.ts +460 -58
  170. package/src/three/tests/legacyMultiDraw.test.ts +88 -0
  171. package/src/three/tests/pr3PerFrameCpuCuts.test.ts +370 -0
  172. package/src/three/tests/signTextureCache.test.ts +4 -4
  173. package/src/three/threeJsMedia.ts +55 -72
  174. package/src/three/threeJsParticles.ts +32 -41
  175. package/src/three/threeJsSound.ts +3 -3
  176. package/src/three/threeJsUtils.ts +3 -3
  177. package/src/three/threeWorker.ts +2 -2
  178. package/src/three/waypointSprite.ts +55 -82
  179. package/src/three/waypoints.ts +20 -23
  180. package/src/three/world/cursorBlock.ts +25 -12
  181. package/src/three/world/vr.ts +11 -17
  182. package/src/three/worldGeometryExport.ts +15 -34
  183. package/src/three/worldRendererThree.ts +131 -133
  184. package/src/wasm-mesher/bridge/convertChunk.ts +3 -9
  185. package/src/wasm-mesher/bridge/render-from-wasm.ts +204 -229
  186. package/src/wasm-mesher/bridge/shaderCubeBridge.ts +26 -67
  187. package/src/wasm-mesher/tests/cullingRegression.test.ts +307 -0
  188. package/src/wasm-mesher/tests/heightmapParity.test.ts +8 -18
  189. package/src/wasm-mesher/tests/mesherWasmConversionCache.test.ts +2 -2
  190. package/src/wasm-mesher/tests/sectionRaycastAabb.test.ts +17 -4
  191. package/src/wasm-mesher/tests/shaderCubeInstances.test.ts +103 -141
  192. package/src/wasm-mesher/tests/splitColumnWasmOutput.test.ts +14 -22
  193. package/src/wasm-mesher/worker/mesherWasm.ts +150 -141
  194. package/src/wasm-mesher/worker/mesherWasmConversionCache.ts +2 -8
  195. package/src/wasm-mesher/worker/mesherWasmLightDirty.test.ts +1 -3
  196. package/src/wasm-mesher/worker/mesherWasmLightDirty.ts +1 -5
  197. package/src/wasm-mesher/worker/mesherWasmRequestTracker.ts +42 -42
  198. package/src/worldView/worldView.spiral.test.ts +1 -1
  199. package/src/worldView/worldView.ts +34 -39
  200. package/src/worldView/worldViewWorkerBridge.test.ts +4 -4
@@ -0,0 +1,217 @@
1
+ //@ts-nocheck
2
+ import { describe, expect, test } from 'vitest'
3
+ import * as THREE from 'three'
4
+ import { GlobalBlockBuffer } from '../globalBlockBuffer'
5
+ import { buildVisibleCubeSpans } from '../cubeDrawSpans'
6
+ import { createCubeBlockMaterial } from '../shaders/cubeBlockShader'
7
+ import { packWord3 } from '../../wasm-mesher/bridge/shaderCubeBridge'
8
+
9
+ type BufferInternals = {
10
+ pendingRanges: Array<{ start: number; end: number }>
11
+ }
12
+
13
+ function getInternals(buffer: GlobalBlockBuffer): BufferInternals {
14
+ return buffer as unknown as BufferInternals
15
+ }
16
+
17
+ function drainUploads(buffer: GlobalBlockBuffer): void {
18
+ while (getInternals(buffer).pendingRanges.length) buffer.uploadDirtyRange()
19
+ }
20
+
21
+ function makeSectionWords(faceW0: number[]): Uint32Array {
22
+ const words = new Uint32Array(faceW0.length * 4)
23
+ for (let i = 0; i < faceW0.length; i++) {
24
+ words[i * 4] = faceW0[i]!
25
+ words[i * 4 + 1] = 0
26
+ words[i * 4 + 2] = 0
27
+ words[i * 4 + 3] = packWord3(0, 0)
28
+ }
29
+ return words
30
+ }
31
+
32
+ function finishCurrentMove(buffer: GlobalBlockBuffer): void {
33
+ drainUploads(buffer)
34
+ buffer.compactStep()
35
+ }
36
+
37
+ test('GlobalBlockBuffer: new section gated until upload completes', () => {
38
+ const scene = new THREE.Scene()
39
+ const mat = createCubeBlockMaterial()
40
+ const buffer = new GlobalBlockBuffer(mat, scene)
41
+
42
+ buffer.addSection('a', makeSectionWords([1]), 1)
43
+ expect(buffer.getSectionDrawStart('a')).toBeUndefined()
44
+
45
+ drainUploads(buffer)
46
+ expect(buffer.getSectionDrawStart('a')).toBe(0)
47
+
48
+ buffer.dispose()
49
+ mat.dispose()
50
+ })
51
+
52
+ test('GlobalBlockBuffer: remesh double-buffers old geometry until upload', () => {
53
+ const scene = new THREE.Scene()
54
+ const mat = createCubeBlockMaterial()
55
+ const buffer = new GlobalBlockBuffer(mat, scene)
56
+
57
+ buffer.addSection('a', makeSectionWords([10]), 1)
58
+ drainUploads(buffer)
59
+ const oldStart = buffer.getSectionSlot('a')!.start
60
+
61
+ buffer.addSection('a', makeSectionWords([20]), 1)
62
+ expect(buffer.getSectionDrawStart('a')).toBe(oldStart)
63
+ expect(buffer.hasPendingReplace()).toBe(true)
64
+
65
+ const w0 = buffer.mesh.geometry.getAttribute('a_w0').array as Uint32Array
66
+ expect(w0[oldStart]).toBe(10)
67
+
68
+ const epochBefore = buffer.getUploadEpoch()
69
+ drainUploads(buffer)
70
+ buffer.compactStep()
71
+ expect(buffer.hasPendingReplace()).toBe(false)
72
+ expect(buffer.getUploadEpoch()).toBeGreaterThan(epochBefore)
73
+ finishCurrentMove(buffer)
74
+ expect(buffer.getSectionDrawStart('a')).toBe(buffer.getSectionSlot('a')!.start)
75
+ expect(w0[buffer.getSectionSlot('a')!.start]).toBe(20)
76
+
77
+ buffer.dispose()
78
+ mat.dispose()
79
+ })
80
+
81
+ test('GlobalBlockBuffer: remesh before previous upload completes keeps fully-uploaded fallback', () => {
82
+ const scene = new THREE.Scene()
83
+ const mat = createCubeBlockMaterial()
84
+ const buffer = new GlobalBlockBuffer(mat, scene)
85
+
86
+ buffer.addSection('a', makeSectionWords([10]), 1)
87
+ drainUploads(buffer)
88
+ buffer.compactStep()
89
+ const slotA = buffer.getSectionSlot('a')!.start
90
+
91
+ buffer.addSection('a', makeSectionWords([20]), 1)
92
+ expect(buffer.hasPendingReplace()).toBe(true)
93
+ expect(buffer.hasPendingUploads()).toBe(true)
94
+
95
+ buffer.addSection('a', makeSectionWords([30]), 1)
96
+
97
+ const drawStart = buffer.getSectionDrawStart('a')
98
+ const drawCount = buffer.getSectionDrawCount('a')!
99
+ expect(drawStart).toBe(slotA)
100
+ expect(buffer.isRangeFullyUploaded(drawStart!, drawStart! + drawCount - 1)).toBe(true)
101
+
102
+ const spans = buildVisibleCubeSpans(
103
+ [{ start: drawStart!, count: drawCount }],
104
+ buffer.getHighWatermark(),
105
+ false,
106
+ (start, end) => buffer.isRangeFullyUploaded(start, end),
107
+ buffer.getPendingDirtyRanges()
108
+ )
109
+ expect(spans.length).toBeGreaterThan(0)
110
+ expect(spans.some(s => s.start <= drawStart! && s.start + s.count > drawStart!)).toBe(true)
111
+
112
+ const w0 = buffer.mesh.geometry.getAttribute('a_w0').array as Uint32Array
113
+ expect(w0[slotA]).toBe(10)
114
+
115
+ drainUploads(buffer)
116
+ buffer.compactStep()
117
+ finishCurrentMove(buffer)
118
+ const slotC = buffer.getSectionSlot('a')!.start
119
+ expect(buffer.getSectionDrawStart('a')).toBe(slotC)
120
+ expect(w0[slotC]).toBe(30)
121
+
122
+ buffer.dispose()
123
+ mat.dispose()
124
+ })
125
+
126
+ test('GlobalBlockBuffer: remesh stays drawable when slot kept (updateSection flow)', () => {
127
+ const scene = new THREE.Scene()
128
+ const mat = createCubeBlockMaterial()
129
+ const buffer = new GlobalBlockBuffer(mat, scene)
130
+
131
+ buffer.addSection('a', makeSectionWords([10]), 1)
132
+ drainUploads(buffer)
133
+ expect(buffer.getSectionDrawStart('a')).toBe(0)
134
+
135
+ // updateSection forRemesh: do NOT removeSection before addSection
136
+ buffer.addSection('a', makeSectionWords([20]), 1)
137
+ expect(buffer.getSectionDrawStart('a')).toBeDefined()
138
+ expect(buffer.hasPendingReplace()).toBe(true)
139
+
140
+ drainUploads(buffer)
141
+ buffer.compactStep()
142
+ expect(buffer.hasPendingReplace()).toBe(false)
143
+ finishCurrentMove(buffer)
144
+ expect(buffer.getSectionDrawStart('a')).toBe(buffer.getSectionSlot('a')!.start)
145
+
146
+ buffer.dispose()
147
+ mat.dispose()
148
+ })
149
+
150
+ test('GlobalBlockBuffer: pre-remove before remesh leaves drawable hole until upload', () => {
151
+ const scene = new THREE.Scene()
152
+ const mat = createCubeBlockMaterial()
153
+ const buffer = new GlobalBlockBuffer(mat, scene)
154
+
155
+ buffer.addSection('a', makeSectionWords([10]), 1)
156
+ drainUploads(buffer)
157
+
158
+ buffer.removeSection('a')
159
+ buffer.addSection('a', makeSectionWords([20]), 1)
160
+ expect(buffer.getSectionDrawStart('a')).toBeUndefined()
161
+ expect(buffer.hasPendingReplace()).toBe(false)
162
+
163
+ drainUploads(buffer)
164
+ expect(buffer.getSectionDrawStart('a')).toBeDefined()
165
+
166
+ buffer.dispose()
167
+ mat.dispose()
168
+ })
169
+
170
+ test('GlobalBlockBuffer: canUseFullDrawShortcut false while uploads pending', () => {
171
+ const scene = new THREE.Scene()
172
+ const mat = createCubeBlockMaterial()
173
+ const buffer = new GlobalBlockBuffer(mat, scene)
174
+
175
+ buffer.addSection('a', makeSectionWords([1, 2, 3]), 3)
176
+ expect(buffer.canUseFullDrawShortcut()).toBe(false)
177
+
178
+ drainUploads(buffer)
179
+ expect(buffer.canUseFullDrawShortcut()).toBe(true)
180
+
181
+ buffer.dispose()
182
+ mat.dispose()
183
+ })
184
+
185
+ test('GlobalBlockBuffer: uploadEpoch increments on partial upload advance', () => {
186
+ const scene = new THREE.Scene()
187
+ const mat = createCubeBlockMaterial()
188
+ const buffer = new GlobalBlockBuffer(mat, scene)
189
+
190
+ const faceCount = 20_000
191
+ const words = new Uint32Array(faceCount * 4)
192
+ for (let i = 0; i < faceCount; i++) {
193
+ words[i * 4] = i + 1
194
+ }
195
+ buffer.addSection('a', words, faceCount)
196
+ const epoch0 = buffer.getUploadEpoch()
197
+ buffer.uploadDirtyRange()
198
+ expect(buffer.getUploadEpoch()).toBe(epoch0 + 1)
199
+ expect(buffer.hasPendingUploads()).toBe(true)
200
+
201
+ buffer.dispose()
202
+ mat.dispose()
203
+ })
204
+
205
+ test('GlobalBlockBuffer: uploadEpoch increments when dirty range drains', () => {
206
+ const scene = new THREE.Scene()
207
+ const mat = createCubeBlockMaterial()
208
+ const buffer = new GlobalBlockBuffer(mat, scene)
209
+
210
+ const epoch0 = buffer.getUploadEpoch()
211
+ buffer.addSection('a', makeSectionWords([1]), 1)
212
+ drainUploads(buffer)
213
+ expect(buffer.getUploadEpoch()).toBeGreaterThan(epoch0)
214
+
215
+ buffer.dispose()
216
+ mat.dispose()
217
+ })