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,285 @@
1
+ import { Euler, Quaternion, Vector3 } from "three";
2
+ import { footHeightScale, partWidth, spatialShape } from "./proportions.js";
3
+ import { fingerPart, fingerBasis, fingerOffset, owningHand } from "./hands.js";
4
+ import maleRig from "./assets/quaternius-rig.json" with { type: "json" };
5
+ import femaleRig from "./assets/quaternius-female-rig.json" with { type: "json" };
6
+ const DEG = Math.PI / 180;
7
+ export const vector = (value) => new Vector3(...value);
8
+ export const quaternion = (value) => new Quaternion().setFromEuler(new Euler(...value.map(v => v * DEG), "XYZ"));
9
+ export const angles = (value) => {
10
+ const e = new Euler().setFromQuaternion(value, "XYZ");
11
+ return [e.x / DEG, e.y / DEG, e.z / DEG];
12
+ };
13
+ // These attachment segments follow their parent, without a local rotational DOF.
14
+ // Match the source part so duplicated limbs obey the same rule.
15
+ export const isRigidBodyConnector = (bone) => /^(left|right)-(shoulder|hip)$/.test(bone.modelPart);
16
+ export function boneQuaternion(actor, bone, rotation = bone.rotation) {
17
+ const basis = fingerBasis(actor, bone);
18
+ return basis.clone().multiply(quaternion(rotation)).multiply(basis.invert());
19
+ }
20
+ export function boneAngles(actor, bone, rotation) {
21
+ const basis = fingerBasis(actor, bone);
22
+ return angles(basis.clone().invert().multiply(rotation).multiply(basis));
23
+ }
24
+ // Stored offsets describe the anatomical rig. Apply the head-count width at
25
+ // torso and shoulder/hip attachments before posing so mesh and controls align.
26
+ export function proportionedJointOffset(character, joint) {
27
+ const offset = vector(joint.offset);
28
+ const part = character.bones.find(b => b.endJointId === joint.id)?.modelPart;
29
+ if (part && fingerPart(part)) {
30
+ const bone = character.bones.find(b => b.endJointId === joint.id);
31
+ const hand = owningHand(character, bone);
32
+ if (hand)
33
+ return fingerOffset(character, joint, hand);
34
+ }
35
+ const shape = spatialShape(character.headRatio);
36
+ if (part && (["spine", "chest", "neck"].includes(part) || /-(shoulder|hip)$/.test(part))) {
37
+ const width = partWidth(shape, part) * 6 * character.headRatio / (7 * (character.headRatio - 1));
38
+ offset.x *= width;
39
+ // Thickness describes a skin cross-section. Scaling the rest spine's
40
+ // sagittal offsets by it would exaggerate the curve as height shrinks.
41
+ const depth = shape.torsoDepth * 6 * character.headRatio / (7 * (character.headRatio - 1));
42
+ offset.z *= 1 + (depth - 1) * (1 - shape.softness);
43
+ }
44
+ const neckLength = character.neckLength ?? 1;
45
+ if (part === "neck")
46
+ offset.multiplyScalar(shape.neck * neckLength);
47
+ if (part === "spine" || part === "chest") {
48
+ const neck = character.joints.find(j => j.id === "neck");
49
+ if (neck) {
50
+ offset.y += neck.offset[1] * (1 - shape.neck) / 2;
51
+ offset.z += neck.offset[2] * (1 - shape.neck) * shape.torsoDepth * 6 * character.headRatio / (7 * (character.headRatio - 1)) / 2 * (1 - shape.softness);
52
+ }
53
+ }
54
+ if (part && /-(elbow|wrist)$/.test(part))
55
+ offset.multiplyScalar(shape.armLength);
56
+ if (part?.endsWith("-hand"))
57
+ offset.multiplyScalar(shape.handLength * (character.palmSize ?? 1));
58
+ const footHeight = footHeightScale(character.footSize);
59
+ if (part?.endsWith("-ankle") && footHeight !== 1) {
60
+ const foot = character.bones.find(b => b.startJointId === joint.id && b.modelPart.endsWith("-foot"));
61
+ if (foot) {
62
+ const rig = character.bodyType === "female" ? femaleRig : maleRig;
63
+ const source = rig.parts.find(p => p.id === foot.modelPart);
64
+ const end = character.joints.find(j => j.id === foot.endJointId);
65
+ const scale = vector(end.offset).length() / vector(source.end).sub(vector(source.start)).length();
66
+ // Raise the ankle within the leg, keeping the knee/body in place. The
67
+ // same anatomical sole height anchors the foot's mild vertical growth.
68
+ offset.y += (source.start[1] - rig.bottom) * scale * (footHeight - 1);
69
+ }
70
+ }
71
+ if (part?.endsWith("-foot")) {
72
+ offset.x *= character.footSize ?? 1;
73
+ offset.y *= footHeight;
74
+ offset.z *= shape.footLength * (character.footSize ?? 1);
75
+ }
76
+ return offset;
77
+ }
78
+ export function jointWorldTransforms(character, rest) {
79
+ const result = Object.create(null);
80
+ const joints = new Map(character.joints.map(joint => [joint.id, joint]));
81
+ const incoming = new Map(character.bones.map(bone => [bone.endJointId, bone]));
82
+ const visiting = new Set();
83
+ const resolve = (id) => {
84
+ if (result[id])
85
+ return result[id];
86
+ if (visiting.has(id))
87
+ throw new Error("SPATIAL_INVALID: cyclic skeleton");
88
+ visiting.add(id);
89
+ const joint = joints.get(id);
90
+ if (!joint)
91
+ throw new Error("SPATIAL_INVALID: missing parent joint");
92
+ const parent = joint.parentId ? resolve(joint.parentId) : { position: vector(character.position), rotation: quaternion(character.rotation) };
93
+ const bone = incoming.get(id);
94
+ const basis = rest?.[id].basis;
95
+ const local = bone ? basis ? basis.clone().multiply(quaternion(bone.rotation)).multiply(basis.clone().invert()) : boneQuaternion(character, bone) : new Quaternion();
96
+ const rotation = parent.rotation.clone().multiply(local).normalize();
97
+ const position = (rest?.[id].offset.clone() ?? proportionedJointOffset(character, joint)).applyQuaternion(rotation).add(parent.position);
98
+ visiting.delete(id);
99
+ return result[id] = { position, rotation };
100
+ };
101
+ character.joints.forEach(joint => resolve(joint.id));
102
+ return result;
103
+ }
104
+ export function boneWorldTransforms(character) {
105
+ const world = jointWorldTransforms(character);
106
+ return Object.fromEntries(character.bones.map(b => [b.id, { position: world[b.startJointId].position.clone(), rotation: world[b.endJointId].rotation.clone() }]));
107
+ }
108
+ // Damped least squares over the articulated hierarchy. Limits are projected after
109
+ // every step; pinned targets receive a separate final solve and hard validation.
110
+ export function solveJoint(source, jointId, goal, isolated = true) {
111
+ const character = structuredClone(source);
112
+ const selected = character.joints.find(j => j.id === jointId);
113
+ if (!selected)
114
+ throw new Error("SPATIAL_INVALID: unknown joint");
115
+ const selectedBone = character.bones.find(b => b.endJointId === jointId);
116
+ const fingerOnly = Boolean(selectedBone && fingerPart(selectedBone.modelPart));
117
+ const rest = Object.fromEntries(character.joints.map(j => {
118
+ const b = character.bones.find(b => b.endJointId === j.id);
119
+ return [j.id, { offset: proportionedJointOffset(character, j), basis: b ? fingerBasis(character, b) : new Quaternion() }];
120
+ }));
121
+ const worldNow = () => jointWorldTransforms(character, rest);
122
+ const initial = jointWorldTransforms(source);
123
+ if ((goal.position && selected.lockPosition) || (goal.rotation && selectedBone && (selectedBone.lockRotation || isRigidBodyConnector(selectedBone)))) {
124
+ return { character: source, constrained: true };
125
+ }
126
+ const pins = [
127
+ ...source.joints.filter(j => j.lockPosition).map(j => ({ id: j.id, weight: 100, position: initial[j.id].position })),
128
+ ...source.bones.filter(b => b.lockRotation).map(b => ({ id: b.endJointId, weight: 100, rotation: initial[b.endJointId].rotation })),
129
+ ];
130
+ const desired = { id: jointId, weight: 1,
131
+ ...(goal.position ? { position: vector(goal.position) } : {}),
132
+ ...(goal.rotation ? { rotation: quaternion(goal.rotation) } : {}),
133
+ };
134
+ if (desired.rotation && selectedBone) {
135
+ const parent = selected.parentId ? initial[selected.parentId].rotation : quaternion(source.rotation);
136
+ const local = boneAngles(character, selectedBone, parent.clone().invert().multiply(desired.rotation));
137
+ if (local.every((v, axis) => v >= selectedBone.limits.min[axis] && v <= selectedBone.limits.max[axis])) {
138
+ selectedBone.rotation = local;
139
+ const world = worldNow();
140
+ if (pins.every(pin => (!pin.position || pin.position.distanceTo(world[pin.id].position) < 0.00001)
141
+ && (!pin.rotation || pin.rotation.angleTo(world[pin.id].rotation) < 0.00001)))
142
+ return { character, constrained: false };
143
+ selectedBone.rotation = [...source.bones.find(b => b.endJointId === jointId).rotation];
144
+ }
145
+ }
146
+ const chain = new Set();
147
+ let ancestor = jointId;
148
+ while (ancestor) {
149
+ chain.add(ancestor);
150
+ const joint = character.joints.find(j => j.id === ancestor);
151
+ ancestor = joint.parentId;
152
+ if (ancestor && character.joints.filter(j => j.parentId === ancestor).length > 1)
153
+ break;
154
+ }
155
+ const rotationChain = new Set([jointId]);
156
+ for (const id of rotationChain)
157
+ for (const child of character.joints.filter(j => j.parentId === id))
158
+ rotationChain.add(child.id);
159
+ const variables = [];
160
+ for (const joint of character.bones) {
161
+ if (joint.lockRotation || isRigidBodyConnector(joint) || (desired.rotation ? !rotationChain.has(joint.endJointId) : isolated && !chain.has(joint.endJointId)))
162
+ continue;
163
+ for (const axis of [0, 1, 2]) {
164
+ if (joint.limits.max[axis] - joint.limits.min[axis] < 0.0001)
165
+ continue;
166
+ variables.push({ get: () => joint.rotation[axis], set: v => { joint.rotation[axis] = Math.max(joint.limits.min[axis], Math.min(joint.limits.max[axis], v)); }, step: 0.05 });
167
+ }
168
+ }
169
+ if (!selected.parentId)
170
+ for (const axis of [0, 1, 2]) {
171
+ variables.push({ get: () => character.position[axis], set: v => { character.position[axis] = v; }, step: 0.001 });
172
+ }
173
+ const residual = (targets) => {
174
+ // A locked world orientation determines this joint's local orientation from
175
+ // its parent; eliminate those degrees instead of balancing a soft penalty.
176
+ const pending = new Set(character.bones.filter(b => b.lockRotation && !isRigidBodyConnector(b)).map(b => b.id));
177
+ const applyRotationPin = (id) => {
178
+ const bone = character.bones.find(b => b.id === id);
179
+ const parentBone = character.bones.find(b => b.endJointId === bone.startJointId);
180
+ if (parentBone && pending.has(parentBone.id))
181
+ applyRotationPin(parentBone.id);
182
+ const world = worldNow();
183
+ const parent = world[bone.startJointId].rotation;
184
+ bone.rotation = boneAngles(character, bone, parent.clone().invert().multiply(initial[bone.endJointId].rotation)).map((v, axis) => Math.max(bone.limits.min[axis], Math.min(bone.limits.max[axis], v)));
185
+ pending.delete(id);
186
+ };
187
+ for (const id of pending)
188
+ applyRotationPin(id);
189
+ const world = worldNow();
190
+ const values = [];
191
+ for (const target of targets) {
192
+ if (target.position)
193
+ values.push(...target.position.clone().sub(world[target.id].position).multiplyScalar(target.weight).toArray());
194
+ if (target.rotation) {
195
+ const delta = target.rotation.clone().multiply(world[target.id].rotation.clone().invert()).normalize();
196
+ const sign = delta.w < 0 ? -1 : 1;
197
+ values.push(delta.x * 2 * sign * target.weight, delta.y * 2 * sign * target.weight, delta.z * 2 * sign * target.weight);
198
+ }
199
+ }
200
+ return values;
201
+ };
202
+ const energy = (values) => values.reduce((sum, value) => sum + value * value, 0);
203
+ const optimize = (targets, iterations) => {
204
+ for (let iteration = 0; iteration < iterations; iteration++) {
205
+ const error = residual(targets);
206
+ const score = energy(error);
207
+ if (score < 1e-12)
208
+ break;
209
+ const base = variables.map(v => v.get());
210
+ const jacobian = variables.map((variable, i) => {
211
+ variable.set(base[i] + variable.step);
212
+ let actual = variable.get() - base[i];
213
+ if (Math.abs(actual) < 1e-10) {
214
+ variable.set(base[i] - variable.step);
215
+ actual = variable.get() - base[i];
216
+ }
217
+ const changed = residual(targets);
218
+ variable.set(base[i]);
219
+ return changed.map((value, row) => actual === 0 ? 0 : (error[row] - value) / actual);
220
+ });
221
+ // Solve in constraint space (J Jᵀ + λI), keeping sparse rig degrees free.
222
+ const matrix = error.map((_, row) => error.map((__, column) => jacobian.reduce((sum, derivative) => sum + derivative[row] * derivative[column], 0) + (row === column ? (fingerOnly ? 1e-7 * (character.height / 1.8) ** 2 : .00001) : 0)));
223
+ const multipliers = solveLinear(matrix, error);
224
+ const delta = jacobian.map(column => column.reduce((sum, value, i) => sum + value * multipliers[i], 0));
225
+ let accepted = false;
226
+ for (const scale of [1, 0.5, 0.2, 0.05]) {
227
+ variables.forEach((variable, i) => variable.set(base[i] + Math.max(-15, Math.min(15, delta[i])) * scale));
228
+ if (energy(residual(targets)) < score - 1e-14) {
229
+ accepted = true;
230
+ break;
231
+ }
232
+ }
233
+ if (!accepted) {
234
+ variables.forEach((variable, i) => variable.set(base[i]));
235
+ break;
236
+ }
237
+ }
238
+ };
239
+ optimize([...pins, desired], 65);
240
+ if (pins.length)
241
+ optimize(pins, 25);
242
+ residual(pins);
243
+ const final = worldNow();
244
+ const validPins = pins.every(pin => (!pin.position || pin.position.distanceTo(final[pin.id].position) < 0.00001)
245
+ && (!pin.rotation || pin.rotation.angleTo(final[pin.id].rotation) < 0.00001));
246
+ if (!validPins)
247
+ return isolated && !fingerOnly ? solveJoint(source, jointId, goal, false) : { character: source, constrained: true };
248
+ const constrained = (desired.position ? desired.position.distanceTo(final[jointId].position) > (fingerOnly ? character.height * .0005 : .005) : false)
249
+ || (desired.rotation ? desired.rotation.angleTo(final[jointId].rotation) > 0.005 : false);
250
+ if (constrained && isolated && !fingerOnly) {
251
+ const full = solveJoint(source, jointId, goal, false);
252
+ const error = (actor) => {
253
+ const final = jointWorldTransforms(actor)[jointId];
254
+ return (desired.position?.distanceTo(final.position) ?? 0) + (desired.rotation?.angleTo(final.rotation) ?? 0);
255
+ };
256
+ if (error(full.character) < error(character))
257
+ return full;
258
+ }
259
+ return { character, constrained };
260
+ }
261
+ function solveLinear(matrix, values) {
262
+ const rows = matrix.map((row, i) => [...row, values[i]]);
263
+ const n = rows.length;
264
+ for (let column = 0; column < n; column++) {
265
+ let pivot = column;
266
+ for (let row = column + 1; row < n; row++)
267
+ if (Math.abs(rows[row][column]) > Math.abs(rows[pivot][column]))
268
+ pivot = row;
269
+ [rows[pivot], rows[column]] = [rows[column], rows[pivot]];
270
+ const divisor = rows[column][column];
271
+ if (Math.abs(divisor) < 1e-14)
272
+ continue;
273
+ for (let k = column; k <= n; k++)
274
+ rows[column][k] /= divisor;
275
+ for (let row = 0; row < n; row++) {
276
+ if (row === column)
277
+ continue;
278
+ const factor = rows[row][column];
279
+ for (let k = column; k <= n; k++)
280
+ rows[row][k] -= factor * rows[column][k];
281
+ }
282
+ }
283
+ return rows.map(row => row[n]);
284
+ }
285
+ //# sourceMappingURL=kinematics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinematics.js","sourceRoot":"","sources":["../../../src/domain/spatial/kinematics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { DirectionalLight, Group, Mesh, Vector3 } from "three";
2
+ import type { SpatialDraft } from "./types.ts";
3
+ export declare const SPATIAL_LIGHTING: {
4
+ readonly ambient: 0.3;
5
+ readonly key: 0.85;
6
+ readonly direction: readonly [-0.65, 0.6, 1.3];
7
+ readonly shadowSize: 2048;
8
+ readonly shadowRadius: 2;
9
+ readonly shadowStrength: 0.65;
10
+ };
11
+ export declare const getSpatialLighting: (draft: SpatialDraft) => {
12
+ readonly ambient: 0.3;
13
+ readonly key: 0.85;
14
+ readonly direction: readonly [-0.65, 0.6, 1.3];
15
+ readonly shadowSize: 2048;
16
+ readonly shadowRadius: 2;
17
+ readonly shadowStrength: 0.65;
18
+ } | {
19
+ ambient: number;
20
+ key: number;
21
+ shadowStrength: number;
22
+ direction: readonly [-0.65, 0.6, 1.3];
23
+ shadowSize: 2048;
24
+ shadowRadius: 2;
25
+ };
26
+ export declare const spatialSurfaces: (scene: Group) => Mesh[];
27
+ /** Fit all authored surfaces, excluding the editor grid and articulation helpers. */
28
+ export declare function fitSpatialLight(light: DirectionalLight, scene: Group): void;
29
+ /** Short hemisphere rays darken nearby contacts, on the same posed skin in both renderers. */
30
+ export declare function applySpatialContactShading(scene: Group, draft: SpatialDraft, cached?: Float32Array[]): Float32Array[];
31
+ /** CPU equivalent of the editor's fitted directional shadow map. */
32
+ export declare function spatialShadowSampler(scene: Group): {
33
+ slope(normal: Vector3): [number, number];
34
+ sample(point: Vector3, slopeX: number, slopeY: number): number;
35
+ };
@@ -0,0 +1,173 @@
1
+ import { Box3, DirectionalLight, DoubleSide, Float32BufferAttribute, Matrix3, Matrix4, Mesh, Ray, Vector3 } from "three";
2
+ // Linear diffuse contributions. Three's Lambert lights use intensity / PI.
3
+ export const SPATIAL_LIGHTING = { ambient: .3, key: .85, direction: [-.65, .6, 1.3], shadowSize: 2048, shadowRadius: 2, shadowStrength: .65 };
4
+ export const getSpatialLighting = (draft) => draft.lightingEnabled
5
+ ? SPATIAL_LIGHTING : { ...SPATIAL_LIGHTING, ambient: 1, key: 0, shadowStrength: 0 };
6
+ export const spatialSurfaces = (scene) => {
7
+ const meshes = [];
8
+ scene.traverse(object => { if (object instanceof Mesh && !object.userData.rig)
9
+ meshes.push(object); });
10
+ return meshes;
11
+ };
12
+ /** Fit all authored surfaces, excluding the editor grid and articulation helpers. */
13
+ export function fitSpatialLight(light, scene) {
14
+ const bounds = new Box3();
15
+ for (const mesh of spatialSurfaces(scene))
16
+ bounds.union(new Box3().setFromObject(mesh));
17
+ const center = bounds.isEmpty() ? new Vector3() : bounds.getCenter(new Vector3());
18
+ const extent = Math.max(.1, bounds.getSize(new Vector3()).length());
19
+ light.position.copy(center).addScaledVector(new Vector3(...SPATIAL_LIGHTING.direction).normalize(), extent);
20
+ light.target.position.copy(center);
21
+ light.target.updateMatrixWorld();
22
+ light.updateMatrixWorld();
23
+ const camera = light.shadow.camera;
24
+ camera.position.copy(light.position);
25
+ camera.lookAt(center);
26
+ camera.updateMatrixWorld();
27
+ const viewBounds = bounds.isEmpty() ? new Box3(new Vector3(-.5, -.5, -.5), new Vector3(.5, .5, .5)) : bounds.clone().applyMatrix4(camera.matrixWorldInverse);
28
+ const pad = extent * .02;
29
+ camera.left = viewBounds.min.x - pad;
30
+ camera.right = viewBounds.max.x + pad;
31
+ camera.bottom = viewBounds.min.y - pad;
32
+ camera.top = viewBounds.max.y + pad;
33
+ camera.near = Math.max(.001, -viewBounds.max.z - pad);
34
+ camera.far = Math.max(camera.near + .1, -viewBounds.min.z + pad);
35
+ camera.updateProjectionMatrix();
36
+ const texel = Math.max(camera.right - camera.left, camera.top - camera.bottom) / SPATIAL_LIGHTING.shadowSize;
37
+ light.castShadow = true;
38
+ light.shadow.mapSize.setScalar(SPATIAL_LIGHTING.shadowSize);
39
+ light.shadow.radius = SPATIAL_LIGHTING.shadowRadius;
40
+ light.shadow.intensity = SPATIAL_LIGHTING.shadowStrength;
41
+ light.shadow.normalBias = texel * 2;
42
+ light.shadow.bias = -texel * 2 / (camera.far - camera.near);
43
+ light.shadow.needsUpdate = true;
44
+ }
45
+ function occlusionTree(triangles) {
46
+ const bounds = new Box3();
47
+ for (const triangle of triangles)
48
+ bounds.union(triangle.bounds);
49
+ if (triangles.length <= 12)
50
+ return { bounds, triangles };
51
+ const size = bounds.getSize(new Vector3()), axis = size.x > size.y && size.x > size.z ? "x" : size.y > size.z ? "y" : "z";
52
+ triangles.sort((a, b) => a.center[axis] - b.center[axis]);
53
+ const middle = Math.floor(triangles.length / 2);
54
+ return { bounds, left: occlusionTree(triangles.slice(0, middle)), right: occlusionTree(triangles.slice(middle)) };
55
+ }
56
+ /** Short hemisphere rays darken nearby contacts, on the same posed skin in both renderers. */
57
+ export function applySpatialContactShading(scene, draft, cached) {
58
+ const meshes = spatialSurfaces(scene), triangles = [];
59
+ const apply = (mesh, colors) => {
60
+ mesh.geometry.setAttribute("color", new Float32BufferAttribute(colors, 3));
61
+ const material = mesh.material;
62
+ material.vertexColors = true;
63
+ material.shadowSide = DoubleSide;
64
+ mesh.castShadow = true;
65
+ mesh.receiveShadow = true;
66
+ };
67
+ if (cached) {
68
+ meshes.forEach((mesh, i) => apply(mesh, cached[i]));
69
+ return cached;
70
+ }
71
+ for (const mesh of meshes) {
72
+ const positions = mesh.geometry.getAttribute("position"), indices = mesh.geometry.index;
73
+ for (let i = 0; i < (indices?.count ?? positions.count); i += 3) {
74
+ const [a, b, c] = [0, 1, 2].map(j => new Vector3().fromBufferAttribute(positions, indices ? indices.getX(i + j) : i + j).applyMatrix4(mesh.matrixWorld));
75
+ triangles.push({ a, b, c, bounds: new Box3().setFromPoints([a, b, c]), center: a.clone().add(b).add(c).multiplyScalar(1 / 3) });
76
+ }
77
+ }
78
+ if (!triangles.length)
79
+ return [];
80
+ const result = [];
81
+ const tree = occlusionTree(triangles), ray = new Ray(), hit = new Vector3();
82
+ const blocked = (node, radius) => {
83
+ if (node.bounds.distanceToPoint(ray.origin) > radius || !ray.intersectsBox(node.bounds))
84
+ return false;
85
+ if (node.triangles)
86
+ return node.triangles.some(t => ray.intersectTriangle(t.a, t.b, t.c, false, hit) !== null && hit.distanceToSquared(ray.origin) < radius * radius);
87
+ return blocked(node.left, radius) || blocked(node.right, radius);
88
+ };
89
+ const point = new Vector3(), normal = new Vector3(), tangent = new Vector3(), bitangent = new Vector3();
90
+ const samples = Array.from({ length: 8 }, (_, i) => { const z = Math.sqrt(1 - (i + .5) / 8), r = Math.sqrt(1 - z * z), angle = i * 2.399963229728653; return [r * Math.cos(angle), r * Math.sin(angle), z]; });
91
+ for (const mesh of meshes) {
92
+ const positions = mesh.geometry.getAttribute("position"), normals = mesh.geometry.getAttribute("normal");
93
+ const normalMatrix = new Matrix3().getNormalMatrix(mesh.matrixWorld);
94
+ const actor = draft.characters.find(c => c.id === mesh.userData.characterId);
95
+ const radius = (actor?.height ?? Math.max(...(draft.objects.find(o => o.id === mesh.userData.objectId)?.size ?? [1]))) * .025;
96
+ const colors = new Float32Array(positions.count * 3);
97
+ for (let i = 0; i < positions.count; i++) {
98
+ point.fromBufferAttribute(positions, i).applyMatrix4(mesh.matrixWorld);
99
+ normal.fromBufferAttribute(normals, i).applyNormalMatrix(normalMatrix);
100
+ tangent.set(Math.abs(normal.y) < .9 ? 0 : 1, Math.abs(normal.y) < .9 ? 1 : 0, 0).cross(normal).normalize();
101
+ bitangent.crossVectors(normal, tangent);
102
+ ray.origin.copy(point).addScaledVector(normal, radius * .025);
103
+ let occluded = 0;
104
+ for (const [x, y, z] of samples) {
105
+ ray.direction.copy(normal).multiplyScalar(z).addScaledVector(tangent, x).addScaledVector(bitangent, y);
106
+ if (blocked(tree, radius))
107
+ occluded++;
108
+ }
109
+ colors.fill(1 - .5 * occluded / samples.length, i * 3, i * 3 + 3);
110
+ }
111
+ apply(mesh, colors);
112
+ result.push(colors);
113
+ }
114
+ return result;
115
+ }
116
+ /** CPU equivalent of the editor's fitted directional shadow map. */
117
+ export function spatialShadowSampler(scene) {
118
+ const light = new DirectionalLight();
119
+ fitSpatialLight(light, scene);
120
+ const camera = light.shadow.camera, size = SPATIAL_LIGHTING.shadowSize;
121
+ const matrix = new Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
122
+ const depths = new Float32Array(size * size).fill(Infinity);
123
+ for (const mesh of spatialSurfaces(scene)) {
124
+ const geometry = mesh.geometry, positions = geometry.getAttribute("position"), indices = geometry.index;
125
+ const transform = matrix.clone().multiply(mesh.matrixWorld);
126
+ for (let i = 0; i < (indices?.count ?? positions.count); i += 3) {
127
+ const p = [0, 1, 2].map(j => new Vector3().fromBufferAttribute(positions, indices ? indices.getX(i + j) : i + j).applyMatrix4(transform));
128
+ for (const v of p) {
129
+ v.x = (v.x + 1) * size / 2;
130
+ v.y = (v.y + 1) * size / 2;
131
+ }
132
+ const [a, b, c] = p, area = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
133
+ if (Math.abs(area) < 1e-9)
134
+ continue;
135
+ const x0 = Math.max(0, Math.floor(Math.min(a.x, b.x, c.x))), x1 = Math.min(size - 1, Math.ceil(Math.max(a.x, b.x, c.x)));
136
+ const y0 = Math.max(0, Math.floor(Math.min(a.y, b.y, c.y))), y1 = Math.min(size - 1, Math.ceil(Math.max(a.y, b.y, c.y)));
137
+ for (let y = y0; y <= y1; y++)
138
+ for (let x = x0; x <= x1; x++) {
139
+ const u = ((b.x - x - .5) * (c.y - y - .5) - (b.y - y - .5) * (c.x - x - .5)) / area;
140
+ const v = ((c.x - x - .5) * (a.y - y - .5) - (c.y - y - .5) * (a.x - x - .5)) / area, w = 1 - u - v;
141
+ if (u < 0 || v < 0 || w < 0)
142
+ continue;
143
+ const index = y * size + x;
144
+ depths[index] = Math.min(depths[index], u * a.z + v * b.z + w * c.z);
145
+ }
146
+ }
147
+ }
148
+ const projected = new Vector3(), viewNormal = new Vector3();
149
+ const normalMatrix = new Matrix3().getNormalMatrix(camera.matrixWorldInverse);
150
+ const bias = -2 * light.shadow.bias;
151
+ return {
152
+ slope(normal) {
153
+ viewNormal.copy(normal).applyNormalMatrix(normalMatrix);
154
+ const z = Math.abs(viewNormal.z) < .001 ? (viewNormal.z < 0 ? -.001 : .001) : viewNormal.z;
155
+ const scale = 2 / ((camera.far - camera.near) * size * z);
156
+ return [viewNormal.x * (camera.right - camera.left) * scale, viewNormal.y * (camera.top - camera.bottom) * scale];
157
+ },
158
+ sample(point, slopeX, slopeY) {
159
+ projected.copy(point).applyMatrix4(matrix);
160
+ const x = (projected.x + 1) * size / 2 - .5, y = (projected.y + 1) * size / 2 - .5;
161
+ const radius = SPATIAL_LIGHTING.shadowRadius * .75;
162
+ let visible = 0;
163
+ for (const [dx, dy] of [[0, 0], [-radius, 0], [radius, 0], [0, -radius], [0, radius]]) {
164
+ const sx = Math.round(x + dx), sy = Math.round(y + dy);
165
+ // Compare at each tap's receiver-plane depth, avoiding stripes on sloped skin.
166
+ const receiver = projected.z + slopeX * (sx - x) + slopeY * (sy - y);
167
+ visible += sx < 0 || sy < 0 || sx >= size || sy >= size || receiver <= depths[sy * size + sx] + bias ? 1 : 0;
168
+ }
169
+ return visible / 5;
170
+ }
171
+ };
172
+ }
173
+ //# sourceMappingURL=lighting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lighting.js","sourceRoot":"","sources":["../../../src/domain/spatial/lighting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Group } from "three";
2
+ import type { SpatialCharacter } from "./types.ts";
3
+ export declare function createCharacterModel(actor: SpatialCharacter, options?: {
4
+ handCreases?: boolean;
5
+ }): Group;