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
|
@@ -3,196 +3,182 @@ import * as THREE from 'three'
|
|
|
3
3
|
|
|
4
4
|
// ---- Palette entry ----
|
|
5
5
|
export interface TintPaletteEntry {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
r: number // 0-1
|
|
7
|
+
g: number
|
|
8
|
+
b: number
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
// ---- Palette manager ----
|
|
12
12
|
export class TintPalette {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
13
|
+
private entries: TintPaletteEntry[] = [{ r: 1, g: 1, b: 1 }] // index 0 = white (no tint)
|
|
14
|
+
private colorToIndex: Map<number, number> = new Map() // packed color -> index
|
|
15
|
+
private categoryBiomeToIndex: Map<string, number> = new Map()
|
|
16
|
+
private texture: THREE.DataTexture | null = null
|
|
17
|
+
private ready = false
|
|
18
|
+
|
|
19
|
+
/** Pack [r,g,b] (0-1 floats) into a 24-bit integer for fast lookup */
|
|
20
|
+
private packColor(r: number, g: number, b: number): number {
|
|
21
|
+
const ri = Math.round(r * 255)
|
|
22
|
+
const gi = Math.round(g * 255)
|
|
23
|
+
const bi = Math.round(b * 255)
|
|
24
|
+
return (ri << 16) | (gi << 8) | bi
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Add a tint entry, returns its palette index (reuses duplicates) */
|
|
28
|
+
add(r: number, g: number, b: number, category: string, key: string): number {
|
|
29
|
+
const packed = this.packColor(r, g, b)
|
|
30
|
+
|
|
31
|
+
// Try categorical lookup first (faster and preserves semantic grouping)
|
|
32
|
+
const catKey = `${category}:${key}`
|
|
33
|
+
const existing = this.categoryBiomeToIndex.get(catKey)
|
|
34
|
+
if (existing !== undefined) return existing
|
|
35
|
+
|
|
36
|
+
// Deduplicate by exact color
|
|
37
|
+
const colorIdx = this.colorToIndex.get(packed)
|
|
38
|
+
if (colorIdx !== undefined) {
|
|
39
|
+
this.categoryBiomeToIndex.set(catKey, colorIdx)
|
|
40
|
+
return colorIdx
|
|
25
41
|
}
|
|
26
42
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
this.categoryBiomeToIndex.
|
|
47
|
-
|
|
43
|
+
const idx = this.entries.length
|
|
44
|
+
this.entries.push({ r, g, b })
|
|
45
|
+
this.colorToIndex.set(packed, idx)
|
|
46
|
+
this.categoryBiomeToIndex.set(catKey, idx)
|
|
47
|
+
return idx
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Look up tint index for a specific block face */
|
|
51
|
+
getTintIndex(faceTintIndex: number | undefined, blockName: string, blockProps: Record<string, any>, biome: string): number {
|
|
52
|
+
if (faceTintIndex === undefined) return 0 // white
|
|
53
|
+
|
|
54
|
+
if (faceTintIndex === 0) {
|
|
55
|
+
if (blockName === 'redstone_wire') {
|
|
56
|
+
return this.categoryBiomeToIndex.get(`redstone:${blockProps.power}`) ?? this.categoryBiomeToIndex.get('redstone:0') ?? 0
|
|
57
|
+
}
|
|
58
|
+
if (blockName === 'birch_leaves' || blockName === 'spruce_leaves' || blockName === 'lily_pad') {
|
|
59
|
+
return this.categoryBiomeToIndex.get(`constant:${blockName}`) ?? this.categoryBiomeToIndex.get('constant:default') ?? 0
|
|
60
|
+
}
|
|
61
|
+
if (blockName.includes('leaves') || blockName === 'vine') {
|
|
62
|
+
return this.categoryBiomeToIndex.get(`foliage:${biome}`) ?? this.categoryBiomeToIndex.get('foliage:plains') ?? 0
|
|
63
|
+
}
|
|
64
|
+
// Default: grass tint
|
|
65
|
+
return this.categoryBiomeToIndex.get(`grass:${biome}`) ?? this.categoryBiomeToIndex.get('grass:plains') ?? 0
|
|
48
66
|
}
|
|
49
67
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// Default: grass tint
|
|
74
|
-
return this.categoryBiomeToIndex.get(`grass:${biome}`) ?? this.categoryBiomeToIndex.get('grass:plains') ?? 0
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return 0 // unknown tint index -> white
|
|
68
|
+
return 0 // unknown tint index -> white
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Get the palette entry at a given index */
|
|
72
|
+
getEntry(index: number): TintPaletteEntry {
|
|
73
|
+
return this.entries[index] ?? this.entries[0]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Total number of palette entries */
|
|
77
|
+
get size(): number {
|
|
78
|
+
return this.entries.length
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Build RGBA Float32Array from palette entries (for DataTexture) */
|
|
82
|
+
private buildTextureData(): Float32Array {
|
|
83
|
+
// RGBA × 256 entries
|
|
84
|
+
const data = new Float32Array(256 * 4)
|
|
85
|
+
for (let i = 0; i < this.entries.length && i < 256; i++) {
|
|
86
|
+
const e = this.entries[i]
|
|
87
|
+
data[i * 4] = e.r
|
|
88
|
+
data[i * 4 + 1] = e.g
|
|
89
|
+
data[i * 4 + 2] = e.b
|
|
90
|
+
data[i * 4 + 3] = 1.0
|
|
78
91
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
92
|
+
return data
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Create or update the Three.js DataTexture */
|
|
96
|
+
createTexture(): THREE.DataTexture {
|
|
97
|
+
if (this.texture) {
|
|
98
|
+
this.texture.dispose()
|
|
99
|
+
this.texture = null
|
|
100
|
+
this.ready = false
|
|
83
101
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
102
|
+
const data = this.buildTextureData()
|
|
103
|
+
const texture = new THREE.DataTexture(data as any, 256, 1, THREE.RGBAFormat, THREE.FloatType) as THREE.DataTexture
|
|
104
|
+
texture.minFilter = THREE.NearestFilter
|
|
105
|
+
texture.magFilter = THREE.NearestFilter
|
|
106
|
+
texture.wrapS = THREE.ClampToEdgeWrapping
|
|
107
|
+
texture.wrapT = THREE.ClampToEdgeWrapping
|
|
108
|
+
texture.needsUpdate = true
|
|
109
|
+
this.texture = texture
|
|
110
|
+
this.ready = true
|
|
111
|
+
return texture
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
getTexture(): THREE.DataTexture | null {
|
|
115
|
+
return this.texture
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
isReady(): boolean {
|
|
119
|
+
return this.ready
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Precompute the full palette using tints data */
|
|
123
|
+
static fromTintsData(tintsData: Record<string, any>): TintPalette {
|
|
124
|
+
const palette = new TintPalette()
|
|
125
|
+
// Offsets to avoid collision with categorical keys — already handled by packColor dedup
|
|
126
|
+
|
|
127
|
+
function tintToGl(tint: number): [number, number, number] {
|
|
128
|
+
const r = ((tint >> 16) & 0xff) / 255
|
|
129
|
+
const g = ((tint >> 8) & 0xff) / 255
|
|
130
|
+
const b = (tint & 0xff) / 255
|
|
131
|
+
return [r, g, b]
|
|
88
132
|
}
|
|
89
133
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
data[i * 4 + 1] = e.g
|
|
98
|
-
data[i * 4 + 2] = e.b
|
|
99
|
-
data[i * 4 + 3] = 1.0
|
|
134
|
+
// --- grass tint (per biome) ---
|
|
135
|
+
if (tintsData.grass) {
|
|
136
|
+
const grassDefault = tintToGl(tintsData.grass.default)
|
|
137
|
+
for (const { keys, color } of tintsData.grass.data ?? []) {
|
|
138
|
+
const c = tintToGl(color as number)
|
|
139
|
+
for (const biome of keys as string[]) {
|
|
140
|
+
palette.add(c[0], c[1], c[2], 'grass', biome)
|
|
100
141
|
}
|
|
101
|
-
|
|
142
|
+
}
|
|
143
|
+
palette.add(grassDefault[0], grassDefault[1], grassDefault[2], 'grass', 'plains')
|
|
102
144
|
}
|
|
103
145
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
146
|
+
// --- foliage tint (per biome) ---
|
|
147
|
+
if (tintsData.foliage) {
|
|
148
|
+
const foliageDefault = tintToGl(tintsData.foliage.default)
|
|
149
|
+
for (const { keys, color } of tintsData.foliage.data ?? []) {
|
|
150
|
+
const c = tintToGl(color as number)
|
|
151
|
+
for (const biome of keys as string[]) {
|
|
152
|
+
palette.add(c[0], c[1], c[2], 'foliage', biome)
|
|
110
153
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
data as any,
|
|
114
|
-
256, 1,
|
|
115
|
-
THREE.RGBAFormat,
|
|
116
|
-
THREE.FloatType,
|
|
117
|
-
) as THREE.DataTexture
|
|
118
|
-
texture.minFilter = THREE.NearestFilter
|
|
119
|
-
texture.magFilter = THREE.NearestFilter
|
|
120
|
-
texture.wrapS = THREE.ClampToEdgeWrapping
|
|
121
|
-
texture.wrapT = THREE.ClampToEdgeWrapping
|
|
122
|
-
texture.needsUpdate = true
|
|
123
|
-
this.texture = texture
|
|
124
|
-
this.ready = true
|
|
125
|
-
return texture
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
getTexture(): THREE.DataTexture | null {
|
|
129
|
-
return this.texture
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
isReady(): boolean {
|
|
133
|
-
return this.ready
|
|
154
|
+
}
|
|
155
|
+
palette.add(foliageDefault[0], foliageDefault[1], foliageDefault[2], 'foliage', 'plains')
|
|
134
156
|
}
|
|
135
157
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const g = ((tint >> 8) & 0xff) / 255
|
|
144
|
-
const b = (tint & 0xff) / 255
|
|
145
|
-
return [r, g, b]
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// --- grass tint (per biome) ---
|
|
149
|
-
if (tintsData.grass) {
|
|
150
|
-
const grassDefault = tintToGl(tintsData.grass.default)
|
|
151
|
-
for (const { keys, color } of tintsData.grass.data ?? []) {
|
|
152
|
-
const c = tintToGl(color as number)
|
|
153
|
-
for (const biome of keys as string[]) {
|
|
154
|
-
palette.add(c[0], c[1], c[2], 'grass', biome)
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
palette.add(grassDefault[0], grassDefault[1], grassDefault[2], 'grass', 'plains')
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// --- foliage tint (per biome) ---
|
|
161
|
-
if (tintsData.foliage) {
|
|
162
|
-
const foliageDefault = tintToGl(tintsData.foliage.default)
|
|
163
|
-
for (const { keys, color } of tintsData.foliage.data ?? []) {
|
|
164
|
-
const c = tintToGl(color as number)
|
|
165
|
-
for (const biome of keys as string[]) {
|
|
166
|
-
palette.add(c[0], c[1], c[2], 'foliage', biome)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
palette.add(foliageDefault[0], foliageDefault[1], foliageDefault[2], 'foliage', 'plains')
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// --- redstone tint (per power level 0-15) ---
|
|
173
|
-
if (tintsData.redstone) {
|
|
174
|
-
const rsDefault = tintToGl(tintsData.redstone.default)
|
|
175
|
-
for (const { keys, color } of tintsData.redstone.data ?? []) {
|
|
176
|
-
const c = tintToGl(color as number)
|
|
177
|
-
for (const key of keys as string[]) {
|
|
178
|
-
palette.add(c[0], c[1], c[2], 'redstone', key)
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
palette.add(rsDefault[0], rsDefault[1], rsDefault[2], 'redstone', '0')
|
|
158
|
+
// --- redstone tint (per power level 0-15) ---
|
|
159
|
+
if (tintsData.redstone) {
|
|
160
|
+
const rsDefault = tintToGl(tintsData.redstone.default)
|
|
161
|
+
for (const { keys, color } of tintsData.redstone.data ?? []) {
|
|
162
|
+
const c = tintToGl(color as number)
|
|
163
|
+
for (const key of keys as string[]) {
|
|
164
|
+
palette.add(c[0], c[1], c[2], 'redstone', key)
|
|
182
165
|
}
|
|
166
|
+
}
|
|
167
|
+
palette.add(rsDefault[0], rsDefault[1], rsDefault[2], 'redstone', '0')
|
|
168
|
+
}
|
|
183
169
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
palette.add(constDefault[0], constDefault[1], constDefault[2], 'constant', 'default')
|
|
170
|
+
// --- constant tints (birch leaves, spruce leaves, lily pad) ---
|
|
171
|
+
if (tintsData.constant) {
|
|
172
|
+
const constDefault = tintToGl(tintsData.constant.default)
|
|
173
|
+
for (const { keys, color } of tintsData.constant.data ?? []) {
|
|
174
|
+
const c = tintToGl(color as number)
|
|
175
|
+
for (const key of keys as string[]) {
|
|
176
|
+
palette.add(c[0], c[1], c[2], 'constant', key)
|
|
194
177
|
}
|
|
195
|
-
|
|
196
|
-
|
|
178
|
+
}
|
|
179
|
+
palette.add(constDefault[0], constDefault[1], constDefault[2], 'constant', 'default')
|
|
197
180
|
}
|
|
181
|
+
|
|
182
|
+
return palette
|
|
183
|
+
}
|
|
198
184
|
}
|
|
@@ -4,17 +4,19 @@ import PrismarineChatLoader from 'prismarine-chat'
|
|
|
4
4
|
import { renderSign } from '../sign-renderer'
|
|
5
5
|
import type { WorldRendererThree } from './worldRendererThree'
|
|
6
6
|
|
|
7
|
-
const signTextureCache = new Map<string, { texture: THREE.Texture
|
|
7
|
+
const signTextureCache = new Map<string, { texture: THREE.Texture; refCount: number }>()
|
|
8
8
|
|
|
9
9
|
// Build the key ONLY from fields that change rendered pixels, so two signs
|
|
10
10
|
// with identical visible text share a texture even if other NBT differs.
|
|
11
|
-
function createSignCacheKey
|
|
11
|
+
function createSignCacheKey(blockEntity: any, isHanging: boolean, backSide: boolean): string {
|
|
12
12
|
let lines: string[]
|
|
13
13
|
let color: string
|
|
14
|
-
if (blockEntity && 'front_text' in blockEntity) {
|
|
14
|
+
if (blockEntity && 'front_text' in blockEntity) {
|
|
15
|
+
// 1.20+
|
|
15
16
|
lines = blockEntity.front_text?.messages ?? []
|
|
16
17
|
color = blockEntity.front_text?.color || 'black'
|
|
17
|
-
} else {
|
|
18
|
+
} else {
|
|
19
|
+
// legacy
|
|
18
20
|
lines = [blockEntity?.Text1, blockEntity?.Text2, blockEntity?.Text3, blockEntity?.Text4]
|
|
19
21
|
color = blockEntity?.Color || 'black'
|
|
20
22
|
}
|
|
@@ -22,12 +24,7 @@ function createSignCacheKey (blockEntity: any, isHanging: boolean, backSide: boo
|
|
|
22
24
|
return `${isHanging ? 1 : 0}|${backSide ? 1 : 0}|${color}|${lines.join('\0')}`
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
export function getSignTexture
|
|
26
|
-
worldRenderer: WorldRendererThree,
|
|
27
|
-
blockEntity: any,
|
|
28
|
-
isHanging: boolean,
|
|
29
|
-
backSide = false
|
|
30
|
-
): THREE.Texture | undefined {
|
|
27
|
+
export function getSignTexture(worldRenderer: WorldRendererThree, blockEntity: any, isHanging: boolean, backSide = false): THREE.Texture | undefined {
|
|
31
28
|
const cacheKey = createSignCacheKey(blockEntity, isHanging, backSide)
|
|
32
29
|
const cached = signTextureCache.get(cacheKey)
|
|
33
30
|
if (cached) {
|
|
@@ -45,7 +42,7 @@ export function getSignTexture (
|
|
|
45
42
|
return tex
|
|
46
43
|
}
|
|
47
44
|
|
|
48
|
-
export function releaseSignTexture
|
|
45
|
+
export function releaseSignTexture(texture: THREE.Texture): void {
|
|
49
46
|
for (const [key, cached] of signTextureCache.entries()) {
|
|
50
47
|
if (cached.texture === texture) {
|
|
51
48
|
cached.refCount--
|
|
@@ -58,7 +55,7 @@ export function releaseSignTexture (texture: THREE.Texture): void {
|
|
|
58
55
|
}
|
|
59
56
|
}
|
|
60
57
|
|
|
61
|
-
export function disposeAllSignTextures
|
|
58
|
+
export function disposeAllSignTextures(): void {
|
|
62
59
|
for (const [, cached] of signTextureCache) cached.texture.dispose()
|
|
63
60
|
signTextureCache.clear()
|
|
64
61
|
}
|