minecraft-renderer 0.1.78 → 0.1.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -25
- package/dist/mesher.js +36 -36
- package/dist/mesher.js.map +4 -4
- package/dist/mesherWasm.js +217 -217
- package/dist/minecraft-renderer.js +32 -32
- package/dist/minecraft-renderer.js.meta.json +1 -1
- package/dist/threeWorker.js +415 -415
- 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 +338 -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/cameraShake.ts +15 -6
- package/src/three/chunkMeshManager.ts +329 -301
- 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 +174 -99
- package/src/three/globalLegacyBuffer.ts +465 -136
- 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 +93 -0
- 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 +30 -18
- 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 +133 -25
- 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 +460 -58
- package/src/three/tests/legacyMultiDraw.test.ts +88 -0
- package/src/three/tests/pr3PerFrameCpuCuts.test.ts +370 -0
- package/src/three/tests/signTextureCache.test.ts +4 -4
- 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 +131 -133
- 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/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 +17 -4
- package/src/wasm-mesher/tests/shaderCubeInstances.test.ts +103 -141
- package/src/wasm-mesher/tests/splitColumnWasmOutput.test.ts +14 -22
- 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
|
@@ -27,8 +27,8 @@ class MainScene extends BasePlaygroundScene {
|
|
|
27
27
|
},
|
|
28
28
|
entityRotate: false,
|
|
29
29
|
camera: '',
|
|
30
|
-
playSound() {
|
|
31
|
-
blockIsomorphicRenderBundle() {
|
|
30
|
+
playSound() {},
|
|
31
|
+
blockIsomorphicRenderBundle() {},
|
|
32
32
|
modelVariant: 0
|
|
33
33
|
}
|
|
34
34
|
this.metadataGui = this.gui.add(this.params, 'metadata')
|
|
@@ -44,7 +44,7 @@ class MainScene extends BasePlaygroundScene {
|
|
|
44
44
|
options: this.mcData.entitiesArray.map(b => b.name).sort((a, b) => a.localeCompare(b))
|
|
45
45
|
},
|
|
46
46
|
camera: {
|
|
47
|
-
hide: true
|
|
47
|
+
hide: true
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
super.initGui()
|
|
@@ -73,7 +73,8 @@ class MainScene extends BasePlaygroundScene {
|
|
|
73
73
|
if (states) {
|
|
74
74
|
for (const state of states) {
|
|
75
75
|
let defaultValue: string | number | boolean
|
|
76
|
-
if (state.values) {
|
|
76
|
+
if (state.values) {
|
|
77
|
+
// int, enum
|
|
77
78
|
defaultValue = state.values[0] as string | number | boolean
|
|
78
79
|
} else {
|
|
79
80
|
switch (state.type) {
|
|
@@ -140,9 +141,16 @@ class MainScene extends BasePlaygroundScene {
|
|
|
140
141
|
this.worldRenderer?.entities.clear()
|
|
141
142
|
if (!this.params.entity) return
|
|
142
143
|
this.worldView!.emit('entity', {
|
|
143
|
-
id: 'id',
|
|
144
|
+
id: 'id',
|
|
145
|
+
name: this.params.entity,
|
|
146
|
+
pos: this.targetPos.offset(0.5, 1, 0.5),
|
|
147
|
+
width: 1,
|
|
148
|
+
height: 1,
|
|
149
|
+
username: localStorage.testUsername,
|
|
150
|
+
yaw: Math.PI,
|
|
151
|
+
pitch: 0
|
|
144
152
|
})
|
|
145
|
-
const enableSkeletonDebug =
|
|
153
|
+
const enableSkeletonDebug = obj => {
|
|
146
154
|
if (!obj) return
|
|
147
155
|
const { children, isSkeletonHelper } = obj
|
|
148
156
|
if (!Array.isArray(children)) return
|
|
@@ -222,11 +230,7 @@ class MainScene extends BasePlaygroundScene {
|
|
|
222
230
|
this.worldRenderer.realScene.background = null
|
|
223
231
|
|
|
224
232
|
const rad = THREE.MathUtils.degToRad(-120)
|
|
225
|
-
this.worldRenderer.directionalLight.position.set(
|
|
226
|
-
Math.cos(rad),
|
|
227
|
-
Math.sin(rad),
|
|
228
|
-
0.2
|
|
229
|
-
).normalize()
|
|
233
|
+
this.worldRenderer.directionalLight.position.set(Math.cos(rad), Math.sin(rad), 0.2).normalize()
|
|
230
234
|
this.worldRenderer.directionalLight.intensity = 1
|
|
231
235
|
|
|
232
236
|
const cameraPos = this.targetPos.offset(2, 2, 2)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { BasePlaygroundScene } from '../baseScene'
|
|
3
|
+
|
|
4
|
+
/** Manual check for issue #49: farmland field + cut copper stairs (1.18.2). */
|
|
5
|
+
export default class extends BasePlaygroundScene {
|
|
6
|
+
override version = '1.18.2'
|
|
7
|
+
enableCameraOrbitControl = true
|
|
8
|
+
|
|
9
|
+
override setupWorld() {
|
|
10
|
+
const ox = -8
|
|
11
|
+
const oz = -8
|
|
12
|
+
const yFarmland = 64
|
|
13
|
+
for (let z = 0; z < 16; z++) {
|
|
14
|
+
for (let x = 0; x < 16; x++) {
|
|
15
|
+
this.addWorldBlock(ox + x, yFarmland - 1, oz + z, 'dirt')
|
|
16
|
+
this.addWorldBlock(ox + x, yFarmland, oz + z, 'farmland')
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const stairY = 64
|
|
21
|
+
const stairProps = { facing: 'east', half: 'bottom', shape: 'straight', waterlogged: false } as const
|
|
22
|
+
for (let x = 0; x < 8; x++) {
|
|
23
|
+
this.addWorldBlock(20 + x, stairY, 0, 'cut_copper_stairs', stairProps)
|
|
24
|
+
this.addWorldBlock(20 + x, stairY, 1, 'cut_copper_stairs', stairProps)
|
|
25
|
+
}
|
|
26
|
+
for (let x = 0; x < 6; x++) {
|
|
27
|
+
this.addWorldBlock(20 + x, stairY, 4, 'cut_copper_stairs', stairProps)
|
|
28
|
+
this.addWorldBlock(20 + x, stairY + 1, 4, 'cut_copper_stairs', stairProps)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { BasePlaygroundScene } from '../baseScene'
|
|
3
3
|
|
|
4
4
|
export default class RailsCobwebScene extends BasePlaygroundScene {
|
|
5
|
-
setupWorld
|
|
5
|
+
setupWorld() {
|
|
6
6
|
this.addWorldBlock(0, 0, 0, 'cobweb')
|
|
7
7
|
this.addWorldBlock(0, -1, 0, 'cobweb')
|
|
8
8
|
this.addWorldBlock(1, -1, 0, 'cobweb')
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
import { BasePlaygroundScene } from '../baseScene'
|
|
3
3
|
|
|
4
4
|
export default class extends BasePlaygroundScene {
|
|
5
|
-
expectedNumberOfFaces = 30
|
|
6
5
|
enableCameraOrbitControl = false
|
|
7
6
|
|
|
8
|
-
setupWorld
|
|
7
|
+
setupWorld() {
|
|
9
8
|
this.addWorldBlock(0, 1, 0, 'stone_slab')
|
|
10
9
|
this.addWorldBlock(0, 0, 0, 'stone')
|
|
11
10
|
this.addWorldBlock(0, -1, 0, 'stone_slab', { type: 'top', waterlogged: false })
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { BasePlaygroundScene } from '../baseScene'
|
|
3
3
|
|
|
4
4
|
export default class extends BasePlaygroundScene {
|
|
5
|
-
setupWorld
|
|
5
|
+
setupWorld() {
|
|
6
6
|
this.addWorldBlock(0, 0, 0, 'water')
|
|
7
7
|
this.addWorldBlock(0, 1, 0, 'lime_stained_glass')
|
|
8
8
|
this.addWorldBlock(0, 0, -1, 'lime_stained_glass')
|
package/src/playground/shared.ts
CHANGED
|
@@ -51,7 +51,7 @@ export const getSyncWorld = (version: string): world.WorldSync => {
|
|
|
51
51
|
return world
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
function getAllMethods
|
|
54
|
+
function getAllMethods(obj) {
|
|
55
55
|
const methods = new Set()
|
|
56
56
|
let currentObj = obj
|
|
57
57
|
|
|
@@ -66,7 +66,7 @@ function getAllMethods (obj) {
|
|
|
66
66
|
return [...methods] as string[]
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
export const delayedIterator = async <T>
|
|
69
|
+
export const delayedIterator = async <T>(arr: T[], delay: number, exec: (item: T, index: number) => Promise<void>, chunkSize = 1) => {
|
|
70
70
|
// if delay is 0 then don't use setTimeout
|
|
71
71
|
for (let i = 0; i < arr.length; i += chunkSize) {
|
|
72
72
|
if (delay) {
|
|
@@ -27,9 +27,7 @@ type ItemDefinitionsStore = ReturnType<typeof getLoadedItemDefinitionsStore>
|
|
|
27
27
|
|
|
28
28
|
let workerItemDefinitionsStore: ItemDefinitionsStore | null = null
|
|
29
29
|
|
|
30
|
-
export function getItemsDefinitionsStoreForRender
|
|
31
|
-
resources: LoadedResourcesTransferrable
|
|
32
|
-
): ItemDefinitionsStore {
|
|
30
|
+
export function getItemsDefinitionsStoreForRender(resources: LoadedResourcesTransferrable): ItemDefinitionsStore {
|
|
33
31
|
if (!isWebWorker) {
|
|
34
32
|
ensureItemsDefinitionsStore(resources)
|
|
35
33
|
return resources.itemsDefinitionsStore
|
|
@@ -40,13 +38,11 @@ export function getItemsDefinitionsStoreForRender (
|
|
|
40
38
|
return workerItemDefinitionsStore
|
|
41
39
|
}
|
|
42
40
|
|
|
43
|
-
export function ensureItemsDefinitionsStore
|
|
41
|
+
export function ensureItemsDefinitionsStore(resources: LoadedResourcesTransferrable): void {
|
|
44
42
|
if (isWebWorker) return
|
|
45
43
|
const store = resources.itemsDefinitionsStore as { get?: unknown }
|
|
46
44
|
if (typeof store?.get === 'function') return
|
|
47
|
-
resources.itemsDefinitionsStore = getLoadedItemDefinitionsStore(
|
|
48
|
-
resources.sourceItemDefinitionsJson ?? itemDefinitionsJson
|
|
49
|
-
)
|
|
45
|
+
resources.itemsDefinitionsStore = getLoadedItemDefinitionsStore(resources.sourceItemDefinitionsJson ?? itemDefinitionsJson)
|
|
50
46
|
}
|
|
51
47
|
|
|
52
48
|
export class LoadedResourcesTransferrable {
|
|
@@ -66,11 +62,11 @@ export class LoadedResourcesTransferrable {
|
|
|
66
62
|
/** array where the index represents the custom model data value, and the element at that index is the model path to use */
|
|
67
63
|
customItemModelNames: Record<string, string[]> = {}
|
|
68
64
|
customTextures: {
|
|
69
|
-
items?: { tileSize: number | undefined
|
|
70
|
-
blocks?: { tileSize: number | undefined
|
|
71
|
-
armor?: { tileSize: number | undefined
|
|
65
|
+
items?: { tileSize: number | undefined; textures: Record<string, HTMLImageElement> }
|
|
66
|
+
blocks?: { tileSize: number | undefined; textures: Record<string, HTMLImageElement> }
|
|
67
|
+
armor?: { tileSize: number | undefined; textures: Record<string, HTMLImageElement> }
|
|
72
68
|
} = {}
|
|
73
|
-
guiAtlas: { json: any
|
|
69
|
+
guiAtlas: { json: any; image: ImageBitmap } | null = null
|
|
74
70
|
guiAtlasVersion = 0
|
|
75
71
|
|
|
76
72
|
itemsRenderer: ItemsRenderer | undefined
|
|
@@ -90,8 +86,7 @@ export class LoadedResourcesTransferrable {
|
|
|
90
86
|
ensureItemsDefinitionsStore(this)
|
|
91
87
|
}
|
|
92
88
|
if (this.version) {
|
|
93
|
-
const globalMc = (globalThis as { loadedData?: IndexedData
|
|
94
|
-
?? (globalThis as { mcData?: IndexedData }).mcData
|
|
89
|
+
const globalMc = (globalThis as { loadedData?: IndexedData; mcData?: IndexedData }).loadedData ?? (globalThis as { mcData?: IndexedData }).mcData
|
|
95
90
|
if (isWebWorker && globalMc?.entitiesByName) {
|
|
96
91
|
this.mcData = globalMc
|
|
97
92
|
} else {
|
|
@@ -112,8 +107,11 @@ export class LoadedResourcesTransferrable {
|
|
|
112
107
|
if (!Object.prototype.hasOwnProperty.call(this, key)) continue
|
|
113
108
|
if (typeof this[key] === 'function') continue
|
|
114
109
|
if (
|
|
115
|
-
key === 'itemsRenderer' ||
|
|
116
|
-
|
|
110
|
+
key === 'itemsRenderer' ||
|
|
111
|
+
key === 'worldBlockProvider' ||
|
|
112
|
+
key === 'mcData' ||
|
|
113
|
+
key === 'itemsDefinitionsStore' ||
|
|
114
|
+
key === 'sourceItemDefinitionsJson'
|
|
117
115
|
) {
|
|
118
116
|
continue
|
|
119
117
|
}
|
|
@@ -125,7 +123,6 @@ export class LoadedResourcesTransferrable {
|
|
|
125
123
|
delete cloned.sourceItemDefinitionsJson
|
|
126
124
|
return cloned as LoadedResourcesTransferrable
|
|
127
125
|
}
|
|
128
|
-
|
|
129
126
|
}
|
|
130
127
|
|
|
131
128
|
export interface ResourcesCurrentConfig {
|
|
@@ -151,7 +148,7 @@ const STABLE_MODELS_VERSION = '1.21.4'
|
|
|
151
148
|
export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<ResourceManagerEvents>) {
|
|
152
149
|
static restorerName = 'ResourcesManager'
|
|
153
150
|
|
|
154
|
-
rebuildWorkerRenderers
|
|
151
|
+
rebuildWorkerRenderers(resources: LoadedResourcesTransferrable): void {
|
|
155
152
|
if (!isWebWorker) return
|
|
156
153
|
if (!resources.version || !resources.blockstatesModels || !resources.blocksAtlasJson) return
|
|
157
154
|
|
|
@@ -163,17 +160,8 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
163
160
|
this.itemsAtlasParser = new AtlasParser(this.sourceItemsAtlases, '')
|
|
164
161
|
}
|
|
165
162
|
|
|
166
|
-
resources.itemsRenderer = new ItemsRenderer(
|
|
167
|
-
|
|
168
|
-
resources.blockstatesModels,
|
|
169
|
-
this.itemsAtlasParser,
|
|
170
|
-
this.blocksAtlasParser
|
|
171
|
-
)
|
|
172
|
-
resources.worldBlockProvider = worldBlockProvider(
|
|
173
|
-
resources.blockstatesModels,
|
|
174
|
-
this.blocksAtlasParser.atlas,
|
|
175
|
-
STABLE_MODELS_VERSION
|
|
176
|
-
)
|
|
163
|
+
resources.itemsRenderer = new ItemsRenderer(resources.version, resources.blockstatesModels, this.itemsAtlasParser, this.blocksAtlasParser)
|
|
164
|
+
resources.worldBlockProvider = worldBlockProvider(resources.blockstatesModels, this.blocksAtlasParser.atlas, STABLE_MODELS_VERSION)
|
|
177
165
|
}
|
|
178
166
|
|
|
179
167
|
static restoreTransferred(data: any, worker?: Worker) {
|
|
@@ -199,7 +187,7 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
199
187
|
return resourcesManager
|
|
200
188
|
}
|
|
201
189
|
|
|
202
|
-
enrichTransferSnapshot
|
|
190
|
+
enrichTransferSnapshot(transfer?: LoadedResourcesTransferrable): LoadedResourcesTransferrable | undefined {
|
|
203
191
|
if (!transfer) return transfer
|
|
204
192
|
if (this.itemsAtlasParser?.atlas?.latest) {
|
|
205
193
|
transfer.itemsAtlasJson = this.itemsAtlasParser.atlas.latest
|
|
@@ -220,24 +208,22 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
220
208
|
class: ResourcesManager.restorerName,
|
|
221
209
|
type: 'event',
|
|
222
210
|
eventName,
|
|
223
|
-
args: sanitizeWorkerEventArgs(args)
|
|
211
|
+
args: sanitizeWorkerEventArgs(args)
|
|
224
212
|
})
|
|
225
213
|
// todo handle assetsInventoryReady
|
|
226
214
|
if (eventName === 'assetsTexturesUpdated' || eventName === 'assetsInventoryReady') {
|
|
227
|
-
const currentResources = this.enrichTransferSnapshot(
|
|
228
|
-
this.currentResources?.prepareForTransfer(),
|
|
229
|
-
)
|
|
215
|
+
const currentResources = this.enrichTransferSnapshot(this.currentResources?.prepareForTransfer())
|
|
230
216
|
worker.postMessage({
|
|
231
217
|
class: ResourcesManager.restorerName,
|
|
232
218
|
type: 'newResources',
|
|
233
|
-
currentResources
|
|
219
|
+
currentResources
|
|
234
220
|
})
|
|
235
221
|
}
|
|
236
222
|
}) as any
|
|
237
223
|
}
|
|
238
224
|
return {
|
|
239
225
|
__restorer: ResourcesManager.restorerName,
|
|
240
|
-
currentResources: this.enrichTransferSnapshot(this.currentResources?.prepareForTransfer())
|
|
226
|
+
currentResources: this.enrichTransferSnapshot(this.currentResources?.prepareForTransfer())
|
|
241
227
|
}
|
|
242
228
|
}
|
|
243
229
|
|
|
@@ -296,28 +282,21 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
296
282
|
}
|
|
297
283
|
|
|
298
284
|
console.time('recreateAtlases')
|
|
299
|
-
await Promise.all([
|
|
300
|
-
this.recreateBlockAtlas(resources),
|
|
301
|
-
this.recreateItemsAtlas(resources)
|
|
302
|
-
])
|
|
285
|
+
await Promise.all([this.recreateBlockAtlas(resources), this.recreateItemsAtlas(resources)])
|
|
303
286
|
console.timeEnd('recreateAtlases')
|
|
304
287
|
|
|
305
288
|
if (abortController.signal.aborted) return
|
|
306
289
|
|
|
307
290
|
if (resources.version && resources.blockstatesModels && this.itemsAtlasParser && this.blocksAtlasParser) {
|
|
308
|
-
resources.itemsRenderer = new ItemsRenderer(
|
|
309
|
-
resources.version,
|
|
310
|
-
resources.blockstatesModels,
|
|
311
|
-
this.itemsAtlasParser,
|
|
312
|
-
this.blocksAtlasParser
|
|
313
|
-
)
|
|
291
|
+
resources.itemsRenderer = new ItemsRenderer(resources.version, resources.blockstatesModels, this.itemsAtlasParser, this.blocksAtlasParser)
|
|
314
292
|
}
|
|
315
293
|
|
|
316
294
|
if (abortController.signal.aborted) return
|
|
317
295
|
|
|
318
296
|
this.currentResources = resources
|
|
319
297
|
resources.allReady = true
|
|
320
|
-
if (!unstableSkipEvent) {
|
|
298
|
+
if (!unstableSkipEvent) {
|
|
299
|
+
// todo rework resourcepack optimization
|
|
321
300
|
this.emit('assetsTexturesUpdated')
|
|
322
301
|
}
|
|
323
302
|
|
|
@@ -348,7 +327,7 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
348
327
|
console.time('createBlocksAtlas')
|
|
349
328
|
const { atlas: blocksAtlas, canvas: blocksCanvas } = await blocksAssetsParser.makeNewAtlas(
|
|
350
329
|
resources.texturesVersion,
|
|
351
|
-
|
|
330
|
+
textureName => {
|
|
352
331
|
if (this.currentConfig!.includeOnlyBlocks && !this.currentConfig!.includeOnlyBlocks.includes(textureName)) return false
|
|
353
332
|
const texture = resources.customTextures.blocks?.textures[textureName]
|
|
354
333
|
return blockTexturesChanges[textureName] ?? texture
|
|
@@ -357,7 +336,7 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
357
336
|
undefined,
|
|
358
337
|
customBlockTextures,
|
|
359
338
|
{
|
|
360
|
-
needHorizontalIndexes: !!this.currentConfig!.includeOnlyBlocks
|
|
339
|
+
needHorizontalIndexes: !!this.currentConfig!.includeOnlyBlocks
|
|
361
340
|
}
|
|
362
341
|
)
|
|
363
342
|
console.timeEnd('createBlocksAtlas')
|
|
@@ -366,11 +345,7 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
366
345
|
resources.blocksAtlasImage = await createImageBitmap(blocksCanvas)
|
|
367
346
|
resources.blocksAtlasJson = this.blocksAtlasParser.atlas.latest
|
|
368
347
|
|
|
369
|
-
resources.worldBlockProvider = worldBlockProvider(
|
|
370
|
-
resources.blockstatesModels,
|
|
371
|
-
this.blocksAtlasParser.atlas,
|
|
372
|
-
STABLE_MODELS_VERSION
|
|
373
|
-
)
|
|
348
|
+
resources.worldBlockProvider = worldBlockProvider(resources.blockstatesModels, this.blocksAtlasParser.atlas, STABLE_MODELS_VERSION)
|
|
374
349
|
}
|
|
375
350
|
|
|
376
351
|
async recreateItemsAtlas(resources: LoadedResourcesTransferrable = this.currentResources!) {
|
|
@@ -378,7 +353,7 @@ export class ResourcesManager extends (EventEmitter as new () => TypedEmitter<Re
|
|
|
378
353
|
const customItemTextures = Object.keys(resources.customTextures.items?.textures ?? {})
|
|
379
354
|
const { atlas: itemsAtlas, canvas: itemsCanvas } = await itemsAssetsParser.makeNewAtlas(
|
|
380
355
|
resources.texturesVersion,
|
|
381
|
-
|
|
356
|
+
textureName => {
|
|
382
357
|
const texture = resources.customTextures.items?.textures[textureName]
|
|
383
358
|
if (!texture) return
|
|
384
359
|
return texture
|
|
@@ -4,14 +4,10 @@ import blocksAtlases from 'mc-assets/dist/blocksAtlases.json'
|
|
|
4
4
|
import itemsAtlases from 'mc-assets/dist/itemsAtlases.json'
|
|
5
5
|
import blockstatesModels from 'mc-assets/dist/blockStatesModels.json'
|
|
6
6
|
import { AtlasParser } from 'mc-assets/dist/atlasParser'
|
|
7
|
-
import {
|
|
8
|
-
getItemsDefinitionsStoreForRender,
|
|
9
|
-
LoadedResourcesTransferrable,
|
|
10
|
-
ResourcesManager,
|
|
11
|
-
} from './resourcesManager'
|
|
7
|
+
import { getItemsDefinitionsStoreForRender, LoadedResourcesTransferrable, ResourcesManager } from './resourcesManager'
|
|
12
8
|
|
|
13
9
|
vi.mock('../three/documentRenderer', () => ({
|
|
14
|
-
isWebWorker: true
|
|
10
|
+
isWebWorker: true
|
|
15
11
|
}))
|
|
16
12
|
|
|
17
13
|
describe('ResourcesManager.rebuildWorkerRenderers', () => {
|
|
@@ -24,7 +20,7 @@ describe('ResourcesManager.rebuildWorkerRenderers', () => {
|
|
|
24
20
|
blockstatesModels,
|
|
25
21
|
blocksAtlasJson: blocksAtlasParser.atlas.latest,
|
|
26
22
|
itemsAtlasJson: itemsAtlasParser.atlas.latest,
|
|
27
|
-
allReady: true
|
|
23
|
+
allReady: true
|
|
28
24
|
})
|
|
29
25
|
|
|
30
26
|
const manager = new ResourcesManager()
|
|
@@ -40,8 +36,8 @@ describe('ResourcesManager.rebuildWorkerRenderers', () => {
|
|
|
40
36
|
const resources = new LoadedResourcesTransferrable({
|
|
41
37
|
version: '1.21.4',
|
|
42
38
|
blockstatesModels,
|
|
43
|
-
blocksAtlasJson:
|
|
44
|
-
itemsDefinitionsStore: { data: { latest: {} }, inclusive: false }
|
|
39
|
+
blocksAtlasJson: new AtlasParser(blocksAtlases as any, '').atlas.latest,
|
|
40
|
+
itemsDefinitionsStore: { data: { latest: {} }, inclusive: false }
|
|
45
41
|
})
|
|
46
42
|
const store = getItemsDefinitionsStoreForRender(resources)
|
|
47
43
|
expect(typeof store.get).toBe('function')
|
|
@@ -51,7 +47,7 @@ describe('ResourcesManager.rebuildWorkerRenderers', () => {
|
|
|
51
47
|
const resources = new LoadedResourcesTransferrable({
|
|
52
48
|
version: '1.21.4',
|
|
53
49
|
blockstatesModels,
|
|
54
|
-
blocksAtlasJson:
|
|
50
|
+
blocksAtlasJson: new AtlasParser(blocksAtlases as any, '').atlas.latest
|
|
55
51
|
})
|
|
56
52
|
const manager = new ResourcesManager()
|
|
57
53
|
manager.rebuildWorkerRenderers(resources)
|
|
@@ -10,33 +10,79 @@ const VERSION = '1.16.5'
|
|
|
10
10
|
|
|
11
11
|
// Lazy-loaded data for each data type
|
|
12
12
|
const createLazyData = (version: string) => ({
|
|
13
|
-
get attributes() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
get
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
get
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
get
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
get
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
get
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
get
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
get
|
|
35
|
-
|
|
13
|
+
get attributes() {
|
|
14
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16/attributes.json')
|
|
15
|
+
},
|
|
16
|
+
get blocks() {
|
|
17
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/blocks.json')
|
|
18
|
+
},
|
|
19
|
+
get blockCollisionShapes() {
|
|
20
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.1/blockCollisionShapes.json')
|
|
21
|
+
},
|
|
22
|
+
get biomes() {
|
|
23
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/biomes.json')
|
|
24
|
+
},
|
|
25
|
+
get effects() {
|
|
26
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.1/effects.json')
|
|
27
|
+
},
|
|
28
|
+
get items() {
|
|
29
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/items.json')
|
|
30
|
+
},
|
|
31
|
+
get enchantments() {
|
|
32
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.4/enchantments.json')
|
|
33
|
+
},
|
|
34
|
+
get recipes() {
|
|
35
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/recipes.json')
|
|
36
|
+
},
|
|
37
|
+
get instruments() {
|
|
38
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.1/instruments.json')
|
|
39
|
+
},
|
|
40
|
+
get materials() {
|
|
41
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/materials.json')
|
|
42
|
+
},
|
|
43
|
+
get language() {
|
|
44
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.1/language.json')
|
|
45
|
+
},
|
|
46
|
+
get entities() {
|
|
47
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/entities.json')
|
|
48
|
+
},
|
|
49
|
+
get protocol() {
|
|
50
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/protocol.json')
|
|
51
|
+
},
|
|
52
|
+
get windows() {
|
|
53
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.1/windows.json')
|
|
54
|
+
},
|
|
55
|
+
get version() {
|
|
56
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.5/version.json')
|
|
57
|
+
},
|
|
58
|
+
get foods() {
|
|
59
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.1/foods.json')
|
|
60
|
+
},
|
|
61
|
+
get particles() {
|
|
62
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16/particles.json')
|
|
63
|
+
},
|
|
64
|
+
get blockLoot() {
|
|
65
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/blockLoot.json')
|
|
66
|
+
},
|
|
67
|
+
get entityLoot() {
|
|
68
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/entityLoot.json')
|
|
69
|
+
},
|
|
70
|
+
get loginPacket() {
|
|
71
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/loginPacket.json')
|
|
72
|
+
},
|
|
73
|
+
get tints() {
|
|
74
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16.2/tints.json')
|
|
75
|
+
},
|
|
76
|
+
get mapIcons() {
|
|
77
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16/mapIcons.json')
|
|
78
|
+
},
|
|
79
|
+
get sounds() {
|
|
80
|
+
return require('minecraft-data/minecraft-data/data/pc/1.16/sounds.json')
|
|
81
|
+
}
|
|
36
82
|
})
|
|
37
83
|
|
|
38
84
|
module.exports = {
|
|
39
85
|
pc: {
|
|
40
|
-
[VERSION]: createLazyData(VERSION)
|
|
86
|
+
[VERSION]: createLazyData(VERSION)
|
|
41
87
|
}
|
|
42
88
|
}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
<!
|
|
1
|
+
<!doctype html>
|
|
2
2
|
<html>
|
|
3
|
-
|
|
4
|
-
<head>
|
|
3
|
+
<head>
|
|
5
4
|
<meta charset="UTF-8" />
|
|
6
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no, viewport-fit=cover" />
|
|
7
6
|
<title>%VITE_NAME%</title>
|
|
8
7
|
<style>
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
8
|
+
@font-face {
|
|
9
|
+
font-family: mojangles;
|
|
10
|
+
src: url(../../../assets/mojangles.ttf);
|
|
11
|
+
}
|
|
13
12
|
</style>
|
|
14
|
-
</head>
|
|
13
|
+
</head>
|
|
15
14
|
|
|
16
|
-
<body>
|
|
17
|
-
<div id="root" style="font-family: mojangles
|
|
15
|
+
<body>
|
|
16
|
+
<div id="root" style="font-family: mojangles">test</div>
|
|
18
17
|
<script src="./playground.ts" type="module"></script>
|
|
19
|
-
</body>
|
|
20
|
-
|
|
18
|
+
</body>
|
|
21
19
|
</html>
|
|
@@ -2,25 +2,27 @@
|
|
|
2
2
|
import type { ChatMessage } from 'prismarine-chat'
|
|
3
3
|
import { createCanvas } from '../lib/utils'
|
|
4
4
|
|
|
5
|
-
type SignBlockEntity =
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
5
|
+
type SignBlockEntity =
|
|
6
|
+
| {
|
|
7
|
+
Color?: string
|
|
8
|
+
GlowingText?: 0 | 1
|
|
9
|
+
Text1?: string
|
|
10
|
+
Text2?: string
|
|
11
|
+
Text3?: string
|
|
12
|
+
Text4?: string
|
|
13
|
+
}
|
|
14
|
+
| {
|
|
15
|
+
// todo
|
|
16
|
+
is_waxed?: 0 | 1
|
|
17
|
+
front_text: {
|
|
18
|
+
color: string
|
|
19
|
+
messages: string[]
|
|
20
|
+
// todo
|
|
21
|
+
has_glowing_text?: 0 | 1
|
|
22
|
+
}
|
|
23
|
+
// todo
|
|
24
|
+
// back_text: {}
|
|
25
|
+
}
|
|
24
26
|
|
|
25
27
|
type JsonEncodedType = string | null | Record<string, any>
|
|
26
28
|
|
|
@@ -49,15 +51,17 @@ const LEGACY_COLORS = {
|
|
|
49
51
|
red: '#FF5555',
|
|
50
52
|
light_purple: '#FF55FF',
|
|
51
53
|
yellow: '#FFFF55',
|
|
52
|
-
white: '#FFFFFF'
|
|
54
|
+
white: '#FFFFFF'
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
export const renderSign = (
|
|
56
58
|
blockEntity: SignBlockEntity,
|
|
57
59
|
isHanging: boolean,
|
|
58
60
|
PrismarineChat: typeof ChatMessage,
|
|
59
|
-
ctxHook =
|
|
60
|
-
canvasCreator = (width, height): OffscreenCanvas => {
|
|
61
|
+
ctxHook = ctx => {},
|
|
62
|
+
canvasCreator = (width, height): OffscreenCanvas => {
|
|
63
|
+
return createCanvas(width, height)
|
|
64
|
+
}
|
|
61
65
|
) => {
|
|
62
66
|
// todo don't use texture rendering, investigate the font rendering when possible
|
|
63
67
|
// or increase factor when needed
|
|
@@ -68,14 +72,10 @@ export const renderSign = (
|
|
|
68
72
|
const heightScalar = heightOffset / 16
|
|
69
73
|
// todo the text should be clipped based on it's render width (needs investigate)
|
|
70
74
|
|
|
71
|
-
const texts =
|
|
72
|
-
blockEntity.Text1,
|
|
73
|
-
blockEntity.Text2,
|
|
74
|
-
blockEntity.Text3,
|
|
75
|
-
blockEntity.Text4
|
|
76
|
-
]
|
|
75
|
+
const texts =
|
|
76
|
+
'front_text' in blockEntity ? /* > 1.20 */ blockEntity.front_text.messages : [blockEntity.Text1, blockEntity.Text2, blockEntity.Text3, blockEntity.Text4]
|
|
77
77
|
|
|
78
|
-
if (!texts.some(
|
|
78
|
+
if (!texts.some(text => text !== 'null')) {
|
|
79
79
|
return undefined
|
|
80
80
|
}
|
|
81
81
|
|