@nodecraft/rendermite 1.11.1 → 1.12.0

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 (257) hide show
  1. package/README.md +52 -16
  2. package/assets/builtin/mobheads/items/frostbite.json +6 -0
  3. package/assets/builtin/mobheads/models/item/frostbite.json +6 -0
  4. package/assets/mod-models/README.md +24 -0
  5. package/dist/atlas/registry.d.ts +5 -6
  6. package/dist/atlas/registry.js +1 -2
  7. package/dist/atlas/sources.d.ts +2 -2
  8. package/dist/atlas/sources.js +1 -2
  9. package/dist/{atlas-pack-BUadroKy.d.ts → atlas-pack-Dxl3kwT2.d.ts} +1 -1
  10. package/dist/{biomes-BGOF6gRM.js → biomes-DTmzQfnL.js} +1 -1
  11. package/dist/{biomes-CnnhDCnk.d.ts → biomes-_HZ93QNR.d.ts} +1 -1
  12. package/dist/{blend-mJAeQB3C.d.ts → blend-DnogOnaU.d.ts} +1 -1
  13. package/dist/{block-behaviour-B5lD0RfG.d.ts → block-behaviour-D6NwU9bV.d.ts} +6 -6
  14. package/dist/{block-entities-C807EY2I.js → block-entities-Dp3rMxWq.js} +1 -1
  15. package/dist/{block-overrides-BhuJIxKC.js → block-overrides-DMzzzeq_.js} +1 -1
  16. package/dist/blocks/atlas-pack.d.ts +1 -1
  17. package/dist/blocks/atlas-pack.js +1 -2
  18. package/dist/blocks/biomes.d.ts +1 -1
  19. package/dist/blocks/biomes.js +1 -2
  20. package/dist/blocks/block-behaviour.d.ts +1 -1
  21. package/dist/blocks/block-behaviour.js +1 -2
  22. package/dist/blocks/block-entities.d.ts +12 -13
  23. package/dist/blocks/block-entities.js +1 -2
  24. package/dist/blocks/block-overrides.d.ts +7 -8
  25. package/dist/blocks/block-overrides.js +1 -2
  26. package/dist/blocks/blockstate-eval.js +1 -2
  27. package/dist/blocks/cli.d.ts +2 -3
  28. package/dist/blocks/cli.js +1 -2
  29. package/dist/blocks/datapack.d.ts +1 -1
  30. package/dist/blocks/datapack.js +1 -2
  31. package/dist/blocks/ender-storage.d.ts +4 -5
  32. package/dist/blocks/ender-storage.js +1 -2
  33. package/dist/blocks/entities.d.ts +8 -9
  34. package/dist/blocks/entities.js +1 -2
  35. package/dist/blocks/entity-geo.d.ts +4 -5
  36. package/dist/blocks/entity-geo.js +1 -2
  37. package/dist/blocks/entity-models.d.ts +8 -9
  38. package/dist/blocks/entity-models.js +1 -2
  39. package/dist/blocks/entity-sizes.d.ts +4 -4
  40. package/dist/blocks/entity-sizes.js +1 -2
  41. package/dist/blocks/export.d.ts +1 -1
  42. package/dist/blocks/export.js +1 -2
  43. package/dist/blocks/game-rules.js +1 -2
  44. package/dist/blocks/geo-blocks.d.ts +5 -6
  45. package/dist/blocks/geo-blocks.js +1 -2
  46. package/dist/blocks/item-sprites.d.ts +9 -10
  47. package/dist/blocks/item-sprites.js +1 -2
  48. package/dist/blocks/light-bytecode.d.ts +1 -1
  49. package/dist/blocks/light-bytecode.js +1 -2
  50. package/dist/blocks/light-eval.d.ts +1 -1
  51. package/dist/blocks/light-eval.js +1 -2
  52. package/dist/blocks/light.d.ts +8 -9
  53. package/dist/blocks/light.js +1 -2
  54. package/dist/blocks/names.d.ts +1 -1
  55. package/dist/blocks/names.js +1 -2
  56. package/dist/blocks/obj-mesh.d.ts +1 -1
  57. package/dist/blocks/obj-mesh.js +1 -2
  58. package/dist/blocks/pack-format.d.ts +1 -1
  59. package/dist/blocks/pack-format.js +1 -2
  60. package/dist/blocks/sprite-sheet.d.ts +11 -12
  61. package/dist/blocks/sprite-sheet.js +1 -2
  62. package/dist/blocks/states.js +1 -2
  63. package/dist/blocks/tints.d.ts +1 -1
  64. package/dist/blocks/tints.js +1 -2
  65. package/dist/{blockstate-DVb8Mhxc.js → blockstate-D5FgI-Qv.js} +3 -4
  66. package/dist/{blockstate-eval-CcgxVdKb.js → blockstate-eval-Cu-9TWH0.js} +1 -2
  67. package/dist/builtin.d.ts +5 -6
  68. package/dist/builtin.js +1 -2
  69. package/dist/{classfile-BJSs3JH0.js → classfile-YGjbyMPk.js} +3 -4
  70. package/dist/{cli-BUQzP6YF.js → cli-CeEAmdX9.js} +5 -5
  71. package/dist/cli.js +8 -8
  72. package/dist/{datapack-D6eH46ay.js → datapack-BZpO7nv-.js} +8 -9
  73. package/dist/{datapack-CmEg0Vko.d.ts → datapack-DhBAuxw5.d.ts} +1 -1
  74. package/dist/{definition-ColsvWrH.js → definition-Dab22cHd.js} +1 -1
  75. package/dist/{descriptor-Dz2cR-BH.js → descriptor-CJLtRmBc.js} +3 -3
  76. package/dist/{discovery-DWe_kX8W.d.ts → discovery-2Qk3x25z.d.ts} +1 -1
  77. package/dist/{discovery-CD0QqxSF.js → discovery-CMHJfdHQ.js} +13 -15
  78. package/dist/dynamic/generators.d.ts +1 -1
  79. package/dist/dynamic/generators.js +1 -2
  80. package/dist/{encode-TzYXOEId.js → encode-BIAWeZy2.js} +2 -3
  81. package/dist/{encode-BNEYHHR0.d.ts → encode-DZSVif8a.d.ts} +1 -1
  82. package/dist/{ender-storage-CKDiYgYc.js → ender-storage-COyXL-I4.js} +1 -1
  83. package/dist/entities/classfile.js +1 -2
  84. package/dist/entities/geo-model.d.ts +3 -4
  85. package/dist/entities/geo-model.js +1 -2
  86. package/dist/entities/inherit.d.ts +4 -5
  87. package/dist/entities/inherit.js +1 -2
  88. package/dist/entities/jar-classes.js +1 -2
  89. package/dist/entities/link.d.ts +9 -10
  90. package/dist/entities/link.js +1 -2
  91. package/dist/entities/mappings.js +1 -2
  92. package/dist/entities/merge.d.ts +7 -8
  93. package/dist/entities/merge.js +1 -2
  94. package/dist/entities/model-bytecode.d.ts +5 -6
  95. package/dist/entities/model-bytecode.js +1 -2
  96. package/dist/entities/model-code.js +1 -2
  97. package/dist/{entities-rQ4TZjEo.js → entities-4UMp3qXG.js} +4 -5
  98. package/dist/{entity-fallback-BEzCbJq0.js → entity-fallback-ZfurtmEQ.js} +9 -11
  99. package/dist/{entity-geo-DcrcN8TE.js → entity-geo-vJTSO0bB.js} +2 -2
  100. package/dist/{entity-models-D6AMLAy6.js → entity-models-CleLnlV4.js} +9 -10
  101. package/dist/{entity-sizes-Dmr4w0vu.js → entity-sizes-CC6-7DBz.js} +1 -1
  102. package/dist/{entity-textures-DG6NUNyp.js → entity-textures-BS5dI5dz.js} +15 -19
  103. package/dist/{export-CnKiSTiu.d.ts → export-BL_3VVZI.d.ts} +1 -1
  104. package/dist/{export-DE1V-ElS.js → export-BPH-b4LT.js} +25 -27
  105. package/dist/{face-uWXECGNr.d.ts → face-BOsq7v9f.d.ts} +4 -4
  106. package/dist/{face-D6SfTISC.js → face-DtbBpvbY.js} +2 -2
  107. package/dist/{game-rules-Dehe210A.js → game-rules-DrYU_6hd.js} +14 -16
  108. package/dist/{generators-D6giKoab.js → generators-7b5w6s0L.js} +1 -1
  109. package/dist/{generators-hu_vk10m.d.ts → generators-P1goUyvI.d.ts} +1 -1
  110. package/dist/{geo-BOYYFFQn.js → geo-CZHkm59F.js} +10 -12
  111. package/dist/{geo-DsWwuC5o.d.ts → geo-Ci_PGkFI.d.ts} +5 -5
  112. package/dist/{geo-blocks-BQqFfAQT.js → geo-blocks-BYSBc8uq.js} +1 -1
  113. package/dist/{geometry-bUDBhncX.js → geometry-BGTvfmbS.js} +1 -2
  114. package/dist/{geometry--UzHu1Vh.d.ts → geometry-Btiz31vH.d.ts} +1 -1
  115. package/dist/index.d.ts +21 -21
  116. package/dist/index.js +19 -19
  117. package/dist/{inherit-DJ45bOB_.js → inherit-LSSIV8N2.js} +2 -2
  118. package/dist/{item-sprites-CwiEBEAJ.js → item-sprites-Cip695Kk.js} +3 -3
  119. package/dist/{item-styles-BAeneY1R.js → item-styles-D-7N6j1i.js} +1 -1
  120. package/dist/items/blockstate.d.ts +5 -6
  121. package/dist/items/blockstate.js +1 -2
  122. package/dist/items/definition.js +1 -2
  123. package/dist/items/discovery.d.ts +1 -1
  124. package/dist/items/discovery.js +1 -2
  125. package/dist/{jar-DvofBm71.js → jar-Df0Xhw7X.js} +1 -1
  126. package/dist/{jar-4Jg7ufWK.d.ts → jar-IHoEeMdV.d.ts} +1 -1
  127. package/dist/{jar-classes-0wqWbTax.js → jar-classes-C5P3F18e.js} +1 -1
  128. package/dist/{legacy-reshape-CcdstKyI.js → legacy-reshape-ClEZFEVT.js} +6 -8
  129. package/dist/{light-c7l13kka.js → light-Bj0iD-ok.js} +19 -23
  130. package/dist/{light-bytecode-CQzTG8DJ.js → light-bytecode-B4_sP6ri.js} +3 -3
  131. package/dist/{light-eval-BuwUW4Tj.d.ts → light-eval-DJA58Kdg.d.ts} +1 -1
  132. package/dist/{lighting-3FGRC3Af.d.ts → lighting-DYkS-NlV.d.ts} +2 -2
  133. package/dist/{lighting--5myudVu.js → lighting-f_oZTiOx.js} +2 -2
  134. package/dist/{link-IDjVJ2Ij.js → link-CxzBRqeB.js} +4 -5
  135. package/dist/{loader-qOH0Jynq.js → loader-Ckhy0t8m.js} +3 -4
  136. package/dist/{loader-C4gsX_wO.d.ts → loader-CrPTL0zk.d.ts} +1 -1
  137. package/dist/{loader-BYyPIs9f.d.ts → loader-mGAKSRp6.d.ts} +2 -2
  138. package/dist/{manager-D6zXmFrO.js → manager-B1VPl4UQ.js} +4 -5
  139. package/dist/{manager-Ct0dEOMg.d.ts → manager-Ey26G_3e.d.ts} +1 -1
  140. package/dist/{model-bytecode-CXYAZ5dX.js → model-bytecode-Cp4LGfjI.js} +5 -6
  141. package/dist/{model-code-C5Au_FKU.js → model-code-B11iaTy1.js} +1 -1
  142. package/dist/models/loader.d.ts +1 -1
  143. package/dist/models/loader.js +1 -2
  144. package/dist/models/types.d.ts +1 -1
  145. package/dist/{models-BsYA-NZg.js → models-CvFehP26.js} +1 -1
  146. package/dist/mods/models.d.ts +3 -4
  147. package/dist/mods/models.js +1 -2
  148. package/dist/mods/prepare.d.ts +1 -1
  149. package/dist/mods/prepare.js +1 -2
  150. package/dist/mods/synthesize.d.ts +5 -6
  151. package/dist/mods/synthesize.js +1 -2
  152. package/dist/mods/tints.d.ts +7 -8
  153. package/dist/mods/tints.js +1 -2
  154. package/dist/{names-D1abAVIB.d.ts → names-D30ZIXkK.d.ts} +1 -1
  155. package/dist/{obj-NxBaySXt.js → obj-BWsU8pYz.js} +16 -18
  156. package/dist/{obj-mesh-BBSLG2Fv.js → obj-mesh-WShUgD4g.js} +1 -1
  157. package/dist/{obj-mesh-CzL0lOlJ.d.ts → obj-mesh-yN3ttPYf.d.ts} +2 -2
  158. package/dist/output/encode.d.ts +1 -1
  159. package/dist/output/encode.js +1 -2
  160. package/dist/output/item-styles.d.ts +3 -4
  161. package/dist/output/item-styles.js +1 -2
  162. package/dist/output/minify.js +1 -2
  163. package/dist/output/stylesheet.d.ts +1 -1
  164. package/dist/output/stylesheet.js +1 -2
  165. package/dist/pack.d.ts +5 -5
  166. package/dist/pack.js +1 -1
  167. package/dist/{pipeline-CCfkRth7.js → pipeline-DV4hIRMp.js} +12 -12
  168. package/dist/{pipeline-DuPF3sap.d.ts → pipeline-DmLQ49DB.d.ts} +4 -4
  169. package/dist/{pool-CKGp1qup.js → pool-Co7kPWwN.js} +1 -1
  170. package/dist/{prepare-DkJkZXuQ.js → prepare-BC5PYUmn.js} +7 -8
  171. package/dist/{prepare-Ce5SpR7Y.d.ts → prepare-BpwBH_m9.d.ts} +1 -1
  172. package/dist/{prepare-BPzsZI_S.d.ts → prepare-CZu44oTS.d.ts} +1 -1
  173. package/dist/{prepare-sj36BP90.js → prepare-DJnJQYtn.js} +9 -10
  174. package/dist/{rasterizer-M9Y7mn-W.js → rasterizer-B3tOyG4B.js} +5 -6
  175. package/dist/{rasterizer-DjnurUgD.d.ts → rasterizer-UBaTPhH4.d.ts} +1 -1
  176. package/dist/{registry-DafxsAhG.js → registry-CNFi94eo.js} +5 -7
  177. package/dist/render/blend.d.ts +1 -1
  178. package/dist/render/blend.js +1 -2
  179. package/dist/render/compose.d.ts +4 -5
  180. package/dist/render/compose.js +1 -2
  181. package/dist/render/entity-fallback.d.ts +12 -13
  182. package/dist/render/entity-fallback.js +1 -2
  183. package/dist/render/face.d.ts +1 -1
  184. package/dist/render/face.js +1 -2
  185. package/dist/render/fluid-bucket.d.ts +4 -5
  186. package/dist/render/fluid-bucket.js +1 -2
  187. package/dist/render/geo.d.ts +1 -1
  188. package/dist/render/geo.js +1 -2
  189. package/dist/render/geometry.d.ts +1 -1
  190. package/dist/render/geometry.js +1 -2
  191. package/dist/render/legacy-tints.d.ts +4 -5
  192. package/dist/render/legacy-tints.js +1 -2
  193. package/dist/render/lighting.d.ts +1 -1
  194. package/dist/render/lighting.js +1 -2
  195. package/dist/render/obj.d.ts +10 -10
  196. package/dist/render/obj.js +1 -2
  197. package/dist/render/pipeline.d.ts +1 -1
  198. package/dist/render/pipeline.js +1 -2
  199. package/dist/render/rasterizer.d.ts +1 -1
  200. package/dist/render/rasterizer.js +1 -2
  201. package/dist/render/renderer.d.ts +1 -1
  202. package/dist/render/renderer.js +1 -2
  203. package/dist/render/tints.d.ts +1 -1
  204. package/dist/render/tints.js +1 -2
  205. package/dist/render/vector.js +1 -2
  206. package/dist/{renderer-QgROYvPv.d.ts → renderer-DZSDiXL0.d.ts} +6 -6
  207. package/dist/resources/cache.d.ts +2 -3
  208. package/dist/resources/cache.js +1 -2
  209. package/dist/resources/cached.d.ts +3 -4
  210. package/dist/resources/cached.js +1 -2
  211. package/dist/resources/descriptor.d.ts +1 -1
  212. package/dist/resources/descriptor.js +1 -2
  213. package/dist/resources/entity-textures.d.ts +19 -20
  214. package/dist/resources/entity-textures.js +1 -2
  215. package/dist/resources/jar.d.ts +1 -1
  216. package/dist/resources/jar.js +1 -2
  217. package/dist/resources/locator.js +1 -2
  218. package/dist/resources/manager.d.ts +1 -1
  219. package/dist/resources/manager.js +1 -2
  220. package/dist/resources/read-ahead.d.ts +2 -3
  221. package/dist/resources/read-ahead.js +1 -2
  222. package/dist/resources/synthetic.d.ts +1 -1
  223. package/dist/resources/synthetic.js +1 -2
  224. package/dist/resources/zip-reader.d.ts +2 -3
  225. package/dist/resources/zip-reader.js +1 -2
  226. package/dist/{run-Bf5TLTJw.js → run-5Rc8hTHT.js} +15 -11
  227. package/dist/{run-CxB1qabg.d.ts → run-CfvR5OAR.d.ts} +3 -3
  228. package/dist/run.d.ts +1 -1
  229. package/dist/run.js +2 -2
  230. package/dist/{sources-DYY5Qu-t.js → sources-BsEa9YPc.js} +1 -1
  231. package/dist/{sources-sFtealLJ.d.ts → sources-ByuTQR_o.d.ts} +7 -3
  232. package/dist/{sprite-sheet-BWsLl0Vd.js → sprite-sheet-BQsUioOJ.js} +6 -7
  233. package/dist/{stylesheet-C61VrCAV.js → stylesheet-Cin7eCyU.js} +6 -7
  234. package/dist/{stylesheet-DxHkk4qA.d.ts → stylesheet-XJ-kH6kk.d.ts} +1 -1
  235. package/dist/{synthesize-jTjVjPAt.js → synthesize-DNvUwWhZ.js} +3 -4
  236. package/dist/{synthetic-CWtFtAkR.d.ts → synthetic-C8_0G5iP.d.ts} +1 -1
  237. package/dist/{synthetic-rc9BPT4P.js → synthetic-y9Mr-wB2.js} +0 -0
  238. package/dist/textures/loader.d.ts +1 -1
  239. package/dist/textures/loader.js +1 -2
  240. package/dist/textures/overlay.d.ts +3 -4
  241. package/dist/textures/overlay.js +1 -2
  242. package/dist/{tints-B0a1K11c.d.ts → tints-BNS9JGf7.d.ts} +2 -2
  243. package/dist/{tints-DwFmEkf3.d.ts → tints-CvHlfvDC.d.ts} +2 -2
  244. package/dist/{tints-B3WQcPtx.js → tints-Cw5okshA.js} +1 -1
  245. package/dist/{tints-CZeyKzMv.js → tints-DhSA5SCg.js} +3 -3
  246. package/dist/{types-qlp3I8_-.d.ts → types-BQQzfHEY.d.ts} +4 -0
  247. package/dist/versions/download.d.ts +2 -3
  248. package/dist/versions/download.js +1 -2
  249. package/dist/versions/legacy-reshape.d.ts +3 -4
  250. package/dist/versions/legacy-reshape.js +1 -2
  251. package/dist/versions/prepare.d.ts +1 -1
  252. package/dist/versions/prepare.js +1 -2
  253. package/dist/workers/pool.d.ts +6 -7
  254. package/dist/workers/pool.js +1 -2
  255. package/dist/workers/render-worker.d.ts +6 -7
  256. package/dist/workers/render-worker.js +2 -2
  257. package/package.json +9 -9
package/README.md CHANGED
@@ -44,7 +44,7 @@ Or use an extracted asset tree directly:
44
44
  rendermite --assets ./my-resource-pack --output ./icons
45
45
  ```
46
46
 
47
- Useful flags: `--size <px>` (default 64), `--format webp|avif`, `--gif` for legacy-browser animation, `--lighting-profile modern|legacy`, `--concurrency <n>`. Run `rendermite` with no arguments for the full list.
47
+ Useful flags: `--size <px>` (default 64), `--format webp|avif`, `--gif` for legacy-browser animation, `--lighting-profile modern|legacy`, `--workers <n>`. Run `rendermite --help` for the full list, and `rendermite blocks --help` for block packs.
48
48
 
49
49
  ### Output layout
50
50
 
@@ -99,10 +99,17 @@ Mods are first-class. Forge/NeoForge **OBJ geometry** exports as triangle meshes
99
99
  Everything the CLI does is exported, from the high-level `run()` and `exportBlockPack()` down to individual pieces (`ModelLoader`, `TextureLoader`, `renderModel`, `prepareVersionResources`, `prepareModResources`, `generateStylesheet`, `evaluateBlockState`, `packAtlas`).
100
100
 
101
101
  ```ts
102
- import { run, exportBlockPack, prepareModResources, builtinPackPath } from '@nodecraft/rendermite';
102
+ import { prepareVersionResources, run } from '@nodecraft/rendermite';
103
+
104
+ const resources = await prepareVersionResources({ version: '1.21.8', jar: './1.21.8-client.jar' });
105
+ const result = await run({ resources, output: './icons', itemList: true });
106
+
107
+ console.log(`${result.rendered.length} rendered, ${result.failed.length} failed`);
103
108
  ```
104
109
 
105
- Reading a published block pack needs none of that toolchain, so it has its own entry — no `sharp`,
110
+ The CLI also picks the era-appropriate builtin pack (chests, banners, heads) and donor jars for old versions, so it is the easiest starting point; [`src/cli.ts`](src/cli.ts) shows how it wires the pieces together.
111
+
112
+ Reading a published block pack needs none of that toolchain, so it has its own entry with no `sharp`,
106
113
  no `node:` builtin, 13 KB bundled:
107
114
 
108
115
  ```ts
@@ -112,26 +119,55 @@ import type { BlockPackModel } from '@nodecraft/rendermite/pack';
112
119
 
113
120
  ## Performance
114
121
 
115
- Benchmarked against PHP renderchest v5.1.0 on the same machine, rendering the same extracted 1.21.8 assets at 64px (PNG + WebP):
122
+ Compared with PHP renderchest v5.1.0 on the same machine, rendering the same extracted 1.21.8 assets at 64px (PNG + WebP):
123
+
124
+ | | wall time | items written | throughput |
125
+ | --- | --- | --- | --- |
126
+ | renderchest (docker, 8 cores) | 186s | 1,573 | ~506/min |
127
+ | rendermite (one Node process, 8 worker threads) | 12.1s | 2,035 | ~10,070/min |
116
128
 
117
- | | wall time | items written | silent drops | throughput |
118
- | --- | --- | --- | --- | --- |
119
- | renderchest (docker, 8 cores) | 186s | 1,573 | 33 | ~506/min |
120
- | rendermite (one Node process, 8 worker threads) | 12.1s | 2,035 | 0 | ~10,070/min |
129
+ Both run with `--size 64 --format webp --fallback --item-list`, median of warm runs, measured September 2026. rendermite reports every item it could not draw in `rc-minecraft-failures.json`, and its summary counts files actually written. Run `node --run bench` for current numbers on your machine; CI runs the same suite and comments the delta on pull requests.
121
130
 
122
- 15x faster with 29% more items rendered. renderchest logged 1,606 items as rendered and exited 0,
123
- but wrote 1,573 of them; rendermite reports every item it could not draw in
124
- `rc-minecraft-failures.json`. Both run with `--size 64 --format webp --fallback --item-list`,
125
- median of warm runs, measured September 2026. Run `npm run bench` for current numbers on your
126
- machine; CI runs the same suite and comments the delta on pull requests.
131
+ ## Docs
127
132
 
128
- ## Testing
133
+ - [DESIGN.md](DESIGN.md): architecture, version support matrix, mod support, output contract, performance notes
134
+ - [docs/block-pack-export.md](docs/block-pack-export.md): the block pack format, with [block light](docs/block-light.md) and [entity geometry](docs/entity-geometry.md)
135
+ - [docs/css-output.md](docs/css-output.md): the generated stylesheet
136
+ - [docs/renderchest-compat.md](docs/renderchest-compat.md) and [docs/renderchest-spec.md](docs/renderchest-spec.md): parity with renderchest
137
+ - [docs/mod-coverage.md](docs/mod-coverage.md): how mod coverage is measured
138
+
139
+ ## Development
129
140
 
130
141
  ```sh
131
- npm test
142
+ npm ci
143
+ node --run lint # eslint with --fix (lint:ci for check only)
144
+ node --run typecheck
145
+ node --run build
146
+ node --run test
147
+ node --run bench # benchmarks for the working tree
148
+ node --run bench:against -- --base main # this tree against another ref, as CI does on PRs
132
149
  ```
133
150
 
134
- The suite is fully self-contained: vanilla jars download from Mojang at test time (cached under `.work/fixtures/`), synthetic mod jars are built from committed declarations, and real mods download from Modrinth. Set `RENDERMITE_SKIP_ONLINE=1` to skip the Modrinth suite offline, and point `RENDERMITE_MODJARS` at a local directory of jars to run the optional real-mod suite (third-party jars are license-restricted and never committed).
151
+ The test suite is self-contained. Vanilla jars download from Mojang on the first run and real mods from Modrinth, all cached under `.work/fixtures/`; synthetic mod jars are built from committed declarations in `test/fixtures/mods.ts`. Environment variables:
152
+
153
+ - `RENDERMITE_SKIP_ONLINE=1` skips the suites that download mods from Modrinth.
154
+ - `RENDERMITE_MODJARS=<dir>` runs an optional suite against a local directory of mod jars. Third-party jars are never committed.
155
+
156
+ The [rendermite.dev](https://rendermite.dev) landing page lives in [`website/`](website/) as a static assets Worker with its own pinned wrangler. `npm ci --ignore-scripts && node --run dev` inside it serves the page locally. Pushes to `main` that touch it deploy through `.github/workflows/website.yml`, which reads `CLOUDFLARE_API_TOKEN` and `CLOUDFLARE_ACCOUNT_ID` from the `website` GitHub environment.
157
+
158
+ The golden pixel tests compare against a local render from the renderchest v5.1.0 docker image placed in `.work/golden/1.21.8-docker/`, and skip when it is absent. The generators in `scripts/mod-models/` need a JDK (`javap`) and `unzip`; nothing else does.
159
+
160
+ ## Contributing
161
+
162
+ Issues and pull requests are welcome. Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/) because [semantic-release](https://semantic-release.gitbook.io/) derives versions and the changelog from them, so use `fix:`, `feat:`, `perf:` and so on. Please run `node --run lint`, `node --run typecheck` and `node --run test` before opening a PR.
163
+
164
+ To report a security issue, see [SECURITY.md](SECURITY.md).
165
+
166
+ ## Disclaimer
167
+
168
+ rendermite is not affiliated with or endorsed by Mojang Studios or Microsoft. Minecraft is a trademark of Mojang Synergies AB. Rendered icons are derived from game and mod assets that you supply or download, so you are responsible for having the rights to render and publish them.
169
+
170
+ The icons hosted on `assets.rendermite.dev` show artwork that belongs to Mojang and to the authors of each mod. Nodecraft claims no ownership of it, hosts the renders free of charge, and grants no license to them; the MIT license covers rendermite's code only. Mod authors who want their icons changed or removed can [open an issue](https://github.com/nodecraft/rendermite/issues).
135
171
 
136
172
  ## Attribution
137
173
 
@@ -0,0 +1,6 @@
1
+ {
2
+ "model": {
3
+ "type": "minecraft:model",
4
+ "model": "mobheads:item/frostbite"
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "parent": "mobheads:item/base/head_64_64",
3
+ "textures": {
4
+ "texture": "minecraft:entity/zombie/frostbite"
5
+ }
6
+ }
@@ -18,6 +18,18 @@ node scripts/mod-models/build.ts
18
18
  the texture, and which parts draw emissive or translucent — with each value citing the class
19
19
  it came from. Regenerating after a mod update is one command; review the resulting diff.
20
20
 
21
+ ## Provenance
22
+
23
+ Every value here is derived from the named mod's own jar: box geometry from its model classes,
24
+ and the `display` block copied from its item model. No textures are included; those still come
25
+ from the mod jar at render time. The data remains subject to each mod's license:
26
+
27
+ | namespace | mod | license |
28
+ | --- | --- | --- |
29
+ | `mekanism` | [Mekanism](https://github.com/mekanism/Mekanism) | MIT |
30
+ | `botania` | [Botania](https://github.com/VazkiiMods/Botania) | Botania License, see upstream |
31
+ | `ad_astra` | [Ad Astra](https://github.com/terrarium-earth/Ad-Astra) | Terrarium License v1, see upstream |
32
+
21
33
  ## Precedence
22
34
 
23
35
  This pack layers **above** the mod jars, so it shadows the jar's `builtin/entity` stub in
@@ -128,3 +140,15 @@ and crystal poses collapse into one; the brewery's plate heights are the excepti
128
140
  `sin(i·40)` even at tick 0, exactly as in game on that tick.
129
141
 
130
142
  All nine of Botania's `builtin/entity` items are ported.
143
+
144
+ ### Ad Astra (1.20.1, Fabric)
145
+
146
+ Both vehicle `ItemRenderer`s pose identically: `Axis.ZP 180°` then `translate(0, -1.501, 0)`,
147
+ with no centring translate of their own. The jar is intermediary-mapped, which `extract.ts`
148
+ reads by rewriting the class ids. `RocketModel` holds all four tiers, so each spec names the
149
+ layer method to read.
150
+
151
+ | item | model class | layer method |
152
+ | --- | --- | --- |
153
+ | `tier_1_rocket` … `tier_4_rocket` | `RocketModel` | `createTier1Layer` … `createTier4Layer` |
154
+ | `tier_1_rover` | `RoverModel` | `createBodyLayer` |
@@ -1,8 +1,7 @@
1
1
  import { n as ResourceLocator } from "../locator-jDbdUeTd.js";
2
- import { a as ResourceManager } from "../manager-Ct0dEOMg.js";
3
- import { r as Texture } from "../loader-C4gsX_wO.js";
4
- import { t as AtlasResolver } from "../sources-sFtealLJ.js";
2
+ import { a as ResourceManager } from "../manager-Ey26G_3e.js";
3
+ import { r as Texture } from "../loader-CrPTL0zk.js";
4
+ import { t as AtlasResolver } from "../sources-ByuTQR_o.js";
5
5
  //#region src/atlas/registry.d.ts
6
- declare function loadAtlasResolver(resources: ResourceManager, loadTexture: (locator: ResourceLocator) => Promise<Texture | null>, onWarning?: (message: string) => void): Promise<AtlasResolver>;
7
- //#endregion
8
- export { loadAtlasResolver };
6
+ export declare function loadAtlasResolver(resources: ResourceManager, loadTexture: (locator: ResourceLocator) => Promise<Texture | null>, onWarning?: (message: string) => void): Promise<AtlasResolver>;
7
+ //#endregion
@@ -1,2 +1 @@
1
- import { t as loadAtlasResolver } from "../registry-DafxsAhG.js";
2
- export { loadAtlasResolver };
1
+ export { t as loadAtlasResolver } from "../registry-CNFi94eo.js";
@@ -1,2 +1,2 @@
1
- import { a as HasTexture, c as SingleAtlasSource, d as parseAtlasSources, i as DirectoryAtlasSource, l as UnstitchAtlasSource, n as AtlasSource, o as PalettedPermutationsSource, r as AtlasSourceError, s as ResolvedSprite, t as AtlasResolver, u as createAtlasResolver } from "../sources-sFtealLJ.js";
2
- export { AtlasResolver, AtlasSource, AtlasSourceError, DirectoryAtlasSource, HasTexture, PalettedPermutationsSource, ResolvedSprite, SingleAtlasSource, UnstitchAtlasSource, createAtlasResolver, parseAtlasSources };
1
+ import { a as DirectoryAtlasSource, c as ResolvedSprite, d as createAtlasResolver, f as parseAtlasSources, i as AtlasSourceError, l as SingleAtlasSource, n as AtlasSource, o as HasTexture, r as AtlasSourceEntry, s as PalettedPermutationsSource, t as AtlasResolver, u as UnstitchAtlasSource } from "../sources-ByuTQR_o.js";
2
+ export { AtlasResolver, AtlasSource, AtlasSourceEntry, AtlasSourceError, DirectoryAtlasSource, HasTexture, PalettedPermutationsSource, ResolvedSprite, SingleAtlasSource, UnstitchAtlasSource, createAtlasResolver, parseAtlasSources };
@@ -1,2 +1 @@
1
- import { a as UnstitchAtlasSource, i as SingleAtlasSource, n as DirectoryAtlasSource, o as createAtlasResolver, r as PalettedPermutationsSource, s as parseAtlasSources, t as AtlasSourceError } from "../sources-DYY5Qu-t.js";
2
- export { AtlasSourceError, DirectoryAtlasSource, PalettedPermutationsSource, SingleAtlasSource, UnstitchAtlasSource, createAtlasResolver, parseAtlasSources };
1
+ export { t as AtlasSourceError, n as DirectoryAtlasSource, r as PalettedPermutationsSource, i as SingleAtlasSource, a as UnstitchAtlasSource, o as createAtlasResolver, s as parseAtlasSources } from "../sources-BsEa9YPc.js";
@@ -1,4 +1,4 @@
1
- import { r as Texture } from "./loader-C4gsX_wO.js";
1
+ import { r as Texture } from "./loader-CrPTL0zk.js";
2
2
  //#region src/blocks/atlas-pack.d.ts
3
3
  interface PackEntry {
4
4
  /** Caller's identifier; carried through to the emitted rect. */
@@ -1,4 +1,4 @@
1
- import { r as compareVersions } from "./prepare-DkJkZXuQ.js";
1
+ import { r as compareVersions } from "./prepare-BC5PYUmn.js";
2
2
  //#region src/blocks/biomes.ts
3
3
  /**
4
4
  * Biome climate for the exported pack: what a renderer needs to colour grass,
@@ -1,4 +1,4 @@
1
- import { a as ResourceManager } from "./manager-Ct0dEOMg.js";
1
+ import { a as ResourceManager } from "./manager-Ey26G_3e.js";
2
2
  //#region src/blocks/biomes.d.ts
3
3
  /** Where a biome's colours come from. Colours are `#rrggbb`, as everywhere else in the pack. */
4
4
  interface BiomeClimate {
@@ -1,4 +1,4 @@
1
- import { r as Texture } from "./loader-C4gsX_wO.js";
1
+ import { r as Texture } from "./loader-CrPTL0zk.js";
2
2
  //#region src/render/blend.d.ts
3
3
  /** RGBA float pixels for render-time work; converted back to 8-bit at encode. */
4
4
  interface FloatTexture {
@@ -1,12 +1,12 @@
1
- import { n as BiomeClimatePack } from "./biomes-CnnhDCnk.js";
1
+ import { n as BiomeClimatePack } from "./biomes-_HZ93QNR.js";
2
2
  import { a as BlockStateMultipartCase, o as BlockStateVariantCase } from "./blockstate-eval-C-ZSx78w.js";
3
- import { r as TagPack, t as AdvancementPack } from "./datapack-CmEg0Vko.js";
3
+ import { r as TagPack, t as AdvancementPack } from "./datapack-DhBAuxw5.js";
4
4
  import { n as GameRulePack } from "./game-rules-ThvdDG3B.js";
5
- import { t as NamePack } from "./names-D1abAVIB.js";
6
- import { a as FaceDirectionName, l as Vec3, o as ModelElementJson, u as Vec4 } from "./types-qlp3I8_-.js";
7
- import { t as MeshGroup } from "./obj-mesh-CzL0lOlJ.js";
5
+ import { t as NamePack } from "./names-D30ZIXkK.js";
6
+ import { a as FaceDirectionName, l as Vec3, o as ModelElementJson, u as Vec4 } from "./types-BQQzfHEY.js";
7
+ import { t as MeshGroup } from "./obj-mesh-yN3ttPYf.js";
8
8
  import { n as BlockStatesPack } from "./states-OzneeCTU.js";
9
- import { n as BlockTintPack } from "./tints-DwFmEkf3.js";
9
+ import { n as BlockTintPack } from "./tints-CvHlfvDC.js";
10
10
  import { t as ClassFile } from "./classfile-Dzn0gW9M.js";
11
11
  //#region src/blocks/pack-format.d.ts
12
12
  /** How a sprite's alpha classifies it, inferred because assets rarely say. */
@@ -1,6 +1,6 @@
1
1
  import { n as ResourceLocator } from "./locator-COMEtEn9.js";
2
2
  import { t as overlaySheets } from "./overlay-BdHHd5WR.js";
3
- import { c as findEntityTexture, d as findMobTexture, l as findFluidSibling, m as resolveChestSheets, n as HEAD_LAYOUTS, o as findBedTexture, p as layerAccentSheet, t as DYE_COLORS, u as findFluidStill } from "./entity-textures-DG6NUNyp.js";
3
+ import { c as findEntityTexture, d as findMobTexture, l as findFluidSibling, m as resolveChestSheets, n as HEAD_LAYOUTS, o as findBedTexture, p as layerAccentSheet, t as DYE_COLORS, u as findFluidStill } from "./entity-textures-BS5dI5dz.js";
4
4
  //#region src/blocks/block-entities.ts
5
5
  /**
6
6
  * Geometry for blocks the game draws from Java rather than from a model.
@@ -1,4 +1,4 @@
1
- import { n as instructions } from "./entity-sizes-Dmr4w0vu.js";
1
+ import { n as instructions } from "./entity-sizes-CC6-7DBz.js";
2
2
  //#region src/blocks/block-overrides.ts
3
3
  /**
4
4
  * Where a block's own class answers a question itself, rather than leaving it to its `Properties`.
@@ -1,2 +1,2 @@
1
- import { a as PackedRect, i as PackedPage, n as PackOptions, o as packAtlas, r as PackedAtlas, t as PackEntry } from "../atlas-pack-BUadroKy.js";
1
+ import { a as PackedRect, i as PackedPage, n as PackOptions, o as packAtlas, r as PackedAtlas, t as PackEntry } from "../atlas-pack-Dxl3kwT2.js";
2
2
  export { PackEntry, PackOptions, PackedAtlas, PackedPage, PackedRect, packAtlas };
@@ -1,2 +1 @@
1
- import { t as packAtlas } from "../atlas-pack-CoOih7By.js";
2
- export { packAtlas };
1
+ export { t as packAtlas } from "../atlas-pack-CoOih7By.js";
@@ -1,2 +1,2 @@
1
- import { a as LegacyBiome, c as buildBiomeClimates, i as LEGACY_BIOMES, l as parseBiomeClimate, n as BiomeClimatePack, o as PRE_JAR_BIOMES, r as DEFAULT_WATER_COLOR, s as VANILLA_BIOME_CLIMATES, t as BiomeClimate, u as vanillaBiomesFor } from "../biomes-CnnhDCnk.js";
1
+ import { a as LegacyBiome, c as buildBiomeClimates, i as LEGACY_BIOMES, l as parseBiomeClimate, n as BiomeClimatePack, o as PRE_JAR_BIOMES, r as DEFAULT_WATER_COLOR, s as VANILLA_BIOME_CLIMATES, t as BiomeClimate, u as vanillaBiomesFor } from "../biomes-_HZ93QNR.js";
2
2
  export { BiomeClimate, BiomeClimatePack, DEFAULT_WATER_COLOR, LEGACY_BIOMES, LegacyBiome, PRE_JAR_BIOMES, VANILLA_BIOME_CLIMATES, buildBiomeClimates, parseBiomeClimate, vanillaBiomesFor };
@@ -1,2 +1 @@
1
- import { a as buildBiomeClimates, i as VANILLA_BIOME_CLIMATES, n as LEGACY_BIOMES, o as parseBiomeClimate, r as PRE_JAR_BIOMES, s as vanillaBiomesFor, t as DEFAULT_WATER_COLOR } from "../biomes-BGOF6gRM.js";
2
- export { DEFAULT_WATER_COLOR, LEGACY_BIOMES, PRE_JAR_BIOMES, VANILLA_BIOME_CLIMATES, buildBiomeClimates, parseBiomeClimate, vanillaBiomesFor };
1
+ export { t as DEFAULT_WATER_COLOR, n as LEGACY_BIOMES, r as PRE_JAR_BIOMES, i as VANILLA_BIOME_CLIMATES, a as buildBiomeClimates, o as parseBiomeClimate, s as vanillaBiomesFor } from "../biomes-DTmzQfnL.js";
@@ -1,2 +1,2 @@
1
- import { i as statedMapColor, n as PushReactionName, r as blockBehaviour, t as BlockBehaviour } from "../block-behaviour-B5lD0RfG.js";
1
+ import { i as statedMapColor, n as PushReactionName, r as blockBehaviour, t as BlockBehaviour } from "../block-behaviour-D6NwU9bV.js";
2
2
  export { BlockBehaviour, PushReactionName, blockBehaviour, statedMapColor };
@@ -1,2 +1 @@
1
- import { n as statedMapColor, t as blockBehaviour } from "../block-behaviour-DVjqeSkv.js";
2
- export { blockBehaviour, statedMapColor };
1
+ export { t as blockBehaviour, n as statedMapColor } from "../block-behaviour-DVjqeSkv.js";
@@ -1,19 +1,19 @@
1
- import { a as ResourceManager } from "../manager-Ct0dEOMg.js";
2
- import { i as TextureLoader } from "../loader-C4gsX_wO.js";
3
- import { t as ModelLoader } from "../loader-BYyPIs9f.js";
1
+ import { a as ResourceManager } from "../manager-Ey26G_3e.js";
2
+ import { i as TextureLoader } from "../loader-CrPTL0zk.js";
3
+ import { t as ModelLoader } from "../loader-mGAKSRp6.js";
4
4
  //#region src/blocks/block-entities.d.ts
5
5
  /**
6
6
  * What the table is allowed to look at. The vanilla families are a lookup, but
7
7
  * a mod's chest or mob head is only findable by searching its own assets, so
8
8
  * the table needs the pack in hand rather than just the block's name.
9
9
  */
10
- interface GeometryContext {
10
+ export interface GeometryContext {
11
11
  resources: ResourceManager;
12
12
  textures: TextureLoader;
13
13
  models: ModelLoader;
14
14
  }
15
15
  /** How a block's own properties turn into a rotation of the vendored model. */
16
- type Orientation =
16
+ export type Orientation =
17
17
  /** One shape, no property to read. */
18
18
  {
19
19
  kind: 'fixed';
@@ -34,7 +34,7 @@ type Orientation =
34
34
  {
35
35
  kind: 'rotation16';
36
36
  };
37
- interface BlockEntityShape {
37
+ export interface BlockEntityShape {
38
38
  /** Vendored model drawn in place of the empty one. */
39
39
  model: string;
40
40
  /**
@@ -51,7 +51,7 @@ interface BlockEntityShape {
51
51
  */
52
52
  translate?: [number, number, number];
53
53
  }
54
- interface BlockEntityGeometry {
54
+ export interface BlockEntityGeometry {
55
55
  /** Usually one; more where a property picks between shapes. */
56
56
  shapes: BlockEntityShape[];
57
57
  /** Texture variables to bind where the vendored model leaves them open. */
@@ -72,8 +72,8 @@ interface BlockEntityGeometry {
72
72
  * that came out empty by accident, so a consumer can tell a deliberate hole
73
73
  * from a gap in this exporter.
74
74
  */
75
- declare const INVISIBLE_BLOCKS: Record<string, string>;
76
- interface SynthesizedVariant {
75
+ export declare const INVISIBLE_BLOCKS: Record<string, string>;
76
+ export interface SynthesizedVariant {
77
77
  when: Record<string, string>;
78
78
  x: number;
79
79
  y: number;
@@ -83,11 +83,10 @@ interface SynthesizedVariant {
83
83
  * block can be placed in, so a consumer holding the real property map from the
84
84
  * chunk finds the case the game would have used.
85
85
  */
86
- declare function synthesizeVariants(orient: Orientation): SynthesizedVariant[];
86
+ export declare function synthesizeVariants(orient: Orientation): SynthesizedVariant[];
87
87
  /**
88
88
  * The vendored geometry for a block the game draws in code, or null when there
89
89
  * is none and the block stays empty.
90
90
  */
91
- declare function blockEntityGeometry(blockId: string, context: GeometryContext): Promise<BlockEntityGeometry | null>;
92
- //#endregion
93
- export { BlockEntityGeometry, BlockEntityShape, GeometryContext, INVISIBLE_BLOCKS, Orientation, SynthesizedVariant, blockEntityGeometry, synthesizeVariants };
91
+ export declare function blockEntityGeometry(blockId: string, context: GeometryContext): Promise<BlockEntityGeometry | null>;
92
+ //#endregion
@@ -1,2 +1 @@
1
- import { n as blockEntityGeometry, r as synthesizeVariants, t as INVISIBLE_BLOCKS } from "../block-entities-C807EY2I.js";
2
- export { INVISIBLE_BLOCKS, blockEntityGeometry, synthesizeVariants };
1
+ export { t as INVISIBLE_BLOCKS, n as blockEntityGeometry, r as synthesizeVariants } from "../block-entities-Dp3rMxWq.js";
@@ -1,26 +1,25 @@
1
- import { d as MemberReference } from "../block-behaviour-B5lD0RfG.js";
1
+ import { d as MemberReference } from "../block-behaviour-D6NwU9bV.js";
2
2
  import { t as ClassFile } from "../classfile-Dzn0gW9M.js";
3
3
  //#region src/blocks/block-overrides.d.ts
4
- interface OverrideSource {
4
+ export interface OverrideSource {
5
5
  resolve: (internalName: string) => ClassFile | null;
6
6
  /** A member's original name, for a jar that spells the game's own obfuscated. */
7
7
  nameOf: (reference: MemberReference, field: boolean) => string;
8
8
  }
9
9
  /** The nearest override of one of `names` above `blockType`, or null where only the base declares it. */
10
- declare function overrideOf(source: OverrideSource, blockType: string, names: readonly string[]): MemberReference | null;
10
+ export declare function overrideOf(source: OverrideSource, blockType: string, names: readonly string[]): MemberReference | null;
11
11
  /**
12
12
  * The constants an override reads, by original name, and whether it reads a block property: enough to
13
13
  * answer from its code without running it. Kelp's `getFluidState` reads `Fluids.WATER` and nothing
14
14
  * else; a barrier's `getRenderShape` reads `RenderShape.INVISIBLE`. One that reads a property
15
15
  * (`waterlogged`) answers per state, which the state already says.
16
16
  */
17
- declare function constantsReadBy(source: OverrideSource, method: MemberReference): {
17
+ export declare function constantsReadBy(source: OverrideSource, method: MemberReference): {
18
18
  statics: Set<string>;
19
19
  readsState: boolean;
20
20
  } | null;
21
21
  /** The fluid an override of `getFluidState` holds in every state, or null where it depends on one. */
22
- declare function constantFluidOf(source: OverrideSource, method: MemberReference): 'water' | 'lava' | null;
22
+ export declare function constantFluidOf(source: OverrideSource, method: MemberReference): 'water' | 'lava' | null;
23
23
  /** Whether an override of `getRenderShape` always answers `INVISIBLE`, as a barrier's and a light block's do. */
24
- declare function alwaysInvisible(source: OverrideSource, method: MemberReference): boolean;
25
- //#endregion
26
- export { OverrideSource, alwaysInvisible, constantFluidOf, constantsReadBy, overrideOf };
24
+ export declare function alwaysInvisible(source: OverrideSource, method: MemberReference): boolean;
25
+ //#endregion
@@ -1,2 +1 @@
1
- import { i as overrideOf, n as constantFluidOf, r as constantsReadBy, t as alwaysInvisible } from "../block-overrides-BhuJIxKC.js";
2
- export { alwaysInvisible, constantFluidOf, constantsReadBy, overrideOf };
1
+ export { t as alwaysInvisible, n as constantFluidOf, r as constantsReadBy, i as overrideOf } from "../block-overrides-DMzzzeq_.js";
@@ -1,2 +1 @@
1
- import { a as parseBlockState, i as matchesCondition, n as collectModels, o as weightedVariantIndex, r as evaluateBlockState, t as BlockStateError } from "../blockstate-eval-CcgxVdKb.js";
2
- export { BlockStateError, collectModels, evaluateBlockState, matchesCondition, parseBlockState, weightedVariantIndex };
1
+ export { t as BlockStateError, n as collectModels, r as evaluateBlockState, i as matchesCondition, a as parseBlockState, o as weightedVariantIndex } from "../blockstate-eval-Cu-9TWH0.js";
@@ -4,6 +4,5 @@
4
4
  * handling (download a version's jar, or read asset folders, plus mod jars) but
5
5
  * emitting geometry and an atlas instead of icons.
6
6
  */
7
- declare function runBlocksCli(argv: string[]): Promise<number>;
8
- //#endregion
9
- export { runBlocksCli };
7
+ export declare function runBlocksCli(argv: string[]): Promise<number>;
8
+ //#endregion
@@ -1,2 +1 @@
1
- import { t as runBlocksCli } from "../cli-BUQzP6YF.js";
2
- export { runBlocksCli };
1
+ export { t as runBlocksCli } from "../cli-CeEAmdX9.js";
@@ -1,2 +1,2 @@
1
- import { i as collectDatapack, n as DatapackResult, r as TagPack, t as AdvancementPack } from "../datapack-CmEg0Vko.js";
1
+ import { i as collectDatapack, n as DatapackResult, r as TagPack, t as AdvancementPack } from "../datapack-DhBAuxw5.js";
2
2
  export { AdvancementPack, DatapackResult, TagPack, collectDatapack };
@@ -1,2 +1 @@
1
- import { t as collectDatapack } from "../datapack-D6eH46ay.js";
2
- export { collectDatapack };
1
+ export { t as collectDatapack } from "../datapack-BZpO7nv-.js";
@@ -1,10 +1,9 @@
1
- import { a as ResourceManager } from "../manager-Ct0dEOMg.js";
2
- import { P as BlockPackModel } from "../block-behaviour-B5lD0RfG.js";
1
+ import { a as ResourceManager } from "../manager-Ey26G_3e.js";
2
+ import { P as BlockPackModel } from "../block-behaviour-D6NwU9bV.js";
3
3
  //#region src/blocks/ender-storage.d.ts
4
4
  /**
5
5
  * Ender Storage feeds this OBJ through CodeChickenLib's `swapYZ`, translates it almost exactly onto
6
6
  * the block centre, and takes a backfaced copy so its glass/frame can be seen from either side.
7
7
  */
8
- declare function enderStorageBlockModel(blockId: string, resources: ResourceManager): Promise<BlockPackModel | null>;
9
- //#endregion
10
- export { enderStorageBlockModel };
8
+ export declare function enderStorageBlockModel(blockId: string, resources: ResourceManager): Promise<BlockPackModel | null>;
9
+ //#endregion
@@ -1,2 +1 @@
1
- import { t as enderStorageBlockModel } from "../ender-storage-CKDiYgYc.js";
2
- export { enderStorageBlockModel };
1
+ export { t as enderStorageBlockModel } from "../ender-storage-COyXL-I4.js";
@@ -1,8 +1,8 @@
1
- import { a as ResourceManager } from "../manager-Ct0dEOMg.js";
2
- import { i as TextureLoader } from "../loader-C4gsX_wO.js";
3
- import { q as EntityPackEntry } from "../block-behaviour-B5lD0RfG.js";
1
+ import { a as ResourceManager } from "../manager-Ey26G_3e.js";
2
+ import { i as TextureLoader } from "../loader-CrPTL0zk.js";
3
+ import { q as EntityPackEntry } from "../block-behaviour-D6NwU9bV.js";
4
4
  //#region src/blocks/entities.d.ts
5
- interface EntityPackResult {
5
+ export interface EntityPackResult {
6
6
  entities: Record<string, EntityPackEntry>;
7
7
  failures: Array<{
8
8
  id: string;
@@ -15,16 +15,15 @@ interface EntityPackResult {
15
15
  * Keys with more segments than `<prefix>.<ns>.<name>` are dropped: those are a variant's own label
16
16
  * (`entity.minecraft.villager.farmer`) or a death message, never a type.
17
17
  */
18
- declare function entityTypesOf(resources: ResourceManager, namespace: string): Promise<Array<{
18
+ export declare function entityTypesOf(resources: ResourceManager, namespace: string): Promise<Array<{
19
19
  id: string;
20
20
  name: string;
21
21
  }>>;
22
- interface CollectEntitiesOptions {
22
+ export interface CollectEntitiesOptions {
23
23
  resources: ResourceManager;
24
24
  textures: TextureLoader;
25
25
  namespaces: readonly string[];
26
26
  onProgress?: (done: number, total: number) => void;
27
27
  }
28
- declare function collectEntities(options: CollectEntitiesOptions): Promise<EntityPackResult>;
29
- //#endregion
30
- export { CollectEntitiesOptions, EntityPackResult, collectEntities, entityTypesOf };
28
+ export declare function collectEntities(options: CollectEntitiesOptions): Promise<EntityPackResult>;
29
+ //#endregion
@@ -1,2 +1 @@
1
- import { n as entityTypesOf, t as collectEntities } from "../entities-rQ4TZjEo.js";
2
- export { collectEntities, entityTypesOf };
1
+ export { t as collectEntities, n as entityTypesOf } from "../entities-4UMp3qXG.js";
@@ -1,7 +1,7 @@
1
- import { a as ResourceManager } from "../manager-Ct0dEOMg.js";
1
+ import { a as ResourceManager } from "../manager-Ey26G_3e.js";
2
2
  import { r as ExtractedModel } from "../model-PnQ4gV0-.js";
3
3
  //#region src/blocks/entity-geo.d.ts
4
- interface GeoEntityModel {
4
+ export interface GeoEntityModel {
5
5
  /** Model id: the resource that produced it, which is also what makes it unique in the pack. */
6
6
  id: string;
7
7
  model: ExtractedModel;
@@ -13,6 +13,5 @@ interface GeoEntityModel {
13
13
  * `assets/occultism/geo/entity/afrit.geo.json` and its neighbours. Nothing is inferred from the
14
14
  * *class* here: a GeckoLib mob has no model class to inspect.
15
15
  */
16
- declare function findGeoForEntity(resources: ResourceManager, namespace: string, name: string): Promise<GeoEntityModel | null>;
17
- //#endregion
18
- export { GeoEntityModel, findGeoForEntity };
16
+ export declare function findGeoForEntity(resources: ResourceManager, namespace: string, name: string): Promise<GeoEntityModel | null>;
17
+ //#endregion
@@ -1,2 +1 @@
1
- import { t as findGeoForEntity } from "../entity-geo-DcrcN8TE.js";
2
- export { findGeoForEntity };
1
+ export { t as findGeoForEntity } from "../entity-geo-vJTSO0bB.js";
@@ -1,10 +1,10 @@
1
- import { a as ResourceManager } from "../manager-Ct0dEOMg.js";
1
+ import { a as ResourceManager } from "../manager-Ey26G_3e.js";
2
2
  import { t as ClassSource } from "../jar-classes-CSRrPAUy.js";
3
- import { J as EntityPackModel, X as EquipmentPack } from "../block-behaviour-B5lD0RfG.js";
3
+ import { J as EntityPackModel, X as EquipmentPack } from "../block-behaviour-D6NwU9bV.js";
4
4
  import { t as Mappings } from "../mappings-DhOPQTgV.js";
5
5
  import { t as ModelCode } from "../model-code-BclYt1do.js";
6
6
  //#region src/blocks/entity-models.d.ts
7
- interface EntityGeometryResult {
7
+ export interface EntityGeometryResult {
8
8
  /** Model id (the class it came from) → geometry. */
9
9
  models: Record<string, EntityPackModel>;
10
10
  /** Entity id → model id, for the entity table to point with. */
@@ -18,7 +18,7 @@ interface EntityGeometryResult {
18
18
  reason: string;
19
19
  }>;
20
20
  }
21
- interface CollectEntityGeometryOptions {
21
+ export interface CollectEntityGeometryOptions {
22
22
  version: string;
23
23
  /** Where mappings cache; the same directory the jars do. */
24
24
  cacheDir: string;
@@ -44,7 +44,7 @@ interface CollectEntityGeometryOptions {
44
44
  * is obfuscated *and* unmapped — 1.13.x — yields nothing, with the reason recorded once rather than
45
45
  * per entity.
46
46
  */
47
- declare function collectEntityGeometry(options: CollectEntityGeometryOptions): Promise<EntityGeometryResult>;
47
+ export declare function collectEntityGeometry(options: CollectEntityGeometryOptions): Promise<EntityGeometryResult>;
48
48
  /**
49
49
  * Reads the authored armour-trim atlas and names every generated worn sheet.
50
50
  *
@@ -52,7 +52,6 @@ declare function collectEntityGeometry(options: CollectEntityGeometryOptions): P
52
52
  * sprite ids so the normal entity-atlas stitcher asks it for those pixels. Copies are visited from
53
53
  * lowest to highest precedence, matching atlas source resolution when packs extend the vanilla file.
54
54
  */
55
- declare function collectArmourTrims(resources: ResourceManager, spriteIds: Set<string>): Promise<EquipmentPack['trims']>;
56
- declare function collectEquipment(names: readonly string[], mappings: Mappings, read: (internal: string) => Promise<Uint8Array | null>, code: ModelCode, resources: ResourceManager | undefined, models: Record<string, EntityPackModel>, spriteIds: Set<string>): Promise<EquipmentPack | null>;
57
- //#endregion
58
- export { CollectEntityGeometryOptions, EntityGeometryResult, collectArmourTrims, collectEntityGeometry, collectEquipment };
55
+ export declare function collectArmourTrims(resources: ResourceManager, spriteIds: Set<string>): Promise<EquipmentPack['trims']>;
56
+ export declare function collectEquipment(names: readonly string[], mappings: Mappings, read: (internal: string) => Promise<Uint8Array | null>, code: ModelCode, resources: ResourceManager | undefined, models: Record<string, EntityPackModel>, spriteIds: Set<string>): Promise<EquipmentPack | null>;
57
+ //#endregion
@@ -1,2 +1 @@
1
- import { n as collectEntityGeometry, r as collectEquipment, t as collectArmourTrims } from "../entity-models-D6AMLAy6.js";
2
- export { collectArmourTrims, collectEntityGeometry, collectEquipment };
1
+ export { t as collectArmourTrims, n as collectEntityGeometry, r as collectEquipment } from "../entity-models-CleLnlV4.js";
@@ -6,8 +6,8 @@ interface Instruction {
6
6
  index: number;
7
7
  }
8
8
  /** Every instruction of a method, in order. */
9
- declare function instructions(code: Uint8Array): Generator<Instruction>;
10
- interface EntitySizeResult {
9
+ export declare function instructions(code: Uint8Array): Generator<Instruction>;
10
+ export interface EntitySizeResult {
11
11
  /** Entity id → [width, height], in blocks. */
12
12
  sizes: Map<string, [number, number]>;
13
13
  failures: Array<{
@@ -15,11 +15,11 @@ interface EntitySizeResult {
15
15
  reason: string;
16
16
  }>;
17
17
  }
18
- declare function collectEntitySizes(options: {
18
+ export declare function collectEntitySizes(options: {
19
19
  classes: ClassSource;
20
20
  version: string;
21
21
  cacheDir: string;
22
22
  entityIds: readonly string[];
23
23
  }): Promise<EntitySizeResult>;
24
24
  //#endregion
25
- export { EntitySizeResult, collectEntitySizes, instructions };
25
+ export {};
@@ -1,2 +1 @@
1
- import { n as instructions, t as collectEntitySizes } from "../entity-sizes-Dmr4w0vu.js";
2
- export { collectEntitySizes, instructions };
1
+ export { t as collectEntitySizes, n as instructions } from "../entity-sizes-CC6-7DBz.js";
@@ -1,2 +1,2 @@
1
- import { i as exportBlockPack, n as BlockPackResult, r as ExportBlockPackOptions, t as BlockPackFailure } from "../export-CnKiSTiu.js";
1
+ import { i as exportBlockPack, n as BlockPackResult, r as ExportBlockPackOptions, t as BlockPackFailure } from "../export-BL_3VVZI.js";
2
2
  export { BlockPackFailure, BlockPackResult, ExportBlockPackOptions, exportBlockPack };
@@ -1,2 +1 @@
1
- import { t as exportBlockPack } from "../export-DE1V-ElS.js";
2
- export { exportBlockPack };
1
+ export { t as exportBlockPack } from "../export-BPH-b4LT.js";