minecraft-renderer 0.1.79 → 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.
Files changed (200) hide show
  1. package/README.md +29 -25
  2. package/dist/mesher.js +36 -36
  3. package/dist/mesher.js.map +4 -4
  4. package/dist/mesherWasm.js +217 -217
  5. package/dist/minecraft-renderer.js +27 -27
  6. package/dist/minecraft-renderer.js.meta.json +1 -1
  7. package/dist/threeWorker.js +133 -133
  8. package/package.json +5 -2
  9. package/src/bundler/bundlePrepare.ts +3 -8
  10. package/src/graphicsBackend/appViewer.ts +10 -7
  11. package/src/graphicsBackend/config.ts +1 -5
  12. package/src/graphicsBackend/playerState.ts +35 -34
  13. package/src/graphicsBackend/preloadWorkers.ts +43 -41
  14. package/src/graphicsBackend/rendererDefaultOptions.ts +68 -70
  15. package/src/graphicsBackend/rendererOptionsSync.ts +24 -50
  16. package/src/graphicsBackend/types.ts +2 -2
  17. package/src/index.ts +6 -27
  18. package/src/lib/DebugGui.ts +34 -31
  19. package/src/lib/animationController.ts +9 -9
  20. package/src/lib/bakeLegacyLight.ts +1 -6
  21. package/src/lib/bindAbortableListener.test.ts +32 -12
  22. package/src/lib/bindAbortableListener.ts +14 -6
  23. package/src/lib/blockEntityLightRegistry.ts +11 -20
  24. package/src/lib/blockEntityLighting.test.ts +1 -6
  25. package/src/lib/blockEntityLighting.ts +5 -5
  26. package/src/lib/buildSharedConfig.mjs +4 -4
  27. package/src/lib/buildWorkerMcDataIndexes.test.ts +4 -4
  28. package/src/lib/buildWorkerMcDataIndexes.ts +11 -19
  29. package/src/lib/cameraBobbing.ts +1 -1
  30. package/src/lib/canvas2DOverlay.example.ts +13 -33
  31. package/src/lib/canvas2DOverlay.quickstart.ts +24 -54
  32. package/src/lib/canvas2DOverlay.ts +28 -47
  33. package/src/lib/cleanupDecorator.ts +2 -2
  34. package/src/lib/createPlayerObject.test.ts +2 -7
  35. package/src/lib/createPlayerObject.ts +18 -25
  36. package/src/lib/frameTimingCollector.ts +2 -5
  37. package/src/lib/guiRenderer.ts +57 -42
  38. package/src/lib/items.ts +15 -9
  39. package/src/lib/mesherlogReader.ts +5 -6
  40. package/src/lib/simpleUtils.ts +5 -5
  41. package/src/lib/skyLight.ts +3 -3
  42. package/src/lib/smoothSwitcher.ts +11 -18
  43. package/src/lib/ui/newStats.ts +10 -12
  44. package/src/lib/utils/proxy.ts +7 -1
  45. package/src/lib/utils/skins.ts +4 -4
  46. package/src/lib/utils.ts +1 -1
  47. package/src/lib/workerMessageSanitize.ts +5 -12
  48. package/src/lib/workerProxy.ts +52 -42
  49. package/src/lib/workerSyncOps.test.ts +58 -41
  50. package/src/lib/worldrendererCommon.reconfigure.test.ts +24 -21
  51. package/src/lib/worldrendererCommon.removeColumn.test.ts +11 -13
  52. package/src/lib/worldrendererCommon.ts +338 -211
  53. package/src/mesher-legacy/mesher.ts +9 -4
  54. package/src/mesher-legacy/test/a.ts +1 -1
  55. package/src/mesher-legacy/test/mesherTester.ts +2 -2
  56. package/src/mesher-legacy/test/playground.ts +1 -1
  57. package/src/mesher-legacy/test/run/test-js.ts +1 -1
  58. package/src/mesher-legacy/test/snapshotUtils.ts +3 -8
  59. package/src/mesher-legacy/test/test-perf.ts +1 -1
  60. package/src/mesher-legacy/test/tests.test.ts +2 -2
  61. package/src/mesher-shared/blockEntityMetadata.test.ts +7 -5
  62. package/src/mesher-shared/blockEntityMetadata.ts +28 -19
  63. package/src/mesher-shared/blockPropertiesForMeshing.ts +2 -2
  64. package/src/mesher-shared/computeHeightmap.ts +2 -4
  65. package/src/mesher-shared/exportedGeometryTypes.ts +3 -3
  66. package/src/mesher-shared/faceOcclusion.ts +324 -0
  67. package/src/mesher-shared/models.ts +80 -131
  68. package/src/mesher-shared/modelsGeometryCommon.ts +30 -15
  69. package/src/mesher-shared/shared.ts +46 -46
  70. package/src/mesher-shared/standaloneRenderer.ts +40 -44
  71. package/src/mesher-shared/tests/faceOcclusion.test.ts +179 -0
  72. package/src/mesher-shared/tests/liquidQuadInvariant.test.ts +12 -8
  73. package/src/mesher-shared/vertexShading.ts +2 -11
  74. package/src/mesher-shared/world.ts +19 -19
  75. package/src/mesher-shared/worldLighting.test.ts +2 -2
  76. package/src/performanceMonitor/PerformanceMonitor.ts +4 -13
  77. package/src/performanceMonitor/formatPerformanceFactorsDebug.ts +2 -2
  78. package/src/performanceMonitor/index.ts +1 -5
  79. package/src/performanceMonitor/types.ts +1 -1
  80. package/src/playerState/playerState.ts +55 -50
  81. package/src/playerState/types.ts +2 -8
  82. package/src/playground/allEntitiesDebug.ts +19 -16
  83. package/src/playground/baseScene.ts +29 -32
  84. package/src/playground/mobileControls.tsx +133 -129
  85. package/src/playground/playground.html +76 -73
  86. package/src/playground/playground.ts +14 -1
  87. package/src/playground/playgroundUi.tsx +100 -74
  88. package/src/playground/reactUtils.ts +3 -7
  89. package/src/playground/scenes/entities.ts +10 -7
  90. package/src/playground/scenes/frequentUpdates.ts +5 -5
  91. package/src/playground/scenes/geometryExport.ts +6 -20
  92. package/src/playground/scenes/highPosEntityUpdates.ts +2 -10
  93. package/src/playground/scenes/index.ts +1 -1
  94. package/src/playground/scenes/lightingStarfield.ts +18 -12
  95. package/src/playground/scenes/main.ts +15 -11
  96. package/src/playground/scenes/partialBlockCulling.ts +31 -0
  97. package/src/playground/scenes/railsCobweb.ts +1 -1
  98. package/src/playground/scenes/rotationIssue.ts +1 -1
  99. package/src/playground/scenes/slabsOptimization.ts +1 -2
  100. package/src/playground/scenes/transparencyIssue.ts +1 -1
  101. package/src/playground/shared.ts +2 -2
  102. package/src/resourcesManager/resourcesManager.ts +29 -54
  103. package/src/resourcesManager/resourcesManager.worker.test.ts +6 -10
  104. package/src/shims/minecraftData.ts +70 -24
  105. package/src/sign-renderer/index.html +10 -12
  106. package/src/sign-renderer/index.ts +29 -29
  107. package/src/sign-renderer/playground.ts +22 -15
  108. package/src/sign-renderer/tests.test.ts +16 -13
  109. package/src/sign-renderer/vite.config.ts +2 -2
  110. package/src/three/appShared.ts +46 -25
  111. package/src/three/bannerRenderer.ts +33 -61
  112. package/src/three/cameraShake.ts +15 -6
  113. package/src/three/chunkMeshManager.ts +239 -282
  114. package/src/three/cinimaticScript.ts +26 -15
  115. package/src/three/cubeDrawSpans.ts +27 -37
  116. package/src/three/cubeMultiDraw.ts +9 -22
  117. package/src/three/documentRenderer.ts +15 -18
  118. package/src/three/entities.ts +175 -150
  119. package/src/three/entity/EntityMesh.ts +114 -108
  120. package/src/three/entity/animations.js +3 -3
  121. package/src/three/entity/armorModels.ts +15 -15
  122. package/src/three/entity/gltfAnimationUtils.ts +2 -5
  123. package/src/three/fireworks.ts +34 -32
  124. package/src/three/fireworksRenderer.ts +32 -29
  125. package/src/three/globalBlockBuffer.ts +167 -100
  126. package/src/three/globalLegacyBuffer.ts +257 -166
  127. package/src/three/graphicsBackendBase.ts +19 -25
  128. package/src/three/graphicsBackendOffThread.ts +12 -15
  129. package/src/three/hand.ts +21 -21
  130. package/src/three/handLegacy.ts +3 -13
  131. package/src/three/holdingBlock.ts +116 -79
  132. package/src/three/holdingBlockFactory.ts +1 -4
  133. package/src/three/holdingBlockItemIdentity.test.ts +25 -17
  134. package/src/three/holdingBlockItemIdentity.ts +9 -6
  135. package/src/three/holdingBlockLegacy.ts +113 -132
  136. package/src/three/itemMesh.ts +20 -29
  137. package/src/three/legacyMultiDraw.ts +10 -16
  138. package/src/three/legacySectionCull.ts +8 -14
  139. package/src/three/menuBackground/activeView.ts +1 -4
  140. package/src/three/menuBackground/assetUrl.ts +1 -1
  141. package/src/three/menuBackground/classic.ts +4 -12
  142. package/src/three/menuBackground/gpuPreference.ts +1 -3
  143. package/src/three/menuBackground/index.ts +2 -11
  144. package/src/three/menuBackground/renderer.ts +1 -5
  145. package/src/three/menuBackground/types.ts +1 -4
  146. package/src/three/menuBackground/v2.ts +196 -96
  147. package/src/three/menuBackground/v2Meta.ts +3 -3
  148. package/src/three/menuBackground/worldBlocks.ts +37 -35
  149. package/src/three/modules/blockBreakParticles.ts +59 -28
  150. package/src/three/modules/cameraBobbing.ts +3 -6
  151. package/src/three/modules/index.ts +1 -1
  152. package/src/three/modules/rain.ts +10 -23
  153. package/src/three/modules/sciFiWorldReveal.ts +11 -25
  154. package/src/three/modules/starfield.ts +7 -13
  155. package/src/three/renderSlot.ts +28 -16
  156. package/src/three/rendererModuleSystem.ts +1 -3
  157. package/src/three/sceneOrigin.ts +96 -33
  158. package/src/three/sectionRaycastAabb.ts +30 -18
  159. package/src/three/shaderCubeMesh.ts +6 -17
  160. package/src/three/shaders/cubeBlockShader.ts +85 -96
  161. package/src/three/shaders/legacyBlockShader.ts +21 -43
  162. package/src/three/shaders/textureIndexMapping.ts +89 -95
  163. package/src/three/shaders/tintPalette.ts +156 -170
  164. package/src/three/signTextureCache.ts +9 -12
  165. package/src/three/skyboxRenderer.ts +62 -70
  166. package/src/three/tests/chunkMeshManagerLegacy.test.ts +34 -34
  167. package/src/three/tests/cubeDrawSpans.test.ts +55 -25
  168. package/src/three/tests/globalBlockBuffer.test.ts +217 -0
  169. package/src/three/tests/globalLegacyBuffer.test.ts +300 -41
  170. package/src/three/tests/legacyMultiDraw.test.ts +8 -29
  171. package/src/three/tests/pr3PerFrameCpuCuts.test.ts +106 -29
  172. package/src/three/tests/signTextureCache.test.ts +4 -4
  173. package/src/three/threeJsMedia.ts +55 -72
  174. package/src/three/threeJsParticles.ts +32 -41
  175. package/src/three/threeJsSound.ts +3 -3
  176. package/src/three/threeJsUtils.ts +3 -3
  177. package/src/three/threeWorker.ts +2 -2
  178. package/src/three/waypointSprite.ts +55 -82
  179. package/src/three/waypoints.ts +20 -23
  180. package/src/three/world/cursorBlock.ts +25 -12
  181. package/src/three/world/vr.ts +11 -17
  182. package/src/three/worldGeometryExport.ts +15 -34
  183. package/src/three/worldRendererThree.ts +117 -129
  184. package/src/wasm-mesher/bridge/convertChunk.ts +3 -9
  185. package/src/wasm-mesher/bridge/render-from-wasm.ts +204 -229
  186. package/src/wasm-mesher/bridge/shaderCubeBridge.ts +26 -67
  187. package/src/wasm-mesher/tests/cullingRegression.test.ts +307 -0
  188. package/src/wasm-mesher/tests/heightmapParity.test.ts +8 -18
  189. package/src/wasm-mesher/tests/mesherWasmConversionCache.test.ts +2 -2
  190. package/src/wasm-mesher/tests/sectionRaycastAabb.test.ts +17 -4
  191. package/src/wasm-mesher/tests/shaderCubeInstances.test.ts +103 -141
  192. package/src/wasm-mesher/tests/splitColumnWasmOutput.test.ts +14 -22
  193. package/src/wasm-mesher/worker/mesherWasm.ts +150 -141
  194. package/src/wasm-mesher/worker/mesherWasmConversionCache.ts +2 -8
  195. package/src/wasm-mesher/worker/mesherWasmLightDirty.test.ts +1 -3
  196. package/src/wasm-mesher/worker/mesherWasmLightDirty.ts +1 -5
  197. package/src/wasm-mesher/worker/mesherWasmRequestTracker.ts +42 -42
  198. package/src/worldView/worldView.spiral.test.ts +1 -1
  199. package/src/worldView/worldView.ts +34 -39
  200. 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) { // int, enum
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', name: this.params.entity, pos: this.targetPos.offset(0.5, 1, 0.5), width: 1, height: 1, username: localStorage.testUsername, yaw: Math.PI, pitch: 0
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 = (obj) => {
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,7 +2,7 @@
2
2
  import { BasePlaygroundScene } from '../baseScene'
3
3
 
4
4
  export default class RotationIssueScene extends BasePlaygroundScene {
5
- setupWorld () {
5
+ setupWorld() {
6
6
  // todo
7
7
  }
8
8
  }
@@ -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')
@@ -51,7 +51,7 @@ export const getSyncWorld = (version: string): world.WorldSync => {
51
51
  return world
52
52
  }
53
53
 
54
- function getAllMethods (obj) {
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> (arr: T[], delay: number, exec: (item: T, index: number) => Promise<void>, chunkSize = 1) => {
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 (resources: LoadedResourcesTransferrable): void {
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, textures: Record<string, HTMLImageElement> }
70
- blocks?: { tileSize: number | undefined, textures: Record<string, HTMLImageElement> }
71
- armor?: { tileSize: number | undefined, textures: Record<string, HTMLImageElement> }
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, image: ImageBitmap } | null = null
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, mcData?: IndexedData }).loadedData
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' || key === 'worldBlockProvider' || key === 'mcData'
116
- || key === 'itemsDefinitionsStore' || key === 'sourceItemDefinitionsJson'
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 (resources: LoadedResourcesTransferrable): void {
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
- resources.version,
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 (transfer?: LoadedResourcesTransferrable): LoadedResourcesTransferrable | undefined {
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) { // todo rework resourcepack optimization
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
- (textureName) => {
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
- (textureName) => {
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: (new AtlasParser(blocksAtlases as any, '')).atlas.latest,
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: (new AtlasParser(blocksAtlases as any, '')).atlas.latest,
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() { return require("minecraft-data/minecraft-data/data/pc/1.16/attributes.json") },
14
- get blocks() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/blocks.json") },
15
- get blockCollisionShapes() { return require("minecraft-data/minecraft-data/data/pc/1.16.1/blockCollisionShapes.json") },
16
- get biomes() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/biomes.json") },
17
- get effects() { return require("minecraft-data/minecraft-data/data/pc/1.16.1/effects.json") },
18
- get items() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/items.json") },
19
- get enchantments() { return require("minecraft-data/minecraft-data/data/pc/1.16.4/enchantments.json") },
20
- get recipes() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/recipes.json") },
21
- get instruments() { return require("minecraft-data/minecraft-data/data/pc/1.16.1/instruments.json") },
22
- get materials() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/materials.json") },
23
- get language() { return require("minecraft-data/minecraft-data/data/pc/1.16.1/language.json") },
24
- get entities() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/entities.json") },
25
- get protocol() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/protocol.json") },
26
- get windows() { return require("minecraft-data/minecraft-data/data/pc/1.16.1/windows.json") },
27
- get version() { return require("minecraft-data/minecraft-data/data/pc/1.16.5/version.json") },
28
- get foods() { return require("minecraft-data/minecraft-data/data/pc/1.16.1/foods.json") },
29
- get particles() { return require("minecraft-data/minecraft-data/data/pc/1.16/particles.json") },
30
- get blockLoot() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/blockLoot.json") },
31
- get entityLoot() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/entityLoot.json") },
32
- get loginPacket() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/loginPacket.json") },
33
- get tints() { return require("minecraft-data/minecraft-data/data/pc/1.16.2/tints.json") },
34
- get mapIcons() { return require("minecraft-data/minecraft-data/data/pc/1.16/mapIcons.json") },
35
- get sounds() { return require("minecraft-data/minecraft-data/data/pc/1.16/sounds.json") }
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
- <!DOCTYPE html>
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
- @font-face {
10
- font-family: mojangles;
11
- src: url(../../../assets/mojangles.ttf);
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;">test</div>
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
- Color?: string
7
- GlowingText?: 0 | 1
8
- Text1?: string
9
- Text2?: string
10
- Text3?: string
11
- Text4?: string
12
- } | {
13
- // todo
14
- is_waxed?: 0 | 1
15
- front_text: {
16
- color: string
17
- messages: string[]
18
- // todo
19
- has_glowing_text?: 0 | 1
20
- }
21
- // todo
22
- // back_text: {}
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 = (ctx) => { },
60
- canvasCreator = (width, height): OffscreenCanvas => { return createCanvas(width, height) }
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 = 'front_text' in blockEntity ? /* > 1.20 */ blockEntity.front_text.messages : [
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((text) => text !== 'null')) {
78
+ if (!texts.some(text => text !== 'null')) {
79
79
  return undefined
80
80
  }
81
81