@bitefoundry/retrieviewer 0.0.0-stage → 0.0.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.
- package/ASSET-PROVENANCE.md +43 -0
- package/ASSETS-LICENSE.md +58 -0
- package/ATTRIBUTION.md +54 -0
- package/EMBEDDING.md +96 -0
- package/INSTALLING.md +107 -0
- package/LICENSE +16 -0
- package/LICENSE-CODE +21 -0
- package/PLUGIN.md +110 -0
- package/PUPPY-MEMORY.md +57 -0
- package/PUPPY-Q5-COMPARISON.md +73 -0
- package/README.md +61 -2
- package/RELEASING.md +61 -0
- package/THIRD-PARTY-NOTICES.md +17 -0
- package/TRADEMARKS.md +21 -0
- package/braille.mjs +45 -0
- package/examples/bridge.py +62 -0
- package/examples/embed.mjs +15 -0
- package/examples/live.mjs +40 -0
- package/examples/plugin.mjs +21 -0
- package/integrations/opencode/runtime.mjs +195 -0
- package/integrations/opencode/tui.tsx +59 -0
- package/locomotion-core.mjs +21 -0
- package/locomotion-puppy.animal +0 -0
- package/package.json +125 -4
- package/pet-q5-manifest.json +118 -0
- package/puppy-clean.mjs +51 -0
- package/puppy-companion-interactions-v3-q5.bin.gz +0 -0
- package/puppy-companion-interactions-v3.json +1 -0
- package/puppy-companion-life.mjs +182 -0
- package/puppy-companion-objects.mjs +30 -0
- package/puppy-companion-sprites.mjs +14 -0
- package/puppy-continuous.mjs +57 -0
- package/puppy-face.mjs +46 -0
- package/puppy-frame-predictive.mjs +147 -0
- package/puppy-frame-store.mjs +108 -0
- package/puppy-mouth-anchor.json +1 -0
- package/puppy-mouth-anchor.mjs +33 -0
- package/puppy-paper-actions-v9-q5.bin.gz +0 -0
- package/puppy-paper-actions-v9.json +1 -0
- package/puppy-paper-actions.mjs +48 -0
- package/puppy-paper-approach-q5.bin.gz +0 -0
- package/puppy-paper-approach.json +1 -0
- package/puppy-paper-area.mjs +15 -0
- package/puppy-paper-arrival-seat-q5.bin.gz +0 -0
- package/puppy-paper-arrival-seat.json +1 -0
- package/puppy-paper-behaviors-q5.bin.gz +0 -0
- package/puppy-paper-behaviors.json +1 -0
- package/puppy-paper-behaviors.mjs +8 -0
- package/puppy-paper-contact.mjs +103 -0
- package/puppy-paper-director.mjs +21 -0
- package/puppy-paper-paw-transport.mjs +76 -0
- package/puppy-paper-rear-gallop-q5.bin.gz +0 -0
- package/puppy-paper-rear-gallop.json +1 -0
- package/puppy-paper-seat-q5.bin.gz +0 -0
- package/puppy-paper-seat.json +14 -0
- package/puppy-paper-seat.mjs +13 -0
- package/puppy-paper-trick-timing.mjs +58 -0
- package/puppy-paper-world.mjs +108 -0
- package/puppy-paper.mjs +271 -0
- package/puppy-stable-meta.json +1606 -0
- package/puppy-stable.mjs +72 -0
- package/puppy-stride-meta.json +343 -0
- package/puppy-stride-tweens-q5.bin.gz +0 -0
- package/puppy-zoomies.mjs +27 -0
- package/puppy-zoomies30.mjs +12 -0
- package/retrieviewer-cli.mjs +81 -0
- package/retrieviewer-config.mjs +49 -0
- package/retrieviewer-install.mjs +157 -0
- package/retrieviewer-plugin.d.mts +44 -0
- package/retrieviewer-plugin.mjs +97 -0
- package/retrieviewer-stdio.mjs +38 -0
- package/retrieviewer.d.mts +85 -0
- package/retrieviewer.mjs +142 -0
- package/vendor/procedural-animals/LICENSE +21 -0
- package/vendor/procedural-animals/package.json +40 -0
- package/vendor/procedural-animals/src/animal.js +146 -0
- package/vendor/procedural-animals/src/bake.js +51 -0
- package/vendor/procedural-animals/src/build.js +81 -0
- package/vendor/procedural-animals/src/core/build/coatKit.js +121 -0
- package/vendor/procedural-animals/src/core/build/featherCards.js +189 -0
- package/vendor/procedural-animals/src/core/build/finEdges.js +85 -0
- package/vendor/procedural-animals/src/core/build/furSlope.js +115 -0
- package/vendor/procedural-animals/src/core/build/mesh.js +67 -0
- package/vendor/procedural-animals/src/core/build/pipeline.js +272 -0
- package/vendor/procedural-animals/src/core/build/seams.js +183 -0
- package/vendor/procedural-animals/src/core/build/warp.js +112 -0
- package/vendor/procedural-animals/src/core/build/weights.js +393 -0
- package/vendor/procedural-animals/src/core/math/vec.js +81 -0
- package/vendor/procedural-animals/src/core/motion/actions.js +800 -0
- package/vendor/procedural-animals/src/core/motion/bird.js +3063 -0
- package/vendor/procedural-animals/src/core/motion/birdActions.js +1059 -0
- package/vendor/procedural-animals/src/core/motion/common.js +158 -0
- package/vendor/procedural-animals/src/core/motion/index.js +22 -0
- package/vendor/procedural-animals/src/core/motion/quadruped.js +2875 -0
- package/vendor/procedural-animals/src/core/motion/snake.js +1594 -0
- package/vendor/procedural-animals/src/core/motion/spider.js +1810 -0
- package/vendor/procedural-animals/src/core/motion/swimmer.js +1047 -0
- package/vendor/procedural-animals/src/core/motion/swimmerActions.js +613 -0
- package/vendor/procedural-animals/src/core/render/animalObject.js +262 -0
- package/vendor/procedural-animals/src/core/render/coatMaterial.js +1301 -0
- package/vendor/procedural-animals/src/core/render/dqs.js +159 -0
- package/vendor/procedural-animals/src/core/render/eyes.js +676 -0
- package/vendor/procedural-animals/src/core/render/membranes.js +77 -0
- package/vendor/procedural-animals/src/core/render/skeleton.js +41 -0
- package/vendor/procedural-animals/src/core/rig/bird.js +327 -0
- package/vendor/procedural-animals/src/core/rig/quadruped.js +76 -0
- package/vendor/procedural-animals/src/core/rig/rig.js +79 -0
- package/vendor/procedural-animals/src/core/rig/snake.js +76 -0
- package/vendor/procedural-animals/src/core/rig/spider.js +110 -0
- package/vendor/procedural-animals/src/core/rig/swimmer.js +181 -0
- package/vendor/procedural-animals/src/core/sdf/eyeSocket.js +53 -0
- package/vendor/procedural-animals/src/core/sdf/mesher.js +238 -0
- package/vendor/procedural-animals/src/core/sdf/sdf.js +263 -0
- package/vendor/procedural-animals/src/index.d.ts +98 -0
- package/vendor/procedural-animals/src/index.js +29 -0
- package/vendor/procedural-animals/src/registry.js +48 -0
- package/vendor/procedural-animals/src/species/bear/behaviour.js +463 -0
- package/vendor/procedural-animals/src/species/bear/claws.js +147 -0
- package/vendor/procedural-animals/src/species/bear/coat.js +726 -0
- package/vendor/procedural-animals/src/species/bear/index.js +139 -0
- package/vendor/procedural-animals/src/species/bear/motion.js +112 -0
- package/vendor/procedural-animals/src/species/bear/regions.js +78 -0
- package/vendor/procedural-animals/src/species/bear/rig.js +112 -0
- package/vendor/procedural-animals/src/species/bear/sculpt.js +272 -0
- package/vendor/procedural-animals/src/species/boar/behaviour.js +335 -0
- package/vendor/procedural-animals/src/species/boar/coat.js +372 -0
- package/vendor/procedural-animals/src/species/boar/index.js +110 -0
- package/vendor/procedural-animals/src/species/boar/motion.js +85 -0
- package/vendor/procedural-animals/src/species/boar/regions.js +88 -0
- package/vendor/procedural-animals/src/species/boar/rig.js +111 -0
- package/vendor/procedural-animals/src/species/boar/sculpt.js +285 -0
- package/vendor/procedural-animals/src/species/cat/behaviour.js +559 -0
- package/vendor/procedural-animals/src/species/cat/coat.js +841 -0
- package/vendor/procedural-animals/src/species/cat/index.js +211 -0
- package/vendor/procedural-animals/src/species/cat/motion.js +101 -0
- package/vendor/procedural-animals/src/species/cat/regions.js +82 -0
- package/vendor/procedural-animals/src/species/cat/rig.js +100 -0
- package/vendor/procedural-animals/src/species/cat/sculpt.js +266 -0
- package/vendor/procedural-animals/src/species/cat/whiskers.js +110 -0
- package/vendor/procedural-animals/src/species/cheetah/coat.js +427 -0
- package/vendor/procedural-animals/src/species/cheetah/index.js +51 -0
- package/vendor/procedural-animals/src/species/cheetah/joints.js +3 -0
- package/vendor/procedural-animals/src/species/cheetah/motion.js +77 -0
- package/vendor/procedural-animals/src/species/cheetah/regions.js +95 -0
- package/vendor/procedural-animals/src/species/cheetah/rig.js +66 -0
- package/vendor/procedural-animals/src/species/cheetah/sculpt.js +158 -0
- package/vendor/procedural-animals/src/species/chicken/coat.js +313 -0
- package/vendor/procedural-animals/src/species/chicken/coverts.js +320 -0
- package/vendor/procedural-animals/src/species/chicken/index.js +110 -0
- package/vendor/procedural-animals/src/species/chicken/motion.js +177 -0
- package/vendor/procedural-animals/src/species/chicken/regions.js +66 -0
- package/vendor/procedural-animals/src/species/chicken/rig.js +144 -0
- package/vendor/procedural-animals/src/species/chicken/sculpt.js +389 -0
- package/vendor/procedural-animals/src/species/chicken/wingLook.js +66 -0
- package/vendor/procedural-animals/src/species/chicken/wingStack.js +124 -0
- package/vendor/procedural-animals/src/species/cow/behaviour.js +521 -0
- package/vendor/procedural-animals/src/species/cow/coat.js +465 -0
- package/vendor/procedural-animals/src/species/cow/index.js +118 -0
- package/vendor/procedural-animals/src/species/cow/motion.js +81 -0
- package/vendor/procedural-animals/src/species/cow/regions.js +98 -0
- package/vendor/procedural-animals/src/species/cow/rig.js +116 -0
- package/vendor/procedural-animals/src/species/cow/sculpt.js +339 -0
- package/vendor/procedural-animals/src/species/crow/coat.js +145 -0
- package/vendor/procedural-animals/src/species/crow/index.js +70 -0
- package/vendor/procedural-animals/src/species/crow/joints.js +3 -0
- package/vendor/procedural-animals/src/species/crow/motion.js +101 -0
- package/vendor/procedural-animals/src/species/crow/regions.js +50 -0
- package/vendor/procedural-animals/src/species/crow/rig.js +83 -0
- package/vendor/procedural-animals/src/species/crow/sculpt.js +118 -0
- package/vendor/procedural-animals/src/species/deer/behaviour.js +513 -0
- package/vendor/procedural-animals/src/species/deer/coat.js +391 -0
- package/vendor/procedural-animals/src/species/deer/index.js +106 -0
- package/vendor/procedural-animals/src/species/deer/motion.js +97 -0
- package/vendor/procedural-animals/src/species/deer/regions.js +60 -0
- package/vendor/procedural-animals/src/species/deer/rig.js +124 -0
- package/vendor/procedural-animals/src/species/deer/sculpt.js +297 -0
- package/vendor/procedural-animals/src/species/dog/behaviour.js +521 -0
- package/vendor/procedural-animals/src/species/dog/coat.js +495 -0
- package/vendor/procedural-animals/src/species/dog/index.js +144 -0
- package/vendor/procedural-animals/src/species/dog/motion.js +118 -0
- package/vendor/procedural-animals/src/species/dog/regions.js +61 -0
- package/vendor/procedural-animals/src/species/dog/rig.js +129 -0
- package/vendor/procedural-animals/src/species/dog/sculpt.js +246 -0
- package/vendor/procedural-animals/src/species/eagle/coat.js +250 -0
- package/vendor/procedural-animals/src/species/eagle/index.js +76 -0
- package/vendor/procedural-animals/src/species/eagle/joints.js +3 -0
- package/vendor/procedural-animals/src/species/eagle/motion.js +137 -0
- package/vendor/procedural-animals/src/species/eagle/regions.js +57 -0
- package/vendor/procedural-animals/src/species/eagle/rig.js +107 -0
- package/vendor/procedural-animals/src/species/eagle/sculpt.js +137 -0
- package/vendor/procedural-animals/src/species/fish/coat.js +271 -0
- package/vendor/procedural-animals/src/species/fish/index.js +88 -0
- package/vendor/procedural-animals/src/species/fish/motion.js +92 -0
- package/vendor/procedural-animals/src/species/fish/regions.js +27 -0
- package/vendor/procedural-animals/src/species/fish/rig.js +143 -0
- package/vendor/procedural-animals/src/species/fish/sculpt.js +214 -0
- package/vendor/procedural-animals/src/species/fish/variants.js +126 -0
- package/vendor/procedural-animals/src/species/fox/behaviour.js +314 -0
- package/vendor/procedural-animals/src/species/fox/coat.js +444 -0
- package/vendor/procedural-animals/src/species/fox/index.js +120 -0
- package/vendor/procedural-animals/src/species/fox/motion.js +81 -0
- package/vendor/procedural-animals/src/species/fox/regions.js +59 -0
- package/vendor/procedural-animals/src/species/fox/rig.js +91 -0
- package/vendor/procedural-animals/src/species/fox/sculpt.js +202 -0
- package/vendor/procedural-animals/src/species/frog/behaviour.js +590 -0
- package/vendor/procedural-animals/src/species/frog/coat.js +305 -0
- package/vendor/procedural-animals/src/species/frog/index.js +97 -0
- package/vendor/procedural-animals/src/species/frog/motion.js +69 -0
- package/vendor/procedural-animals/src/species/frog/regions.js +46 -0
- package/vendor/procedural-animals/src/species/frog/rig.js +156 -0
- package/vendor/procedural-animals/src/species/frog/sculpt.js +240 -0
- package/vendor/procedural-animals/src/species/goat/behaviour.js +509 -0
- package/vendor/procedural-animals/src/species/goat/coat.js +590 -0
- package/vendor/procedural-animals/src/species/goat/index.js +149 -0
- package/vendor/procedural-animals/src/species/goat/motion.js +95 -0
- package/vendor/procedural-animals/src/species/goat/regions.js +98 -0
- package/vendor/procedural-animals/src/species/goat/rig.js +181 -0
- package/vendor/procedural-animals/src/species/goat/sculpt.js +547 -0
- package/vendor/procedural-animals/src/species/horse/coat.js +361 -0
- package/vendor/procedural-animals/src/species/horse/coatSeam.js +122 -0
- package/vendor/procedural-animals/src/species/horse/index.js +80 -0
- package/vendor/procedural-animals/src/species/horse/motion.js +245 -0
- package/vendor/procedural-animals/src/species/horse/regions.js +60 -0
- package/vendor/procedural-animals/src/species/horse/rig.js +117 -0
- package/vendor/procedural-animals/src/species/horse/sculpt.js +316 -0
- package/vendor/procedural-animals/src/species/horse/seamWeights.js +272 -0
- package/vendor/procedural-animals/src/species/lion/behaviour.js +509 -0
- package/vendor/procedural-animals/src/species/lion/coat.js +1016 -0
- package/vendor/procedural-animals/src/species/lion/index.js +111 -0
- package/vendor/procedural-animals/src/species/lion/motion.js +87 -0
- package/vendor/procedural-animals/src/species/lion/regions.js +106 -0
- package/vendor/procedural-animals/src/species/lion/rig.js +110 -0
- package/vendor/procedural-animals/src/species/lion/sculpt.js +384 -0
- package/vendor/procedural-animals/src/species/lion/whiskers.js +132 -0
- package/vendor/procedural-animals/src/species/pig/behaviour.js +575 -0
- package/vendor/procedural-animals/src/species/pig/coat.js +730 -0
- package/vendor/procedural-animals/src/species/pig/ears.js +242 -0
- package/vendor/procedural-animals/src/species/pig/index.js +161 -0
- package/vendor/procedural-animals/src/species/pig/motion.js +105 -0
- package/vendor/procedural-animals/src/species/pig/regions.js +100 -0
- package/vendor/procedural-animals/src/species/pig/rig.js +152 -0
- package/vendor/procedural-animals/src/species/pig/sculpt.js +382 -0
- package/vendor/procedural-animals/src/species/rabbit/behaviour.js +605 -0
- package/vendor/procedural-animals/src/species/rabbit/coat.js +285 -0
- package/vendor/procedural-animals/src/species/rabbit/index.js +85 -0
- package/vendor/procedural-animals/src/species/rabbit/motion.js +85 -0
- package/vendor/procedural-animals/src/species/rabbit/regions.js +48 -0
- package/vendor/procedural-animals/src/species/rabbit/rig.js +99 -0
- package/vendor/procedural-animals/src/species/rabbit/sculpt.js +148 -0
- package/vendor/procedural-animals/src/species/rat/behaviour.js +539 -0
- package/vendor/procedural-animals/src/species/rat/coat.js +341 -0
- package/vendor/procedural-animals/src/species/rat/index.js +111 -0
- package/vendor/procedural-animals/src/species/rat/motion.js +90 -0
- package/vendor/procedural-animals/src/species/rat/regions.js +92 -0
- package/vendor/procedural-animals/src/species/rat/rig.js +112 -0
- package/vendor/procedural-animals/src/species/rat/sculpt.js +163 -0
- package/vendor/procedural-animals/src/species/rat/whiskers.js +119 -0
- package/vendor/procedural-animals/src/species/shark/coat.js +383 -0
- package/vendor/procedural-animals/src/species/shark/index.js +104 -0
- package/vendor/procedural-animals/src/species/shark/motion.js +69 -0
- package/vendor/procedural-animals/src/species/shark/regions.js +34 -0
- package/vendor/procedural-animals/src/species/shark/rig.js +194 -0
- package/vendor/procedural-animals/src/species/shark/sculpt.js +343 -0
- package/vendor/procedural-animals/src/species/shark/variants.js +105 -0
- package/vendor/procedural-animals/src/species/sheep/behaviour.js +522 -0
- package/vendor/procedural-animals/src/species/sheep/coat.js +529 -0
- package/vendor/procedural-animals/src/species/sheep/index.js +152 -0
- package/vendor/procedural-animals/src/species/sheep/motion.js +86 -0
- package/vendor/procedural-animals/src/species/sheep/neck.js +41 -0
- package/vendor/procedural-animals/src/species/sheep/regions.js +62 -0
- package/vendor/procedural-animals/src/species/sheep/rig.js +163 -0
- package/vendor/procedural-animals/src/species/sheep/sculpt.js +542 -0
- package/vendor/procedural-animals/src/species/snake/coat.js +315 -0
- package/vendor/procedural-animals/src/species/snake/index.js +73 -0
- package/vendor/procedural-animals/src/species/snake/motion.js +51 -0
- package/vendor/procedural-animals/src/species/snake/regions.js +51 -0
- package/vendor/procedural-animals/src/species/snake/rig.js +108 -0
- package/vendor/procedural-animals/src/species/snake/sculpt.js +122 -0
- package/vendor/procedural-animals/src/species/spider/coat.js +279 -0
- package/vendor/procedural-animals/src/species/spider/index.js +78 -0
- package/vendor/procedural-animals/src/species/spider/motion.js +72 -0
- package/vendor/procedural-animals/src/species/spider/regions.js +87 -0
- package/vendor/procedural-animals/src/species/spider/rig.js +118 -0
- package/vendor/procedural-animals/src/species/spider/sculpt.js +182 -0
- package/vendor/procedural-animals/src/species/wolf/behaviour.js +160 -0
- package/vendor/procedural-animals/src/species/wolf/coat.js +749 -0
- package/vendor/procedural-animals/src/species/wolf/index.js +107 -0
- package/vendor/procedural-animals/src/species/wolf/motion.js +80 -0
- package/vendor/procedural-animals/src/species/wolf/regions.js +57 -0
- package/vendor/procedural-animals/src/species/wolf/rig.js +87 -0
- package/vendor/procedural-animals/src/species/wolf/sculpt.js +339 -0
- 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
|
+
}
|