@bitefoundry/retrieviewer 0.0.3 → 0.0.5

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 (263) hide show
  1. package/ASSET-PROVENANCE.md +11 -0
  2. package/ASSETS-LICENSE.md +2 -1
  3. package/ATTRIBUTION.md +6 -1
  4. package/COMFORT-ART.md +95 -0
  5. package/DESKTOP-PLATFORMS.md +6 -1
  6. package/INSTALLING.md +4 -0
  7. package/PLUGIN.md +13 -10
  8. package/PREREQUISITES.md +95 -0
  9. package/PUPPY-MEMORY.md +102 -1
  10. package/README.ko.md +116 -0
  11. package/README.md +121 -59
  12. package/RELEASING.md +33 -13
  13. package/THIRD-PARTY-NOTICES.md +5 -3
  14. package/braille.mjs +35 -9
  15. package/examples/live.mjs +2 -2
  16. package/integrations/linux-overlay/overlay.py +8 -2
  17. package/integrations/macos-overlay/overlay.jxa +9 -7
  18. package/integrations/opencode/runtime.mjs +4 -4
  19. package/integrations/opencode/tui.tsx +1 -1
  20. package/integrations/windows-overlay/Overlay.cs +7 -6
  21. package/integrations/windows-overlay/desktop.mjs +2 -1
  22. package/integrations/windows-overlay/protocol.mjs +13 -7
  23. package/integrations/windows-overlay/worker.mjs +1 -1
  24. package/package.json +34 -13
  25. package/puppy-comfort-sprites.mjs +33 -0
  26. package/puppy-companion-comfort-q5.bin.gz +0 -0
  27. package/puppy-companion-comfort.json +140 -0
  28. package/puppy-companion-life.mjs +58 -18
  29. package/puppy-companion-objects.mjs +12 -0
  30. package/puppy-companion-sprites.mjs +4 -2
  31. package/puppy-frame-predictive.mjs +15 -9
  32. package/puppy-frame-store.mjs +2 -2
  33. package/puppy-paper-actions.mjs +4 -2
  34. package/puppy-paper-behaviors.mjs +1 -1
  35. package/puppy-paper-contact.mjs +4 -2
  36. package/puppy-paper-seat.mjs +4 -2
  37. package/puppy-paper-world.mjs +14 -0
  38. package/puppy-paper.mjs +79 -21
  39. package/retrieviewer-cli.mjs +8 -6
  40. package/retrieviewer-plugin.d.mts +1 -1
  41. package/retrieviewer-plugin.mjs +1 -1
  42. package/retrieviewer.d.mts +12 -4
  43. package/retrieviewer.mjs +20 -14
  44. package/locomotion-core.mjs +0 -21
  45. package/locomotion-puppy.animal +0 -0
  46. package/vendor/procedural-animals/package.json +0 -40
  47. package/vendor/procedural-animals/src/animal.js +0 -146
  48. package/vendor/procedural-animals/src/bake.js +0 -51
  49. package/vendor/procedural-animals/src/build.js +0 -81
  50. package/vendor/procedural-animals/src/core/build/coatKit.js +0 -121
  51. package/vendor/procedural-animals/src/core/build/featherCards.js +0 -189
  52. package/vendor/procedural-animals/src/core/build/finEdges.js +0 -85
  53. package/vendor/procedural-animals/src/core/build/furSlope.js +0 -115
  54. package/vendor/procedural-animals/src/core/build/mesh.js +0 -67
  55. package/vendor/procedural-animals/src/core/build/pipeline.js +0 -272
  56. package/vendor/procedural-animals/src/core/build/seams.js +0 -183
  57. package/vendor/procedural-animals/src/core/build/warp.js +0 -112
  58. package/vendor/procedural-animals/src/core/build/weights.js +0 -393
  59. package/vendor/procedural-animals/src/core/math/vec.js +0 -81
  60. package/vendor/procedural-animals/src/core/motion/actions.js +0 -800
  61. package/vendor/procedural-animals/src/core/motion/bird.js +0 -3063
  62. package/vendor/procedural-animals/src/core/motion/birdActions.js +0 -1059
  63. package/vendor/procedural-animals/src/core/motion/common.js +0 -158
  64. package/vendor/procedural-animals/src/core/motion/index.js +0 -22
  65. package/vendor/procedural-animals/src/core/motion/quadruped.js +0 -2875
  66. package/vendor/procedural-animals/src/core/motion/snake.js +0 -1594
  67. package/vendor/procedural-animals/src/core/motion/spider.js +0 -1810
  68. package/vendor/procedural-animals/src/core/motion/swimmer.js +0 -1047
  69. package/vendor/procedural-animals/src/core/motion/swimmerActions.js +0 -613
  70. package/vendor/procedural-animals/src/core/render/animalObject.js +0 -262
  71. package/vendor/procedural-animals/src/core/render/coatMaterial.js +0 -1301
  72. package/vendor/procedural-animals/src/core/render/dqs.js +0 -159
  73. package/vendor/procedural-animals/src/core/render/eyes.js +0 -676
  74. package/vendor/procedural-animals/src/core/render/membranes.js +0 -77
  75. package/vendor/procedural-animals/src/core/render/skeleton.js +0 -41
  76. package/vendor/procedural-animals/src/core/rig/bird.js +0 -327
  77. package/vendor/procedural-animals/src/core/rig/quadruped.js +0 -76
  78. package/vendor/procedural-animals/src/core/rig/rig.js +0 -79
  79. package/vendor/procedural-animals/src/core/rig/snake.js +0 -76
  80. package/vendor/procedural-animals/src/core/rig/spider.js +0 -110
  81. package/vendor/procedural-animals/src/core/rig/swimmer.js +0 -181
  82. package/vendor/procedural-animals/src/core/sdf/eyeSocket.js +0 -53
  83. package/vendor/procedural-animals/src/core/sdf/mesher.js +0 -238
  84. package/vendor/procedural-animals/src/core/sdf/sdf.js +0 -263
  85. package/vendor/procedural-animals/src/index.d.ts +0 -98
  86. package/vendor/procedural-animals/src/index.js +0 -29
  87. package/vendor/procedural-animals/src/registry.js +0 -48
  88. package/vendor/procedural-animals/src/species/bear/behaviour.js +0 -463
  89. package/vendor/procedural-animals/src/species/bear/claws.js +0 -147
  90. package/vendor/procedural-animals/src/species/bear/coat.js +0 -726
  91. package/vendor/procedural-animals/src/species/bear/index.js +0 -139
  92. package/vendor/procedural-animals/src/species/bear/motion.js +0 -112
  93. package/vendor/procedural-animals/src/species/bear/regions.js +0 -78
  94. package/vendor/procedural-animals/src/species/bear/rig.js +0 -112
  95. package/vendor/procedural-animals/src/species/bear/sculpt.js +0 -272
  96. package/vendor/procedural-animals/src/species/boar/behaviour.js +0 -335
  97. package/vendor/procedural-animals/src/species/boar/coat.js +0 -372
  98. package/vendor/procedural-animals/src/species/boar/index.js +0 -110
  99. package/vendor/procedural-animals/src/species/boar/motion.js +0 -85
  100. package/vendor/procedural-animals/src/species/boar/regions.js +0 -88
  101. package/vendor/procedural-animals/src/species/boar/rig.js +0 -111
  102. package/vendor/procedural-animals/src/species/boar/sculpt.js +0 -285
  103. package/vendor/procedural-animals/src/species/cat/behaviour.js +0 -559
  104. package/vendor/procedural-animals/src/species/cat/coat.js +0 -841
  105. package/vendor/procedural-animals/src/species/cat/index.js +0 -211
  106. package/vendor/procedural-animals/src/species/cat/motion.js +0 -101
  107. package/vendor/procedural-animals/src/species/cat/regions.js +0 -82
  108. package/vendor/procedural-animals/src/species/cat/rig.js +0 -100
  109. package/vendor/procedural-animals/src/species/cat/sculpt.js +0 -266
  110. package/vendor/procedural-animals/src/species/cat/whiskers.js +0 -110
  111. package/vendor/procedural-animals/src/species/cheetah/coat.js +0 -427
  112. package/vendor/procedural-animals/src/species/cheetah/index.js +0 -51
  113. package/vendor/procedural-animals/src/species/cheetah/joints.js +0 -3
  114. package/vendor/procedural-animals/src/species/cheetah/motion.js +0 -77
  115. package/vendor/procedural-animals/src/species/cheetah/regions.js +0 -95
  116. package/vendor/procedural-animals/src/species/cheetah/rig.js +0 -66
  117. package/vendor/procedural-animals/src/species/cheetah/sculpt.js +0 -158
  118. package/vendor/procedural-animals/src/species/chicken/coat.js +0 -313
  119. package/vendor/procedural-animals/src/species/chicken/coverts.js +0 -320
  120. package/vendor/procedural-animals/src/species/chicken/index.js +0 -110
  121. package/vendor/procedural-animals/src/species/chicken/motion.js +0 -177
  122. package/vendor/procedural-animals/src/species/chicken/regions.js +0 -66
  123. package/vendor/procedural-animals/src/species/chicken/rig.js +0 -144
  124. package/vendor/procedural-animals/src/species/chicken/sculpt.js +0 -389
  125. package/vendor/procedural-animals/src/species/chicken/wingLook.js +0 -66
  126. package/vendor/procedural-animals/src/species/chicken/wingStack.js +0 -124
  127. package/vendor/procedural-animals/src/species/cow/behaviour.js +0 -521
  128. package/vendor/procedural-animals/src/species/cow/coat.js +0 -465
  129. package/vendor/procedural-animals/src/species/cow/index.js +0 -118
  130. package/vendor/procedural-animals/src/species/cow/motion.js +0 -81
  131. package/vendor/procedural-animals/src/species/cow/regions.js +0 -98
  132. package/vendor/procedural-animals/src/species/cow/rig.js +0 -116
  133. package/vendor/procedural-animals/src/species/cow/sculpt.js +0 -339
  134. package/vendor/procedural-animals/src/species/crow/coat.js +0 -145
  135. package/vendor/procedural-animals/src/species/crow/index.js +0 -70
  136. package/vendor/procedural-animals/src/species/crow/joints.js +0 -3
  137. package/vendor/procedural-animals/src/species/crow/motion.js +0 -101
  138. package/vendor/procedural-animals/src/species/crow/regions.js +0 -50
  139. package/vendor/procedural-animals/src/species/crow/rig.js +0 -83
  140. package/vendor/procedural-animals/src/species/crow/sculpt.js +0 -118
  141. package/vendor/procedural-animals/src/species/deer/behaviour.js +0 -513
  142. package/vendor/procedural-animals/src/species/deer/coat.js +0 -391
  143. package/vendor/procedural-animals/src/species/deer/index.js +0 -106
  144. package/vendor/procedural-animals/src/species/deer/motion.js +0 -97
  145. package/vendor/procedural-animals/src/species/deer/regions.js +0 -60
  146. package/vendor/procedural-animals/src/species/deer/rig.js +0 -124
  147. package/vendor/procedural-animals/src/species/deer/sculpt.js +0 -297
  148. package/vendor/procedural-animals/src/species/dog/behaviour.js +0 -521
  149. package/vendor/procedural-animals/src/species/dog/coat.js +0 -495
  150. package/vendor/procedural-animals/src/species/dog/index.js +0 -144
  151. package/vendor/procedural-animals/src/species/dog/motion.js +0 -118
  152. package/vendor/procedural-animals/src/species/dog/regions.js +0 -61
  153. package/vendor/procedural-animals/src/species/dog/rig.js +0 -129
  154. package/vendor/procedural-animals/src/species/dog/sculpt.js +0 -246
  155. package/vendor/procedural-animals/src/species/eagle/coat.js +0 -250
  156. package/vendor/procedural-animals/src/species/eagle/index.js +0 -76
  157. package/vendor/procedural-animals/src/species/eagle/joints.js +0 -3
  158. package/vendor/procedural-animals/src/species/eagle/motion.js +0 -137
  159. package/vendor/procedural-animals/src/species/eagle/regions.js +0 -57
  160. package/vendor/procedural-animals/src/species/eagle/rig.js +0 -107
  161. package/vendor/procedural-animals/src/species/eagle/sculpt.js +0 -137
  162. package/vendor/procedural-animals/src/species/fish/coat.js +0 -271
  163. package/vendor/procedural-animals/src/species/fish/index.js +0 -88
  164. package/vendor/procedural-animals/src/species/fish/motion.js +0 -92
  165. package/vendor/procedural-animals/src/species/fish/regions.js +0 -27
  166. package/vendor/procedural-animals/src/species/fish/rig.js +0 -143
  167. package/vendor/procedural-animals/src/species/fish/sculpt.js +0 -214
  168. package/vendor/procedural-animals/src/species/fish/variants.js +0 -126
  169. package/vendor/procedural-animals/src/species/fox/behaviour.js +0 -314
  170. package/vendor/procedural-animals/src/species/fox/coat.js +0 -444
  171. package/vendor/procedural-animals/src/species/fox/index.js +0 -120
  172. package/vendor/procedural-animals/src/species/fox/motion.js +0 -81
  173. package/vendor/procedural-animals/src/species/fox/regions.js +0 -59
  174. package/vendor/procedural-animals/src/species/fox/rig.js +0 -91
  175. package/vendor/procedural-animals/src/species/fox/sculpt.js +0 -202
  176. package/vendor/procedural-animals/src/species/frog/behaviour.js +0 -590
  177. package/vendor/procedural-animals/src/species/frog/coat.js +0 -305
  178. package/vendor/procedural-animals/src/species/frog/index.js +0 -97
  179. package/vendor/procedural-animals/src/species/frog/motion.js +0 -69
  180. package/vendor/procedural-animals/src/species/frog/regions.js +0 -46
  181. package/vendor/procedural-animals/src/species/frog/rig.js +0 -156
  182. package/vendor/procedural-animals/src/species/frog/sculpt.js +0 -240
  183. package/vendor/procedural-animals/src/species/goat/behaviour.js +0 -509
  184. package/vendor/procedural-animals/src/species/goat/coat.js +0 -590
  185. package/vendor/procedural-animals/src/species/goat/index.js +0 -149
  186. package/vendor/procedural-animals/src/species/goat/motion.js +0 -95
  187. package/vendor/procedural-animals/src/species/goat/regions.js +0 -98
  188. package/vendor/procedural-animals/src/species/goat/rig.js +0 -181
  189. package/vendor/procedural-animals/src/species/goat/sculpt.js +0 -547
  190. package/vendor/procedural-animals/src/species/horse/coat.js +0 -361
  191. package/vendor/procedural-animals/src/species/horse/coatSeam.js +0 -122
  192. package/vendor/procedural-animals/src/species/horse/index.js +0 -80
  193. package/vendor/procedural-animals/src/species/horse/motion.js +0 -245
  194. package/vendor/procedural-animals/src/species/horse/regions.js +0 -60
  195. package/vendor/procedural-animals/src/species/horse/rig.js +0 -117
  196. package/vendor/procedural-animals/src/species/horse/sculpt.js +0 -316
  197. package/vendor/procedural-animals/src/species/horse/seamWeights.js +0 -272
  198. package/vendor/procedural-animals/src/species/lion/behaviour.js +0 -509
  199. package/vendor/procedural-animals/src/species/lion/coat.js +0 -1016
  200. package/vendor/procedural-animals/src/species/lion/index.js +0 -111
  201. package/vendor/procedural-animals/src/species/lion/motion.js +0 -87
  202. package/vendor/procedural-animals/src/species/lion/regions.js +0 -106
  203. package/vendor/procedural-animals/src/species/lion/rig.js +0 -110
  204. package/vendor/procedural-animals/src/species/lion/sculpt.js +0 -384
  205. package/vendor/procedural-animals/src/species/lion/whiskers.js +0 -132
  206. package/vendor/procedural-animals/src/species/pig/behaviour.js +0 -575
  207. package/vendor/procedural-animals/src/species/pig/coat.js +0 -730
  208. package/vendor/procedural-animals/src/species/pig/ears.js +0 -242
  209. package/vendor/procedural-animals/src/species/pig/index.js +0 -161
  210. package/vendor/procedural-animals/src/species/pig/motion.js +0 -105
  211. package/vendor/procedural-animals/src/species/pig/regions.js +0 -100
  212. package/vendor/procedural-animals/src/species/pig/rig.js +0 -152
  213. package/vendor/procedural-animals/src/species/pig/sculpt.js +0 -382
  214. package/vendor/procedural-animals/src/species/rabbit/behaviour.js +0 -605
  215. package/vendor/procedural-animals/src/species/rabbit/coat.js +0 -285
  216. package/vendor/procedural-animals/src/species/rabbit/index.js +0 -85
  217. package/vendor/procedural-animals/src/species/rabbit/motion.js +0 -85
  218. package/vendor/procedural-animals/src/species/rabbit/regions.js +0 -48
  219. package/vendor/procedural-animals/src/species/rabbit/rig.js +0 -99
  220. package/vendor/procedural-animals/src/species/rabbit/sculpt.js +0 -148
  221. package/vendor/procedural-animals/src/species/rat/behaviour.js +0 -539
  222. package/vendor/procedural-animals/src/species/rat/coat.js +0 -341
  223. package/vendor/procedural-animals/src/species/rat/index.js +0 -111
  224. package/vendor/procedural-animals/src/species/rat/motion.js +0 -90
  225. package/vendor/procedural-animals/src/species/rat/regions.js +0 -92
  226. package/vendor/procedural-animals/src/species/rat/rig.js +0 -112
  227. package/vendor/procedural-animals/src/species/rat/sculpt.js +0 -163
  228. package/vendor/procedural-animals/src/species/rat/whiskers.js +0 -119
  229. package/vendor/procedural-animals/src/species/shark/coat.js +0 -383
  230. package/vendor/procedural-animals/src/species/shark/index.js +0 -104
  231. package/vendor/procedural-animals/src/species/shark/motion.js +0 -69
  232. package/vendor/procedural-animals/src/species/shark/regions.js +0 -34
  233. package/vendor/procedural-animals/src/species/shark/rig.js +0 -194
  234. package/vendor/procedural-animals/src/species/shark/sculpt.js +0 -343
  235. package/vendor/procedural-animals/src/species/shark/variants.js +0 -105
  236. package/vendor/procedural-animals/src/species/sheep/behaviour.js +0 -522
  237. package/vendor/procedural-animals/src/species/sheep/coat.js +0 -529
  238. package/vendor/procedural-animals/src/species/sheep/index.js +0 -152
  239. package/vendor/procedural-animals/src/species/sheep/motion.js +0 -86
  240. package/vendor/procedural-animals/src/species/sheep/neck.js +0 -41
  241. package/vendor/procedural-animals/src/species/sheep/regions.js +0 -62
  242. package/vendor/procedural-animals/src/species/sheep/rig.js +0 -163
  243. package/vendor/procedural-animals/src/species/sheep/sculpt.js +0 -542
  244. package/vendor/procedural-animals/src/species/snake/coat.js +0 -315
  245. package/vendor/procedural-animals/src/species/snake/index.js +0 -73
  246. package/vendor/procedural-animals/src/species/snake/motion.js +0 -51
  247. package/vendor/procedural-animals/src/species/snake/regions.js +0 -51
  248. package/vendor/procedural-animals/src/species/snake/rig.js +0 -108
  249. package/vendor/procedural-animals/src/species/snake/sculpt.js +0 -122
  250. package/vendor/procedural-animals/src/species/spider/coat.js +0 -279
  251. package/vendor/procedural-animals/src/species/spider/index.js +0 -78
  252. package/vendor/procedural-animals/src/species/spider/motion.js +0 -72
  253. package/vendor/procedural-animals/src/species/spider/regions.js +0 -87
  254. package/vendor/procedural-animals/src/species/spider/rig.js +0 -118
  255. package/vendor/procedural-animals/src/species/spider/sculpt.js +0 -182
  256. package/vendor/procedural-animals/src/species/wolf/behaviour.js +0 -160
  257. package/vendor/procedural-animals/src/species/wolf/coat.js +0 -749
  258. package/vendor/procedural-animals/src/species/wolf/index.js +0 -107
  259. package/vendor/procedural-animals/src/species/wolf/motion.js +0 -80
  260. package/vendor/procedural-animals/src/species/wolf/regions.js +0 -57
  261. package/vendor/procedural-animals/src/species/wolf/rig.js +0 -87
  262. package/vendor/procedural-animals/src/species/wolf/sculpt.js +0 -339
  263. package/vendor/procedural-animals/src/worker.js +0 -29
@@ -1,263 +0,0 @@
1
- // Signed distance field built from bone-attached primitives, combined with smooth unions
2
- // (polynomial smooth-min, per-primitive blend radius) and smooth subtractions (carvers).
3
- import { frameZY, sub, norm } from '../math/vec.js';
4
-
5
- export const T_ELL = 0;
6
- export const T_CONE = 1;
7
- export const T_LENS = 2; // almond (vesica) prism along a view axis, clipped to a depth slab: eye apertures
8
- export const T_FIN = 3; // thin slab: a planar polygon extruded to a thickness, rim rounded (fin membranes)
9
-
10
- function sminf(a, b, k) {
11
- if (k <= 0) return a < b ? a : b;
12
- const d = a - b;
13
- const h = Math.max(k - Math.abs(d), 0) / k;
14
- return (a < b ? a : b) - h * h * k * 0.25;
15
- }
16
-
17
- export class SDFModel {
18
- constructor() {
19
- this.prims = [];
20
- }
21
-
22
- // Ellipsoid. axis = direction of local Z (radius r[2]), up = hint for local Y (radius r[1]).
23
- ell(o) {
24
- const [ax, ay, az] = frameZY(o.axis || [0, 0, 1], o.up || [0, 1, 0]);
25
- const P = new Float64Array(15);
26
- P.set(o.c, 0);
27
- P.set(ax, 3);
28
- P.set(ay, 6);
29
- P.set(az, 9);
30
- P[12] = o.r[0];
31
- P[13] = o.r[1];
32
- P[14] = o.r[2];
33
- return this._push(T_ELL, P, o);
34
- }
35
-
36
- sphere(o) {
37
- return this.ell({ ...o, r: [o.rad, o.rad, o.rad] });
38
- }
39
-
40
- // Round cone (tapered capsule) between a and b with radii ra, rb.
41
- cone(o) {
42
- const P = new Float64Array(12);
43
- const ba = sub(o.b, o.a);
44
- const l2 = ba[0] * ba[0] + ba[1] * ba[1] + ba[2] * ba[2];
45
- const rr = o.ra - o.rb;
46
- P.set(o.a, 0);
47
- P.set(ba, 3);
48
- P[6] = l2;
49
- P[7] = rr;
50
- P[8] = l2 - rr * rr;
51
- P[9] = 1 / l2;
52
- P[10] = o.ra;
53
- P[11] = o.rb;
54
- return this._push(T_CONE, P, o);
55
- }
56
-
57
- // Almond-shaped aperture: the intersection of two cylinders of radius R whose axes run along the
58
- // frame's Z and are offset by -/+d along its Y (upper / lower lid arcs), clipped to zMin..zMax.
59
- lens(o) {
60
- const P = new Float64Array(16);
61
- P.set(o.c, 0);
62
- P.set(o.x, 3);
63
- P.set(o.y, 6);
64
- P.set(o.z, 9);
65
- P[12] = o.R;
66
- P[13] = o.d;
67
- P[14] = o.zMin;
68
- P[15] = o.zMax;
69
- return this._push(T_LENS, P, o);
70
- }
71
-
72
- // Fin membrane: a planar polygon (2D points in the plane spanned by u, v from origin o) extruded
73
- // to thickness t along n = u x v, with a rounded rim (radius min(round, t/2)). Exact distance, so
74
- // thin membranes mesh cleanly with a constant thickness right to the edge. `poly` is a closed
75
- // outline [[u, v], ...] (either winding).
76
- // Optional, for tiles of a curved sheet of varying thickness (a thick ear root thinning to its rim):
77
- // - `grad: [gu, gv]`: the thickness tapers linearly in the plane (t at the origin, the half thickness
78
- // changing by gu / gv per metre along u / v, the rim radius in proportion);
79
- // - `curve: [m0, mu, mv, muu, muv, mvv]`: the slab's mid-surface is the quadric patch
80
- // n = m0 + mu u + mv v + (muu u^2 + 2 muv u v + mvv v^2) / 2 over the polygon instead of the plane, so
81
- // neighbouring tiles fitted to one smooth sheet join with continuous tangents (no facets).
82
- // The distance is then divided by sqrt(1 + (|grad| + |slope of the patch|)^2), a local Lipschitz bound
83
- // (approximate: exact for the plane). Without them the slab and its distance are exactly as before.
84
- fin(o) {
85
- const u = norm(o.u), n = norm(crossV(o.u, o.v)), v = crossV(n, u);
86
- const pts = o.poly;
87
- const c = o.curve && o.curve.some((x) => x) ? o.curve : null;
88
- const g = c || (o.grad && (o.grad[0] || o.grad[1])) ? o.grad || [0, 0] : null;
89
- const P = new Float64Array(15 + pts.length * 2 + (g ? 2 : 0) + (c ? 6 : 0));
90
- P.set(o.o, 0);
91
- P.set(u, 3);
92
- P.set(v, 6);
93
- P.set(n, 9);
94
- P[12] = o.t / 2;
95
- P[13] = Math.min(o.round ?? o.t / 2, o.t / 2);
96
- P[14] = pts.length;
97
- for (let i = 0; i < pts.length; i++) { P[15 + i * 2] = pts[i][0]; P[16 + i * 2] = pts[i][1]; }
98
- if (g) { P[15 + pts.length * 2] = g[0]; P[16 + pts.length * 2] = g[1]; }
99
- if (c) for (let i = 0; i < 6; i++) P[17 + pts.length * 2 + i] = c[i];
100
- return this._push(T_FIN, P, o);
101
- }
102
-
103
- _push(type, P, o) {
104
- const prim = {
105
- type,
106
- P,
107
- k: o.k ?? 0.02,
108
- bone: o.bone,
109
- group: o.group || 'axial',
110
- part: o.part || 'body',
111
- carve: !!o.carve,
112
- tag: o.tag || '',
113
- bias: o.bias || 0,
114
- id: this.prims.length,
115
- };
116
- this.prims.push(prim);
117
- return prim;
118
- }
119
-
120
- // Raw distance to a single primitive
121
- static dist(pr, x, y, z) {
122
- const P = pr.P;
123
- if (pr.type === T_ELL) {
124
- const dx = x - P[0], dy = y - P[1], dz = z - P[2];
125
- const lx = dx * P[3] + dy * P[4] + dz * P[5];
126
- const ly = dx * P[6] + dy * P[7] + dz * P[8];
127
- const lz = dx * P[9] + dy * P[10] + dz * P[11];
128
- const rx = P[12], ry = P[13], rz = P[14];
129
- const qx = lx / rx, qy = ly / ry, qz = lz / rz;
130
- const k0 = Math.sqrt(qx * qx + qy * qy + qz * qz);
131
- const sx = qx / rx, sy = qy / ry, sz = qz / rz;
132
- const k1 = Math.sqrt(sx * sx + sy * sy + sz * sz);
133
- if (k1 < 1e-12) return -Math.min(rx, ry, rz);
134
- return (k0 * (k0 - 1)) / k1;
135
- } else if (pr.type === T_LENS) {
136
- const dx = x - P[0], dy = y - P[1], dz = z - P[2];
137
- const lx = dx * P[3] + dy * P[4] + dz * P[5];
138
- const ly = dx * P[6] + dy * P[7] + dz * P[8];
139
- const lz = dx * P[9] + dy * P[10] + dz * P[11];
140
- const R = P[12], d = P[13];
141
- const lens = Math.max(Math.hypot(lx, ly + d) - R, Math.hypot(lx, ly - d) - R);
142
- return Math.max(lens, P[14] - lz, lz - P[15]);
143
- } else if (pr.type === T_FIN) {
144
- const dx = x - P[0], dy = y - P[1], dz = z - P[2];
145
- const pu = dx * P[3] + dy * P[4] + dz * P[5];
146
- const pv = dx * P[6] + dy * P[7] + dz * P[8];
147
- const pn = dx * P[9] + dy * P[10] + dz * P[11];
148
- const gi = 15 + 2 * P[14];
149
- if (P.length > gi) {
150
- // tapered (fin({ grad })) and curved (fin({ curve })) slab: half thickness and rim radius vary linearly
151
- // in the plane, the mid-surface is a quadric patch over it
152
- const gu = P[gi], gv = P[gi + 1];
153
- const hh = Math.max(0.2 * P[12], P[12] + gu * pu + gv * pv), rho = Math.min(hh, (P[13] * hh) / P[12]);
154
- let q = pn, sl = 0;
155
- if (P.length > gi + 2) {
156
- const su = P[gi + 3] + P[gi + 5] * pu + P[gi + 6] * pv, sv = P[gi + 4] + P[gi + 6] * pu + P[gi + 7] * pv;
157
- q = pn - (P[gi + 2] + P[gi + 3] * pu + P[gi + 4] * pv + 0.5 * (P[gi + 5] * pu * pu + 2 * P[gi + 6] * pu * pv + P[gi + 7] * pv * pv));
158
- sl = Math.sqrt(su * su + sv * sv);
159
- }
160
- const ex = polySD(P, pu, pv) + rho, ey = Math.abs(q) - (hh - rho);
161
- const ox = ex > 0 ? ex : 0, oy = ey > 0 ? ey : 0;
162
- const L = Math.sqrt(gu * gu + gv * gv) + sl;
163
- return (Math.min(Math.max(ex, ey), 0) + Math.sqrt(ox * ox + oy * oy) - rho) / Math.sqrt(1 + L * L);
164
- }
165
- const rho = P[13];
166
- const ex = polySD(P, pu, pv) + rho, ey = Math.abs(pn) - (P[12] - rho);
167
- const ox = ex > 0 ? ex : 0, oy = ey > 0 ? ey : 0;
168
- return Math.min(Math.max(ex, ey), 0) + Math.sqrt(ox * ox + oy * oy) - rho;
169
- } else {
170
- // IQ exact round cone
171
- const pax = x - P[0], pay = y - P[1], paz = z - P[2];
172
- const bax = P[3], bay = P[4], baz = P[5];
173
- const l2 = P[6], rr = P[7], a2 = P[8], il2 = P[9], r1 = P[10], r2 = P[11];
174
- const yy = pax * bax + pay * bay + paz * baz;
175
- const zz = yy - l2;
176
- const vx = pax * l2 - bax * yy, vy = pay * l2 - bay * yy, vz = paz * l2 - baz * yy;
177
- const x2 = vx * vx + vy * vy + vz * vz;
178
- const y2 = yy * yy * l2;
179
- const z2 = zz * zz * l2;
180
- const k = Math.sign(rr) * rr * rr * x2;
181
- if (Math.sign(zz) * a2 * z2 > k) return Math.sqrt(x2 + z2) * il2 - r2;
182
- if (Math.sign(yy) * a2 * y2 < k) return Math.sqrt(x2 + y2) * il2 - r1;
183
- return (Math.sqrt(x2 * a2 * il2) + yy * rr) * il2 - r1;
184
- }
185
- }
186
-
187
- // Evaluate the field using only the primitives in `list` (array of prim objects, in model order)
188
- static evalList(list, x, y, z) {
189
- let d = 1e9;
190
- let carving = false;
191
- for (let i = 0; i < list.length; i++) {
192
- const pr = list[i];
193
- const di = SDFModel.dist(pr, x, y, z);
194
- if (!pr.carve) d = sminf(d, di, pr.k);
195
- else {
196
- carving = true;
197
- d = -sminf(-d, di, pr.k);
198
- }
199
- }
200
- return d;
201
- }
202
-
203
- forPart(part) {
204
- return this.prims.filter((p) => p.part === part);
205
- }
206
-
207
- // Conservative culling: primitives that cannot influence the field inside a cell (center c, radius rho)
208
- static cull(list, cx, cy, cz, rho, kmax) {
209
- const n = list.length;
210
- const dv = new Float64Array(n);
211
- let best = 1e9;
212
- for (let i = 0; i < n; i++) {
213
- dv[i] = SDFModel.dist(list[i], cx, cy, cz);
214
- if (!list[i].carve && dv[i] < best) best = dv[i];
215
- }
216
- const out = [];
217
- const margin = 2.2 * rho + 0.5 * kmax;
218
- for (let i = 0; i < n; i++) {
219
- const pr = list[i];
220
- if (!pr.carve) {
221
- if (dv[i] - best < margin + pr.k) out.push(pr);
222
- } else {
223
- // carvers only matter close to the surface
224
- if (dv[i] < pr.k + margin + Math.max(0, -best)) out.push(pr);
225
- }
226
- }
227
- return out;
228
- }
229
- }
230
-
231
- const crossV = (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]];
232
-
233
- // signed distance to a closed 2D polygon stored in P from index 15 (count at P[14]); < 0 inside
234
- export function polySD(P, px, py) {
235
- const n = P[14];
236
- let vx = P[15], vy = P[16];
237
- let d = (px - vx) * (px - vx) + (py - vy) * (py - vy);
238
- let s = 1;
239
- for (let i = 0, j = n - 1; i < n; j = i, i++) {
240
- const ix = P[15 + i * 2], iy = P[16 + i * 2], jx = P[15 + j * 2], jy = P[16 + j * 2];
241
- const ex = jx - ix, ey = jy - iy, wx = px - ix, wy = py - iy;
242
- const t = Math.max(0, Math.min(1, (wx * ex + wy * ey) / (ex * ex + ey * ey || 1e-18)));
243
- const bx = wx - ex * t, by = wy - ey * t;
244
- const dd = bx * bx + by * by;
245
- if (dd < d) d = dd;
246
- const c1 = py >= iy, c2 = py < jy, c3 = ex * wy > ey * wx;
247
- if ((c1 && c2 && c3) || (!c1 && !c2 && !c3)) s = -s;
248
- }
249
- void vx; void vy;
250
- return s * Math.sqrt(d);
251
- }
252
-
253
- export function gradient(list, x, y, z, e = 0.0006) {
254
- // tetrahedral gradient
255
- const f = SDFModel.evalList;
256
- const a = f(list, x + e, y - e, z - e);
257
- const b = f(list, x - e, y - e, z + e);
258
- const c = f(list, x - e, y + e, z - e);
259
- const d = f(list, x + e, y + e, z + e);
260
- return [a - b - c + d, -a - b + c + d, -a + b - c + d].map((v) => v / (4 * e));
261
- }
262
-
263
- export { norm };
@@ -1,98 +0,0 @@
1
- // Type declarations for procedural-animals (three.js Procedural Animals).
2
- import type { Object3D, Vector3 } from 'three';
3
-
4
- export type SpeciesId =
5
- | 'wolf' | 'dog' | 'fox' | 'cat' | 'lion' | 'cheetah' | 'bear' | 'rat'
6
- | 'horse' | 'deer' | 'cow' | 'pig' | 'sheep' | 'goat' | 'boar'
7
- | 'chicken' | 'crow' | 'eagle' | 'fish' | 'shark'
8
- | 'rabbit' | 'frog' | 'snake' | 'spider';
9
-
10
- export type Quality = 'hero' | 'high' | 'medium' | 'low' | 'crowd';
11
-
12
- export type ActionName =
13
- | 'idle' | 'jump' | 'sit' | 'lie' | 'sleep' | 'eat' | 'drink' | 'attack' | 'hit' | 'death' | 'stand'
14
- | 'takeoff' | 'land' | 'perch' | 'glide' | 'flap' | 'burst' | 'coil' | 'strike' | 'hop'
15
- | (string & {});
16
-
17
- export interface CreateAnimalOptions {
18
- seed?: number;
19
- quality?: Quality;
20
- variant?: string;
21
- sex?: 'male' | 'female' | string;
22
- age?: 'adult' | 'juvenile' | string;
23
- /** Terrain height in the space of animal.object.parent. Default: flat y = 0. */
24
- ground?: (x: number, z: number) => number;
25
- /** Water surface height, or null where dry (swimmers, drinking). */
26
- water?: (x: number, z: number) => number | null;
27
- /** Perch points for birds. */
28
- perches?: Vector3[];
29
- position?: Vector3;
30
- heading?: number;
31
- /** A .animal file (from `procedural-animals-bake`) instead of building procedurally. */
32
- baked?: ArrayBuffer | Promise<ArrayBuffer>;
33
- /** false: build on the calling thread; a function: returns a Worker running the library's worker (procedural-animals/worker). */
34
- worker?: boolean | (() => Worker);
35
- castShadow?: boolean;
36
- receiveShadow?: boolean;
37
- onProgress?: (message: string) => void;
38
- overrides?: Record<string, unknown>;
39
- }
40
-
41
- export interface FootstepEvent { type: 'footstep'; animal: Animal; foot: string; position: Vector3; speed: number; strength: number; }
42
- export interface AttackHitEvent { type: 'attackHit'; animal: Animal; position: Vector3; direction?: Vector3; style?: string; }
43
- export interface ActionEvent { type: 'actionStart' | 'actionEnd'; animal: Animal; name: string; reason?: string; }
44
- export type AnimalEvent = FootstepEvent | AttackHitEvent | ActionEvent | { type: string; animal: Animal; [k: string]: unknown };
45
-
46
- export type PlayResult = 'done' | 'interrupted' | 'stopped' | 'refused';
47
-
48
- export interface PlayOptions { target?: Vector3; direction?: Vector3; loop?: boolean; speed?: number; [k: string]: unknown; }
49
-
50
- export declare class Animal {
51
- readonly id: string;
52
- readonly seed: number;
53
- readonly params: Record<string, unknown>;
54
- /** Add this to your scene; keep its own transform at identity. */
55
- readonly object: Object3D;
56
- /** Attachment points such as mouth, head, back (horse: seat, stirrupL/R, bitL/R). */
57
- readonly attachments: Record<string, Object3D>;
58
- readonly stats: { vertices: number; triangles: number; bones: number; buildMs: number; updateMs: number };
59
- readonly actions: string[];
60
- readonly gaits: string[];
61
- /** Named speeds (m/s) for this individual, e.g. { walk: 1.2, trot: 3 }. */
62
- readonly gears: Record<string, number>;
63
- readonly position: Vector3;
64
- readonly heading: number;
65
- readonly speed: number;
66
- readonly velocity: Vector3;
67
- readonly state: Record<string, any>;
68
-
69
- move(opts?: { speed?: number; heading?: number; climb?: number; gait?: string }): this;
70
- stop(): this;
71
- moveTo(point: Vector3 | null, opts?: { speed?: number }): this;
72
- follow(position: Vector3, velocity?: Vector3, opts?: { heading?: number }): this;
73
- lookAt(target: Vector3 | null): this;
74
- play(name: ActionName, opts?: PlayOptions): Promise<PlayResult>;
75
- stopAction(name?: string): this;
76
- on(type: 'footstep', fn: (e: FootstepEvent) => void): () => void;
77
- on(type: 'attackHit', fn: (e: AttackHitEvent) => void): () => void;
78
- on(type: string, fn: (e: AnimalEvent) => void): () => void;
79
- off(type: string, fn: (e: AnimalEvent) => void): this;
80
- update(dt: number): this;
81
- setQuality(q: Quality): this;
82
- setLod(level: 0 | 1 | 2): this;
83
- setDebug(mode: 'albedo' | 'weights' | 'material' | 'bare', on: boolean): this;
84
- setCoverings(on: boolean): this;
85
- dispose(): void;
86
- }
87
-
88
- export declare function createAnimal(species: SpeciesId | string | object, opts?: CreateAnimalOptions): Promise<Animal>;
89
- export declare function registerSpecies(mod: object): object;
90
- export declare function listSpecies(): string[];
91
- export declare function loadSpecies(id: string | object): Promise<any>;
92
- export declare function addLoader(id: string, loader: () => Promise<any>): void;
93
- export declare function buildAnimalData(species: string | object, opts?: CreateAnimalOptions, onProgress?: (m: string) => void): Promise<any>;
94
- export declare function setWorkerFactory(fn: (() => Worker) | null): void;
95
- export declare function clearBuildCache(): void;
96
- export declare function writeBake(data: any): ArrayBuffer;
97
- export declare function readBake(buf: ArrayBuffer): any;
98
- export declare const QUALITY: Record<Quality, { res: number; shells: number; fins: boolean; eyePatches: boolean }>;
@@ -1,29 +0,0 @@
1
- // procedural-animals: three.js Procedural Animals.
2
- //
3
- // const wolf = await createAnimal('wolf', { seed: 3, quality: 'high', ground: (x, z) => h(x, z) });
4
- // scene.add(wolf.object);
5
- // wolf.move({ speed: 6, heading }); // or wolf.follow(body.position, body.velocity)
6
- // wolf.update(dt); // every frame
7
- import { Animal } from './animal.js';
8
- import { buildAnimalData } from './build.js';
9
- import { loadSpecies } from './registry.js';
10
- import { readBake } from './bake.js';
11
-
12
- export { Animal } from './animal.js';
13
- export { registerSpecies, listSpecies, loadSpecies, addLoader } from './registry.js';
14
- export { buildAnimalData, setWorkerFactory, clearBuildCache } from './build.js';
15
- export { QUALITY } from './core/build/pipeline.js';
16
- export { writeBake, readBake } from './bake.js';
17
-
18
- /**
19
- * Create an animal. Builds it procedurally (in Web Workers when available) or loads a baked file.
20
- * @param {string|object} species species id ('wolf') or an imported species module
21
- * @param {object} opts { seed, quality, sex, age, ground, water, position, heading, baked, worker, onProgress }
22
- */
23
- export async function createAnimal(species, opts = {}) {
24
- const s = await loadSpecies(species);
25
- let data;
26
- if (opts.baked) data = readBake(opts.baked instanceof ArrayBuffer ? opts.baked : await opts.baked);
27
- else data = await buildAnimalData(s, opts, opts.onProgress);
28
- return new Animal(s, data, opts);
29
- }
@@ -1,48 +0,0 @@
1
- // Species registry. String ids resolve through loaders (dynamic imports), so a bundler only pulls in
2
- // the species a game actually asks for. Species modules can also be imported and registered
3
- // directly: `import wolf from 'procedural-animals/species/wolf'; createAnimal(wolf, ...)`.
4
- const loaders = {
5
- bear: () => import('./species/bear/index.js'),
6
- boar: () => import('./species/boar/index.js'),
7
- cat: () => import('./species/cat/index.js'),
8
- cheetah: () => import('./species/cheetah/index.js'),
9
- chicken: () => import('./species/chicken/index.js'),
10
- cow: () => import('./species/cow/index.js'),
11
- crow: () => import('./species/crow/index.js'),
12
- deer: () => import('./species/deer/index.js'),
13
- dog: () => import('./species/dog/index.js'),
14
- eagle: () => import('./species/eagle/index.js'),
15
- fish: () => import('./species/fish/index.js'),
16
- fox: () => import('./species/fox/index.js'),
17
- frog: () => import('./species/frog/index.js'),
18
- goat: () => import('./species/goat/index.js'),
19
- horse: () => import('./species/horse/index.js'),
20
- lion: () => import('./species/lion/index.js'),
21
- pig: () => import('./species/pig/index.js'),
22
- rabbit: () => import('./species/rabbit/index.js'),
23
- rat: () => import('./species/rat/index.js'),
24
- shark: () => import('./species/shark/index.js'),
25
- sheep: () => import('./species/sheep/index.js'),
26
- snake: () => import('./species/snake/index.js'),
27
- spider: () => import('./species/spider/index.js'),
28
- wolf: () => import('./species/wolf/index.js'),
29
- };
30
- const loaded = new Map();
31
-
32
- export function registerSpecies(mod) {
33
- const s = mod.default || mod;
34
- loaded.set(s.id, s);
35
- return s;
36
- }
37
-
38
- export async function loadSpecies(id) {
39
- if (typeof id === 'object' && id) return registerSpecies(id);
40
- if (loaded.has(id)) return loaded.get(id);
41
- const l = loaders[id];
42
- if (!l) throw new Error(`procedural-animals: unknown species "${id}". Known: ${listSpecies().join(', ')}`);
43
- return registerSpecies(await l());
44
- }
45
-
46
- export function getLoadedSpecies(id) { return loaded.get(id); }
47
- export function listSpecies() { return [...new Set([...Object.keys(loaders), ...loaded.keys()])]; }
48
- export function addLoader(id, fn) { loaders[id] = fn; }