@bitefoundry/retrieviewer 0.0.0-stage → 0.0.2

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 (297) hide show
  1. package/ASSET-PROVENANCE.md +43 -0
  2. package/ASSETS-LICENSE.md +58 -0
  3. package/ATTRIBUTION.md +54 -0
  4. package/EMBEDDING.md +96 -0
  5. package/INSTALLING.md +126 -0
  6. package/LICENSE +16 -0
  7. package/LICENSE-CODE +21 -0
  8. package/PLUGIN.md +110 -0
  9. package/PUPPY-MEMORY.md +57 -0
  10. package/PUPPY-Q5-COMPARISON.md +73 -0
  11. package/README.md +86 -2
  12. package/RELEASING.md +70 -0
  13. package/THIRD-PARTY-NOTICES.md +17 -0
  14. package/TRADEMARKS.md +21 -0
  15. package/WINDOWS-COMPANION.md +113 -0
  16. package/braille.mjs +45 -0
  17. package/examples/bridge.py +62 -0
  18. package/examples/embed.mjs +15 -0
  19. package/examples/live.mjs +40 -0
  20. package/examples/plugin.mjs +21 -0
  21. package/integrations/opencode/runtime.mjs +195 -0
  22. package/integrations/opencode/tui.tsx +59 -0
  23. package/integrations/windows-overlay/Overlay.cs +259 -0
  24. package/integrations/windows-overlay/desktop.mjs +87 -0
  25. package/integrations/windows-overlay/protocol.mjs +39 -0
  26. package/integrations/windows-overlay/worker.mjs +60 -0
  27. package/locomotion-core.mjs +21 -0
  28. package/locomotion-puppy.animal +0 -0
  29. package/package.json +131 -4
  30. package/pet-q5-manifest.json +118 -0
  31. package/puppy-clean.mjs +51 -0
  32. package/puppy-companion-interactions-v3-q5.bin.gz +0 -0
  33. package/puppy-companion-interactions-v3.json +1 -0
  34. package/puppy-companion-life.mjs +182 -0
  35. package/puppy-companion-objects.mjs +30 -0
  36. package/puppy-companion-sprites.mjs +14 -0
  37. package/puppy-continuous.mjs +57 -0
  38. package/puppy-face.mjs +46 -0
  39. package/puppy-frame-predictive.mjs +147 -0
  40. package/puppy-frame-store.mjs +108 -0
  41. package/puppy-mouth-anchor.json +1 -0
  42. package/puppy-mouth-anchor.mjs +33 -0
  43. package/puppy-paper-actions-v9-q5.bin.gz +0 -0
  44. package/puppy-paper-actions-v9.json +1 -0
  45. package/puppy-paper-actions.mjs +48 -0
  46. package/puppy-paper-approach-q5.bin.gz +0 -0
  47. package/puppy-paper-approach.json +1 -0
  48. package/puppy-paper-area.mjs +15 -0
  49. package/puppy-paper-arrival-seat-q5.bin.gz +0 -0
  50. package/puppy-paper-arrival-seat.json +1 -0
  51. package/puppy-paper-behaviors-q5.bin.gz +0 -0
  52. package/puppy-paper-behaviors.json +1 -0
  53. package/puppy-paper-behaviors.mjs +8 -0
  54. package/puppy-paper-contact.mjs +103 -0
  55. package/puppy-paper-director.mjs +21 -0
  56. package/puppy-paper-paw-transport.mjs +76 -0
  57. package/puppy-paper-rear-gallop-q5.bin.gz +0 -0
  58. package/puppy-paper-rear-gallop.json +1 -0
  59. package/puppy-paper-seat-q5.bin.gz +0 -0
  60. package/puppy-paper-seat.json +14 -0
  61. package/puppy-paper-seat.mjs +13 -0
  62. package/puppy-paper-trick-timing.mjs +58 -0
  63. package/puppy-paper-world.mjs +108 -0
  64. package/puppy-paper.mjs +271 -0
  65. package/puppy-stable-meta.json +1606 -0
  66. package/puppy-stable.mjs +72 -0
  67. package/puppy-stride-meta.json +343 -0
  68. package/puppy-stride-tweens-q5.bin.gz +0 -0
  69. package/puppy-zoomies.mjs +27 -0
  70. package/puppy-zoomies30.mjs +12 -0
  71. package/retrieviewer-cli.mjs +94 -0
  72. package/retrieviewer-config.mjs +49 -0
  73. package/retrieviewer-install.mjs +157 -0
  74. package/retrieviewer-plugin.d.mts +44 -0
  75. package/retrieviewer-plugin.mjs +97 -0
  76. package/retrieviewer-stdio.mjs +38 -0
  77. package/retrieviewer.d.mts +85 -0
  78. package/retrieviewer.mjs +142 -0
  79. package/vendor/procedural-animals/LICENSE +21 -0
  80. package/vendor/procedural-animals/package.json +40 -0
  81. package/vendor/procedural-animals/src/animal.js +146 -0
  82. package/vendor/procedural-animals/src/bake.js +51 -0
  83. package/vendor/procedural-animals/src/build.js +81 -0
  84. package/vendor/procedural-animals/src/core/build/coatKit.js +121 -0
  85. package/vendor/procedural-animals/src/core/build/featherCards.js +189 -0
  86. package/vendor/procedural-animals/src/core/build/finEdges.js +85 -0
  87. package/vendor/procedural-animals/src/core/build/furSlope.js +115 -0
  88. package/vendor/procedural-animals/src/core/build/mesh.js +67 -0
  89. package/vendor/procedural-animals/src/core/build/pipeline.js +272 -0
  90. package/vendor/procedural-animals/src/core/build/seams.js +183 -0
  91. package/vendor/procedural-animals/src/core/build/warp.js +112 -0
  92. package/vendor/procedural-animals/src/core/build/weights.js +393 -0
  93. package/vendor/procedural-animals/src/core/math/vec.js +81 -0
  94. package/vendor/procedural-animals/src/core/motion/actions.js +800 -0
  95. package/vendor/procedural-animals/src/core/motion/bird.js +3063 -0
  96. package/vendor/procedural-animals/src/core/motion/birdActions.js +1059 -0
  97. package/vendor/procedural-animals/src/core/motion/common.js +158 -0
  98. package/vendor/procedural-animals/src/core/motion/index.js +22 -0
  99. package/vendor/procedural-animals/src/core/motion/quadruped.js +2875 -0
  100. package/vendor/procedural-animals/src/core/motion/snake.js +1594 -0
  101. package/vendor/procedural-animals/src/core/motion/spider.js +1810 -0
  102. package/vendor/procedural-animals/src/core/motion/swimmer.js +1047 -0
  103. package/vendor/procedural-animals/src/core/motion/swimmerActions.js +613 -0
  104. package/vendor/procedural-animals/src/core/render/animalObject.js +262 -0
  105. package/vendor/procedural-animals/src/core/render/coatMaterial.js +1301 -0
  106. package/vendor/procedural-animals/src/core/render/dqs.js +159 -0
  107. package/vendor/procedural-animals/src/core/render/eyes.js +676 -0
  108. package/vendor/procedural-animals/src/core/render/membranes.js +77 -0
  109. package/vendor/procedural-animals/src/core/render/skeleton.js +41 -0
  110. package/vendor/procedural-animals/src/core/rig/bird.js +327 -0
  111. package/vendor/procedural-animals/src/core/rig/quadruped.js +76 -0
  112. package/vendor/procedural-animals/src/core/rig/rig.js +79 -0
  113. package/vendor/procedural-animals/src/core/rig/snake.js +76 -0
  114. package/vendor/procedural-animals/src/core/rig/spider.js +110 -0
  115. package/vendor/procedural-animals/src/core/rig/swimmer.js +181 -0
  116. package/vendor/procedural-animals/src/core/sdf/eyeSocket.js +53 -0
  117. package/vendor/procedural-animals/src/core/sdf/mesher.js +238 -0
  118. package/vendor/procedural-animals/src/core/sdf/sdf.js +263 -0
  119. package/vendor/procedural-animals/src/index.d.ts +98 -0
  120. package/vendor/procedural-animals/src/index.js +29 -0
  121. package/vendor/procedural-animals/src/registry.js +48 -0
  122. package/vendor/procedural-animals/src/species/bear/behaviour.js +463 -0
  123. package/vendor/procedural-animals/src/species/bear/claws.js +147 -0
  124. package/vendor/procedural-animals/src/species/bear/coat.js +726 -0
  125. package/vendor/procedural-animals/src/species/bear/index.js +139 -0
  126. package/vendor/procedural-animals/src/species/bear/motion.js +112 -0
  127. package/vendor/procedural-animals/src/species/bear/regions.js +78 -0
  128. package/vendor/procedural-animals/src/species/bear/rig.js +112 -0
  129. package/vendor/procedural-animals/src/species/bear/sculpt.js +272 -0
  130. package/vendor/procedural-animals/src/species/boar/behaviour.js +335 -0
  131. package/vendor/procedural-animals/src/species/boar/coat.js +372 -0
  132. package/vendor/procedural-animals/src/species/boar/index.js +110 -0
  133. package/vendor/procedural-animals/src/species/boar/motion.js +85 -0
  134. package/vendor/procedural-animals/src/species/boar/regions.js +88 -0
  135. package/vendor/procedural-animals/src/species/boar/rig.js +111 -0
  136. package/vendor/procedural-animals/src/species/boar/sculpt.js +285 -0
  137. package/vendor/procedural-animals/src/species/cat/behaviour.js +559 -0
  138. package/vendor/procedural-animals/src/species/cat/coat.js +841 -0
  139. package/vendor/procedural-animals/src/species/cat/index.js +211 -0
  140. package/vendor/procedural-animals/src/species/cat/motion.js +101 -0
  141. package/vendor/procedural-animals/src/species/cat/regions.js +82 -0
  142. package/vendor/procedural-animals/src/species/cat/rig.js +100 -0
  143. package/vendor/procedural-animals/src/species/cat/sculpt.js +266 -0
  144. package/vendor/procedural-animals/src/species/cat/whiskers.js +110 -0
  145. package/vendor/procedural-animals/src/species/cheetah/coat.js +427 -0
  146. package/vendor/procedural-animals/src/species/cheetah/index.js +51 -0
  147. package/vendor/procedural-animals/src/species/cheetah/joints.js +3 -0
  148. package/vendor/procedural-animals/src/species/cheetah/motion.js +77 -0
  149. package/vendor/procedural-animals/src/species/cheetah/regions.js +95 -0
  150. package/vendor/procedural-animals/src/species/cheetah/rig.js +66 -0
  151. package/vendor/procedural-animals/src/species/cheetah/sculpt.js +158 -0
  152. package/vendor/procedural-animals/src/species/chicken/coat.js +313 -0
  153. package/vendor/procedural-animals/src/species/chicken/coverts.js +320 -0
  154. package/vendor/procedural-animals/src/species/chicken/index.js +110 -0
  155. package/vendor/procedural-animals/src/species/chicken/motion.js +177 -0
  156. package/vendor/procedural-animals/src/species/chicken/regions.js +66 -0
  157. package/vendor/procedural-animals/src/species/chicken/rig.js +144 -0
  158. package/vendor/procedural-animals/src/species/chicken/sculpt.js +389 -0
  159. package/vendor/procedural-animals/src/species/chicken/wingLook.js +66 -0
  160. package/vendor/procedural-animals/src/species/chicken/wingStack.js +124 -0
  161. package/vendor/procedural-animals/src/species/cow/behaviour.js +521 -0
  162. package/vendor/procedural-animals/src/species/cow/coat.js +465 -0
  163. package/vendor/procedural-animals/src/species/cow/index.js +118 -0
  164. package/vendor/procedural-animals/src/species/cow/motion.js +81 -0
  165. package/vendor/procedural-animals/src/species/cow/regions.js +98 -0
  166. package/vendor/procedural-animals/src/species/cow/rig.js +116 -0
  167. package/vendor/procedural-animals/src/species/cow/sculpt.js +339 -0
  168. package/vendor/procedural-animals/src/species/crow/coat.js +145 -0
  169. package/vendor/procedural-animals/src/species/crow/index.js +70 -0
  170. package/vendor/procedural-animals/src/species/crow/joints.js +3 -0
  171. package/vendor/procedural-animals/src/species/crow/motion.js +101 -0
  172. package/vendor/procedural-animals/src/species/crow/regions.js +50 -0
  173. package/vendor/procedural-animals/src/species/crow/rig.js +83 -0
  174. package/vendor/procedural-animals/src/species/crow/sculpt.js +118 -0
  175. package/vendor/procedural-animals/src/species/deer/behaviour.js +513 -0
  176. package/vendor/procedural-animals/src/species/deer/coat.js +391 -0
  177. package/vendor/procedural-animals/src/species/deer/index.js +106 -0
  178. package/vendor/procedural-animals/src/species/deer/motion.js +97 -0
  179. package/vendor/procedural-animals/src/species/deer/regions.js +60 -0
  180. package/vendor/procedural-animals/src/species/deer/rig.js +124 -0
  181. package/vendor/procedural-animals/src/species/deer/sculpt.js +297 -0
  182. package/vendor/procedural-animals/src/species/dog/behaviour.js +521 -0
  183. package/vendor/procedural-animals/src/species/dog/coat.js +495 -0
  184. package/vendor/procedural-animals/src/species/dog/index.js +144 -0
  185. package/vendor/procedural-animals/src/species/dog/motion.js +118 -0
  186. package/vendor/procedural-animals/src/species/dog/regions.js +61 -0
  187. package/vendor/procedural-animals/src/species/dog/rig.js +129 -0
  188. package/vendor/procedural-animals/src/species/dog/sculpt.js +246 -0
  189. package/vendor/procedural-animals/src/species/eagle/coat.js +250 -0
  190. package/vendor/procedural-animals/src/species/eagle/index.js +76 -0
  191. package/vendor/procedural-animals/src/species/eagle/joints.js +3 -0
  192. package/vendor/procedural-animals/src/species/eagle/motion.js +137 -0
  193. package/vendor/procedural-animals/src/species/eagle/regions.js +57 -0
  194. package/vendor/procedural-animals/src/species/eagle/rig.js +107 -0
  195. package/vendor/procedural-animals/src/species/eagle/sculpt.js +137 -0
  196. package/vendor/procedural-animals/src/species/fish/coat.js +271 -0
  197. package/vendor/procedural-animals/src/species/fish/index.js +88 -0
  198. package/vendor/procedural-animals/src/species/fish/motion.js +92 -0
  199. package/vendor/procedural-animals/src/species/fish/regions.js +27 -0
  200. package/vendor/procedural-animals/src/species/fish/rig.js +143 -0
  201. package/vendor/procedural-animals/src/species/fish/sculpt.js +214 -0
  202. package/vendor/procedural-animals/src/species/fish/variants.js +126 -0
  203. package/vendor/procedural-animals/src/species/fox/behaviour.js +314 -0
  204. package/vendor/procedural-animals/src/species/fox/coat.js +444 -0
  205. package/vendor/procedural-animals/src/species/fox/index.js +120 -0
  206. package/vendor/procedural-animals/src/species/fox/motion.js +81 -0
  207. package/vendor/procedural-animals/src/species/fox/regions.js +59 -0
  208. package/vendor/procedural-animals/src/species/fox/rig.js +91 -0
  209. package/vendor/procedural-animals/src/species/fox/sculpt.js +202 -0
  210. package/vendor/procedural-animals/src/species/frog/behaviour.js +590 -0
  211. package/vendor/procedural-animals/src/species/frog/coat.js +305 -0
  212. package/vendor/procedural-animals/src/species/frog/index.js +97 -0
  213. package/vendor/procedural-animals/src/species/frog/motion.js +69 -0
  214. package/vendor/procedural-animals/src/species/frog/regions.js +46 -0
  215. package/vendor/procedural-animals/src/species/frog/rig.js +156 -0
  216. package/vendor/procedural-animals/src/species/frog/sculpt.js +240 -0
  217. package/vendor/procedural-animals/src/species/goat/behaviour.js +509 -0
  218. package/vendor/procedural-animals/src/species/goat/coat.js +590 -0
  219. package/vendor/procedural-animals/src/species/goat/index.js +149 -0
  220. package/vendor/procedural-animals/src/species/goat/motion.js +95 -0
  221. package/vendor/procedural-animals/src/species/goat/regions.js +98 -0
  222. package/vendor/procedural-animals/src/species/goat/rig.js +181 -0
  223. package/vendor/procedural-animals/src/species/goat/sculpt.js +547 -0
  224. package/vendor/procedural-animals/src/species/horse/coat.js +361 -0
  225. package/vendor/procedural-animals/src/species/horse/coatSeam.js +122 -0
  226. package/vendor/procedural-animals/src/species/horse/index.js +80 -0
  227. package/vendor/procedural-animals/src/species/horse/motion.js +245 -0
  228. package/vendor/procedural-animals/src/species/horse/regions.js +60 -0
  229. package/vendor/procedural-animals/src/species/horse/rig.js +117 -0
  230. package/vendor/procedural-animals/src/species/horse/sculpt.js +316 -0
  231. package/vendor/procedural-animals/src/species/horse/seamWeights.js +272 -0
  232. package/vendor/procedural-animals/src/species/lion/behaviour.js +509 -0
  233. package/vendor/procedural-animals/src/species/lion/coat.js +1016 -0
  234. package/vendor/procedural-animals/src/species/lion/index.js +111 -0
  235. package/vendor/procedural-animals/src/species/lion/motion.js +87 -0
  236. package/vendor/procedural-animals/src/species/lion/regions.js +106 -0
  237. package/vendor/procedural-animals/src/species/lion/rig.js +110 -0
  238. package/vendor/procedural-animals/src/species/lion/sculpt.js +384 -0
  239. package/vendor/procedural-animals/src/species/lion/whiskers.js +132 -0
  240. package/vendor/procedural-animals/src/species/pig/behaviour.js +575 -0
  241. package/vendor/procedural-animals/src/species/pig/coat.js +730 -0
  242. package/vendor/procedural-animals/src/species/pig/ears.js +242 -0
  243. package/vendor/procedural-animals/src/species/pig/index.js +161 -0
  244. package/vendor/procedural-animals/src/species/pig/motion.js +105 -0
  245. package/vendor/procedural-animals/src/species/pig/regions.js +100 -0
  246. package/vendor/procedural-animals/src/species/pig/rig.js +152 -0
  247. package/vendor/procedural-animals/src/species/pig/sculpt.js +382 -0
  248. package/vendor/procedural-animals/src/species/rabbit/behaviour.js +605 -0
  249. package/vendor/procedural-animals/src/species/rabbit/coat.js +285 -0
  250. package/vendor/procedural-animals/src/species/rabbit/index.js +85 -0
  251. package/vendor/procedural-animals/src/species/rabbit/motion.js +85 -0
  252. package/vendor/procedural-animals/src/species/rabbit/regions.js +48 -0
  253. package/vendor/procedural-animals/src/species/rabbit/rig.js +99 -0
  254. package/vendor/procedural-animals/src/species/rabbit/sculpt.js +148 -0
  255. package/vendor/procedural-animals/src/species/rat/behaviour.js +539 -0
  256. package/vendor/procedural-animals/src/species/rat/coat.js +341 -0
  257. package/vendor/procedural-animals/src/species/rat/index.js +111 -0
  258. package/vendor/procedural-animals/src/species/rat/motion.js +90 -0
  259. package/vendor/procedural-animals/src/species/rat/regions.js +92 -0
  260. package/vendor/procedural-animals/src/species/rat/rig.js +112 -0
  261. package/vendor/procedural-animals/src/species/rat/sculpt.js +163 -0
  262. package/vendor/procedural-animals/src/species/rat/whiskers.js +119 -0
  263. package/vendor/procedural-animals/src/species/shark/coat.js +383 -0
  264. package/vendor/procedural-animals/src/species/shark/index.js +104 -0
  265. package/vendor/procedural-animals/src/species/shark/motion.js +69 -0
  266. package/vendor/procedural-animals/src/species/shark/regions.js +34 -0
  267. package/vendor/procedural-animals/src/species/shark/rig.js +194 -0
  268. package/vendor/procedural-animals/src/species/shark/sculpt.js +343 -0
  269. package/vendor/procedural-animals/src/species/shark/variants.js +105 -0
  270. package/vendor/procedural-animals/src/species/sheep/behaviour.js +522 -0
  271. package/vendor/procedural-animals/src/species/sheep/coat.js +529 -0
  272. package/vendor/procedural-animals/src/species/sheep/index.js +152 -0
  273. package/vendor/procedural-animals/src/species/sheep/motion.js +86 -0
  274. package/vendor/procedural-animals/src/species/sheep/neck.js +41 -0
  275. package/vendor/procedural-animals/src/species/sheep/regions.js +62 -0
  276. package/vendor/procedural-animals/src/species/sheep/rig.js +163 -0
  277. package/vendor/procedural-animals/src/species/sheep/sculpt.js +542 -0
  278. package/vendor/procedural-animals/src/species/snake/coat.js +315 -0
  279. package/vendor/procedural-animals/src/species/snake/index.js +73 -0
  280. package/vendor/procedural-animals/src/species/snake/motion.js +51 -0
  281. package/vendor/procedural-animals/src/species/snake/regions.js +51 -0
  282. package/vendor/procedural-animals/src/species/snake/rig.js +108 -0
  283. package/vendor/procedural-animals/src/species/snake/sculpt.js +122 -0
  284. package/vendor/procedural-animals/src/species/spider/coat.js +279 -0
  285. package/vendor/procedural-animals/src/species/spider/index.js +78 -0
  286. package/vendor/procedural-animals/src/species/spider/motion.js +72 -0
  287. package/vendor/procedural-animals/src/species/spider/regions.js +87 -0
  288. package/vendor/procedural-animals/src/species/spider/rig.js +118 -0
  289. package/vendor/procedural-animals/src/species/spider/sculpt.js +182 -0
  290. package/vendor/procedural-animals/src/species/wolf/behaviour.js +160 -0
  291. package/vendor/procedural-animals/src/species/wolf/coat.js +749 -0
  292. package/vendor/procedural-animals/src/species/wolf/index.js +107 -0
  293. package/vendor/procedural-animals/src/species/wolf/motion.js +80 -0
  294. package/vendor/procedural-animals/src/species/wolf/regions.js +57 -0
  295. package/vendor/procedural-animals/src/species/wolf/rig.js +87 -0
  296. package/vendor/procedural-animals/src/species/wolf/sculpt.js +339 -0
  297. package/vendor/procedural-animals/src/worker.js +29 -0
@@ -0,0 +1,66 @@
1
+ // The folded wing's tertials (sec8-10, the top of the folded stack behind the shield) read as contour
2
+ // feathers: their top layers are restyled from vane cards to material FEATHER (the body's shingle shading,
3
+ // the wing tract's colour and markings) with the body's down shells (furLen), so the rear of the folded
4
+ // wing continues the plumage (as vanes they were one flat, glossy panel). Their undersides stay vanes.
5
+ import { MAT } from '../../core/build/coatKit.js';
6
+
7
+ // the cards of a featherCards block: [{ bone, start, n, top: [start, start + n / 2) }]
8
+ export function cardBlocks(fc, boneNames) {
9
+ const out = [];
10
+ let v = 0;
11
+ const nV = fc.nV;
12
+ // runs of one bone; each run holds 1 or 2 cards of equal size (feather, covert)
13
+ const runs = [];
14
+ while (v < nV) {
15
+ const b = fc.skinIndex[v * 4];
16
+ let e = v; while (e < nV && fc.skinIndex[e * 4] === b) e++;
17
+ runs.push([b, v, e]); v = e;
18
+ }
19
+ const cs = Math.min(...runs.map(([, a, e]) => e - a));
20
+ for (const [b, a, e] of runs) for (let k = 0; a + k * cs < e; k++) out.push({ bone: b, name: boneNames[b], covert: k > 0, start: a + k * cs, n: cs });
21
+ return out;
22
+ }
23
+
24
+ export function restyleWing(fc, rig, look) {
25
+ if (!look) return fc;
26
+ const names = rig.BONES.map((b) => b.name);
27
+ for (const c of cardBlocks(fc, names)) {
28
+ const m = /^sec(\d+)[LR]$/.exec(c.name);
29
+ if (!m || c.covert) continue;
30
+ const i = +m[1] - 1;
31
+ if (i < 7) continue;
32
+ for (let v = c.start; v < c.start + c.n / 2; v++) {
33
+ fc.tint.set([look.rgb[0], look.rgb[1], look.rgb[2], MAT.FEATHER], v * 4);
34
+ fc.surf.set([look.gloss, look.size, look.mz, look.irid], v * 4);
35
+ fc.pattern[v] = 1;
36
+ fc.furLen[v] = look.fur ?? 0;
37
+ if (look.mcol) fc.patternColor.set([look.mcol[0], look.mcol[1], look.mcol[2], 0], v * 4);
38
+ }
39
+ }
40
+ return fc;
41
+ }
42
+
43
+ // A chick's wing is down-covered skin with at most a few short pin feathers at its tip: its flight-feather
44
+ // cards (narrow pin-feather cards, motion.js feathersFor) are restyled as down, both faces material FUR
45
+ // with the down shells of the wing tract around them (the top the colour of the down on the folded wing's
46
+ // bed, the underside the pale underwing), so the folded wing reads as part of the ball of down and the
47
+ // flapping wing as a small downy wing (as plain vanes they were a pale opaque lens on the down).
48
+ // look: { top: rgb, under: rgb, fur (m), furUnder (m, the underside's short down), furTip (fraction of fur left at the tip), size, gloss }
49
+ export function downyWing(fc, rig, look) {
50
+ if (!look) return fc;
51
+ const names = rig.BONES.map((b) => b.name);
52
+ for (const c of cardBlocks(fc, names)) {
53
+ if (!/^(pri|sec)\d+[LR]$/.test(c.name)) continue;
54
+ for (let v = c.start; v < c.start + c.n; v++) {
55
+ const top = v < c.start + c.n / 2;
56
+ const t = fc.surf[v * 4 + 3], k = 1 + 0.05 * Math.sin(v * 0.37);
57
+ const rgb = top ? look.top : look.under;
58
+ fc.tint.set([rgb[0] * k, rgb[1] * k, rgb[2] * k, MAT.FUR], v * 4);
59
+ fc.surf.set([look.gloss, look.size, 0, 0], v * 4);
60
+ fc.pattern[v] = 1;
61
+ fc.furLen[v] = (top ? look.fur : look.furUnder ?? look.fur) * (1 - (1 - look.furTip) * t);
62
+ fc.patternColor.set([0, 0, 0, 0], v * 4);
63
+ }
64
+ }
65
+ return fc;
66
+ }
@@ -0,0 +1,124 @@
1
+ // The stack of flight-feather cards seen in the forearm's plan: a height map of the top card above the
2
+ // wing plane, the highest over the wing's motion (folded, half open, spread and over-fanned). The covert
3
+ // shield on the forearm (sculpt.js coverts()) and the greater covert cards along its rim (coverts.js)
4
+ // are placed from it, so the coverts lie ON the stack (a small gap above its top card) in every pose and
5
+ // no flight feather comes out through them.
6
+ //
7
+ // Plan frame (the ulna's): x from the wrist toward the elbow, y toward the trailing edge, h along the
8
+ // wing's dorsal normal; mm, for this individual (not normalised by the wing's size).
9
+ import { wingFK, makeWingFrames, degs, featherFrame, makeFeatherFrame, resolveFeathers, extension, DEG } from '../../core/rig/bird.js';
10
+ import { vaneWidth } from '../../core/build/featherCards.js';
11
+ import { wingFor, feathersFor } from './motion.js';
12
+
13
+ const V = (o) => [o.x, o.y, o.z];
14
+ const add = (a, b, k) => [a[0] + b[0] * k, a[1] + b[1] * k, a[2] + b[2] * k];
15
+ const cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
16
+ const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
17
+ const nrm = (a) => { const l = Math.hypot(a[0], a[1], a[2]) || 1; return [a[0] / l, a[1] / l, a[2] / l]; };
18
+
19
+ // wing states between folded (0) and spread (1, glide), the feather fan up to the engine's over-fan
20
+ export const STACK_STATES = [0, 0.15, 0.3, 0.5, 0.7, 0.85, 1, 1.2];
21
+
22
+ const cache = new Map();
23
+ /**
24
+ * @returns { at(x, y) -> top card height (mm, max over the states) or -Infinity where no card lies,
25
+ * fold(x, y) -> the same, folded only, cell (mm) }
26
+ */
27
+ export function wingStack(form = {}, states = STACK_STATES) {
28
+ const key = JSON.stringify([form.wingK, form.priK, form.fwK, form.chick, form.up, states]);
29
+ if (cache.has(key)) return cache.get(key);
30
+ const W = wingFor(form), F = resolveFeathers(feathersFor(form)), cov = F.coverts;
31
+ const L = { h: W.lengths[0], u: W.lengths[1], m: W.lengths[2] };
32
+ const cell = 1, X0 = -40, Y0 = -70, NX = 320, NY = 160;
33
+ const maxH = new Float32Array(NX * NY).fill(-Infinity), foldH = new Float32Array(NX * NY).fill(-Infinity);
34
+ const ff = makeFeatherFrame();
35
+ for (const e of states) {
36
+ const eW = Math.min(1, e), cfg = Object.fromEntries(Object.keys(W.fold).map((k) => [k, W.fold[k] + (W.glide[k] - W.fold[k]) * eW]));
37
+ const fr = wingFK(makeWingFrames(), 1, L, degs(cfg));
38
+ const eH = Math.min(1.25, extension(cfg.wrist * DEG, W.fold.wrist * DEG, W.glide.wrist * DEG) + Math.max(0, e - 1));
39
+ const eU = Math.min(1.2, extension(cfg.elbow * DEG, W.fold.elbow * DEG, W.glide.elbow * DEG) + Math.max(0, e - 1));
40
+ const P0 = V(fr.wrist), dU = V(fr.dU), nU = V(fr.nU), tU = nrm(cross(nU, dU)), X = dU.map((x) => -x);
41
+ const proj = (p) => { const q = [p[0] - P0[0], p[1] - P0[1], p[2] - P0[2]]; return [dot(q, X) * 1000, dot(q, tU) * 1000, dot(q, nU) * 1000]; };
42
+ const P0o = { x: P0[0], y: P0[1], z: P0[2] };
43
+ const raster = (f, o = {}) => {
44
+ const A = V(ff.axis), N = V(ff.normal), Tv = nrm(cross(N, A));
45
+ const fo = o.shape ? { ...f, ...o.shape } : f;
46
+ const len = f.len * (o.lenK || 1), w = f.width * (o.widthK || 1);
47
+ const root = add(add(V(ff.root), N, o.lift || 0), A, o.shift || 0), arch = fo.arch ?? 0.12;
48
+ // the card's top layer on a (t, c) grid
49
+ const nt = 24, nc = 6, G = [];
50
+ for (let i = 0; i <= nt; i++) {
51
+ const t = i / nt, [wo, wi] = vaneWidth(fo, Math.min(t, 0.999), w), cu = (fo.curve || 0) * len * t * t, dr = (fo.droop || 0) * len * t * t;
52
+ const row = [];
53
+ for (let j = 0; j <= nc; j++) {
54
+ const c = -1 + 2 * j / nc, ww = c < 0 ? wo : wi;
55
+ let p = add(root, A, t * len);
56
+ p = add(p, Tv, cu + c * ww);
57
+ p = add(p, N, -dr - Math.abs(c) * ww * arch + 0.00025);
58
+ row.push(proj(p));
59
+ }
60
+ G.push(row);
61
+ }
62
+ for (let i = 0; i < nt; i++) for (let j = 0; j < nc; j++) {
63
+ const a = G[i][j], b = G[i + 1][j], c = G[i + 1][j + 1], d = G[i][j + 1];
64
+ tri(a, b, c); tri(a, c, d);
65
+ }
66
+ };
67
+ const tri = (a, b, c) => {
68
+ const x0 = Math.floor((Math.min(a[0], b[0], c[0]) - X0) / cell), x1 = Math.ceil((Math.max(a[0], b[0], c[0]) - X0) / cell);
69
+ const y0 = Math.floor((Math.min(a[1], b[1], c[1]) - Y0) / cell), y1 = Math.ceil((Math.max(a[1], b[1], c[1]) - Y0) / cell);
70
+ const den = (b[1] - c[1]) * (a[0] - c[0]) + (c[0] - b[0]) * (a[1] - c[1]);
71
+ if (Math.abs(den) < 1e-9) return;
72
+ for (let iy = Math.max(0, y0); iy <= Math.min(NY - 1, y1); iy++) for (let ix = Math.max(0, x0); ix <= Math.min(NX - 1, x1); ix++) {
73
+ const px = X0 + ix * cell, py = Y0 + iy * cell;
74
+ const l1 = ((b[1] - c[1]) * (px - c[0]) + (c[0] - b[0]) * (py - c[1])) / den;
75
+ const l2 = ((c[1] - a[1]) * (px - c[0]) + (a[0] - c[0]) * (py - c[1])) / den;
76
+ const l3 = 1 - l1 - l2;
77
+ // (a cell touched by the triangle's edge counts: the outline is conservative by ~half a cell)
78
+ if (l1 < -0.08 || l2 < -0.08 || l3 < -0.08) continue;
79
+ const h = l1 * a[2] + l2 * b[2] + l3 * c[2], k = iy * NX + ix;
80
+ if (h > maxH[k]) maxH[k] = h;
81
+ if (e === 0 && h > foldH[k]) foldH[k] = h;
82
+ }
83
+ };
84
+ for (const f of F.primaries) {
85
+ featherFrame(ff, P0o, fr.dM, fr.nM, L.m, 1, f, f.fold + (f.spread - f.fold) * eH, false);
86
+ raster(f);
87
+ if (!f.cov?.skip) raster(f, { lenK: cov.primary * (1 - 0.25 * f.i / Math.max(1, f.n - 1)), widthK: 1.05, lift: 0.0022, shift: -0.004, ...(f.cov || {}), shape: { emarg: 0, tipRound: 0.6, outer: 0.45, curve: 0.02, ...(f.cov?.shape || {}) } });
88
+ }
89
+ for (const f of F.secondaries) {
90
+ featherFrame(ff, P0o, fr.dU, fr.nU, L.u, 1, f, f.fold + (f.spread - f.fold) * eU, true);
91
+ raster(f);
92
+ if (!f.cov?.skip) raster(f, { lenK: cov.secondary, widthK: 1.15, lift: 0.0028, shift: -0.006, ...(f.cov || {}), shape: { tipRound: 0.65, outer: 0.45, curve: 0.02, ...(f.cov?.shape || {}) } });
93
+ }
94
+ }
95
+ const look = (A) => (x, y) => {
96
+ const ix = Math.round((x - X0) / cell), iy = Math.round((y - Y0) / cell);
97
+ if (ix < 0 || iy < 0 || ix >= NX || iy >= NY) return -Infinity;
98
+ return A[iy * NX + ix];
99
+ };
100
+ // the highest card within r mm of (x, y) (a footprint's clearance)
101
+ const near = (A) => (x, y, r = 1) => {
102
+ let m = -Infinity;
103
+ const ix0 = Math.round((x - X0) / cell), iy0 = Math.round((y - Y0) / cell), R = Math.ceil(r / cell);
104
+ for (let iy = iy0 - R; iy <= iy0 + R; iy++) for (let ix = ix0 - R; ix <= ix0 + R; ix++) {
105
+ if (ix < 0 || iy < 0 || ix >= NX || iy >= NY) continue;
106
+ if ((ix - ix0) ** 2 + (iy - iy0) ** 2 > R * R) continue;
107
+ m = Math.max(m, A[iy * NX + ix]);
108
+ }
109
+ return m;
110
+ };
111
+ const out = { at: look(maxH), fold: look(foldH), near: near(maxH), cell };
112
+ cache.set(key, out);
113
+ return out;
114
+ }
115
+
116
+ // point in polygon (plan)
117
+ export function insidePoly(poly, x, y) {
118
+ let c = false;
119
+ for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {
120
+ const a = poly[i], b = poly[j];
121
+ if ((a[1] > y) !== (b[1] > y) && x < (b[0] - a[0]) * (y - a[1]) / (b[1] - a[1]) + a[0]) c = !c;
122
+ }
123
+ return c;
124
+ }