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
@@ -4,20 +4,53 @@ import type { Object3D, Scene, Vector3 } from 'three'
4
4
  const IS_TRACKED_PROXY = Symbol('tracked-proxy')
5
5
 
6
6
  const MUTATING_METHODS = new Set([
7
- 'add', 'addScalar', 'addScaledVector', 'addVectors',
8
- 'sub', 'subScalar', 'subVectors',
9
- 'multiply', 'multiplyScalar', 'multiplyVectors',
10
- 'divide', 'divideScalar',
11
- 'applyEuler', 'applyAxisAngle', 'applyMatrix3', 'applyMatrix4', 'applyNormalMatrix', 'applyQuaternion',
12
- 'negate', 'floor', 'ceil', 'round', 'roundToZero',
13
- 'min', 'max', 'clamp', 'clampLength', 'clampScalar',
14
- 'project', 'unproject', 'reflect',
15
- 'lerp', 'lerpVectors',
16
- 'cross', 'crossVectors',
17
- 'setFromMatrixPosition', 'setFromMatrixColumn', 'setFromMatrix3Column',
18
- 'setFromEuler', 'setFromSpherical', 'setFromSphericalCoords', 'setFromCylindrical',
19
- 'fromArray', 'fromBufferAttribute',
20
- 'setComponent', 'randomDirection', 'random',
7
+ 'add',
8
+ 'addScalar',
9
+ 'addScaledVector',
10
+ 'addVectors',
11
+ 'sub',
12
+ 'subScalar',
13
+ 'subVectors',
14
+ 'multiply',
15
+ 'multiplyScalar',
16
+ 'multiplyVectors',
17
+ 'divide',
18
+ 'divideScalar',
19
+ 'applyEuler',
20
+ 'applyAxisAngle',
21
+ 'applyMatrix3',
22
+ 'applyMatrix4',
23
+ 'applyNormalMatrix',
24
+ 'applyQuaternion',
25
+ 'negate',
26
+ 'floor',
27
+ 'ceil',
28
+ 'round',
29
+ 'roundToZero',
30
+ 'min',
31
+ 'max',
32
+ 'clamp',
33
+ 'clampLength',
34
+ 'clampScalar',
35
+ 'project',
36
+ 'unproject',
37
+ 'reflect',
38
+ 'lerp',
39
+ 'lerpVectors',
40
+ 'cross',
41
+ 'crossVectors',
42
+ 'setFromMatrixPosition',
43
+ 'setFromMatrixColumn',
44
+ 'setFromMatrix3Column',
45
+ 'setFromEuler',
46
+ 'setFromSpherical',
47
+ 'setFromSphericalCoords',
48
+ 'setFromCylindrical',
49
+ 'fromArray',
50
+ 'fromBufferAttribute',
51
+ 'setComponent',
52
+ 'randomDirection',
53
+ 'random'
21
54
  ])
22
55
 
23
56
  interface TrackOptions {
@@ -41,9 +74,15 @@ export class SceneOrigin {
41
74
  this.scene = scene
42
75
  }
43
76
 
44
- get x(): number { return this._x }
45
- get y(): number { return this._y }
46
- get z(): number { return this._z }
77
+ get x(): number {
78
+ return this._x
79
+ }
80
+ get y(): number {
81
+ return this._y
82
+ }
83
+ get z(): number {
84
+ return this._z
85
+ }
47
86
 
48
87
  /** Update origin (called each frame with camera world position) */
49
88
  update(worldX: number, worldY: number, worldZ: number): void {
@@ -83,7 +122,9 @@ export class SceneOrigin {
83
122
  if (prop === IS_TRACKED_PROXY) return worldData
84
123
  if (prop === 'set') {
85
124
  return (x: number, y: number, z: number) => {
86
- worldData.x = x; worldData.y = y; worldData.z = z
125
+ worldData.x = x
126
+ worldData.y = y
127
+ worldData.z = z
87
128
  target.set(x - origin._x, y - origin._y, z - origin._z)
88
129
  if (opts?.updateMatrix) obj.updateMatrix()
89
130
  return receiver
@@ -95,7 +136,9 @@ export class SceneOrigin {
95
136
  const wx = srcWorld ? srcWorld.x : v.x
96
137
  const wy = srcWorld ? srcWorld.y : v.y
97
138
  const wz = srcWorld ? srcWorld.z : v.z
98
- worldData.x = wx; worldData.y = wy; worldData.z = wz
139
+ worldData.x = wx
140
+ worldData.y = wy
141
+ worldData.z = wz
99
142
  target.set(wx - origin._x, wy - origin._y, wz - origin._z)
100
143
  if (opts?.updateMatrix) obj.updateMatrix()
101
144
  return receiver
@@ -103,27 +146,32 @@ export class SceneOrigin {
103
146
  }
104
147
  if (prop === 'setX') {
105
148
  return (val: number) => {
106
- worldData.x = val; target.x = val - origin._x
149
+ worldData.x = val
150
+ target.x = val - origin._x
107
151
  if (opts?.updateMatrix) obj.updateMatrix()
108
152
  return receiver
109
153
  }
110
154
  }
111
155
  if (prop === 'setY') {
112
156
  return (val: number) => {
113
- worldData.y = val; target.y = val - origin._y
157
+ worldData.y = val
158
+ target.y = val - origin._y
114
159
  if (opts?.updateMatrix) obj.updateMatrix()
115
160
  return receiver
116
161
  }
117
162
  }
118
163
  if (prop === 'setZ') {
119
164
  return (val: number) => {
120
- worldData.z = val; target.z = val - origin._z
165
+ worldData.z = val
166
+ target.z = val - origin._z
121
167
  if (opts?.updateMatrix) obj.updateMatrix()
122
168
  return receiver
123
169
  }
124
170
  }
125
171
  if (typeof prop === 'string' && MUTATING_METHODS.has(prop)) {
126
- return () => { throw new Error(`Cannot call position.${prop}() on a tracked object. Use position.set(x, y, z) instead.`) }
172
+ return () => {
173
+ throw new Error(`Cannot call position.${prop}() on a tracked object. Use position.set(x, y, z) instead.`)
174
+ }
127
175
  }
128
176
  const value = (target as any)[prop]
129
177
  if (typeof value === 'function') return value.bind(target)
@@ -131,17 +179,20 @@ export class SceneOrigin {
131
179
  },
132
180
  set(target, prop, value) {
133
181
  if (prop === 'x') {
134
- worldData.x = value; target.x = value - origin._x
182
+ worldData.x = value
183
+ target.x = value - origin._x
135
184
  if (opts?.updateMatrix) obj.updateMatrix()
136
185
  return true
137
186
  }
138
187
  if (prop === 'y') {
139
- worldData.y = value; target.y = value - origin._y
188
+ worldData.y = value
189
+ target.y = value - origin._y
140
190
  if (opts?.updateMatrix) obj.updateMatrix()
141
191
  return true
142
192
  }
143
193
  if (prop === 'z') {
144
- worldData.z = value; target.z = value - origin._z
194
+ worldData.z = value
195
+ target.z = value - origin._z
145
196
  if (opts?.updateMatrix) obj.updateMatrix()
146
197
  return true
147
198
  }
@@ -179,7 +230,7 @@ export class SceneOrigin {
179
230
 
180
231
  /** Untrack an Object3D and all its descendants, then remove from the scene */
181
232
  removeAndUntrackAll(obj: Object3D): void {
182
- obj.traverse((child) => {
233
+ obj.traverse(child => {
183
234
  this.untrack(child)
184
235
  })
185
236
  obj.removeFromParent()
@@ -204,12 +255,24 @@ export class SceneOrigin {
204
255
  }
205
256
 
206
257
  /** Convert world coordinates → scene coordinates */
207
- toSceneX(worldX: number): number { return worldX - this._x }
208
- toSceneY(worldY: number): number { return worldY - this._y }
209
- toSceneZ(worldZ: number): number { return worldZ - this._z }
258
+ toSceneX(worldX: number): number {
259
+ return worldX - this._x
260
+ }
261
+ toSceneY(worldY: number): number {
262
+ return worldY - this._y
263
+ }
264
+ toSceneZ(worldZ: number): number {
265
+ return worldZ - this._z
266
+ }
210
267
 
211
268
  /** Convert scene coordinates → world coordinates */
212
- toWorldX(sceneX: number): number { return sceneX + this._x }
213
- toWorldY(sceneY: number): number { return sceneY + this._y }
214
- toWorldZ(sceneZ: number): number { return sceneZ + this._z }
269
+ toWorldX(sceneX: number): number {
270
+ return sceneX + this._x
271
+ }
272
+ toWorldY(sceneY: number): number {
273
+ return sceneY + this._y
274
+ }
275
+ toWorldZ(sceneZ: number): number {
276
+ return sceneZ + this._z
277
+ }
215
278
  }
@@ -25,12 +25,12 @@ export type ShaderSectionRaycastEntry = {
25
25
  * Tight world-space AABB covering occupied shader-cube blocks in a section.
26
26
  * `sectionCenter*` is geometryData.sx/sy/sz (section base + 8).
27
27
  */
28
- export function computeShaderSectionRaycastAabb (
28
+ export function computeShaderSectionRaycastAabb(
29
29
  words: Uint32Array,
30
30
  faceCount: number,
31
31
  sectionCenterX: number,
32
32
  sectionCenterY: number,
33
- sectionCenterZ: number,
33
+ sectionCenterZ: number
34
34
  ): ShaderSectionRaycastBox | undefined {
35
35
  if (faceCount <= 0) return undefined
36
36
 
@@ -77,11 +77,11 @@ export function computeShaderSectionRaycastAabb (
77
77
  maxZ,
78
78
  cx: (minX + maxX) * 0.5,
79
79
  cy: (minY + maxY) * 0.5,
80
- cz: (minZ + maxZ) * 0.5,
80
+ cz: (minZ + maxZ) * 0.5
81
81
  }
82
82
  }
83
83
 
84
- export function isPointInsideAabb (
84
+ export function isPointInsideAabb(
85
85
  ox: number,
86
86
  oy: number,
87
87
  oz: number,
@@ -90,38 +90,13 @@ export function isPointInsideAabb (
90
90
  minZ: number,
91
91
  maxX: number,
92
92
  maxY: number,
93
- maxZ: number,
93
+ maxZ: number
94
94
  ): boolean {
95
95
  return ox >= minX && ox <= maxX && oy >= minY && oy <= maxY && oz >= minZ && oz <= maxZ
96
96
  }
97
97
 
98
- /** True if a `far`-bounded ray from (ox,oy,oz) dir (dx,dy,dz) crosses or starts inside
99
- * the cube-section AABB centered at (cx,cy,cz) with the given half-extent. */
100
- export function sectionAabbIntersectsRay (
101
- cx: number,
102
- cy: number,
103
- cz: number,
104
- ox: number,
105
- oy: number,
106
- oz: number,
107
- dx: number,
108
- dy: number,
109
- dz: number,
110
- far: number,
111
- halfExtent: number,
112
- ): boolean {
113
- const minX = cx - halfExtent
114
- const minY = cy - halfExtent
115
- const minZ = cz - halfExtent
116
- const maxX = cx + halfExtent
117
- const maxY = cy + halfExtent
118
- const maxZ = cz + halfExtent
119
- if (isPointInsideAabb(ox, oy, oz, minX, minY, minZ, maxX, maxY, maxZ)) return true
120
- return raycastAabb(ox, oy, oz, dx, dy, dz, minX, minY, minZ, maxX, maxY, maxZ, far) !== undefined
121
- }
122
-
123
98
  /** Ray–AABB entry distance, or undefined. Ignores hits when origin is inside the box. */
124
- export function raycastAabb (
99
+ export function raycastAabb(
125
100
  ox: number,
126
101
  oy: number,
127
102
  oz: number,
@@ -134,7 +109,7 @@ export function raycastAabb (
134
109
  maxX: number,
135
110
  maxY: number,
136
111
  maxZ: number,
137
- maxDist: number,
112
+ maxDist: number
138
113
  ): number | undefined {
139
114
  if (isPointInsideAabb(ox, oy, oz, minX, minY, minZ, maxX, maxY, maxZ)) {
140
115
  return undefined
@@ -149,7 +124,11 @@ export function raycastAabb (
149
124
  const inv = 1 / dx
150
125
  let t1 = (minX - ox) * inv
151
126
  let t2 = (maxX - ox) * inv
152
- if (t1 > t2) { const tmp = t1; t1 = t2; t2 = tmp }
127
+ if (t1 > t2) {
128
+ const tmp = t1
129
+ t1 = t2
130
+ t2 = tmp
131
+ }
153
132
  tmin = Math.max(tmin, t1)
154
133
  tmax = Math.min(tmax, t2)
155
134
  if (tmin > tmax) return undefined
@@ -161,7 +140,11 @@ export function raycastAabb (
161
140
  const inv = 1 / dy
162
141
  let t1 = (minY - oy) * inv
163
142
  let t2 = (maxY - oy) * inv
164
- if (t1 > t2) { const tmp = t1; t1 = t2; t2 = tmp }
143
+ if (t1 > t2) {
144
+ const tmp = t1
145
+ t1 = t2
146
+ t2 = tmp
147
+ }
165
148
  tmin = Math.max(tmin, t1)
166
149
  tmax = Math.min(tmax, t2)
167
150
  if (tmin > tmax) return undefined
@@ -173,7 +156,11 @@ export function raycastAabb (
173
156
  const inv = 1 / dz
174
157
  let t1 = (minZ - oz) * inv
175
158
  let t2 = (maxZ - oz) * inv
176
- if (t1 > t2) { const tmp = t1; t1 = t2; t2 = tmp }
159
+ if (t1 > t2) {
160
+ const tmp = t1
161
+ t1 = t2
162
+ t2 = tmp
163
+ }
177
164
  tmin = Math.max(tmin, t1)
178
165
  tmax = Math.min(tmax, t2)
179
166
  if (tmin > tmax) return undefined
@@ -183,7 +170,7 @@ export function raycastAabb (
183
170
  }
184
171
 
185
172
  /** Ray origin inside AABB: distance to exit face along the ray. */
186
- export function raycastAabbFromInside (
173
+ export function raycastAabbFromInside(
187
174
  ox: number,
188
175
  oy: number,
189
176
  oz: number,
@@ -196,7 +183,7 @@ export function raycastAabbFromInside (
196
183
  maxX: number,
197
184
  maxY: number,
198
185
  maxZ: number,
199
- maxDist: number,
186
+ maxDist: number
200
187
  ): number | undefined {
201
188
  let tExit = maxDist
202
189
 
@@ -217,76 +204,3 @@ export function raycastAabbFromInside (
217
204
 
218
205
  return tExit <= maxDist ? tExit : undefined
219
206
  }
220
-
221
- /** Per-block raycast; `word0Stride` 1 = GlobalBlockBuffer SoA, 4 = deferred AoS. */
222
- export function raycastShaderBlocksAabb (
223
- w0Source: Uint32Array,
224
- start: number,
225
- faceCount: number,
226
- word0Stride: number,
227
- sectionCenterX: number,
228
- sectionCenterY: number,
229
- sectionCenterZ: number,
230
- ox: number,
231
- oy: number,
232
- oz: number,
233
- dx: number,
234
- dy: number,
235
- dz: number,
236
- maxDist: number,
237
- visitGen: Uint16Array,
238
- visitStamp: number,
239
- ): number | undefined {
240
- const baseX = sectionCenterX - 8
241
- const baseY = sectionCenterY - 8
242
- const baseZ = sectionCenterZ - 8
243
-
244
- let closest = maxDist
245
- let found = false
246
-
247
- for (let i = 0; i < faceCount; i++) {
248
- const w0 = w0Source[start + i * word0Stride]!
249
- const lx = w0 & ((1 << WORD0.LX_BITS) - 1)
250
- const ly = (w0 >> WORD0.LY_SHIFT) & ((1 << WORD0.LY_BITS) - 1)
251
- const lz = (w0 >> WORD0.LZ_SHIFT) & ((1 << WORD0.LZ_BITS) - 1)
252
- const visitIdx = lx + (ly << 4) + (lz << 8)
253
- if (visitGen[visitIdx] === visitStamp) continue
254
- visitGen[visitIdx] = visitStamp
255
-
256
- const minX = baseX + lx
257
- const minY = baseY + ly
258
- const minZ = baseZ + lz
259
- const maxX = minX + 1
260
- const maxY = minY + 1
261
- const maxZ = minZ + 1
262
-
263
- let t: number | undefined
264
- if (isPointInsideAabb(ox, oy, oz, minX, minY, minZ, maxX, maxY, maxZ)) {
265
- t = raycastAabbFromInside(ox, oy, oz, dx, dy, dz, minX, minY, minZ, maxX, maxY, maxZ, closest)
266
- } else {
267
- t = raycastAabb(ox, oy, oz, dx, dy, dz, minX, minY, minZ, maxX, maxY, maxZ, closest)
268
- }
269
- if (t !== undefined && t < closest) {
270
- closest = t
271
- found = true
272
- }
273
- }
274
-
275
- return found ? closest : undefined
276
- }
277
-
278
- /** 16³ section box centered at (cx, cy, cz) — tests / legacy helper. */
279
- export function raycastSectionAabb (
280
- ox: number,
281
- oy: number,
282
- oz: number,
283
- dx: number,
284
- dy: number,
285
- dz: number,
286
- cx: number,
287
- cy: number,
288
- cz: number,
289
- maxDist: number,
290
- ): number | undefined {
291
- return raycastAabb(ox, oy, oz, dx, dy, dz, cx - 8, cy - 8, cz - 8, cx + 8, cy + 8, cz + 8, maxDist)
292
- }
@@ -12,10 +12,7 @@ export type ShaderCubeInstanceData = {
12
12
  * Build InstancedBufferGeometry for full-cube shader faces.
13
13
  * One instance = one visible face; vertex shader uses gl_VertexID (6 verts/face).
14
14
  */
15
- export function buildShaderCubeGeometry(
16
- words: Uint32Array,
17
- faceCount: number,
18
- ): THREE.InstancedBufferGeometry {
15
+ export function buildShaderCubeGeometry(words: Uint32Array, faceCount: number): THREE.InstancedBufferGeometry {
19
16
  const geometry = new THREE.InstancedBufferGeometry()
20
17
 
21
18
  const positions = new Float32Array(VERTICES_PER_FACE * 3)
@@ -39,14 +36,8 @@ export function buildShaderCubeGeometry(
39
36
  geometry.setAttribute('a_w3', new THREE.InstancedBufferAttribute(w3, 1))
40
37
 
41
38
  geometry.instanceCount = faceCount
42
- geometry.boundingBox = new THREE.Box3(
43
- new THREE.Vector3(-8, -8, -8),
44
- new THREE.Vector3(8, 8, 8),
45
- )
46
- geometry.boundingSphere = new THREE.Sphere(
47
- new THREE.Vector3(0, 0, 0),
48
- Math.sqrt(3 * 8 ** 2),
49
- )
39
+ geometry.boundingBox = new THREE.Box3(new THREE.Vector3(-8, -8, -8), new THREE.Vector3(8, 8, 8))
40
+ geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(0, 0, 0), Math.sqrt(3 * 8 ** 2))
50
41
 
51
42
  return geometry
52
43
  }
@@ -58,9 +49,7 @@ const _raycastPoint = new THREE.Vector3()
58
49
  * CPU raycast uses section AABB (geometry.boundingBox), not GPU-generated faces.
59
50
  * Enough for third-person camera collision; block pick uses mineflayer, not mesh raycast.
60
51
  */
61
- export function attachShaderCubeRaycast(
62
- mesh: THREE.Mesh<THREE.BufferGeometry, THREE.Material>,
63
- ): void {
52
+ export function attachShaderCubeRaycast(mesh: THREE.Mesh<THREE.BufferGeometry, THREE.Material>): void {
64
53
  mesh.raycast = (raycaster, intersects) => {
65
54
  const { geometry } = mesh
66
55
  if (!geometry.boundingBox) return
@@ -70,14 +59,14 @@ export function attachShaderCubeRaycast(
70
59
  intersects.push({
71
60
  distance,
72
61
  point: _raycastPoint.clone(),
73
- object: mesh,
62
+ object: mesh
74
63
  })
75
64
  }
76
65
  }
77
66
 
78
67
  export function createShaderCubeMesh(
79
68
  data: ShaderCubeInstanceData,
80
- material: THREE.ShaderMaterial,
69
+ material: THREE.ShaderMaterial
81
70
  ): THREE.Mesh<THREE.InstancedBufferGeometry, THREE.ShaderMaterial> {
82
71
  const geometry = buildShaderCubeGeometry(data.words, data.count)
83
72
  const mesh = new THREE.Mesh(geometry, material)