minecraft-renderer 0.1.101 → 0.1.102
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/dist/mesherWasm.js +168 -168
- package/package.json +1 -1
- package/src/wasm-mesher/bridge/convertChunk.ts +20 -0
- package/src/wasm-mesher/runtime-build/wasm_mesher.d.ts +11 -11
- package/src/wasm-mesher/runtime-build/wasm_mesher_bg.wasm +0 -0
- package/src/wasm-mesher/runtime-build/wasm_mesher_bg.wasm.d.ts +11 -11
- package/src/wasm-mesher/tests/globalPaletteBits.test.ts +17 -0
- package/src/wasm-mesher/worker/mesherWasm.ts +9 -13
package/package.json
CHANGED
|
@@ -48,6 +48,26 @@ export const getBlockMeta = (version: string): BlockMeta => {
|
|
|
48
48
|
return meta
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
const ceilLog2 = (count: number) => (count <= 1 ? 0 : 32 - Math.clz32(count - 1))
|
|
52
|
+
|
|
53
|
+
const globalPaletteBitsCache = new Map<string, { blocks: number; biomes: number }>()
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Bits of the global block state and biome palettes, vanilla's
|
|
57
|
+
* `Strategy.globalPaletteBitsInMemory`: ceillog2 of the registry size.
|
|
58
|
+
* map_chunk stores direct (unpaletted) containers with them. The biome count
|
|
59
|
+
* is minecraft-data's vanilla registry; a server's own biomes can change it.
|
|
60
|
+
*/
|
|
61
|
+
export const getGlobalPaletteBits = (version: string) => {
|
|
62
|
+
const cached = globalPaletteBitsCache.get(version)
|
|
63
|
+
if (cached) return cached
|
|
64
|
+
const mcData = MinecraftData(version)
|
|
65
|
+
const blockStates = mcData.blocksArray.reduce((max, block) => Math.max(max, block.maxStateId ?? 0), 0) + 1
|
|
66
|
+
const bits = { blocks: ceilLog2(blockStates), biomes: ceilLog2(mcData.biomesArray.length) }
|
|
67
|
+
globalPaletteBitsCache.set(version, bits)
|
|
68
|
+
return bits
|
|
69
|
+
}
|
|
70
|
+
|
|
51
71
|
export interface ChunkConversionResult {
|
|
52
72
|
blockStates: Uint16Array
|
|
53
73
|
blockLight: Uint8Array
|
|
@@ -227,23 +227,23 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl
|
|
|
227
227
|
|
|
228
228
|
export interface InitOutput {
|
|
229
229
|
readonly memory: WebAssembly.Memory;
|
|
230
|
+
readonly computeWireframeEdges: (a: number, b: number, c: number, d: number) => [number, number];
|
|
231
|
+
readonly computeWireframeEdgesU16: (a: number, b: number, c: number, d: number) => [number, number];
|
|
232
|
+
readonly generateGeometryFromDump118: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number, i1: number, j1: number, k1: number) => any;
|
|
233
|
+
readonly generateGeometryFromMapChunkV18Plus: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number) => any;
|
|
234
|
+
readonly generateGeometryFromMapChunkV18PlusMulti: (a: any, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number) => any;
|
|
235
|
+
readonly generateGeometryFromParsedV16V17: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number) => any;
|
|
236
|
+
readonly generateGeometryFromParsedV16V17Multi: (a: any, b: number, c: number, d: number, e: number, f: number, g: any, h: number, i: any, j: any, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number) => any;
|
|
230
237
|
readonly generate_geometry: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number) => any;
|
|
231
238
|
readonly generate_geometry_multi: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number) => any;
|
|
232
239
|
readonly parseChunkDump118: (a: number, b: number, c: number, d: number, e: number) => any;
|
|
233
|
-
readonly unpackLightSection118: (a: number, b: number) => [number, number];
|
|
234
|
-
readonly parseChunkDump118NoMarshal: (a: number, b: number, c: number, d: number, e: number) => number;
|
|
235
|
-
readonly parseChunkDump118FullColumnAll: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number) => any;
|
|
236
|
-
readonly generateGeometryFromDump118: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number, i1: number, j1: number, k1: number) => any;
|
|
237
240
|
readonly parseChunkDump118FullColumn: (a: number, b: number, c: number, d: number, e: number) => any;
|
|
238
|
-
readonly
|
|
239
|
-
readonly
|
|
241
|
+
readonly parseChunkDump118FullColumnAll: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number) => any;
|
|
242
|
+
readonly parseChunkDump118NoMarshal: (a: number, b: number, c: number, d: number, e: number) => number;
|
|
240
243
|
readonly parseChunkSectionsV16V17: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => any;
|
|
241
|
-
readonly
|
|
242
|
-
readonly generateGeometryFromMapChunkV18PlusMulti: (a: any, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number) => any;
|
|
243
|
-
readonly generateGeometryFromParsedV16V17Multi: (a: any, b: number, c: number, d: number, e: number, f: number, g: any, h: number, i: any, j: any, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number) => any;
|
|
244
|
-
readonly computeWireframeEdges: (a: number, b: number, c: number, d: number) => [number, number];
|
|
245
|
-
readonly computeWireframeEdgesU16: (a: number, b: number, c: number, d: number) => [number, number];
|
|
244
|
+
readonly parseMapChunkV18Plus: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
|
|
246
245
|
readonly parseUpdateLightV17: (a: number, b: number, c: number) => any;
|
|
246
|
+
readonly unpackLightSection118: (a: number, b: number) => [number, number];
|
|
247
247
|
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
|
248
248
|
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
249
249
|
readonly __wbindgen_exn_store: (a: number) => void;
|
|
Binary file
|
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
/* tslint:disable */
|
|
3
3
|
/* eslint-disable */
|
|
4
4
|
export const memory: WebAssembly.Memory;
|
|
5
|
+
export const computeWireframeEdges: (a: number, b: number, c: number, d: number) => [number, number];
|
|
6
|
+
export const computeWireframeEdgesU16: (a: number, b: number, c: number, d: number) => [number, number];
|
|
7
|
+
export const generateGeometryFromDump118: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number, i1: number, j1: number, k1: number) => any;
|
|
8
|
+
export const generateGeometryFromMapChunkV18Plus: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number) => any;
|
|
9
|
+
export const generateGeometryFromMapChunkV18PlusMulti: (a: any, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number) => any;
|
|
10
|
+
export const generateGeometryFromParsedV16V17: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number) => any;
|
|
11
|
+
export const generateGeometryFromParsedV16V17Multi: (a: any, b: number, c: number, d: number, e: number, f: number, g: any, h: number, i: any, j: any, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number) => any;
|
|
5
12
|
export const generate_geometry: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number) => any;
|
|
6
13
|
export const generate_geometry_multi: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number) => any;
|
|
7
14
|
export const parseChunkDump118: (a: number, b: number, c: number, d: number, e: number) => any;
|
|
8
|
-
export const unpackLightSection118: (a: number, b: number) => [number, number];
|
|
9
|
-
export const parseChunkDump118NoMarshal: (a: number, b: number, c: number, d: number, e: number) => number;
|
|
10
|
-
export const parseChunkDump118FullColumnAll: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number) => any;
|
|
11
|
-
export const generateGeometryFromDump118: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number, i1: number, j1: number, k1: number) => any;
|
|
12
15
|
export const parseChunkDump118FullColumn: (a: number, b: number, c: number, d: number, e: number) => any;
|
|
13
|
-
export const
|
|
14
|
-
export const
|
|
16
|
+
export const parseChunkDump118FullColumnAll: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number) => any;
|
|
17
|
+
export const parseChunkDump118NoMarshal: (a: number, b: number, c: number, d: number, e: number) => number;
|
|
15
18
|
export const parseChunkSectionsV16V17: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => any;
|
|
16
|
-
export const
|
|
17
|
-
export const generateGeometryFromMapChunkV18PlusMulti: (a: any, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number) => any;
|
|
18
|
-
export const generateGeometryFromParsedV16V17Multi: (a: any, b: number, c: number, d: number, e: number, f: number, g: any, h: number, i: any, j: any, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number) => any;
|
|
19
|
-
export const computeWireframeEdges: (a: number, b: number, c: number, d: number) => [number, number];
|
|
20
|
-
export const computeWireframeEdgesU16: (a: number, b: number, c: number, d: number) => [number, number];
|
|
19
|
+
export const parseMapChunkV18Plus: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
|
|
21
20
|
export const parseUpdateLightV17: (a: number, b: number, c: number) => any;
|
|
21
|
+
export const unpackLightSection118: (a: number, b: number) => [number, number];
|
|
22
22
|
export const __wbindgen_malloc: (a: number, b: number) => number;
|
|
23
23
|
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
24
24
|
export const __wbindgen_exn_store: (a: number) => void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { describe, expect, test } from 'vitest'
|
|
3
|
+
import { getGlobalPaletteBits } from '../bridge/convertChunk'
|
|
4
|
+
|
|
5
|
+
describe('getGlobalPaletteBits', () => {
|
|
6
|
+
test('is ceillog2 of the block state and biome registry sizes', () => {
|
|
7
|
+
// 20342 states, 61 biomes
|
|
8
|
+
expect(getGlobalPaletteBits('1.18.2')).toEqual({ blocks: 15, biomes: 6 })
|
|
9
|
+
// 65 biomes need a seventh bit
|
|
10
|
+
expect(getGlobalPaletteBits('1.21.4')).toEqual({ blocks: 15, biomes: 7 })
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('needs no extra bit for a power-of-two registry', () => {
|
|
14
|
+
// 64 biomes fit in 6 bits (Mth.ceillog2(64) = 6)
|
|
15
|
+
expect(getGlobalPaletteBits('1.20.4').biomes).toBe(6)
|
|
16
|
+
})
|
|
17
|
+
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//@ts-nocheck
|
|
2
2
|
import { Vec3 } from 'vec3'
|
|
3
|
-
import { convertChunkToWasm, getBlockMeta, type ChunkConversionResult } from '../bridge/convertChunk'
|
|
3
|
+
import { convertChunkToWasm, getBlockMeta, getGlobalPaletteBits, type ChunkConversionResult } from '../bridge/convertChunk'
|
|
4
4
|
import { extractColumnHeightmap, splitColumnWasmOutputToSections } from '../bridge/render-from-wasm'
|
|
5
5
|
import { createGeometryIndexArray } from '../bridge/geometryIndices'
|
|
6
6
|
import { setBlockStatesData as setMesherData } from '../../mesher-shared/models'
|
|
@@ -402,13 +402,10 @@ const convertRawMapChunkToWasm = (raw: RawMapChunkEntry, version: string): Chunk
|
|
|
402
402
|
// 1.18 introduced the new chunk format; on earlier protocols the packet
|
|
403
403
|
// shape differs and our parser would throw. Fall back to the JS path.
|
|
404
404
|
if (raw.protocol < 757) return null
|
|
405
|
-
|
|
406
|
-
// in `wasm-mesher/src/parser_v18plus.rs` (see Stage 2 fixtures).
|
|
407
|
-
const MAX_BITS_PER_BLOCK = 8
|
|
408
|
-
const MAX_BITS_PER_BIOME = 3
|
|
405
|
+
const globalBits = getGlobalPaletteBits(version)
|
|
409
406
|
let parsed: any
|
|
410
407
|
try {
|
|
411
|
-
parsed = (wasm as any).parseMapChunkV18Plus(raw.rawPacket, raw.numSections,
|
|
408
|
+
parsed = (wasm as any).parseMapChunkV18Plus(raw.rawPacket, raw.numSections, globalBits.blocks, globalBits.biomes, raw.protocol)
|
|
412
409
|
} catch (err) {
|
|
413
410
|
console.warn('[WASM Mesher] parseMapChunkV18Plus failed, falling back:', err)
|
|
414
411
|
return null
|
|
@@ -541,9 +538,6 @@ const convertParsedV16ToWasm = (entry: ParsedV16Entry, lightEntry: UpdateLightV1
|
|
|
541
538
|
// Fused parse+mesh helpers (single WASM call, no typed arrays in JS heap)
|
|
542
539
|
// ---------------------------------------------------------------------------
|
|
543
540
|
|
|
544
|
-
const MAX_BITS_PER_BLOCK = 8
|
|
545
|
-
const MAX_BITS_PER_BIOME = 3
|
|
546
|
-
|
|
547
541
|
/// Fused single-column mesh for 1.18+ raw map_chunk.
|
|
548
542
|
/// Returns the GeometryOutput directly (or null on failure → fallback).
|
|
549
543
|
const meshColumnFromRawV18Plus = (
|
|
@@ -557,12 +551,13 @@ const meshColumnFromRawV18Plus = (
|
|
|
557
551
|
if (!wasm || !(wasm as any).generateGeometryFromMapChunkV18Plus) return null
|
|
558
552
|
if (raw.protocol < 757) return null
|
|
559
553
|
const columnHeight = worldMaxY - worldMinY
|
|
554
|
+
const globalBits = getGlobalPaletteBits(version)
|
|
560
555
|
try {
|
|
561
556
|
return (wasm as any).generateGeometryFromMapChunkV18Plus(
|
|
562
557
|
raw.rawPacket,
|
|
563
558
|
raw.numSections,
|
|
564
|
-
|
|
565
|
-
|
|
559
|
+
globalBits.blocks,
|
|
560
|
+
globalBits.biomes,
|
|
566
561
|
raw.protocol,
|
|
567
562
|
x,
|
|
568
563
|
worldMinY,
|
|
@@ -670,12 +665,13 @@ const meshMultiColumnsFromRawV18Plus = (
|
|
|
670
665
|
}
|
|
671
666
|
|
|
672
667
|
const columnHeight = worldMaxY - worldMinY
|
|
668
|
+
const globalBits = getGlobalPaletteBits(version)
|
|
673
669
|
try {
|
|
674
670
|
return (wasm as any).generateGeometryFromMapChunkV18PlusMulti(
|
|
675
671
|
rawPackets,
|
|
676
672
|
numSectionsList,
|
|
677
|
-
|
|
678
|
-
|
|
673
|
+
globalBits.blocks,
|
|
674
|
+
globalBits.biomes,
|
|
679
675
|
protocol,
|
|
680
676
|
chunkXs,
|
|
681
677
|
chunkZs,
|