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/three/sceneOrigin.ts
CHANGED
|
@@ -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',
|
|
8
|
-
'
|
|
9
|
-
'
|
|
10
|
-
'
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
18
|
-
'
|
|
19
|
-
'
|
|
20
|
-
'
|
|
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 {
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 () => {
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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 {
|
|
208
|
-
|
|
209
|
-
|
|
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 {
|
|
213
|
-
|
|
214
|
-
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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
|
-
|
|
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)
|