@nodecraft/rendermite 1.0.7 → 1.1.1

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-lWPrB7wh.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-CaSK8-mi.d.ts → encode-DNcXXvYe.d.ts} +1 -1
  94. package/dist/{encode-Df_tWzkl.js → encode-LR9wxigC.js} +1 -1
  95. package/dist/{entity-fallback-D9QTGU9X.js → entity-fallback-BnFMSHS6.js} +180 -10
  96. package/dist/{face-Cl1O4m2i.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-DHiWBa-C.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-HiA3DC71.d.ts → pipeline-Bp6amYz_.d.ts} +17 -5
  125. package/dist/{pipeline-Da2Kavba.js → pipeline-zu_ZjnNc.js} +85 -21
  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-B9ZGJI3-.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-B20ssjRm.d.ts → renderer-C79EQDSn.d.ts} +3 -3
  156. package/dist/{renderer-gQW_I7YG.js → renderer-oi1MSF3Y.js} +21 -10
  157. package/dist/{run-B0qPw3zf.js → run-D87zIGfr.js} +3 -3
  158. package/dist/{run-CT3VtFqg.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-BH9l0ND0.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-CEHoJ7tM.d.ts +0 -37
  170. package/dist/blend-D0XWgVQr.js +0 -102
  171. package/dist/face-C49L66sQ.d.ts +0 -30
@@ -61,6 +61,103 @@ const DEFAULT_READING_TYPES = /* @__PURE__ */ new Set([
61
61
  "minecraft:map_color",
62
62
  "minecraft:team"
63
63
  ]);
64
+ /**
65
+ * appeng.api.util.AEColor's dark/medium/bright variants, read out of the enum's
66
+ * static initialiser in AE2 26.1.10. Every `ae2:color` tint names one of these
67
+ * plus a variant, and nothing in the mod's assets states the values.
68
+ */
69
+ const AE_COLORS = {
70
+ white: [
71
+ 11842740,
72
+ 14737632,
73
+ 16382457
74
+ ],
75
+ light_gray: [
76
+ 8289918,
77
+ 10526624,
78
+ 12895428
79
+ ],
80
+ gray: [
81
+ 5197647,
82
+ 7105388,
83
+ 9736852
84
+ ],
85
+ black: [
86
+ 1250067,
87
+ 2565927,
88
+ 3881787
89
+ ],
90
+ lime: [
91
+ 5161038,
92
+ 7397977,
93
+ 11794541
94
+ ],
95
+ yellow: [
96
+ 16764736,
97
+ 16769881,
98
+ 16056192
99
+ ],
100
+ orange: [
101
+ 14252079,
102
+ 15508028,
103
+ 15907401
104
+ ],
105
+ brown: [
106
+ 7227922,
107
+ 8281110,
108
+ 9334298
109
+ ],
110
+ red: [
111
+ 11149611,
112
+ 14106178,
113
+ 15758949
114
+ ],
115
+ pink: [
116
+ 14184106,
117
+ 16751035,
118
+ 16501461
119
+ ],
120
+ magenta: [
121
+ 12669321,
122
+ 13988252,
123
+ 15113919
124
+ ],
125
+ purple: [
126
+ 7232696,
127
+ 9526733,
128
+ 11562973
129
+ ],
130
+ blue: [
131
+ 3375088,
132
+ 3708159,
133
+ 4243967
134
+ ],
135
+ light_blue: [
136
+ 6928895,
137
+ 7394047,
138
+ 8452095
139
+ ],
140
+ cyan: [
141
+ 2273454,
142
+ 3132599,
143
+ 6678729
144
+ ],
145
+ green: [
146
+ 498539,
147
+ 1554541,
148
+ 3332176
149
+ ],
150
+ fluix: [
151
+ 5916574,
152
+ 9526733,
153
+ 14853091
154
+ ]
155
+ };
156
+ const VARIANT_INDEX = {
157
+ dark: 0,
158
+ medium: 1,
159
+ bright: 2
160
+ };
64
161
  async function resolveTint(definition, context) {
65
162
  const type = definition.type.includes(":") ? definition.type : `minecraft:${definition.type}`;
66
163
  switch (type) {
@@ -75,9 +172,18 @@ async function resolveTint(definition, context) {
75
172
  const index = context.randomIndex ?? Math.floor(Math.random() * DYE_COLORS.length);
76
173
  return hexColor(DYE_COLORS[index % DYE_COLORS.length]);
77
174
  }
175
+ case "ae2:storage_cell_state": return parseTintValue(65280);
176
+ case "ae2:portable_cell_color": return parseTintValue(8441855);
177
+ case "ae2:color": {
178
+ const named = String(definition.color ?? "");
179
+ const palette = AE_COLORS[named];
180
+ if (!palette) throw new InvalidTinterDefinitionError(`Unknown ae2:color colour: ${named}`);
181
+ const variant = String(definition.variant ?? "medium");
182
+ return parseTintValue(palette[VARIANT_INDEX[variant] ?? 1]);
183
+ }
78
184
  default:
79
185
  if (DEFAULT_READING_TYPES.has(type) || Object.hasOwn(definition, "default")) return parseTintValue(definition.default);
80
- throw new InvalidTinterDefinitionError(`Unknown tint type: ${definition.type}`);
186
+ return null;
81
187
  }
82
188
  }
83
189
  async function resolveTints(definitions, context) {
@@ -1,7 +1,7 @@
1
- import { r as modTintPackPath } from "./builtin-caYjESh0.js";
2
- import { a as defaultProperties, o as evaluateItemModel } from "./definition-3MBm8ar_.js";
1
+ import { i as modTintPackPath } from "./builtin-WkWjATeh.js";
3
2
  import { n as ResourceLocator } from "./locator-ycZzh_6z.js";
4
3
  import { t as FolderResourceManager } from "./manager-CkletR5K.js";
4
+ import { a as defaultProperties, o as evaluateItemModel } from "./definition-ColsvWrH.js";
5
5
  import { n as MapResourceManager } from "./synthetic-ZAUjXT7E.js";
6
6
  //#region src/mods/tints.ts
7
7
  /**
@@ -1,6 +1,6 @@
1
1
  import { i as TextureLoader } from "./loader-Myy22TDL.js";
2
- import { r as TintColor } from "./face-C49L66sQ.js";
3
- import { o as TintDefinition } from "./definition-BwX6Xxv0.js";
2
+ import { r as TintColor } from "./face-cQ-pVHoe.js";
3
+ import { o as TintDefinition } from "./definition-ricL7Jqf.js";
4
4
  //#region src/render/tints.d.ts
5
5
  declare class InvalidTinterDefinitionError extends Error {}
6
6
  /** The 16 dye colors upstream's renderchest:random picks from. */
@@ -40,6 +40,14 @@ interface ModelElementJson {
40
40
  rotation?: ElementRotationJson;
41
41
  shade?: boolean;
42
42
  light_emission?: number;
43
+ /**
44
+ * Ours, not vanilla: skip directional shading for this element. Mods draw
45
+ * emissive parts in code with a fullbright render type (Mekanism's disassembler
46
+ * blade), which no vanilla model field can express.
47
+ */
48
+ emissive_rc?: boolean;
49
+ /** Ours, not vanilla: constant opacity multiplier for a translucent element. */
50
+ alpha_rc?: number;
43
51
  faces: Partial<Record<FaceDirectionName, ModelFaceJson>>;
44
52
  }
45
53
  interface DisplayTransformJson {
@@ -1,5 +1,5 @@
1
1
  import { s as ResourceDescriptor } from "../manager-Cv1NeFyF.js";
2
- import { n as ItemRenderOutcome, r as PipelineSettings } from "../pipeline-HiA3DC71.js";
2
+ import { n as ItemRenderOutcome, r as PipelineSettings } from "../pipeline-Bp6amYz_.js";
3
3
  //#region src/workers/render-worker.d.ts
4
4
  interface RenderWorkerData {
5
5
  resources: ResourceDescriptor;
@@ -1,4 +1,4 @@
1
- import { t as ItemPipeline } from "../pipeline-Da2Kavba.js";
1
+ import { t as ItemPipeline } from "../pipeline-zu_ZjnNc.js";
2
2
  import { n as restoreResources } from "../descriptor-DWebtkI1.js";
3
3
  import sharp from "sharp";
4
4
  import { parentPort, workerData } from "node:worker_threads";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodecraft/rendermite",
3
- "version": "1.0.7",
3
+ "version": "1.1.1",
4
4
  "description": "Minecraft item icon renderer: renders inventory-identical item icons from vanilla and modded assets across game versions, outputting optimized PNG/WebP/AVIF plus CSS and a JSON item library.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,37 +0,0 @@
1
- import { r as Texture } from "./loader-Myy22TDL.js";
2
- //#region src/render/blend.d.ts
3
- /** RGBA float pixels for render-time work; converted back to 8-bit at encode. */
4
- interface FloatTexture {
5
- width: number;
6
- height: number;
7
- /** RGBA, row-major, normalized [0,1]. */
8
- data: Float64Array;
9
- }
10
- declare function toFloatTexture(texture: Texture): FloatTexture;
11
- declare function toByteTexture(texture: FloatTexture): Texture;
12
- declare function cloneFloatTexture(texture: FloatTexture): FloatTexture;
13
- /**
14
- * Imagick stores every pixel write as a Q16 quantum; values re-read for the
15
- * next operation carry that quantization. Matching it is what turns
16
- * off-by-one downscale rounding into exact parity.
17
- */
18
- declare function q16(value: number): number;
19
- /**
20
- * Source-over with straight alpha, in place on `dst` at `offset`:
21
- * ra = 1-(1-sa)(1-da); rc = (sc*sa + dc*da*(1-sa)) / ra; rgb = 0 when ra = 0.
22
- * Results are Q16-quantized like every Imagick pixel write. q16 is inlined
23
- * here because blendPixel is the single hottest function in the pipeline.
24
- */
25
- declare function blendPixel(dst: Float64Array, offset: number, sr: number, sg: number, sb: number, sa: number): void;
26
- /**
27
- * Upstream tintImage: uses ONLY the red channel as luminance — per pixel,
28
- * source-over blend of {tint.rgb * pixel.r, alpha: pixel.a} onto the pixel.
29
- */
30
- declare function tintTexture(texture: FloatTexture, tintR: number, tintG: number, tintB: number): void;
31
- /**
32
- * Upstream darkenTexture: blend pure black with alpha = amount * pixel.alpha,
33
- * restricted to the UV bounding box expanded by 1px on each side.
34
- */
35
- declare function darkenTexture(texture: FloatTexture, amount: number, u1: number, v1: number, u2: number, v2: number): void;
36
- //#endregion
37
- export { q16 as a, toFloatTexture as c, darkenTexture as i, blendPixel as n, tintTexture as o, cloneFloatTexture as r, toByteTexture as s, FloatTexture as t };
@@ -1,102 +0,0 @@
1
- //#region src/render/blend.ts
2
- /** Lookup table for Q16 → 8-bit conversion (ImageMagick's floor(q/257)). */
3
- const BYTE_LUT = /* @__PURE__ */ new Uint8Array(65536);
4
- function toFloatTexture(texture) {
5
- const data = new Float64Array(texture.data.length);
6
- for (let i = 0; i < texture.data.length; i++) data[i] = texture.data[i] / 255;
7
- return {
8
- width: texture.width,
9
- height: texture.height,
10
- data
11
- };
12
- }
13
- function toByteTexture(texture) {
14
- const data = new Uint8ClampedArray(texture.data.length);
15
- if (BYTE_LUT[65535] === 0) for (let q = 0; q < 65536; q++) BYTE_LUT[q] = Math.floor(q / 257);
16
- const src = texture.data;
17
- for (let i = 0; i < src.length; i++) {
18
- const value = src[i];
19
- data[i] = BYTE_LUT[Math.round((value < 0 ? 0 : value > 1 ? 1 : value) * 65535)];
20
- }
21
- return {
22
- width: texture.width,
23
- height: texture.height,
24
- data
25
- };
26
- }
27
- function cloneFloatTexture(texture) {
28
- return {
29
- width: texture.width,
30
- height: texture.height,
31
- data: new Float64Array(texture.data)
32
- };
33
- }
34
- /**
35
- * Imagick stores every pixel write as a Q16 quantum; values re-read for the
36
- * next operation carry that quantization. Matching it is what turns
37
- * off-by-one downscale rounding into exact parity.
38
- */
39
- function q16(value) {
40
- return Math.round((value < 0 ? 0 : Math.min(value, 1)) * 65535) / 65535;
41
- }
42
- /**
43
- * Source-over with straight alpha, in place on `dst` at `offset`:
44
- * ra = 1-(1-sa)(1-da); rc = (sc*sa + dc*da*(1-sa)) / ra; rgb = 0 when ra = 0.
45
- * Results are Q16-quantized like every Imagick pixel write. q16 is inlined
46
- * here because blendPixel is the single hottest function in the pipeline.
47
- */
48
- function blendPixel(dst, offset, sr, sg, sb, sa) {
49
- const da = dst[offset + 3];
50
- const ra = 1 - (1 - sa) * (1 - da);
51
- if (ra === 0) {
52
- dst[offset] = 0;
53
- dst[offset + 1] = 0;
54
- dst[offset + 2] = 0;
55
- dst[offset + 3] = 0;
56
- return;
57
- }
58
- const dstWeight = da * (1 - sa);
59
- let v = (sr * sa + dst[offset] * dstWeight) / ra;
60
- v = v < 0 ? 0 : v > 1 ? 1 : v;
61
- dst[offset] = Math.round(v * 65535) / 65535;
62
- v = (sg * sa + dst[offset + 1] * dstWeight) / ra;
63
- v = v < 0 ? 0 : v > 1 ? 1 : v;
64
- dst[offset + 1] = Math.round(v * 65535) / 65535;
65
- v = (sb * sa + dst[offset + 2] * dstWeight) / ra;
66
- v = v < 0 ? 0 : v > 1 ? 1 : v;
67
- dst[offset + 2] = Math.round(v * 65535) / 65535;
68
- v = ra < 0 ? 0 : ra > 1 ? 1 : ra;
69
- dst[offset + 3] = Math.round(v * 65535) / 65535;
70
- }
71
- /**
72
- * Upstream tintImage: uses ONLY the red channel as luminance — per pixel,
73
- * source-over blend of {tint.rgb * pixel.r, alpha: pixel.a} onto the pixel.
74
- */
75
- function tintTexture(texture, tintR, tintG, tintB) {
76
- const { data } = texture;
77
- for (let offset = 0; offset < data.length; offset += 4) {
78
- const value = data[offset];
79
- blendPixel(data, offset, tintR * value, tintG * value, tintB * value, data[offset + 3]);
80
- }
81
- }
82
- /**
83
- * Upstream darkenTexture: blend pure black with alpha = amount * pixel.alpha,
84
- * restricted to the UV bounding box expanded by 1px on each side.
85
- */
86
- function darkenTexture(texture, amount, u1, v1, u2, v2) {
87
- let startX = Math.floor(Math.min(u1, u2));
88
- let endX = Math.ceil(Math.max(u1, u2));
89
- let startY = Math.floor(Math.min(v1, v2));
90
- let endY = Math.ceil(Math.max(v1, v2));
91
- startX = Math.max(0, startX - 1);
92
- startY = Math.max(0, startY - 1);
93
- endX = Math.min(texture.width - 1, endX + 1);
94
- endY = Math.min(texture.height - 1, endY + 1);
95
- const { data } = texture;
96
- for (let y = startY; y <= endY; y++) for (let x = startX; x <= endX; x++) {
97
- const offset = (y * texture.width + x) * 4;
98
- blendPixel(data, offset, 0, 0, 0, amount * data[offset + 3]);
99
- }
100
- }
101
- //#endregion
102
- export { tintTexture as a, q16 as i, cloneFloatTexture as n, toByteTexture as o, darkenTexture as r, toFloatTexture as s, blendPixel as t };
@@ -1,30 +0,0 @@
1
- import { t as FloatTexture } from "./blend-CEHoJ7tM.js";
2
- import { t as Mat4 } from "./vector-DRKRi4--.js";
3
- import { n as FaceGeometry } from "./geometry-BSVmKx5b.js";
4
- import { r as LightSource } from "./lighting-3FGRC3Af.js";
5
- import { n as FaceBuffer } from "./rasterizer-B9ZGJI3-.js";
6
- //#region src/render/face.d.ts
7
- interface TintColor {
8
- r: number;
9
- g: number;
10
- b: number;
11
- }
12
- interface RenderableFace {
13
- geometry: FaceGeometry;
14
- texture: FloatTexture;
15
- light: LightSource;
16
- tint: TintColor | null;
17
- /** Untransformed model-space max Z — upstream's stable pre-sort key. */
18
- maxZ: number;
19
- }
20
- /** Tinted + darkened textures keyed by source texture, then by shading params. */
21
- type FaceShadeCache = WeakMap<FloatTexture, Map<string, FloatTexture>>;
22
- declare function faceMaxZ(geometry: FaceGeometry): number;
23
- /** Returns null when the face is culled, degenerate, or has a zero-area UV. */
24
- declare function renderFace(face: RenderableFace, width: number, height: number, transformation: Mat4,
25
- /** Reused across a model's faces; cleared here, compacted before return. */
26
- scratch?: FaceBuffer,
27
- /** Shared tint/shade results for one model render. */
28
- shadeCache?: FaceShadeCache): FaceBuffer | null;
29
- //#endregion
30
- export { renderFace as a, faceMaxZ as i, RenderableFace as n, TintColor as r, FaceShadeCache as t };