human2ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -0
  3. package/assets/quaternius/License_Standard.txt +22 -0
  4. package/assets/quaternius/README.md +31 -0
  5. package/assets/quaternius/Superhero_Female_FullBody.bin +0 -0
  6. package/assets/quaternius/Superhero_Female_FullBody.gltf +2056 -0
  7. package/assets/quaternius/Superhero_Male_FullBody.bin +0 -0
  8. package/assets/quaternius/Superhero_Male_FullBody.gltf +2018 -0
  9. package/dist/cli/integration.d.ts +39 -0
  10. package/dist/cli/integration.js +466 -0
  11. package/dist/cli/integration.js.map +1 -0
  12. package/dist/cli/main.d.ts +17 -0
  13. package/dist/cli/main.js +1455 -0
  14. package/dist/cli/main.js.map +1 -0
  15. package/dist/database/composition-session-repository.d.ts +37 -0
  16. package/dist/database/composition-session-repository.js +147 -0
  17. package/dist/database/composition-session-repository.js.map +1 -0
  18. package/dist/database/draft-version-errors.d.ts +29 -0
  19. package/dist/database/draft-version-errors.js +47 -0
  20. package/dist/database/draft-version-errors.js.map +1 -0
  21. package/dist/database/draft-version-store.d.ts +30 -0
  22. package/dist/database/draft-version-store.js +168 -0
  23. package/dist/database/draft-version-store.js.map +1 -0
  24. package/dist/database/image-asset-repository.d.ts +37 -0
  25. package/dist/database/image-asset-repository.js +101 -0
  26. package/dist/database/image-asset-repository.js.map +1 -0
  27. package/dist/database/image-input.d.ts +15 -0
  28. package/dist/database/image-input.js +28 -0
  29. package/dist/database/image-input.js.map +1 -0
  30. package/dist/database/migrate.d.ts +4 -0
  31. package/dist/database/migrate.js +45 -0
  32. package/dist/database/migrate.js.map +1 -0
  33. package/dist/database/project-session-repository.d.ts +72 -0
  34. package/dist/database/project-session-repository.js +291 -0
  35. package/dist/database/project-session-repository.js.map +1 -0
  36. package/dist/database/spatial-session-repository.d.ts +26 -0
  37. package/dist/database/spatial-session-repository.js +44 -0
  38. package/dist/database/spatial-session-repository.js.map +1 -0
  39. package/dist/database/style-library-repository.d.ts +70 -0
  40. package/dist/database/style-library-repository.js +290 -0
  41. package/dist/database/style-library-repository.js.map +1 -0
  42. package/dist/database/svg-input.d.ts +1 -0
  43. package/dist/database/svg-input.js +77 -0
  44. package/dist/database/svg-input.js.map +1 -0
  45. package/dist/database/ui-sketch-session-repository.d.ts +19 -0
  46. package/dist/database/ui-sketch-session-repository.js +35 -0
  47. package/dist/database/ui-sketch-session-repository.js.map +1 -0
  48. package/dist/domain/canvas-layer-order.d.ts +6 -0
  49. package/dist/domain/canvas-layer-order.js +40 -0
  50. package/dist/domain/canvas-layer-order.js.map +1 -0
  51. package/dist/domain/canvas-node-metadata.d.ts +20 -0
  52. package/dist/domain/canvas-node-metadata.js +17 -0
  53. package/dist/domain/canvas-node-metadata.js.map +1 -0
  54. package/dist/domain/canvas-states.d.ts +8 -0
  55. package/dist/domain/canvas-states.js +23 -0
  56. package/dist/domain/canvas-states.js.map +1 -0
  57. package/dist/domain/composition/analysis.d.ts +104 -0
  58. package/dist/domain/composition/analysis.js +337 -0
  59. package/dist/domain/composition/analysis.js.map +1 -0
  60. package/dist/domain/composition/camera-reference.d.ts +24 -0
  61. package/dist/domain/composition/camera-reference.js +34 -0
  62. package/dist/domain/composition/camera-reference.js.map +1 -0
  63. package/dist/domain/composition/draft.d.ts +50 -0
  64. package/dist/domain/composition/draft.js +609 -0
  65. package/dist/domain/composition/draft.js.map +1 -0
  66. package/dist/domain/composition/frame.d.ts +23 -0
  67. package/dist/domain/composition/frame.js +154 -0
  68. package/dist/domain/composition/frame.js.map +1 -0
  69. package/dist/domain/composition/geometry.d.ts +15 -0
  70. package/dist/domain/composition/geometry.js +262 -0
  71. package/dist/domain/composition/geometry.js.map +1 -0
  72. package/dist/domain/composition/index.d.ts +13 -0
  73. package/dist/domain/composition/index.js +10 -0
  74. package/dist/domain/composition/index.js.map +1 -0
  75. package/dist/domain/composition/layers.d.ts +4 -0
  76. package/dist/domain/composition/layers.js +12 -0
  77. package/dist/domain/composition/layers.js.map +1 -0
  78. package/dist/domain/composition/records.d.ts +14 -0
  79. package/dist/domain/composition/records.js +2 -0
  80. package/dist/domain/composition/records.js.map +1 -0
  81. package/dist/domain/composition/refinement/engine.d.ts +12 -0
  82. package/dist/domain/composition/refinement/engine.js +521 -0
  83. package/dist/domain/composition/refinement/engine.js.map +1 -0
  84. package/dist/domain/composition/refinement/relations.d.ts +16 -0
  85. package/dist/domain/composition/refinement/relations.js +293 -0
  86. package/dist/domain/composition/refinement/relations.js.map +1 -0
  87. package/dist/domain/composition/refinement/types.d.ts +181 -0
  88. package/dist/domain/composition/refinement/types.js +2 -0
  89. package/dist/domain/composition/refinement/types.js.map +1 -0
  90. package/dist/domain/composition/render.d.ts +5 -0
  91. package/dist/domain/composition/render.js +169 -0
  92. package/dist/domain/composition/render.js.map +1 -0
  93. package/dist/domain/composition/states.d.ts +9 -0
  94. package/dist/domain/composition/states.js +104 -0
  95. package/dist/domain/composition/states.js.map +1 -0
  96. package/dist/domain/composition/types.d.ts +149 -0
  97. package/dist/domain/composition/types.js +2 -0
  98. package/dist/domain/composition/types.js.map +1 -0
  99. package/dist/domain/composition/workflow.d.ts +15 -0
  100. package/dist/domain/composition/workflow.js +77 -0
  101. package/dist/domain/composition/workflow.js.map +1 -0
  102. package/dist/domain/fingerprint.d.ts +2 -0
  103. package/dist/domain/fingerprint.js +25 -0
  104. package/dist/domain/fingerprint.js.map +1 -0
  105. package/dist/domain/session/canvas-edit-history.d.ts +17 -0
  106. package/dist/domain/session/canvas-edit-history.js +53 -0
  107. package/dist/domain/session/canvas-edit-history.js.map +1 -0
  108. package/dist/domain/session/capabilities.d.ts +16 -0
  109. package/dist/domain/session/capabilities.js +84 -0
  110. package/dist/domain/session/capabilities.js.map +1 -0
  111. package/dist/domain/session/draft-version.d.ts +41 -0
  112. package/dist/domain/session/draft-version.js +2 -0
  113. package/dist/domain/session/draft-version.js.map +1 -0
  114. package/dist/domain/session/index.d.ts +5 -0
  115. package/dist/domain/session/index.js +3 -0
  116. package/dist/domain/session/index.js.map +1 -0
  117. package/dist/domain/session/types.d.ts +23 -0
  118. package/dist/domain/session/types.js +2 -0
  119. package/dist/domain/session/types.js.map +1 -0
  120. package/dist/domain/spatial/assets/quaternius-female-rig.json +799 -0
  121. package/dist/domain/spatial/assets/quaternius-rig.json +799 -0
  122. package/dist/domain/spatial/assets/quaternius-superhero-female.json +1 -0
  123. package/dist/domain/spatial/assets/quaternius-superhero.json +1 -0
  124. package/dist/domain/spatial/camera-box.d.ts +13 -0
  125. package/dist/domain/spatial/camera-box.js +52 -0
  126. package/dist/domain/spatial/camera-box.js.map +1 -0
  127. package/dist/domain/spatial/geometric-model.d.ts +4 -0
  128. package/dist/domain/spatial/geometric-model.js +101 -0
  129. package/dist/domain/spatial/geometric-model.js.map +1 -0
  130. package/dist/domain/spatial/hands.d.ts +36 -0
  131. package/dist/domain/spatial/hands.js +128 -0
  132. package/dist/domain/spatial/hands.js.map +1 -0
  133. package/dist/domain/spatial/index.d.ts +30 -0
  134. package/dist/domain/spatial/index.js +381 -0
  135. package/dist/domain/spatial/index.js.map +1 -0
  136. package/dist/domain/spatial/kinematics.d.ts +27 -0
  137. package/dist/domain/spatial/kinematics.js +285 -0
  138. package/dist/domain/spatial/kinematics.js.map +1 -0
  139. package/dist/domain/spatial/lighting.d.ts +35 -0
  140. package/dist/domain/spatial/lighting.js +173 -0
  141. package/dist/domain/spatial/lighting.js.map +1 -0
  142. package/dist/domain/spatial/model.d.ts +5 -0
  143. package/dist/domain/spatial/model.js +193 -0
  144. package/dist/domain/spatial/model.js.map +1 -0
  145. package/dist/domain/spatial/morph.d.ts +3 -0
  146. package/dist/domain/spatial/morph.js +187 -0
  147. package/dist/domain/spatial/morph.js.map +1 -0
  148. package/dist/domain/spatial/proportions.d.ts +46 -0
  149. package/dist/domain/spatial/proportions.js +59 -0
  150. package/dist/domain/spatial/proportions.js.map +1 -0
  151. package/dist/domain/spatial/reference-lines.d.ts +6 -0
  152. package/dist/domain/spatial/reference-lines.js +58 -0
  153. package/dist/domain/spatial/reference-lines.js.map +1 -0
  154. package/dist/domain/spatial/scene-cache.d.ts +15 -0
  155. package/dist/domain/spatial/scene-cache.js +69 -0
  156. package/dist/domain/spatial/scene-cache.js.map +1 -0
  157. package/dist/domain/spatial/scene.d.ts +8 -0
  158. package/dist/domain/spatial/scene.js +69 -0
  159. package/dist/domain/spatial/scene.js.map +1 -0
  160. package/dist/domain/spatial/types.d.ts +187 -0
  161. package/dist/domain/spatial/types.js +5 -0
  162. package/dist/domain/spatial/types.js.map +1 -0
  163. package/dist/domain/style/index.d.ts +1 -0
  164. package/dist/domain/style/index.js +2 -0
  165. package/dist/domain/style/index.js.map +1 -0
  166. package/dist/domain/style/prompt-summary.d.ts +2 -0
  167. package/dist/domain/style/prompt-summary.js +11 -0
  168. package/dist/domain/style/prompt-summary.js.map +1 -0
  169. package/dist/domain/style/types.d.ts +32 -0
  170. package/dist/domain/style/types.js +3 -0
  171. package/dist/domain/style/types.js.map +1 -0
  172. package/dist/domain/ui-sketch/draft.d.ts +12 -0
  173. package/dist/domain/ui-sketch/draft.js +424 -0
  174. package/dist/domain/ui-sketch/draft.js.map +1 -0
  175. package/dist/domain/ui-sketch/geometry.d.ts +7 -0
  176. package/dist/domain/ui-sketch/geometry.js +11 -0
  177. package/dist/domain/ui-sketch/geometry.js.map +1 -0
  178. package/dist/domain/ui-sketch/groups.d.ts +5 -0
  179. package/dist/domain/ui-sketch/groups.js +40 -0
  180. package/dist/domain/ui-sketch/groups.js.map +1 -0
  181. package/dist/domain/ui-sketch/index.d.ts +8 -0
  182. package/dist/domain/ui-sketch/index.js +8 -0
  183. package/dist/domain/ui-sketch/index.js.map +1 -0
  184. package/dist/domain/ui-sketch/layers.d.ts +4 -0
  185. package/dist/domain/ui-sketch/layers.js +11 -0
  186. package/dist/domain/ui-sketch/layers.js.map +1 -0
  187. package/dist/domain/ui-sketch/render.d.ts +2 -0
  188. package/dist/domain/ui-sketch/render.js +58 -0
  189. package/dist/domain/ui-sketch/render.js.map +1 -0
  190. package/dist/domain/ui-sketch/standardize.d.ts +17 -0
  191. package/dist/domain/ui-sketch/standardize.js +139 -0
  192. package/dist/domain/ui-sketch/standardize.js.map +1 -0
  193. package/dist/domain/ui-sketch/states.d.ts +5 -0
  194. package/dist/domain/ui-sketch/states.js +21 -0
  195. package/dist/domain/ui-sketch/states.js.map +1 -0
  196. package/dist/domain/ui-sketch/types.d.ts +73 -0
  197. package/dist/domain/ui-sketch/types.js +2 -0
  198. package/dist/domain/ui-sketch/types.js.map +1 -0
  199. package/dist/server/app.d.ts +18 -0
  200. package/dist/server/app.js +108 -0
  201. package/dist/server/app.js.map +1 -0
  202. package/dist/server/image-content-type-parser.d.ts +2 -0
  203. package/dist/server/image-content-type-parser.js +5 -0
  204. package/dist/server/image-content-type-parser.js.map +1 -0
  205. package/dist/server/routes/composition-sessions.d.ts +3 -0
  206. package/dist/server/routes/composition-sessions.js +190 -0
  207. package/dist/server/routes/composition-sessions.js.map +1 -0
  208. package/dist/server/routes/draft-version-routes.d.ts +10 -0
  209. package/dist/server/routes/draft-version-routes.js +201 -0
  210. package/dist/server/routes/draft-version-routes.js.map +1 -0
  211. package/dist/server/routes/image-assets.d.ts +3 -0
  212. package/dist/server/routes/image-assets.js +114 -0
  213. package/dist/server/routes/image-assets.js.map +1 -0
  214. package/dist/server/routes/project-sessions.d.ts +48 -0
  215. package/dist/server/routes/project-sessions.js +305 -0
  216. package/dist/server/routes/project-sessions.js.map +1 -0
  217. package/dist/server/routes/spatial-sessions.d.ts +3 -0
  218. package/dist/server/routes/spatial-sessions.js +80 -0
  219. package/dist/server/routes/spatial-sessions.js.map +1 -0
  220. package/dist/server/routes/style-library.d.ts +3 -0
  221. package/dist/server/routes/style-library.js +308 -0
  222. package/dist/server/routes/style-library.js.map +1 -0
  223. package/dist/server/routes/ui-sketch-sessions.d.ts +3 -0
  224. package/dist/server/routes/ui-sketch-sessions.js +14 -0
  225. package/dist/server/routes/ui-sketch-sessions.js.map +1 -0
  226. package/dist/server/runtime.d.ts +30 -0
  227. package/dist/server/runtime.js +123 -0
  228. package/dist/server/runtime.js.map +1 -0
  229. package/dist/server/spatial-render.d.ts +5 -0
  230. package/dist/server/spatial-render.js +360 -0
  231. package/dist/server/spatial-render.js.map +1 -0
  232. package/dist/server/start.d.ts +1 -0
  233. package/dist/server/start.js +3 -0
  234. package/dist/server/start.js.map +1 -0
  235. package/licenses/THIRD-PARTY-NOTICES.txt +16664 -0
  236. package/licenses/YisiUI-LICENSE +21 -0
  237. package/locales/en/common.json +671 -0
  238. package/migrations/0001_projects_and_sessions.sql +45 -0
  239. package/migrations/0002_composition_versions_and_refinements.sql +26 -0
  240. package/migrations/0003_ui_sketch_draft_versions.sql +12 -0
  241. package/migrations/0004_image_assets.sql +16 -0
  242. package/migrations/0005_style_library.sql +31 -0
  243. package/migrations/0006_session_styles.sql +6 -0
  244. package/migrations/0007_svg_image_assets.sql +19 -0
  245. package/migrations/0008_spatial_spaces.sql +20 -0
  246. package/package.json +82 -0
  247. package/schemas/composition-draft.schema.json +234 -0
  248. package/schemas/composition-refinement-plan.schema.json +758 -0
  249. package/schemas/spatial-draft.schema.json +517 -0
  250. package/schemas/spatial-operations.schema.json +1082 -0
  251. package/schemas/ui-layout-standardization-plan.schema.json +29 -0
  252. package/schemas/ui-sketch-draft.schema.json +197 -0
  253. package/skills/human2ai/SKILL.md +149 -0
  254. package/skills/human2ai/agents/openai.yaml +3 -0
  255. package/skills/human2ai/references/composition-projection.md +170 -0
  256. package/skills/human2ai/references/composition.md +79 -0
  257. package/skills/human2ai/references/spatial.md +188 -0
  258. package/skills/human2ai/references/svg-images.md +27 -0
  259. package/skills/human2ai/references/ui-layout.md +100 -0
  260. package/web/out/404/index.html +1 -0
  261. package/web/out/404.html +1 -0
  262. package/web/out/__next.__PAGE__.txt +26 -0
  263. package/web/out/__next._full.txt +21 -0
  264. package/web/out/__next._tree.txt +4 -0
  265. package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_buildManifest.js +1 -0
  266. package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_ssgManifest.js +1 -0
  267. package/web/out/_next/static/chunks/130-9fadd0432daff55d.js +1 -0
  268. package/web/out/_next/static/chunks/158-eb00456e1bab68b3.js +52 -0
  269. package/web/out/_next/static/chunks/20-0801fc297cda2a7a.js +1 -0
  270. package/web/out/_next/static/chunks/248-d4a79649dae2a3f8.js +259 -0
  271. package/web/out/_next/static/chunks/678-1305cadf8254d814.js +1 -0
  272. package/web/out/_next/static/chunks/728-eb8b667f79229443.js +1 -0
  273. package/web/out/_next/static/chunks/83607670-bc1279370476e59f.js +1 -0
  274. package/web/out/_next/static/chunks/app/_global-error/page-5eece43b8152c414.js +1 -0
  275. package/web/out/_next/static/chunks/app/_not-found/page-c0cd75ac39fbf9cf.js +1 -0
  276. package/web/out/_next/static/chunks/app/composition/page-051ee2fabb12110a.js +1 -0
  277. package/web/out/_next/static/chunks/app/layout-745ca27ef8830f4f.js +1 -0
  278. package/web/out/_next/static/chunks/app/page-0027378a269a6168.js +1 -0
  279. package/web/out/_next/static/chunks/app/spatial/page-266dedc81784d4f6.js +1 -0
  280. package/web/out/_next/static/chunks/app/styles/page-d5cb83af828ea9ed.js +1 -0
  281. package/web/out/_next/static/chunks/app/ui-sketch/page-2a8436e05a05c618.js +1 -0
  282. package/web/out/_next/static/chunks/c3f2cda1-9e279dab137b7272.js +342 -0
  283. package/web/out/_next/static/chunks/c7879cf7-7873c8afd9c9c666.js +1 -0
  284. package/web/out/_next/static/chunks/framework-6eacf80ec1e4c887.js +1 -0
  285. package/web/out/_next/static/chunks/main-5ee8fd93319f955c.js +5 -0
  286. package/web/out/_next/static/chunks/main-app-0cf10803ab17c700.js +1 -0
  287. package/web/out/_next/static/chunks/next/dist/client/components/builtin/app-error-5eece43b8152c414.js +1 -0
  288. package/web/out/_next/static/chunks/next/dist/client/components/builtin/forbidden-5eece43b8152c414.js +1 -0
  289. package/web/out/_next/static/chunks/next/dist/client/components/builtin/global-error-728204b7cccc4ed2.js +1 -0
  290. package/web/out/_next/static/chunks/next/dist/client/components/builtin/not-found-5eece43b8152c414.js +1 -0
  291. package/web/out/_next/static/chunks/next/dist/client/components/builtin/unauthorized-5eece43b8152c414.js +1 -0
  292. package/web/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  293. package/web/out/_next/static/chunks/webpack-97ae63c0e0b2a512.js +1 -0
  294. package/web/out/_next/static/css/3b7982b41ed8eccd.css +4 -0
  295. package/web/out/_next/static/css/81ae71f1d3e9a866.css +1 -0
  296. package/web/out/_next/static/css/8c3843f4951fa9f6.css +5 -0
  297. package/web/out/_next/static/css/c739d0131cdcc891.css +1 -0
  298. package/web/out/_next/static/css/ce1b4bb3ad3c6073.css +1 -0
  299. package/web/out/_next/static/css/db96ae2e88545d96.css +1 -0
  300. package/web/out/_not-found/__next._full.txt +18 -0
  301. package/web/out/_not-found/__next._not-found.__PAGE__.txt +24 -0
  302. package/web/out/_not-found/__next._tree.txt +3 -0
  303. package/web/out/_not-found/index.html +1 -0
  304. package/web/out/_not-found/index.txt +18 -0
  305. package/web/out/composition/__next._full.txt +25 -0
  306. package/web/out/composition/__next._tree.txt +6 -0
  307. package/web/out/composition/__next.composition.__PAGE__.txt +31 -0
  308. package/web/out/composition/index.html +1 -0
  309. package/web/out/composition/index.txt +25 -0
  310. package/web/out/index.html +1 -0
  311. package/web/out/index.txt +21 -0
  312. package/web/out/spatial/__next._full.txt +23 -0
  313. package/web/out/spatial/__next._tree.txt +4 -0
  314. package/web/out/spatial/__next.spatial.__PAGE__.txt +29 -0
  315. package/web/out/spatial/index.html +1 -0
  316. package/web/out/spatial/index.txt +23 -0
  317. package/web/out/styles/__next._full.txt +23 -0
  318. package/web/out/styles/__next._tree.txt +4 -0
  319. package/web/out/styles/__next.styles.__PAGE__.txt +29 -0
  320. package/web/out/styles/index.html +1 -0
  321. package/web/out/styles/index.txt +23 -0
  322. package/web/out/ui-sketch/__next._full.txt +25 -0
  323. package/web/out/ui-sketch/__next._tree.txt +6 -0
  324. package/web/out/ui-sketch/__next.ui-sketch.__PAGE__.txt +31 -0
  325. package/web/out/ui-sketch/index.html +1 -0
  326. package/web/out/ui-sketch/index.txt +25 -0
@@ -0,0 +1,193 @@
1
+ import { BufferGeometry, Color, DoubleSide, Float32BufferAttribute, Group, Matrix4, Mesh, MeshLambertMaterial, Quaternion, Vector3 } from "three";
2
+ import maleAsset from "./assets/quaternius-superhero.json" with { type: "json" };
3
+ import femaleAsset from "./assets/quaternius-superhero-female.json" with { type: "json" };
4
+ import { jointWorldTransforms, proportionedJointOffset, quaternion, vector } from "./kinematics.js";
5
+ import { footHeightScale, partWidth, spatialReferenceBlend, spatialShape } from "./proportions.js";
6
+ import { createMorphTargets } from "./morph.js";
7
+ import { fingerPart, fingerRestMatrix, owningHand } from "./hands.js";
8
+ import { createFingerCreases } from "./reference-lines.js";
9
+ import { createGeometricCharacterModel } from "./geometric-model.js";
10
+ const up = new Vector3(0, 1, 0);
11
+ const sources = Object.fromEntries(Object.entries({ male: maleAsset, female: femaleAsset }).map(([bodyType, asset]) => {
12
+ const sourceFrames = asset.parts.map(part => {
13
+ const start = new Vector3(...part.start), direction = new Vector3(...part.end).sub(start);
14
+ return { length: direction.length(), inverse: new Matrix4().compose(start, new Quaternion().setFromUnitVectors(up, direction.normalize()), new Vector3(1, 1, 1)).invert() };
15
+ });
16
+ return [bodyType, { asset, targets: createMorphTargets(asset), sourceFrames, sourceBodyHeight: asset.height - sourceFrames[asset.parts.findIndex(p => p.id === "head")].length }];
17
+ }));
18
+ // CPU skinning is intentional: the browser and deterministic PNG rasterizer
19
+ // consume the very same deformed triangles, including cloned body modules.
20
+ export function createCharacterModel(actor, options = {}) {
21
+ if (actor.appearance === "geometric")
22
+ return createGeometricCharacterModel(actor);
23
+ const handCreases = options.handCreases ?? true;
24
+ const { asset, targets, sourceFrames, sourceBodyHeight } = sources[actor.bodyType ?? "male"];
25
+ const group = new Group(), world = jointWorldTransforms(actor);
26
+ const ratio = actor.height / asset.height;
27
+ const shape = spatialShape(actor.headRatio);
28
+ const [lower, upper, blend] = spatialReferenceBlend(actor.headRatio);
29
+ const matrices = new Map();
30
+ const surfaces = [];
31
+ const transform = (bone, partIndex) => {
32
+ const key = `${bone?.id ?? "root"}/${partIndex}`;
33
+ if (matrices.has(key))
34
+ return matrices.get(key);
35
+ const source = sourceFrames[partIndex];
36
+ const part = asset.parts[partIndex];
37
+ const bodyWidth = ratio * partWidth(shape, part.id) * (part.id.endsWith("-hand") ? actor.palmSize ?? 1 : 1);
38
+ const start = bone ? world[bone.startJointId].position : vector(actor.position);
39
+ const end = actor.joints.find(j => j.id === (bone?.endJointId ?? "spine"));
40
+ const offset = end ? proportionedJointOffset(actor, end) : new Vector3(0, source.length * ratio, 0);
41
+ const footSize = part.id.endsWith("-foot") ? actor.footSize ?? 1 : 1;
42
+ const footHeight = footHeightScale(footSize);
43
+ // Build the established profile first, then grow around the lifted ankle;
44
+ // thickness follows gently instead of leaving a large foot flattened.
45
+ offset.x /= footSize;
46
+ offset.y /= footHeight;
47
+ offset.z /= footSize;
48
+ const longitudinal = offset.length() / source.length;
49
+ const lateral = part.id === "head" ? longitudinal : bodyWidth;
50
+ const rotation = bone ? world[bone.endJointId].rotation.clone() : quaternion(actor.rotation);
51
+ let matrix;
52
+ const hand = bone && fingerPart(part.id) ? owningHand(actor, bone) : undefined;
53
+ if (hand) {
54
+ matrix = new Matrix4().compose(start, rotation, new Vector3(1, 1, 1)).multiply(fingerRestMatrix(actor, hand, part.id))
55
+ .multiply(new Matrix4().makeTranslation(-part.start[0], -part.start[1], -part.start[2]));
56
+ }
57
+ else if (["pelvis", "spine", "chest", "neck"].includes(part.id) || /-(shoulder|hip)$/.test(part.id)) {
58
+ // Torso and cross-body attachments widen in anatomical X/Z, not around
59
+ // their differently tilted bone axes, which would fold their shared skin.
60
+ const direction = vector(part.end).sub(vector(part.start));
61
+ const vertical = Math.abs(direction.y) > .0001 ? offset.y / direction.y : (actor.height - actor.height / actor.headRatio) / sourceBodyHeight;
62
+ const scale = new Vector3(bodyWidth, vertical, ratio * shape.torsoDepth);
63
+ const aligned = rotation.clone().multiply(new Quaternion().setFromUnitVectors(direction.clone().multiply(scale).normalize(), offset.clone().normalize()));
64
+ const origin = new Matrix4().makeTranslation(-part.start[0], -part.start[1], -part.start[2]);
65
+ matrix = new Matrix4().compose(start, aligned, scale).multiply(origin);
66
+ const anatomicalAxis = end && vector(end.offset).normalize().dot(direction.clone().normalize()) > 1 - 1e-6;
67
+ if (shape.softness > 0 && anatomicalAxis && ["pelvis", "spine", "chest", "neck"].includes(part.id)) {
68
+ // Keep horizontal cross-sections horizontal in rest space. A shear
69
+ // maps both joint endpoints exactly while depth changes independently
70
+ // from spine curvature; only authored bone rotations then pose it.
71
+ // Custom attachment directions (e.g. side-by-side heads) keep their
72
+ // own frame rather than being flattened into the anatomical Y axis.
73
+ const rest = new Matrix4().set(scale.x, (offset.x - direction.x * scale.x) / direction.y, 0, 0, 0, scale.y, 0, 0, 0, (offset.z - direction.z * scale.z) / direction.y, scale.z, 0, 0, 0, 0, 1);
74
+ const upright = new Matrix4().compose(start, rotation, new Vector3(1, 1, 1)).multiply(rest).multiply(origin);
75
+ matrix.elements.forEach((value, i) => { matrix.elements[i] = value + (upright.elements[i] - value) * shape.softness; });
76
+ }
77
+ }
78
+ else {
79
+ const posed = rotation.clone().multiply(new Quaternion().setFromUnitVectors(up, offset.clone().normalize()));
80
+ matrix = new Matrix4().compose(start, posed, new Vector3(lateral, longitudinal, part.id === "head" ? lateral * shape.headDepth : lateral)).multiply(source.inverse);
81
+ if (part.id.endsWith("-foot") && shape.softness > 0) {
82
+ // Broaden/lengthen the soft foot without inflating its sole below the
83
+ // floor, blending back to the original bone-axis shape at seven heads.
84
+ const direction = vector(part.end).sub(vector(part.start));
85
+ const scale = new Vector3(bodyWidth, offset.y / direction.y, offset.z / direction.z);
86
+ rotation.multiply(new Quaternion().setFromUnitVectors(direction.multiply(scale).normalize(), offset.clone().normalize()));
87
+ const flat = new Matrix4().compose(start, rotation, scale).multiply(new Matrix4().makeTranslation(-part.start[0], -part.start[1], -part.start[2]));
88
+ matrix.elements.forEach((value, i) => { matrix.elements[i] = value + (flat.elements[i] - value) * shape.softness; });
89
+ }
90
+ }
91
+ if (footSize !== 1) {
92
+ const frame = new Matrix4().compose(start, bone ? world[bone.endJointId].rotation : quaternion(actor.rotation), new Vector3(1, 1, 1));
93
+ matrix.premultiply(frame.clone().multiply(new Matrix4().makeScale(footSize, footHeight, footSize)).multiply(frame.invert()));
94
+ }
95
+ matrices.set(key, matrix);
96
+ return matrix;
97
+ };
98
+ const regular = new Map(actor.bones.filter(b => b.id === b.modelPart).map(b => [b.modelPart, b]));
99
+ const renderModule = (module, bone) => {
100
+ const prefix = bone && bone.id.endsWith(bone.modelPart) ? bone.id.slice(0, -bone.modelPart.length) : "";
101
+ const cloned = Boolean(bone && bone.id !== bone.modelPart);
102
+ const transforms = asset.parts.map((part, index) => {
103
+ const corresponding = cloned ? actor.bones.find(b => b.id === `${prefix}${part.id}`) : regular.get(part.id);
104
+ // Weights crossing a cloned attachment use that module's frame. This
105
+ // keeps the new limb attached without pulling on the original torso.
106
+ return corresponding ? transform(corresponding, index) : cloned && bone ? transform(bone, module.part) : transform(undefined, index);
107
+ });
108
+ const vertices = [...new Set(module.indices)], remap = new Map(vertices.map((v, i) => [v, i]));
109
+ const positions = [], rest = [], value = new Vector3(), weighted = new Vector3(), original = new Vector3();
110
+ for (const vertex of vertices) {
111
+ original.set(...[0, 1, 2].map(axis => {
112
+ const index = vertex * 3 + axis;
113
+ return targets[lower][index] + (targets[upper][index] - targets[lower][index]) * blend;
114
+ }));
115
+ value.set(0, 0, 0);
116
+ if (handCreases)
117
+ rest.push(...original.toArray());
118
+ let total = 0;
119
+ for (let k = 0; k < 4; k++) {
120
+ const weight = asset.weights[vertex * 4 + k];
121
+ if (!weight)
122
+ continue;
123
+ weighted.copy(original).applyMatrix4(transforms[asset.influences[vertex * 4 + k]]);
124
+ value.addScaledVector(weighted, weight);
125
+ total += weight;
126
+ }
127
+ positions.push(...value.divideScalar(total).toArray());
128
+ }
129
+ const geometry = new BufferGeometry();
130
+ geometry.setAttribute("position", new Float32BufferAttribute(positions, 3));
131
+ geometry.setIndex(module.indices.map(v => remap.get(v)));
132
+ geometry.computeVertexNormals();
133
+ if (module.material === "body" && shape.softness > 0)
134
+ surfaces.push({ geometry, keys: vertices.map(v => `${prefix}/${asset.positions.slice(v * 3, v * 3 + 3).join(",")}`) });
135
+ const color = new Color(module.material === "brows" ? "#514235" : module.material === "eyes" ? "#e7ded1" : actor.color);
136
+ const simpleFace = (lower < 2 ? 1 - blend : 0) + (upper < 2 ? blend : 0);
137
+ if (module.material === "brows")
138
+ color.lerp(new Color(actor.color), simpleFace * .9);
139
+ if (module.material === "eyes")
140
+ color.lerp(new Color("#514235"), simpleFace);
141
+ const mesh = new Mesh(geometry, new MeshLambertMaterial({ color, side: DoubleSide }));
142
+ mesh.userData = { characterId: actor.id, ...(bone ? { boneId: bone.id } : {}), modelPart: asset.parts[module.part].id };
143
+ group.add(mesh);
144
+ if (handCreases) {
145
+ const creases = createFingerCreases(actor, asset.parts[module.part].id, rest, positions, module.indices.map(v => remap.get(v)));
146
+ if (creases) {
147
+ // Bias only the skin's depth to avoid coplanar flicker; creases retain
148
+ // their exact surface positions and remain hidden by other geometry.
149
+ mesh.material.polygonOffset = true;
150
+ mesh.material.polygonOffsetFactor = 1;
151
+ mesh.material.polygonOffsetUnits = 1;
152
+ creases.userData = { ...mesh.userData, reference: "finger-crease" };
153
+ group.add(creases);
154
+ }
155
+ }
156
+ };
157
+ for (const module of asset.modules) {
158
+ const part = asset.parts[module.part].id;
159
+ if (part === "pelvis")
160
+ renderModule(module);
161
+ else
162
+ for (const bone of actor.bones.filter(b => b.modelPart === part))
163
+ renderModule(module, bone);
164
+ }
165
+ // Modules remain individually selectable, but their shared skin must have
166
+ // shared shading too. Separate normal generation exposed zigzag seams on
167
+ // the rounded targets even where the vertex positions matched exactly.
168
+ const normals = new Map(), a = new Vector3(), b = new Vector3(), c = new Vector3();
169
+ for (const { geometry, keys } of surfaces) {
170
+ const positions = geometry.getAttribute("position"), indices = geometry.index;
171
+ for (let i = 0; i < indices.count; i += 3) {
172
+ const vertices = [indices.getX(i), indices.getX(i + 1), indices.getX(i + 2)];
173
+ a.fromBufferAttribute(positions, vertices[0]);
174
+ b.fromBufferAttribute(positions, vertices[1]);
175
+ c.fromBufferAttribute(positions, vertices[2]);
176
+ const normal = b.sub(a).cross(c.sub(a));
177
+ for (const vertex of vertices) {
178
+ const key = keys[vertex];
179
+ if (!normals.has(key))
180
+ normals.set(key, new Vector3());
181
+ normals.get(key).add(normal);
182
+ }
183
+ }
184
+ }
185
+ for (const normal of normals.values())
186
+ normal.normalize();
187
+ for (const { geometry, keys } of surfaces) {
188
+ const attribute = geometry.getAttribute("normal");
189
+ keys.forEach((key, i) => { a.fromBufferAttribute(attribute, i).lerp(normals.get(key), shape.softness).normalize(); attribute.setXYZ(i, a.x, a.y, a.z); });
190
+ }
191
+ return group;
192
+ }
193
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/domain/spatial/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type maleAsset from "./assets/quaternius-superhero.json";
2
+ /** Four matching-topology vertex targets, built once for each source body. */
3
+ export declare function createMorphTargets(asset: typeof maleAsset): number[][];
@@ -0,0 +1,187 @@
1
+ import { isHandPart } from "./hands.js";
2
+ /** Weld rest-space seams before relaxing a target, including between modules. */
3
+ function relax(asset, target, passes, preserveVolume) {
4
+ const groups = [], at = [], byPosition = new Map();
5
+ for (let v = 0; v < target.length / 3; v++) {
6
+ const key = asset.positions.slice(v * 3, v * 3 + 3).join(",");
7
+ let group = byPosition.get(key);
8
+ if (group === undefined) {
9
+ group = groups.length;
10
+ byPosition.set(key, group);
11
+ groups.push([]);
12
+ }
13
+ groups[group].push(v);
14
+ at.push(group);
15
+ }
16
+ const adjacent = groups.map(() => new Set());
17
+ for (const module of asset.modules.filter(m => m.material === "body"))
18
+ for (let i = 0; i < module.indices.length; i += 3)
19
+ for (let j = 0; j < 3; j++) {
20
+ const a = at[module.indices[i + j]], b = at[module.indices[i + (j + 1) % 3]];
21
+ if (a !== b) {
22
+ adjacent[a].add(b);
23
+ adjacent[b].add(a);
24
+ }
25
+ }
26
+ let positions = groups.map(vertices => target.slice(vertices[0] * 3, vertices[0] * 3 + 3));
27
+ for (let pass = 0; pass < passes; pass++)
28
+ positions = positions.map((point, i) => {
29
+ const neighbors = [...adjacent[i]], amount = preserveVolume && pass % 2 ? -.53 : .5;
30
+ return neighbors.length ? point.map((v, axis) => v + amount * (neighbors.reduce((sum, j) => sum + positions[j][axis], 0) / neighbors.length - v)) : point;
31
+ });
32
+ return target.map((_, i) => positions[at[Math.floor(i / 3)]][i % 3]);
33
+ }
34
+ /** The existing four-head reference retains a little more anatomical detail. */
35
+ function createSoftTarget(asset) {
36
+ const original = asset.positions, smoothed = relax(asset, original, 18, false);
37
+ const head = asset.parts.find(p => p.id === "head");
38
+ const headVertices = asset.modules.filter(m => asset.parts[m.part].id === "head").flatMap(m => m.indices);
39
+ const chin = Math.min(...headVertices.map(vertex => original[vertex * 3 + 1]));
40
+ const pelvis = asset.parts.find(p => p.id === "pelvis"), chest = asset.parts.find(p => p.id === "chest");
41
+ return original.map((value, index) => {
42
+ const vertex = Math.floor(index / 3), axis = index % 3;
43
+ const x = original[vertex * 3], y = original[vertex * 3 + 1], z = original[vertex * 3 + 2];
44
+ const headHeight = head.end[1] - head.start[1], t = (y - chin) / (head.end[1] - chin);
45
+ if (t >= 0) {
46
+ // Map chin-to-crown to the head reference; retain a rounded lower face.
47
+ const face = Math.min(1, t);
48
+ if (axis === 0)
49
+ return x * (1.12 + .14 * Math.sin(Math.PI * face));
50
+ if (axis === 1)
51
+ return head.start[1] + headHeight * (face - .06 * Math.sin(Math.PI * face));
52
+ const front = z - head.start[2];
53
+ return head.start[2] + (front > .035 ? .035 + (front - .035) * .6 : front * .88);
54
+ }
55
+ // Muscle smoothing collapses the narrow finger cross-sections in X/Z
56
+ // while Y stays anatomical. Preserve hand volume, blending at the wrist
57
+ // with the existing skin weights; chibi targets still get 3D relaxation.
58
+ let handWeight = 0;
59
+ for (let k = 0; k < 4; k++)
60
+ if (isHandPart(asset.parts[asset.influences[vertex * 4 + k]].id))
61
+ handWeight += asset.weights[vertex * 4 + k];
62
+ const smooth = smoothed[index] + (value - smoothed[index]) * handWeight;
63
+ const upper = Math.max(0, Math.min(1, (y - pelvis.start[1]) / (chest.end[1] - pelvis.start[1])));
64
+ const central = Math.max(0, Math.min(1, (.28 - Math.abs(x)) / .12));
65
+ if (axis === 0)
66
+ return smooth * (1 + .18 * central * Math.sin(Math.PI * upper));
67
+ if (axis === 2)
68
+ return smooth * (1 - .36 * central * upper);
69
+ // Blend the chin lift down through the neck, without separating its skin.
70
+ const neck = Math.max(0, Math.min(1, (y - chest.end[1]) / (chin - chest.end[1])));
71
+ return value + (head.start[1] - chin) * neck * central;
72
+ });
73
+ }
74
+ const clamp = (value) => Math.max(0, Math.min(1, value));
75
+ const ease = (value) => { const t = clamp(value); return t * t * (3 - 2 * t); };
76
+ // Authored cross-sections: each target has its own cheek, jaw and torso contour.
77
+ // Values are interpolated in rest space, before any bone rotation or cloning.
78
+ function profile(points, t) {
79
+ const upper = points.findIndex(point => point[0] >= t);
80
+ if (upper <= 0)
81
+ return (upper === 0 ? points[0] : points[points.length - 1]).slice(1);
82
+ const a = points[upper - 1], b = points[upper], before = points[Math.max(0, upper - 2)], after = points[Math.min(points.length - 1, upper + 1)];
83
+ const u = (t - a[0]) / (b[0] - a[0]);
84
+ return a.slice(1).map((v, i) => {
85
+ const m0 = (b[i + 1] - before[i + 1]) / (b[0] - before[0]) * (b[0] - a[0]);
86
+ const m1 = (after[i + 1] - v) / (after[0] - a[0]) * (b[0] - a[0]);
87
+ return (2 * u * u * u - 3 * u * u + 1) * v + (u * u * u - 2 * u * u + u) * m0 + (-2 * u * u * u + 3 * u * u) * b[i + 1] + (u * u * u - u * u) * m1;
88
+ });
89
+ }
90
+ function createChibiTarget(asset, soft, heads) {
91
+ const original = asset.positions, target = [...soft];
92
+ const head = asset.parts.find(p => p.id === "head"), chest = asset.parts.find(p => p.id === "chest"), pelvis = asset.parts[0];
93
+ const headVertices = asset.modules.filter(m => asset.parts[m.part].id === "head").flatMap(m => m.indices);
94
+ const chin = Math.min(...headVertices.map(v => original[v * 3 + 1])), height = head.end[1] - head.start[1];
95
+ const eyes = [...new Set(asset.modules.filter(m => m.material === "eyes").flatMap(m => m.indices))].filter(v => original[v * 3] > 0);
96
+ const eyeX = eyes.reduce((sum, v) => sum + original[v * 3], 0) / eyes.length;
97
+ const eyeY = eyes.reduce((sum, v) => sum + original[v * 3 + 1], 0) / eyes.length;
98
+ const face = heads === 2
99
+ ? [[0, .18, .22], [.12, .34, .34], [.3, .45, .41], [.52, .48, .44], [.72, .46, .43], [.9, .34, .33], [1, .13, .14]]
100
+ : [[0, .14, .19], [.12, .29, .31], [.3, .41, .39], [.52, .45, .43], [.72, .43, .42], [.9, .32, .32], [1, .12, .13]];
101
+ const torso = heads === 2
102
+ ? [[0, .19, .105], [.3, .205, .115], [.65, .20, .11], [1, .18, .10]]
103
+ : [[0, .18, .105], [.3, .172, .10], [.65, .19, .11], [1, .175, .095]];
104
+ for (let vertex = 0; vertex < original.length / 3; vertex++) {
105
+ const index = vertex * 3, [x, y, z] = original.slice(index, index + 3);
106
+ if (y >= chin) {
107
+ let t = clamp((y - chin) / (head.end[1] - chin));
108
+ // Open the eyelids and eyeballs together, rather than enlarging an eye
109
+ // behind the unchanged adult socket. The smooth cage keeps the lid joined.
110
+ const eye = Math.exp(-(((Math.abs(x) - eyeX) / .03) ** 2 + ((y - eyeY) / .055) ** 2)) * ease((z - head.start[2]) / .06) * (1 - ease((t - .8) / .2));
111
+ t += (y - eyeY) / (head.end[1] - chin) * eye * (heads === 2 ? 1.35 : 1.1);
112
+ // Compress the adult lower face; keep eye level below the head midpoint.
113
+ const vertical = t - (heads === 2 ? .10 : .065) * Math.sin(Math.PI * t);
114
+ const [rx, rz] = profile(face, vertical);
115
+ const dz = z - head.start[2], radius = Math.hypot(x, dz);
116
+ const nx = radius > 1e-8 ? x / radius : 0, nz = radius > 1e-8 ? dz / radius : 0;
117
+ const strength = ease(t / .08) * (heads === 2 ? .94 : .86);
118
+ target[index] = soft[index] + (nx * rx * height - soft[index]) * strength;
119
+ target[index + 1] = head.start[1] + height * vertical;
120
+ target[index + 2] = soft[index + 2] + (head.start[2] + nz * rz * height - soft[index + 2]) * strength;
121
+ continue;
122
+ }
123
+ const point = soft.slice(index, index + 3);
124
+ // A single rounded chest/abdomen replaces adult chest, waist and glute relief.
125
+ const t = clamp((y - pelvis.start[1]) / (chest.end[1] - pelvis.start[1]));
126
+ const core = ease((.27 - Math.abs(x)) / .10) * ease((y - pelvis.start[1] + .04) / .12) * (1 - ease((y - chest.end[1] + .01) / .09));
127
+ const centerZ = y < pelvis.end[1]
128
+ ? pelvis.start[2] + (pelvis.end[2] - pelvis.start[2]) * clamp((y - pelvis.start[1]) / (pelvis.end[1] - pelvis.start[1]))
129
+ : chest.start[2] + (chest.end[2] - chest.start[2]) * clamp((y - chest.start[1]) / (chest.end[1] - chest.start[1]));
130
+ const radius = Math.hypot(point[0], point[2] - centerZ), [rx, rz] = profile(torso, t);
131
+ if (radius > 1e-8) {
132
+ target[index] += (point[0] / radius * rx - point[0]) * core;
133
+ target[index + 2] += (centerZ + (point[2] - centerZ) / radius * rz - point[2]) * core;
134
+ }
135
+ // Fill the narrow elbows and wrists into simple soft tubes.
136
+ // Skin weights blend neighboring sections and keep module seams identical.
137
+ for (let k = 0; k < 4; k++) {
138
+ const weight = asset.weights[vertex * 4 + k], part = asset.parts[asset.influences[vertex * 4 + k]];
139
+ if (!weight || !/-(elbow|wrist)$/.test(part.id))
140
+ continue;
141
+ const direction = part.end.map((v, i) => v - part.start[i]), length2 = direction.reduce((sum, v) => sum + v * v, 0);
142
+ const along = point.reduce((sum, v, i) => sum + (v - part.start[i]) * direction[i], 0) / length2;
143
+ const center = part.start.map((v, i) => v + direction[i] * along), radial = point.map((v, i) => v - center[i]);
144
+ const length = Math.hypot(...radial);
145
+ if (length < 1e-8)
146
+ continue;
147
+ const r = part.id.endsWith("-elbow") ? .054 : .046;
148
+ const rounded = r * (1 - .14 * ease(along));
149
+ for (let axis = 0; axis < 3; axis++)
150
+ target[index + axis] += radial[axis] * (rounded / length - 1) * weight * .8;
151
+ }
152
+ const side = x >= 0 ? "left" : "right";
153
+ const thigh = asset.parts.find(p => p.id === `${side}-knee`), calf = asset.parts.find(p => p.id === `${side}-ankle`);
154
+ if (y < thigh.start[1] && y > calf.end[1]) {
155
+ // One continuous contour across the knee prevents two differently sized
156
+ // bone sections from introducing a cuff where their weights meet.
157
+ const leg = y > thigh.end[1] ? thigh : calf;
158
+ const along = clamp((y - leg.start[1]) / (leg.end[1] - leg.start[1]));
159
+ const cx = leg.start[0] + (leg.end[0] - leg.start[0]) * along, cz = leg.start[2] + (leg.end[2] - leg.start[2]) * along;
160
+ const dx = point[0] - cx, dz = point[2] - cz, length = Math.hypot(dx, dz);
161
+ const t = (y - calf.end[1]) / (thigh.start[1] - calf.end[1]);
162
+ const [radius] = profile([[0, .045], [.2, .059], [.5, .063], [.8, .077], [1, .085]], t);
163
+ const amount = ease(t / .12) * (1 - ease((t - .8) / .2)) * .92;
164
+ if (length > 1e-8) {
165
+ target[index] += dx * (radius / length - 1) * amount;
166
+ target[index + 2] += dz * (radius / length - 1) * amount;
167
+ }
168
+ }
169
+ }
170
+ // Relax the sculpted cage in all three axes. Keeping the old adult Y values
171
+ // after changing cross-sections would leave compressed folds at joints.
172
+ const relaxed = relax(asset, target, 24, true);
173
+ for (let v = 0; v < original.length / 3; v++) {
174
+ const y = original[v * 3 + 1];
175
+ // Keep the exact crown, chin seam and sole references stable.
176
+ const amount = ease((y - .04) / .08) * (1 - ease((y - head.end[1] + .025) / .025));
177
+ for (let axis = 0; axis < 3; axis++)
178
+ target[v * 3 + axis] += (relaxed[v * 3 + axis] - target[v * 3 + axis]) * amount;
179
+ }
180
+ return target;
181
+ }
182
+ /** Four matching-topology vertex targets, built once for each source body. */
183
+ export function createMorphTargets(asset) {
184
+ const soft = createSoftTarget(asset);
185
+ return [createChibiTarget(asset, soft, 2), createChibiTarget(asset, soft, 3), asset.positions.map((v, i) => v + (soft[i] - v) * .5), asset.positions];
186
+ }
187
+ //# sourceMappingURL=morph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morph.js","sourceRoot":"","sources":["../../../src/domain/spatial/morph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /** Rest-shape references, independent of pose and the authored torso/leg split. */
2
+ declare const references: {
3
+ heads: number;
4
+ softness: number;
5
+ torso: number;
6
+ torsoDepth: number;
7
+ headDepth: number;
8
+ shoulder: number;
9
+ hip: number;
10
+ arm: number;
11
+ forearm: number;
12
+ thigh: number;
13
+ calf: number;
14
+ hand: number;
15
+ foot: number;
16
+ armLength: number;
17
+ handLength: number;
18
+ footLength: number;
19
+ neck: number;
20
+ }[];
21
+ export type SpatialShape = typeof references[number];
22
+ /** Foot thickness follows half the width/length change. */
23
+ export declare const footHeightScale: (size?: number) => number;
24
+ /** The same adjacent targets and easing drive both rig dimensions and vertices. */
25
+ export declare function spatialReferenceBlend(headRatio: number): [number, number, number];
26
+ export declare function spatialShape(headRatio: number): SpatialShape;
27
+ export declare function partWidth(shape: SpatialShape, part: string): number;
28
+ export declare const BODY_SHAPE_LIMITS: {
29
+ readonly neckLength: {
30
+ readonly min: 0.6;
31
+ readonly max: 1.4;
32
+ };
33
+ readonly palmSize: {
34
+ readonly min: 0.7;
35
+ readonly max: 1.3;
36
+ };
37
+ readonly fingerLength: {
38
+ readonly min: 0.6;
39
+ readonly max: 1.4;
40
+ };
41
+ readonly footSize: {
42
+ readonly min: 0.7;
43
+ readonly max: 1.4;
44
+ };
45
+ };
46
+ export {};
@@ -0,0 +1,59 @@
1
+ /** Rest-shape references, independent of pose and the authored torso/leg split. */
2
+ const references = [
3
+ { heads: 2, softness: 1, torso: 1.02, torsoDepth: 1.5, headDepth: .9, shoulder: .94, hip: 1, arm: 1.02, forearm: 1.08, thigh: 1, calf: 1.12, hand: 1.35, foot: 1.5, armLength: .84, handLength: 1.2, footLength: 1.75, neck: .42 },
4
+ { heads: 3, softness: .82, torso: .94, torsoDepth: 1.24, headDepth: .94, shoulder: .87, hip: .88, arm: .94, forearm: .96, thigh: .94, calf: 1, hand: 1.18, foot: 1.26, armLength: .92, handLength: 1.12, footLength: 1.45, neck: .55 },
5
+ { heads: 4, softness: .5, torso: .84, torsoDepth: 1, headDepth: .94, shoulder: .84, hip: .84, arm: .75, forearm: .78, thigh: .84, calf: .80, hand: .88, foot: .94, armLength: .98, handLength: 1.04, footLength: 1.08, neck: .72 },
6
+ { heads: 7, softness: 0, torso: 1, torsoDepth: 1, headDepth: 1, shoulder: 1, hip: 1, arm: 1, forearm: 1, thigh: 1, calf: 1, hand: 1, foot: 1, armLength: 1, handLength: 1, footLength: 1, neck: 1 },
7
+ ];
8
+ /** Foot thickness follows half the width/length change. */
9
+ export const footHeightScale = (size = 1) => 1 + (size - 1) * .5;
10
+ /** The same adjacent targets and easing drive both rig dimensions and vertices. */
11
+ export function spatialReferenceBlend(headRatio) {
12
+ const upper = references.findIndex(reference => reference.heads >= headRatio);
13
+ if (upper === 0)
14
+ return [0, 0, 0];
15
+ if (upper === -1)
16
+ return [3, 3, 0];
17
+ const t = (headRatio - references[upper - 1].heads) / (references[upper].heads - references[upper - 1].heads);
18
+ return [upper - 1, upper, t * t * (3 - 2 * t)];
19
+ }
20
+ export function spatialShape(headRatio) {
21
+ if (headRatio > 7) {
22
+ const shape = { ...references[3] }, width = Math.sqrt(7 / headRatio);
23
+ for (const key of ["torso", "torsoDepth", "shoulder", "hip", "arm", "forearm", "thigh", "calf", "hand", "foot"])
24
+ shape[key] = width;
25
+ return shape;
26
+ }
27
+ const [lower, upper, blend] = spatialReferenceBlend(headRatio);
28
+ const a = references[lower], b = references[upper];
29
+ return Object.fromEntries(Object.keys(a).map(key => {
30
+ const field = key;
31
+ return [field, a[field] + (b[field] - a[field]) * blend];
32
+ }));
33
+ }
34
+ export function partWidth(shape, part) {
35
+ if (part.endsWith("-shoulder"))
36
+ return shape.shoulder;
37
+ if (part.endsWith("-hip"))
38
+ return shape.hip;
39
+ if (part.endsWith("-elbow"))
40
+ return shape.arm;
41
+ if (part.endsWith("-wrist"))
42
+ return shape.forearm;
43
+ if (part.endsWith("-hand"))
44
+ return shape.hand;
45
+ if (part.endsWith("-knee"))
46
+ return shape.thigh;
47
+ if (part.endsWith("-ankle"))
48
+ return shape.calf;
49
+ if (part.endsWith("-foot"))
50
+ return shape.foot;
51
+ return shape.torso;
52
+ }
53
+ export const BODY_SHAPE_LIMITS = {
54
+ neckLength: { min: .6, max: 1.4 },
55
+ palmSize: { min: .7, max: 1.3 },
56
+ fingerLength: { min: .6, max: 1.4 },
57
+ footSize: { min: .7, max: 1.4 },
58
+ };
59
+ //# sourceMappingURL=proportions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proportions.js","sourceRoot":"","sources":["../../../src/domain/spatial/proportions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { LineSegments } from "three";
2
+ import type { SpatialCharacter } from "./types.ts";
3
+ /** Intersect finger joint planes with the skin in rest space, then interpolate
4
+ * on the exact posed triangles. This follows both proportions and skinning,
5
+ * including custom limbs, without floating rings or a second deformation path. */
6
+ export declare function createFingerCreases(actor: SpatialCharacter, modelPart: string, rest: number[], posed: number[], indices: number[]): LineSegments | null;