@nodecraft/rendermite 1.0.6 → 1.1.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 (171) hide show
  1. package/assets/README.md +6 -2
  2. package/assets/builtin/renderchest/models/item/trident.json +372 -0
  3. package/assets/builtin-legacy/renderchest/models/item/trident.json +372 -0
  4. package/assets/mod-models/README.md +130 -0
  5. package/assets/mod-models/ad_astra/models/item/tier_1_rocket.json +4559 -0
  6. package/assets/mod-models/ad_astra/models/item/tier_1_rover.json +6021 -0
  7. package/assets/mod-models/ad_astra/models/item/tier_2_rocket.json +6832 -0
  8. package/assets/mod-models/ad_astra/models/item/tier_3_rocket.json +8522 -0
  9. package/assets/mod-models/ad_astra/models/item/tier_4_rocket.json +7498 -0
  10. package/assets/mod-models/botania/models/item/avatar.json +574 -0
  11. package/assets/mod-models/botania/models/item/bellows.json +423 -0
  12. package/assets/mod-models/botania/models/item/brewery.json +894 -0
  13. package/assets/mod-models/botania/models/item/corporea_index.json +349 -0
  14. package/assets/mod-models/botania/models/item/gaia_pylon.json +1057 -0
  15. package/assets/mod-models/botania/models/item/hourglass.json +502 -0
  16. package/assets/mod-models/botania/models/item/mana_pylon.json +741 -0
  17. package/assets/mod-models/botania/models/item/natura_pylon.json +1057 -0
  18. package/assets/mod-models/botania/models/item/teru_teru_bozu.json +347 -0
  19. package/assets/mod-models/mekanism/models/item/atomic_disassembler.json +1391 -0
  20. package/assets/mod-models/mekanism/models/item/flamethrower.json +1926 -0
  21. package/assets/mod-models/mekanism/models/item/free_runners.json +595 -0
  22. package/assets/mod-models/mekanism/models/item/jetpack.json +1767 -0
  23. package/assets/mod-models/mekanism/models/item/scuba_mask.json +2305 -0
  24. package/assets/mod-models/mekanism/models/item/scuba_tank.json +833 -0
  25. package/assets/mod-tints/README.md +19 -0
  26. package/assets/mod-tints/mysticalagriculture/items/absorption_i_augment.json +16 -0
  27. package/assets/mod-tints/mysticalagriculture/items/absorption_ii_augment.json +16 -0
  28. package/assets/mod-tints/mysticalagriculture/items/absorption_iii_augment.json +16 -0
  29. package/assets/mod-tints/mysticalagriculture/items/absorption_iv_augment.json +16 -0
  30. package/assets/mod-tints/mysticalagriculture/items/absorption_v_augment.json +16 -0
  31. package/assets/mod-tints/mysticalagriculture/items/attack_aoe_i_augment.json +16 -0
  32. package/assets/mod-tints/mysticalagriculture/items/attack_aoe_ii_augment.json +16 -0
  33. package/assets/mod-tints/mysticalagriculture/items/attack_aoe_iii_augment.json +16 -0
  34. package/assets/mod-tints/mysticalagriculture/items/blindness_resistance_augment.json +16 -0
  35. package/assets/mod-tints/mysticalagriculture/items/fire_resistance_augment.json +16 -0
  36. package/assets/mod-tints/mysticalagriculture/items/flight_augment.json +16 -0
  37. package/assets/mod-tints/mysticalagriculture/items/haste_i_augment.json +16 -0
  38. package/assets/mod-tints/mysticalagriculture/items/haste_ii_augment.json +16 -0
  39. package/assets/mod-tints/mysticalagriculture/items/haste_iii_augment.json +16 -0
  40. package/assets/mod-tints/mysticalagriculture/items/health_boost_i_augment.json +16 -0
  41. package/assets/mod-tints/mysticalagriculture/items/health_boost_ii_augment.json +16 -0
  42. package/assets/mod-tints/mysticalagriculture/items/health_boost_iii_augment.json +16 -0
  43. package/assets/mod-tints/mysticalagriculture/items/health_boost_iv_augment.json +16 -0
  44. package/assets/mod-tints/mysticalagriculture/items/health_boost_v_augment.json +16 -0
  45. package/assets/mod-tints/mysticalagriculture/items/hunger_resistance_augment.json +16 -0
  46. package/assets/mod-tints/mysticalagriculture/items/jump_boost_i_augment.json +16 -0
  47. package/assets/mod-tints/mysticalagriculture/items/jump_boost_ii_augment.json +16 -0
  48. package/assets/mod-tints/mysticalagriculture/items/jump_boost_iii_augment.json +16 -0
  49. package/assets/mod-tints/mysticalagriculture/items/luck_i_augment.json +16 -0
  50. package/assets/mod-tints/mysticalagriculture/items/luck_ii_augment.json +16 -0
  51. package/assets/mod-tints/mysticalagriculture/items/luck_iii_augment.json +16 -0
  52. package/assets/mod-tints/mysticalagriculture/items/mining_aoe_i_augment.json +16 -0
  53. package/assets/mod-tints/mysticalagriculture/items/mining_aoe_ii_augment.json +16 -0
  54. package/assets/mod-tints/mysticalagriculture/items/mining_aoe_iii_augment.json +16 -0
  55. package/assets/mod-tints/mysticalagriculture/items/mining_aoe_iv_augment.json +16 -0
  56. package/assets/mod-tints/mysticalagriculture/items/mining_fatigue_resistance_augment.json +16 -0
  57. package/assets/mod-tints/mysticalagriculture/items/nausea_resistance_augment.json +16 -0
  58. package/assets/mod-tints/mysticalagriculture/items/night_vision_augment.json +16 -0
  59. package/assets/mod-tints/mysticalagriculture/items/pathing_aoe_i_augment.json +16 -0
  60. package/assets/mod-tints/mysticalagriculture/items/pathing_aoe_ii_augment.json +16 -0
  61. package/assets/mod-tints/mysticalagriculture/items/pathing_aoe_iii_augment.json +16 -0
  62. package/assets/mod-tints/mysticalagriculture/items/pathing_aoe_iv_augment.json +16 -0
  63. package/assets/mod-tints/mysticalagriculture/items/poison_resistance_augment.json +16 -0
  64. package/assets/mod-tints/mysticalagriculture/items/slow_falling_augment.json +16 -0
  65. package/assets/mod-tints/mysticalagriculture/items/slowness_resistance_augment.json +16 -0
  66. package/assets/mod-tints/mysticalagriculture/items/speed_i_augment.json +16 -0
  67. package/assets/mod-tints/mysticalagriculture/items/speed_ii_augment.json +16 -0
  68. package/assets/mod-tints/mysticalagriculture/items/speed_iii_augment.json +16 -0
  69. package/assets/mod-tints/mysticalagriculture/items/step_assist_augment.json +16 -0
  70. package/assets/mod-tints/mysticalagriculture/items/strength_i_augment.json +16 -0
  71. package/assets/mod-tints/mysticalagriculture/items/strength_ii_augment.json +16 -0
  72. package/assets/mod-tints/mysticalagriculture/items/strength_iii_augment.json +16 -0
  73. package/assets/mod-tints/mysticalagriculture/items/tilling_aoe_i_augment.json +16 -0
  74. package/assets/mod-tints/mysticalagriculture/items/tilling_aoe_ii_augment.json +16 -0
  75. package/assets/mod-tints/mysticalagriculture/items/tilling_aoe_iii_augment.json +16 -0
  76. package/assets/mod-tints/mysticalagriculture/items/tilling_aoe_iv_augment.json +16 -0
  77. package/assets/mod-tints/mysticalagriculture/items/water_breathing_augment.json +16 -0
  78. package/assets/mod-tints/mysticalagriculture/items/weakness_resistance_augment.json +16 -0
  79. package/assets/mod-tints/mysticalagriculture/items/wither_resistance_augment.json +16 -0
  80. package/dist/atlas/registry.js +1 -1
  81. package/dist/blend-8lnfxtLe.d.ts +79 -0
  82. package/dist/blend-KXMclcHk.js +199 -0
  83. package/dist/blockstate-CdstnW2-.js +104 -0
  84. package/dist/{builtin-caYjESh0.js → builtin-WkWjATeh.js} +5 -1
  85. package/dist/builtin.d.ts +3 -1
  86. package/dist/builtin.js +2 -2
  87. package/dist/cli.js +5 -3
  88. package/dist/{compose-CQCb2LVv.js → compose-BGsNFR12.js} +1 -1
  89. package/dist/{definition-3MBm8ar_.js → definition-ColsvWrH.js} +20 -1
  90. package/dist/{definition-BwX6Xxv0.d.ts → definition-ricL7Jqf.d.ts} +2 -0
  91. package/dist/{discovery-0SM0cTLw.js → discovery-B9aqV_Rz.js} +13 -3
  92. package/dist/{discovery-wiJBGryo.d.ts → discovery-BPSUtdm4.d.ts} +1 -1
  93. package/dist/{encode-DaNQF28M.d.ts → encode-DNcXXvYe.d.ts} +1 -1
  94. package/dist/{encode-D6dQu2dJ.js → encode-LR9wxigC.js} +28 -12
  95. package/dist/{entity-fallback-BRCeGKBT.js → entity-fallback-BnFMSHS6.js} +180 -10
  96. package/dist/{face-DmCiHUd5.js → face-CMJ3b3Ae.js} +44 -18
  97. package/dist/face-cQ-pVHoe.d.ts +44 -0
  98. package/dist/{fluid-bucket-D-GpUQjg.js → fluid-bucket-BzoLofB_.js} +7 -2
  99. package/dist/{geo-Diky41Tw.js → geo-w9HHIrb5.js} +87 -13
  100. package/dist/{geometry-uIDha8S4.js → geometry-Bi-Bf5rb.js} +7 -1
  101. package/dist/{geometry-BSVmKx5b.d.ts → geometry-w0yQbzDZ.d.ts} +5 -1
  102. package/dist/index.d.ts +9 -9
  103. package/dist/index.js +10 -10
  104. package/dist/items/blockstate.d.ts +23 -0
  105. package/dist/items/blockstate.js +2 -0
  106. package/dist/items/definition.d.ts +1 -1
  107. package/dist/items/definition.js +1 -1
  108. package/dist/items/discovery.d.ts +1 -1
  109. package/dist/items/discovery.js +1 -1
  110. package/dist/{loader-D22zZME7.d.ts → loader-DD83d80u.d.ts} +2 -1
  111. package/dist/{loader-B8NJO7pR.js → loader-DwkA9LR5.js} +267 -15
  112. package/dist/{loader-CfXMxcEV.js → loader-Lb0ZeILz.js} +19 -7
  113. package/dist/models/loader.d.ts +1 -1
  114. package/dist/models/loader.js +1 -1
  115. package/dist/models/types.d.ts +1 -1
  116. package/dist/models-BKxGkPS7.js +18 -0
  117. package/dist/mods/models.d.ts +5 -0
  118. package/dist/mods/models.js +2 -0
  119. package/dist/mods/prepare.d.ts +1 -1
  120. package/dist/mods/prepare.js +1 -1
  121. package/dist/mods/tints.js +1 -1
  122. package/dist/output/encode.d.ts +1 -1
  123. package/dist/output/encode.js +1 -1
  124. package/dist/{pipeline-BIk1RRIp.js → pipeline-BVYj7OP0.js} +72 -19
  125. package/dist/{pipeline-zq-yU3Te.d.ts → pipeline-CJNiQG-1.d.ts} +15 -5
  126. package/dist/{prepare-BESRrh6K.js → prepare-D56Z-9cg.js} +7 -2
  127. package/dist/{prepare-CPxO0kKz.d.ts → prepare-Dce7-HAe.d.ts} +8 -0
  128. package/dist/{rasterizer-yqJkicm1.d.ts → rasterizer-BSQHEhJ-.d.ts} +4 -2
  129. package/dist/{rasterizer-76qO8TDh.js → rasterizer-DcVJzkxz.js} +13 -5
  130. package/dist/{registry-B9TcjVbs.js → registry-DS5PZ57l.js} +8 -1
  131. package/dist/render/blend.d.ts +2 -2
  132. package/dist/render/blend.js +2 -2
  133. package/dist/render/compose.d.ts +2 -2
  134. package/dist/render/compose.js +1 -1
  135. package/dist/render/entity-fallback.d.ts +19 -5
  136. package/dist/render/entity-fallback.js +2 -2
  137. package/dist/render/face.d.ts +2 -2
  138. package/dist/render/face.js +2 -2
  139. package/dist/render/fluid-bucket.js +1 -1
  140. package/dist/render/geo.d.ts +3 -3
  141. package/dist/render/geo.js +1 -1
  142. package/dist/render/geometry.d.ts +1 -1
  143. package/dist/render/geometry.js +1 -1
  144. package/dist/render/legacy-tints.d.ts +1 -1
  145. package/dist/render/obj.d.ts +5 -3
  146. package/dist/render/obj.js +1 -1
  147. package/dist/render/pipeline.d.ts +1 -1
  148. package/dist/render/pipeline.js +1 -1
  149. package/dist/render/rasterizer.d.ts +1 -1
  150. package/dist/render/rasterizer.js +1 -1
  151. package/dist/render/renderer.d.ts +1 -1
  152. package/dist/render/renderer.js +1 -1
  153. package/dist/render/tints.d.ts +1 -1
  154. package/dist/render/tints.js +1 -1
  155. package/dist/{renderer-DVsZHAvf.d.ts → renderer-C79EQDSn.d.ts} +3 -3
  156. package/dist/{renderer-CjT19tHd.js → renderer-oi1MSF3Y.js} +36 -19
  157. package/dist/{run-BnICOF4I.js → run-C6AP3Bn8.js} +3 -3
  158. package/dist/{run-CKUtynTy.d.ts → run-uq8_hUx9.d.ts} +1 -1
  159. package/dist/run.d.ts +2 -2
  160. package/dist/run.js +2 -2
  161. package/dist/textures/loader.js +1 -1
  162. package/dist/{tints-BtbHegpI.js → tints-3VI_2SNy.js} +107 -1
  163. package/dist/{tints-B8UJmZMu.js → tints-CebmvjmP.js} +2 -2
  164. package/dist/{tints-DLBExVWN.d.ts → tints-Do9Sh3dg.d.ts} +2 -2
  165. package/dist/{types-COGbtA1t.d.ts → types-DpRSF9Vj.d.ts} +8 -0
  166. package/dist/workers/render-worker.d.ts +1 -1
  167. package/dist/workers/render-worker.js +1 -1
  168. package/package.json +1 -1
  169. package/dist/blend-CHP2-j9U.js +0 -90
  170. package/dist/blend-CyDIxCne.d.ts +0 -36
  171. package/dist/face-BIYg14TE.d.ts +0 -30
@@ -0,0 +1,372 @@
1
+ {
2
+ "credit": "Hand-modeled after the vanilla TridentModel",
3
+ "texture_size": [
4
+ 32,
5
+ 32
6
+ ],
7
+ "textures": {
8
+ "texture": "entity/trident"
9
+ },
10
+ "gui_light": "front",
11
+ "elements": [
12
+ {
13
+ "from": [
14
+ 7.5,
15
+ -7.5,
16
+ 7.5
17
+ ],
18
+ "to": [
19
+ 8.5,
20
+ 17.5,
21
+ 8.5
22
+ ],
23
+ "faces": {
24
+ "down": {
25
+ "uv": [
26
+ 0.5,
27
+ 3,
28
+ 1,
29
+ 3.5
30
+ ],
31
+ "texture": "#texture"
32
+ },
33
+ "up": {
34
+ "uv": [
35
+ 1,
36
+ 3.5,
37
+ 1.5,
38
+ 3
39
+ ],
40
+ "texture": "#texture"
41
+ },
42
+ "west": {
43
+ "uv": [
44
+ 0,
45
+ 3.5,
46
+ 0.5,
47
+ 16
48
+ ],
49
+ "texture": "#texture"
50
+ },
51
+ "north": {
52
+ "uv": [
53
+ 0.5,
54
+ 3.5,
55
+ 1,
56
+ 16
57
+ ],
58
+ "texture": "#texture"
59
+ },
60
+ "east": {
61
+ "uv": [
62
+ 1,
63
+ 3.5,
64
+ 1.5,
65
+ 16
66
+ ],
67
+ "texture": "#texture"
68
+ },
69
+ "south": {
70
+ "uv": [
71
+ 1.5,
72
+ 3.5,
73
+ 2,
74
+ 16
75
+ ],
76
+ "texture": "#texture"
77
+ }
78
+ }
79
+ },
80
+ {
81
+ "from": [
82
+ 6.5,
83
+ 17.5,
84
+ 7.5
85
+ ],
86
+ "to": [
87
+ 9.5,
88
+ 19.5,
89
+ 8.5
90
+ ],
91
+ "faces": {
92
+ "down": {
93
+ "uv": [
94
+ 2.5,
95
+ 0,
96
+ 4,
97
+ 0.5
98
+ ],
99
+ "texture": "#texture"
100
+ },
101
+ "up": {
102
+ "uv": [
103
+ 4,
104
+ 0.5,
105
+ 5.5,
106
+ 0
107
+ ],
108
+ "texture": "#texture"
109
+ },
110
+ "west": {
111
+ "uv": [
112
+ 2,
113
+ 0.5,
114
+ 2.5,
115
+ 1.5
116
+ ],
117
+ "texture": "#texture"
118
+ },
119
+ "north": {
120
+ "uv": [
121
+ 2.5,
122
+ 0.5,
123
+ 4,
124
+ 1.5
125
+ ],
126
+ "texture": "#texture"
127
+ },
128
+ "east": {
129
+ "uv": [
130
+ 4,
131
+ 0.5,
132
+ 4.5,
133
+ 1.5
134
+ ],
135
+ "texture": "#texture"
136
+ },
137
+ "south": {
138
+ "uv": [
139
+ 4.5,
140
+ 0.5,
141
+ 6,
142
+ 1.5
143
+ ],
144
+ "texture": "#texture"
145
+ }
146
+ }
147
+ },
148
+ {
149
+ "from": [
150
+ 5.5,
151
+ 18.5,
152
+ 7.5
153
+ ],
154
+ "to": [
155
+ 6.5,
156
+ 22.5,
157
+ 8.5
158
+ ],
159
+ "faces": {
160
+ "down": {
161
+ "uv": [
162
+ 2.5,
163
+ 1.5,
164
+ 3,
165
+ 2
166
+ ],
167
+ "texture": "#texture"
168
+ },
169
+ "up": {
170
+ "uv": [
171
+ 3,
172
+ 2,
173
+ 3.5,
174
+ 1.5
175
+ ],
176
+ "texture": "#texture"
177
+ },
178
+ "west": {
179
+ "uv": [
180
+ 2,
181
+ 2,
182
+ 2.5,
183
+ 4
184
+ ],
185
+ "texture": "#texture"
186
+ },
187
+ "north": {
188
+ "uv": [
189
+ 2.5,
190
+ 2,
191
+ 3,
192
+ 4
193
+ ],
194
+ "texture": "#texture"
195
+ },
196
+ "east": {
197
+ "uv": [
198
+ 3,
199
+ 2,
200
+ 3.5,
201
+ 4
202
+ ],
203
+ "texture": "#texture"
204
+ },
205
+ "south": {
206
+ "uv": [
207
+ 3.5,
208
+ 2,
209
+ 4,
210
+ 4
211
+ ],
212
+ "texture": "#texture"
213
+ }
214
+ }
215
+ },
216
+ {
217
+ "from": [
218
+ 7.5,
219
+ 19.5,
220
+ 7.5
221
+ ],
222
+ "to": [
223
+ 8.5,
224
+ 23.5,
225
+ 8.5
226
+ ],
227
+ "faces": {
228
+ "down": {
229
+ "uv": [
230
+ 0.5,
231
+ 0,
232
+ 1,
233
+ 0.5
234
+ ],
235
+ "texture": "#texture"
236
+ },
237
+ "up": {
238
+ "uv": [
239
+ 1,
240
+ 0.5,
241
+ 1.5,
242
+ 0
243
+ ],
244
+ "texture": "#texture"
245
+ },
246
+ "west": {
247
+ "uv": [
248
+ 0,
249
+ 0.5,
250
+ 0.5,
251
+ 2.5
252
+ ],
253
+ "texture": "#texture"
254
+ },
255
+ "north": {
256
+ "uv": [
257
+ 0.5,
258
+ 0.5,
259
+ 1,
260
+ 2.5
261
+ ],
262
+ "texture": "#texture"
263
+ },
264
+ "east": {
265
+ "uv": [
266
+ 1,
267
+ 0.5,
268
+ 1.5,
269
+ 2.5
270
+ ],
271
+ "texture": "#texture"
272
+ },
273
+ "south": {
274
+ "uv": [
275
+ 1.5,
276
+ 0.5,
277
+ 2,
278
+ 2.5
279
+ ],
280
+ "texture": "#texture"
281
+ }
282
+ }
283
+ },
284
+ {
285
+ "from": [
286
+ 9.5,
287
+ 18.5,
288
+ 7.5
289
+ ],
290
+ "to": [
291
+ 10.5,
292
+ 22.5,
293
+ 8.5
294
+ ],
295
+ "faces": {
296
+ "down": {
297
+ "uv": [
298
+ 2.5,
299
+ 1.5,
300
+ 3,
301
+ 2
302
+ ],
303
+ "texture": "#texture"
304
+ },
305
+ "up": {
306
+ "uv": [
307
+ 3,
308
+ 2,
309
+ 3.5,
310
+ 1.5
311
+ ],
312
+ "texture": "#texture"
313
+ },
314
+ "west": {
315
+ "uv": [
316
+ 2,
317
+ 2,
318
+ 2.5,
319
+ 4
320
+ ],
321
+ "texture": "#texture"
322
+ },
323
+ "north": {
324
+ "uv": [
325
+ 2.5,
326
+ 2,
327
+ 3,
328
+ 4
329
+ ],
330
+ "texture": "#texture"
331
+ },
332
+ "east": {
333
+ "uv": [
334
+ 3,
335
+ 2,
336
+ 3.5,
337
+ 4
338
+ ],
339
+ "texture": "#texture"
340
+ },
341
+ "south": {
342
+ "uv": [
343
+ 3.5,
344
+ 2,
345
+ 4,
346
+ 4
347
+ ],
348
+ "texture": "#texture"
349
+ }
350
+ }
351
+ }
352
+ ],
353
+ "display": {
354
+ "gui": {
355
+ "rotation": [
356
+ 0,
357
+ 0,
358
+ 0
359
+ ],
360
+ "translation": [
361
+ 0,
362
+ 0,
363
+ 0
364
+ ],
365
+ "scale": [
366
+ 0.4,
367
+ 0.4,
368
+ 0.4
369
+ ]
370
+ }
371
+ }
372
+ }
@@ -0,0 +1,130 @@
1
+ # Curated mod geometry overrides
2
+
3
+ Element models for mod items the game draws in code. A `builtin/entity` item model carries
4
+ display transforms and no `elements`, so the boxes only exist in a Java class: no fallback in
5
+ `src/render/pipeline.ts` can find them and the item fails into the failure sidecar. Layout is
6
+ `<namespace>/models/item/<path>.json`, ordinary vanilla model JSON, mounted with
7
+ `FolderResourceManager` (see `src/mods/models.ts`).
8
+
9
+ **These files are generated — do not hand-edit them.** Run:
10
+
11
+ ```sh
12
+ node scripts/mod-models/build.ts
13
+ ```
14
+
15
+ `scripts/mod-models/extract.ts` reads the box list straight out of the mod's bytecode via
16
+ `javap`, so no geometry number here is hand-copied. The per-item spec in
17
+ `scripts/mod-models/build.ts` supplies only what bytecode can't give mechanically — the pose,
18
+ the texture, and which parts draw emissive or translucent — with each value citing the class
19
+ it came from. Regenerating after a mod update is one command; review the resulting diff.
20
+
21
+ ## Precedence
22
+
23
+ This pack layers **above** the mod jars, so it shadows the jar's `builtin/entity` stub in
24
+ every era. Because it replaces that stub outright, the generator copies the `display` block
25
+ verbatim out of the jar's own model — the override is the whole model, not a patch.
26
+
27
+ ## Renderer extensions
28
+
29
+ Two non-vanilla element fields exist for this pack, both read in `src/render/geometry.ts`:
30
+
31
+ - `emissive_rc: true` — skip directional shading, standing in for a fullbright render type.
32
+ - `alpha_rc: <0..1>` — constant opacity multiplier for a translucent element.
33
+
34
+ ## How the pose is baked
35
+
36
+ Geometry keeps Java's handedness — `from`/`to` are the raw `addBox` bounds — and the whole
37
+ renderer transform is folded into each element's single rotation by `scripts/mod-models/pose.ts`.
38
+ Keeping Java's handedness is what lets the UVs stay the plain entity-sheet unwrap with no
39
+ mirroring anywhere.
40
+
41
+ A spec states the pose as the op list the renderer literally runs, so it reads against the
42
+ bytecode: Mekanism's `translate(0.5, 0.5, 0.5)` + `Axis.ZP 180°`, Botania's
43
+ `translate(0.5, 1.5, 0.5)` + `scale(1, -1, -1)`. Both are rigid — a mirror on two axes has
44
+ determinant +1, so it *is* a rotation — which means the composite of the pose, any per-part
45
+ pose, the part's `PartPose` offset and its rotation is always `p -> C + s·M·p` for a single
46
+ rotation `M`. An element expresses exactly that: place the box at `s·box + C` and rotate about
47
+ `C` by `M`, with `M` written as X-then-Y-then-Z Euler angles.
48
+
49
+ `decompose` throws rather than approximating if a pose ever carries a non-uniform scale or a
50
+ true reflection, since neither fits in one element and silently rounding would ship a wrong
51
+ icon.
52
+
53
+ ## UVs
54
+
55
+ Java entity sheets are not 16×16, and the renderer has no `texture_size`: it normalizes `uv`
56
+ by 16 and multiplies by the real texture dimensions, so pixel coordinates are pre-scaled into
57
+ 0–16 space (`u * 16 / sheetWidth`, `v * 16 / sheetHeight`).
58
+
59
+ The unwrap, in Java model axes: the row at `v` is `down` then `up` (each w×d); the row at
60
+ `v + d` is `west` (d), `north` (w), `east` (d), `south` (w).
61
+
62
+ The rect arithmetic is confirmed against the vendored renderchest chest model, whose UVs match
63
+ it exactly on every element. The assignment *within* the `up`/`down` and `east`/`west` pairs is
64
+ not independently confirmed — a chest's left and right faces are texture-identical, and
65
+ renderchest's own file disagrees with itself on `east`/`west` for that reason. It agrees with
66
+ `src/render/geo.ts`'s GeckoLib-validated table under the Java↔Bedrock double mirror (x and y),
67
+ which is the expected relationship, and swapping either pair changes these renders very little
68
+ because opposite faces of an entity-sheet box carry near-identical detail. Worth nailing down
69
+ against an in-game screenshot if an item ever looks subtly mirrored.
70
+
71
+ ## Entries
72
+
73
+ ### Mekanism 10.7.19 (1.21.1, NeoForge)
74
+
75
+ Six `builtin/entity` items, all `MekanismISTER`s posed with the default bake. Textures live in
76
+ `assets/mekanism/render/`, outside `textures/` — reached through `TextureLoader.decode`'s `raw`
77
+ fallback. Emissive and translucent groups come from each model's `render()` and
78
+ `renderToBuffer()`: a `litParts` list draws at light `15728880`, and the glass-like groups
79
+ additionally carry an alpha in their vertex colour.
80
+
81
+ | item | model class | sheet | parts | groups |
82
+ | --- | --- | --- | --- | --- |
83
+ | `atomic_disassembler` | `ModelAtomicDisassembler` | 64×32 | 16 | 5 blade parts emissive @ `0xBF` alpha |
84
+ | `flamethrower` | `ModelFlamethrower` | 64×64 | 23 | one opaque list |
85
+ | `scuba_tank` | `ModelScubaTank` | 128×64 | 9 | one opaque list |
86
+ | `free_runners` | `ModelFreeRunners` | 64×32 | 6 | opaque; extra `translate(0,-1,0)` |
87
+ | `jetpack` | `ModelJetpack` | 128×64 | 21 | 4 lit parts; 2 wings emissive @ `0x34` alpha |
88
+ | `scuba_mask` | `ModelScubaMask` | 128×64 | 28 | 2 lit parts; 6 glass emissive @ `0x4D` alpha |
89
+
90
+ Mekanism's other ten `builtin/entity` items are the energy cubes and fluid tanks, which are
91
+ assembled from block models in code rather than from a Java entity model, so they are not
92
+ portable this way.
93
+
94
+ ### Botania 454 (1.20.1, Forge)
95
+
96
+ Botania ships no item renderer of its own: `TEISR` hands the stack straight to the block's
97
+ `BlockEntityRenderer` with a **dummy block entity**, so each item's pose is that renderer's
98
+ in-world pose — the standard `translate(0.5, ~1.5, 0.5)` + `scale(1, -1, -1)` block-entity
99
+ flip rather than Mekanism's `Rz(180)`. Sheet sizes are registered in `BotaniaLayerDefinitions`,
100
+ not the model class, so the specs state them explicitly. The jar is SRG-mapped; class names
101
+ survive and descriptors disambiguate every call except `PartPose.offset`/`rotation`, pinned by
102
+ `SRG_ROTATION` in `extract.ts`.
103
+
104
+ | item | model class | sheet | parts | animated? | notes |
105
+ | --- | --- | --- | --- | --- | --- |
106
+ | `avatar` | `AvatarModel` | 32×32 | 6 | no | null level → facing SOUTH → `ROTATIONS[0]` = 180° |
107
+ | `bellows` | `BellowsModel` | 64×32 | 4 | no | funnel posed separately; squeeze fraction is 1 |
108
+ | `hourglass` | `HourglassModel` | 64×32 | 5 | frozen by Botania | sand skipped — an item holds none |
109
+ | `corporea_index` | `CorporeaIndexBlockEntityRenderer` | 64×32 | 3 | yes | geometry lives in the renderer; ring drawn twice, nested |
110
+ | `teru_teru_bozu` | `TeruTeruBozuModel` | 64×32 | 3 | yes | `happy_face` skipped (rain variant) |
111
+ | `brewery` | `BotanicalBreweryModel` | 32×16 | 10 | yes | `plate` drawn 7× round a circle |
112
+ | `mana_pylon` | `ManaPylonModel` | 64×64 | 8 | yes | 4 crystal shards emissive |
113
+ | `natura_pylon` | `NaturaPylonModel` | 64×64 | 12 | yes | 8 crystal shards emissive |
114
+ | `gaia_pylon` | `GaiaPylonModel` | 64×64 | 12 | yes | 8 crystal shards emissive |
115
+
116
+ Botania special-cases the item path in several of these, and the specs follow it rather than
117
+ guessing: the pylon renderer takes `1.35` instead of `1.5` when the block entity is null, the
118
+ corporea index scales by `1.3` and drops `0.1`, and `HoveringHourglassBlockEntityRenderer`
119
+ **zeroes its own clock** when there is no world — so the hourglass icon here is exactly the
120
+ frame the game draws, not a still we picked.
121
+
122
+ `teru_teru_bozu`, `brewery`, `corporea_index` and the three pylons do keep spinning in the inventory, because
123
+ their renderers read `ClientTickHandler.ticksInGame` unguarded. Those six are a **chosen
124
+ still: frame 0**, matching how the renderer already takes frame 0 of an animated texture. The
125
+ position-seeded spin offset those renderers add is correctly absent, since it is guarded on the
126
+ block entity being non-null. At frame 0 most sin/cos terms vanish, which is why the pylons' ring
127
+ and crystal poses collapse into one; the brewery's plate heights are the exception, staggered by
128
+ `sin(i·40)` even at tick 0, exactly as in game on that tick.
129
+
130
+ All nine of Botania's `builtin/entity` items are ported.