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.
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 +32 -32
  6. package/dist/minecraft-renderer.js.meta.json +1 -1
  7. package/dist/threeWorker.js +415 -415
  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 +329 -301
  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 +174 -99
  126. package/src/three/globalLegacyBuffer.ts +465 -136
  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 +93 -0
  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 +133 -25
  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 +460 -58
  170. package/src/three/tests/legacyMultiDraw.test.ts +88 -0
  171. package/src/three/tests/pr3PerFrameCpuCuts.test.ts +370 -0
  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 +131 -133
  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
@@ -1,19 +1,15 @@
1
1
  //@ts-nocheck
2
2
  import * as THREE from 'three'
3
- import {
4
- APPLY_LIGHTMAP_GLSL,
5
- DEFAULT_LIGHTMAP_PARAMS,
6
- type BlockLightmapParams,
7
- } from '../../lib/blockEntityLighting'
3
+ import { APPLY_LIGHTMAP_GLSL, DEFAULT_LIGHTMAP_PARAMS, type BlockLightmapParams } from '../../lib/blockEntityLighting'
8
4
 
9
- export type RenderOrigin = { x: number, y: number, z: number }
5
+ export type RenderOrigin = { x: number; y: number; z: number }
10
6
 
11
- export function computeCameraRelativeUniforms (
7
+ export function computeCameraRelativeUniforms(
12
8
  renderOrigin: RenderOrigin,
13
9
  x: number,
14
10
  y: number,
15
- z: number,
16
- ): { originDelta: RenderOrigin, cameraOriginFrac: RenderOrigin } {
11
+ z: number
12
+ ): { originDelta: RenderOrigin; cameraOriginFrac: RenderOrigin } {
17
13
  const ix = Math.floor(x)
18
14
  const iy = Math.floor(y)
19
15
  const iz = Math.floor(z)
@@ -21,13 +17,13 @@ export function computeCameraRelativeUniforms (
21
17
  originDelta: {
22
18
  x: renderOrigin.x - ix,
23
19
  y: renderOrigin.y - iy,
24
- z: renderOrigin.z - iz,
20
+ z: renderOrigin.z - iz
25
21
  },
26
22
  cameraOriginFrac: {
27
23
  x: x - ix,
28
24
  y: y - iy,
29
- z: z - iz,
30
- },
25
+ z: z - iz
26
+ }
31
27
  }
32
28
  }
33
29
 
@@ -193,70 +189,55 @@ const legacyUniforms = {
193
189
  u_skyLevel: { value: 1.0 },
194
190
  u_lightCurve: { value: DEFAULT_LIGHTMAP_PARAMS.curve },
195
191
  u_minBrightness: { value: DEFAULT_LIGHTMAP_PARAMS.minBrightness },
196
- u_lightGamma: { value: DEFAULT_LIGHTMAP_PARAMS.gamma },
192
+ u_lightGamma: { value: DEFAULT_LIGHTMAP_PARAMS.gamma }
197
193
  }
198
194
 
199
- export function createLegacyBlockMaterial (): THREE.ShaderMaterial {
195
+ export function createLegacyBlockMaterial(): THREE.ShaderMaterial {
200
196
  return new THREE.ShaderMaterial({
201
197
  vertexShader,
202
198
  fragmentShader,
203
- uniforms: THREE.UniformsUtils.merge([
204
- THREE.UniformsLib.fog,
205
- legacyUniforms,
206
- ]),
199
+ uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.fog, legacyUniforms]),
207
200
  transparent: true,
208
201
  depthWrite: true,
209
202
  depthTest: true,
210
203
  vertexColors: true,
211
204
  glslVersion: THREE.GLSL3,
212
- fog: true,
205
+ fog: true
213
206
  })
214
207
  }
215
208
 
216
209
  /** Global opaque legacy buffer — per-vertex section origin via a_origin. */
217
- export function createGlobalLegacyBlockMaterial (): THREE.ShaderMaterial {
210
+ export function createGlobalLegacyBlockMaterial(): THREE.ShaderMaterial {
218
211
  return new THREE.ShaderMaterial({
219
212
  vertexShader: globalVertexShader,
220
213
  fragmentShader,
221
- uniforms: THREE.UniformsUtils.merge([
222
- THREE.UniformsLib.fog,
223
- legacyUniforms,
224
- ]),
214
+ uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.fog, legacyUniforms]),
225
215
  transparent: false,
226
216
  depthWrite: true,
227
217
  depthTest: true,
228
218
  vertexColors: true,
229
219
  glslVersion: THREE.GLSL3,
230
- fog: true,
220
+ fog: true
231
221
  })
232
222
  }
233
223
 
234
224
  /** Global transparent blend buffer — same shaders as opaque global, blend material flags. */
235
- export function createGlobalLegacyBlendMaterial (): THREE.ShaderMaterial {
225
+ export function createGlobalLegacyBlendMaterial(): THREE.ShaderMaterial {
236
226
  return new THREE.ShaderMaterial({
237
227
  vertexShader: globalVertexShader,
238
228
  fragmentShader,
239
- uniforms: THREE.UniformsUtils.merge([
240
- THREE.UniformsLib.fog,
241
- legacyUniforms,
242
- ]),
229
+ uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.fog, legacyUniforms]),
243
230
  transparent: true,
244
231
  depthWrite: true,
245
232
  depthTest: true,
246
233
  vertexColors: true,
247
234
  glslVersion: THREE.GLSL3,
248
- fog: true,
235
+ fog: true
249
236
  })
250
237
  }
251
238
 
252
239
  /** Render-origin + fractional camera split — matches GlobalBlockBuffer.setCameraOrigin. */
253
- export function setLegacyCameraOrigin (
254
- material: THREE.ShaderMaterial,
255
- renderOrigin: RenderOrigin,
256
- x: number,
257
- y: number,
258
- z: number,
259
- ): void {
240
+ export function setLegacyCameraOrigin(material: THREE.ShaderMaterial, renderOrigin: RenderOrigin, x: number, y: number, z: number): void {
260
241
  const { originDelta, cameraOriginFrac } = computeCameraRelativeUniforms(renderOrigin, x, y, z)
261
242
  const u = material.uniforms.u_originDelta
262
243
  if (u?.value?.set) {
@@ -268,15 +249,12 @@ export function setLegacyCameraOrigin (
268
249
  }
269
250
  }
270
251
 
271
- export function setLegacySkyLevel (material: THREE.ShaderMaterial, value: number): void {
252
+ export function setLegacySkyLevel(material: THREE.ShaderMaterial, value: number): void {
272
253
  const u = material.uniforms.u_skyLevel
273
254
  if (u) u.value = value
274
255
  }
275
256
 
276
- export function setLegacyLightmapParams (
277
- material: THREE.ShaderMaterial,
278
- params: BlockLightmapParams,
279
- ): void {
257
+ export function setLegacyLightmapParams(material: THREE.ShaderMaterial, params: BlockLightmapParams): void {
280
258
  if (params.curve !== undefined) {
281
259
  const u = material.uniforms.u_lightCurve
282
260
  if (u) u.value = params.curve
@@ -10,113 +10,107 @@
10
10
 
11
11
  // WorldBlockProvider interface (subset used by this module)
12
12
  export interface TextureAtlasInfo {
13
- /** Atlas width in pixels (must be 1024) */
14
- width: number
15
- /** Atlas height in pixels (must be 1024) */
16
- height: number
17
- /** Tile size in pixels (must be 16) */
18
- tileSize: number
19
- /** Resolution scale (suSv = tileSize * resolution) */
20
- suSv: number
21
- /** Texture name → atlas position */
22
- textures: Record<string, TextureEntry>
13
+ /** Atlas width in pixels (must be 1024) */
14
+ width: number
15
+ /** Atlas height in pixels (must be 1024) */
16
+ height: number
17
+ /** Tile size in pixels (must be 16) */
18
+ tileSize: number
19
+ /** Resolution scale (suSv = tileSize * resolution) */
20
+ suSv: number
21
+ /** Texture name → atlas position */
22
+ textures: Record<string, TextureEntry>
23
23
  }
24
24
 
25
25
  export interface TextureEntry {
26
- /** Horizontal pixel offset within atlas */
27
- u: number
28
- /** Vertical pixel offset within atlas */
29
- v: number
30
- /** Horizontal pixel count (typically 16 or suSv) */
31
- su: number
32
- /** Vertical pixel count (typically 16 or suSv) */
33
- sv: number
26
+ /** Horizontal pixel offset within atlas */
27
+ u: number
28
+ /** Vertical pixel offset within atlas */
29
+ v: number
30
+ /** Horizontal pixel count (typically 16 or suSv) */
31
+ su: number
32
+ /** Vertical pixel count (typically 16 or suSv) */
33
+ sv: number
34
34
  }
35
35
 
36
36
  export class TextureIndexMapping {
37
- private atlasWidth: number
38
- private atlasHeight: number
39
- private tileSize: number
40
- private tilesPerRow: number
41
- private maxTiles: number
42
- private valid: boolean
37
+ private atlasWidth: number
38
+ private atlasHeight: number
39
+ private tileSize: number
40
+ private tilesPerRow: number
41
+ private maxTiles: number
42
+ private valid: boolean
43
43
 
44
- constructor(atlasInfo: TextureAtlasInfo) {
45
- this.atlasWidth = atlasInfo.width
46
- this.atlasHeight = atlasInfo.height
47
- this.tileSize = atlasInfo.tileSize
48
- this.tilesPerRow = Math.floor(this.atlasWidth / this.tileSize)
49
- this.maxTiles = this.tilesPerRow * Math.floor(this.atlasHeight / this.tileSize)
44
+ constructor(atlasInfo: TextureAtlasInfo) {
45
+ this.atlasWidth = atlasInfo.width
46
+ this.atlasHeight = atlasInfo.height
47
+ this.tileSize = atlasInfo.tileSize
48
+ this.tilesPerRow = Math.floor(this.atlasWidth / this.tileSize)
49
+ this.maxTiles = this.tilesPerRow * Math.floor(this.atlasHeight / this.tileSize)
50
50
 
51
- // Only valid when atlas matches the shader's hardcoded layout (1024×1024, 16×16 tiles).
52
- this.valid = this.atlasWidth === 1024
53
- && this.atlasHeight === 1024
54
- && this.tileSize === 16
55
- && this.maxTiles <= 4096 // 12-bit limit
56
- }
51
+ // Only valid when atlas matches the shader's hardcoded layout (1024×1024, 16×16 tiles).
52
+ this.valid = this.atlasWidth === 1024 && this.atlasHeight === 1024 && this.tileSize === 16 && this.maxTiles <= 4096 // 12-bit limit
53
+ }
57
54
 
58
- /** True when 12-bit texIndex encoding is safe (atlas matches the shader's layout). */
59
- isValid(): boolean {
60
- return this.valid
61
- }
55
+ /** True when 12-bit texIndex encoding is safe (atlas matches the shader's layout). */
56
+ isValid(): boolean {
57
+ return this.valid
58
+ }
62
59
 
63
- /** Tiles per row in the atlas */
64
- getTilesPerRow(): number {
65
- return this.tilesPerRow
66
- }
60
+ /** Tiles per row in the atlas */
61
+ getTilesPerRow(): number {
62
+ return this.tilesPerRow
63
+ }
67
64
 
68
- /**
69
- * Compute absolute tile index from atlas pixel position.
70
- * Returns -1 if the position is out of range or gate fails.
71
- */
72
- tileIndexFromPixelCoords(u: number, v: number): number {
73
- if (!this.valid) return -1
74
- const tileCol = Math.floor(u / this.tileSize)
75
- const tileRow = Math.floor(v / this.tileSize)
76
- if (tileCol < 0 || tileCol >= this.tilesPerRow || tileRow < 0) return -1
77
- const index = tileRow * this.tilesPerRow + tileCol
78
- if (index >= this.maxTiles) return -1
79
- return index
80
- }
65
+ /**
66
+ * Compute absolute tile index from atlas pixel position.
67
+ * Returns -1 if the position is out of range or gate fails.
68
+ */
69
+ tileIndexFromPixelCoords(u: number, v: number): number {
70
+ if (!this.valid) return -1
71
+ const tileCol = Math.floor(u / this.tileSize)
72
+ const tileRow = Math.floor(v / this.tileSize)
73
+ if (tileCol < 0 || tileCol >= this.tilesPerRow || tileRow < 0) return -1
74
+ const index = tileRow * this.tilesPerRow + tileCol
75
+ if (index >= this.maxTiles) return -1
76
+ return index
77
+ }
81
78
 
82
- /**
83
- * Get tile index for a texture entry from the atlas.
84
- * Returns -1 if the texture spans multiple tiles or gate fails.
85
- */
86
- tileIndexFromTextureEntry(entry: TextureEntry): number {
87
- if (!this.valid) return -1
88
- // Verify the texture occupies exactly one tile
89
- if (entry.su !== this.tileSize || entry.sv !== this.tileSize) return -1
90
- return this.tileIndexFromPixelCoords(entry.u, entry.v)
91
- }
79
+ /**
80
+ * Get tile index for a texture entry from the atlas.
81
+ * Returns -1 if the texture spans multiple tiles or gate fails.
82
+ */
83
+ tileIndexFromTextureEntry(entry: TextureEntry): number {
84
+ if (!this.valid) return -1
85
+ // Verify the texture occupies exactly one tile
86
+ if (entry.su !== this.tileSize || entry.sv !== this.tileSize) return -1
87
+ return this.tileIndexFromPixelCoords(entry.u, entry.v)
88
+ }
92
89
 
93
- /**
94
- * Look up tile index by texture name.
95
- * Returns -1 if the texture is not found, spans multiple tiles, or gate fails.
96
- */
97
- tileIndexFromTextureName(
98
- textureName: string,
99
- atlasInfo: TextureAtlasInfo,
100
- ): number {
101
- if (!this.valid) return -1
102
- // Try exact name, then strip namespace prefix
103
- let entry = atlasInfo.textures[textureName]
104
- if (!entry && textureName.includes(':')) {
105
- entry = atlasInfo.textures[textureName.split(':')[1]]
106
- }
107
- if (!entry && textureName.includes('/')) {
108
- entry = atlasInfo.textures[textureName.split('/')[1]]
109
- }
110
- if (!entry) {
111
- // Try 'block/' prefix
112
- entry = atlasInfo.textures[`block/${textureName}`]
113
- }
114
- if (!entry) {
115
- // Try without 'block/' prefix
116
- const stripped = textureName.replace(/^block\//, '')
117
- entry = atlasInfo.textures[stripped]
118
- }
119
- if (!entry) return -1
120
- return this.tileIndexFromTextureEntry(entry)
90
+ /**
91
+ * Look up tile index by texture name.
92
+ * Returns -1 if the texture is not found, spans multiple tiles, or gate fails.
93
+ */
94
+ tileIndexFromTextureName(textureName: string, atlasInfo: TextureAtlasInfo): number {
95
+ if (!this.valid) return -1
96
+ // Try exact name, then strip namespace prefix
97
+ let entry = atlasInfo.textures[textureName]
98
+ if (!entry && textureName.includes(':')) {
99
+ entry = atlasInfo.textures[textureName.split(':')[1]]
100
+ }
101
+ if (!entry && textureName.includes('/')) {
102
+ entry = atlasInfo.textures[textureName.split('/')[1]]
103
+ }
104
+ if (!entry) {
105
+ // Try 'block/' prefix
106
+ entry = atlasInfo.textures[`block/${textureName}`]
107
+ }
108
+ if (!entry) {
109
+ // Try without 'block/' prefix
110
+ const stripped = textureName.replace(/^block\//, '')
111
+ entry = atlasInfo.textures[stripped]
121
112
  }
113
+ if (!entry) return -1
114
+ return this.tileIndexFromTextureEntry(entry)
115
+ }
122
116
  }