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.
- package/LICENSE +21 -0
- package/README.md +120 -0
- package/assets/quaternius/License_Standard.txt +22 -0
- package/assets/quaternius/README.md +31 -0
- package/assets/quaternius/Superhero_Female_FullBody.bin +0 -0
- package/assets/quaternius/Superhero_Female_FullBody.gltf +2056 -0
- package/assets/quaternius/Superhero_Male_FullBody.bin +0 -0
- package/assets/quaternius/Superhero_Male_FullBody.gltf +2018 -0
- package/dist/cli/integration.d.ts +39 -0
- package/dist/cli/integration.js +466 -0
- package/dist/cli/integration.js.map +1 -0
- package/dist/cli/main.d.ts +17 -0
- package/dist/cli/main.js +1455 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/database/composition-session-repository.d.ts +37 -0
- package/dist/database/composition-session-repository.js +147 -0
- package/dist/database/composition-session-repository.js.map +1 -0
- package/dist/database/draft-version-errors.d.ts +29 -0
- package/dist/database/draft-version-errors.js +47 -0
- package/dist/database/draft-version-errors.js.map +1 -0
- package/dist/database/draft-version-store.d.ts +30 -0
- package/dist/database/draft-version-store.js +168 -0
- package/dist/database/draft-version-store.js.map +1 -0
- package/dist/database/image-asset-repository.d.ts +37 -0
- package/dist/database/image-asset-repository.js +101 -0
- package/dist/database/image-asset-repository.js.map +1 -0
- package/dist/database/image-input.d.ts +15 -0
- package/dist/database/image-input.js +28 -0
- package/dist/database/image-input.js.map +1 -0
- package/dist/database/migrate.d.ts +4 -0
- package/dist/database/migrate.js +45 -0
- package/dist/database/migrate.js.map +1 -0
- package/dist/database/project-session-repository.d.ts +72 -0
- package/dist/database/project-session-repository.js +291 -0
- package/dist/database/project-session-repository.js.map +1 -0
- package/dist/database/spatial-session-repository.d.ts +26 -0
- package/dist/database/spatial-session-repository.js +44 -0
- package/dist/database/spatial-session-repository.js.map +1 -0
- package/dist/database/style-library-repository.d.ts +70 -0
- package/dist/database/style-library-repository.js +290 -0
- package/dist/database/style-library-repository.js.map +1 -0
- package/dist/database/svg-input.d.ts +1 -0
- package/dist/database/svg-input.js +77 -0
- package/dist/database/svg-input.js.map +1 -0
- package/dist/database/ui-sketch-session-repository.d.ts +19 -0
- package/dist/database/ui-sketch-session-repository.js +35 -0
- package/dist/database/ui-sketch-session-repository.js.map +1 -0
- package/dist/domain/canvas-layer-order.d.ts +6 -0
- package/dist/domain/canvas-layer-order.js +40 -0
- package/dist/domain/canvas-layer-order.js.map +1 -0
- package/dist/domain/canvas-node-metadata.d.ts +20 -0
- package/dist/domain/canvas-node-metadata.js +17 -0
- package/dist/domain/canvas-node-metadata.js.map +1 -0
- package/dist/domain/canvas-states.d.ts +8 -0
- package/dist/domain/canvas-states.js +23 -0
- package/dist/domain/canvas-states.js.map +1 -0
- package/dist/domain/composition/analysis.d.ts +104 -0
- package/dist/domain/composition/analysis.js +337 -0
- package/dist/domain/composition/analysis.js.map +1 -0
- package/dist/domain/composition/camera-reference.d.ts +24 -0
- package/dist/domain/composition/camera-reference.js +34 -0
- package/dist/domain/composition/camera-reference.js.map +1 -0
- package/dist/domain/composition/draft.d.ts +50 -0
- package/dist/domain/composition/draft.js +609 -0
- package/dist/domain/composition/draft.js.map +1 -0
- package/dist/domain/composition/frame.d.ts +23 -0
- package/dist/domain/composition/frame.js +154 -0
- package/dist/domain/composition/frame.js.map +1 -0
- package/dist/domain/composition/geometry.d.ts +15 -0
- package/dist/domain/composition/geometry.js +262 -0
- package/dist/domain/composition/geometry.js.map +1 -0
- package/dist/domain/composition/index.d.ts +13 -0
- package/dist/domain/composition/index.js +10 -0
- package/dist/domain/composition/index.js.map +1 -0
- package/dist/domain/composition/layers.d.ts +4 -0
- package/dist/domain/composition/layers.js +12 -0
- package/dist/domain/composition/layers.js.map +1 -0
- package/dist/domain/composition/records.d.ts +14 -0
- package/dist/domain/composition/records.js +2 -0
- package/dist/domain/composition/records.js.map +1 -0
- package/dist/domain/composition/refinement/engine.d.ts +12 -0
- package/dist/domain/composition/refinement/engine.js +521 -0
- package/dist/domain/composition/refinement/engine.js.map +1 -0
- package/dist/domain/composition/refinement/relations.d.ts +16 -0
- package/dist/domain/composition/refinement/relations.js +293 -0
- package/dist/domain/composition/refinement/relations.js.map +1 -0
- package/dist/domain/composition/refinement/types.d.ts +181 -0
- package/dist/domain/composition/refinement/types.js +2 -0
- package/dist/domain/composition/refinement/types.js.map +1 -0
- package/dist/domain/composition/render.d.ts +5 -0
- package/dist/domain/composition/render.js +169 -0
- package/dist/domain/composition/render.js.map +1 -0
- package/dist/domain/composition/states.d.ts +9 -0
- package/dist/domain/composition/states.js +104 -0
- package/dist/domain/composition/states.js.map +1 -0
- package/dist/domain/composition/types.d.ts +149 -0
- package/dist/domain/composition/types.js +2 -0
- package/dist/domain/composition/types.js.map +1 -0
- package/dist/domain/composition/workflow.d.ts +15 -0
- package/dist/domain/composition/workflow.js +77 -0
- package/dist/domain/composition/workflow.js.map +1 -0
- package/dist/domain/fingerprint.d.ts +2 -0
- package/dist/domain/fingerprint.js +25 -0
- package/dist/domain/fingerprint.js.map +1 -0
- package/dist/domain/session/canvas-edit-history.d.ts +17 -0
- package/dist/domain/session/canvas-edit-history.js +53 -0
- package/dist/domain/session/canvas-edit-history.js.map +1 -0
- package/dist/domain/session/capabilities.d.ts +16 -0
- package/dist/domain/session/capabilities.js +84 -0
- package/dist/domain/session/capabilities.js.map +1 -0
- package/dist/domain/session/draft-version.d.ts +41 -0
- package/dist/domain/session/draft-version.js +2 -0
- package/dist/domain/session/draft-version.js.map +1 -0
- package/dist/domain/session/index.d.ts +5 -0
- package/dist/domain/session/index.js +3 -0
- package/dist/domain/session/index.js.map +1 -0
- package/dist/domain/session/types.d.ts +23 -0
- package/dist/domain/session/types.js +2 -0
- package/dist/domain/session/types.js.map +1 -0
- package/dist/domain/spatial/assets/quaternius-female-rig.json +799 -0
- package/dist/domain/spatial/assets/quaternius-rig.json +799 -0
- package/dist/domain/spatial/assets/quaternius-superhero-female.json +1 -0
- package/dist/domain/spatial/assets/quaternius-superhero.json +1 -0
- package/dist/domain/spatial/camera-box.d.ts +13 -0
- package/dist/domain/spatial/camera-box.js +52 -0
- package/dist/domain/spatial/camera-box.js.map +1 -0
- package/dist/domain/spatial/geometric-model.d.ts +4 -0
- package/dist/domain/spatial/geometric-model.js +101 -0
- package/dist/domain/spatial/geometric-model.js.map +1 -0
- package/dist/domain/spatial/hands.d.ts +36 -0
- package/dist/domain/spatial/hands.js +128 -0
- package/dist/domain/spatial/hands.js.map +1 -0
- package/dist/domain/spatial/index.d.ts +30 -0
- package/dist/domain/spatial/index.js +381 -0
- package/dist/domain/spatial/index.js.map +1 -0
- package/dist/domain/spatial/kinematics.d.ts +27 -0
- package/dist/domain/spatial/kinematics.js +285 -0
- package/dist/domain/spatial/kinematics.js.map +1 -0
- package/dist/domain/spatial/lighting.d.ts +35 -0
- package/dist/domain/spatial/lighting.js +173 -0
- package/dist/domain/spatial/lighting.js.map +1 -0
- package/dist/domain/spatial/model.d.ts +5 -0
- package/dist/domain/spatial/model.js +193 -0
- package/dist/domain/spatial/model.js.map +1 -0
- package/dist/domain/spatial/morph.d.ts +3 -0
- package/dist/domain/spatial/morph.js +187 -0
- package/dist/domain/spatial/morph.js.map +1 -0
- package/dist/domain/spatial/proportions.d.ts +46 -0
- package/dist/domain/spatial/proportions.js +59 -0
- package/dist/domain/spatial/proportions.js.map +1 -0
- package/dist/domain/spatial/reference-lines.d.ts +6 -0
- package/dist/domain/spatial/reference-lines.js +58 -0
- package/dist/domain/spatial/reference-lines.js.map +1 -0
- package/dist/domain/spatial/scene-cache.d.ts +15 -0
- package/dist/domain/spatial/scene-cache.js +69 -0
- package/dist/domain/spatial/scene-cache.js.map +1 -0
- package/dist/domain/spatial/scene.d.ts +8 -0
- package/dist/domain/spatial/scene.js +69 -0
- package/dist/domain/spatial/scene.js.map +1 -0
- package/dist/domain/spatial/types.d.ts +187 -0
- package/dist/domain/spatial/types.js +5 -0
- package/dist/domain/spatial/types.js.map +1 -0
- package/dist/domain/style/index.d.ts +1 -0
- package/dist/domain/style/index.js +2 -0
- package/dist/domain/style/index.js.map +1 -0
- package/dist/domain/style/prompt-summary.d.ts +2 -0
- package/dist/domain/style/prompt-summary.js +11 -0
- package/dist/domain/style/prompt-summary.js.map +1 -0
- package/dist/domain/style/types.d.ts +32 -0
- package/dist/domain/style/types.js +3 -0
- package/dist/domain/style/types.js.map +1 -0
- package/dist/domain/ui-sketch/draft.d.ts +12 -0
- package/dist/domain/ui-sketch/draft.js +424 -0
- package/dist/domain/ui-sketch/draft.js.map +1 -0
- package/dist/domain/ui-sketch/geometry.d.ts +7 -0
- package/dist/domain/ui-sketch/geometry.js +11 -0
- package/dist/domain/ui-sketch/geometry.js.map +1 -0
- package/dist/domain/ui-sketch/groups.d.ts +5 -0
- package/dist/domain/ui-sketch/groups.js +40 -0
- package/dist/domain/ui-sketch/groups.js.map +1 -0
- package/dist/domain/ui-sketch/index.d.ts +8 -0
- package/dist/domain/ui-sketch/index.js +8 -0
- package/dist/domain/ui-sketch/index.js.map +1 -0
- package/dist/domain/ui-sketch/layers.d.ts +4 -0
- package/dist/domain/ui-sketch/layers.js +11 -0
- package/dist/domain/ui-sketch/layers.js.map +1 -0
- package/dist/domain/ui-sketch/render.d.ts +2 -0
- package/dist/domain/ui-sketch/render.js +58 -0
- package/dist/domain/ui-sketch/render.js.map +1 -0
- package/dist/domain/ui-sketch/standardize.d.ts +17 -0
- package/dist/domain/ui-sketch/standardize.js +139 -0
- package/dist/domain/ui-sketch/standardize.js.map +1 -0
- package/dist/domain/ui-sketch/states.d.ts +5 -0
- package/dist/domain/ui-sketch/states.js +21 -0
- package/dist/domain/ui-sketch/states.js.map +1 -0
- package/dist/domain/ui-sketch/types.d.ts +73 -0
- package/dist/domain/ui-sketch/types.js +2 -0
- package/dist/domain/ui-sketch/types.js.map +1 -0
- package/dist/server/app.d.ts +18 -0
- package/dist/server/app.js +108 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/image-content-type-parser.d.ts +2 -0
- package/dist/server/image-content-type-parser.js +5 -0
- package/dist/server/image-content-type-parser.js.map +1 -0
- package/dist/server/routes/composition-sessions.d.ts +3 -0
- package/dist/server/routes/composition-sessions.js +190 -0
- package/dist/server/routes/composition-sessions.js.map +1 -0
- package/dist/server/routes/draft-version-routes.d.ts +10 -0
- package/dist/server/routes/draft-version-routes.js +201 -0
- package/dist/server/routes/draft-version-routes.js.map +1 -0
- package/dist/server/routes/image-assets.d.ts +3 -0
- package/dist/server/routes/image-assets.js +114 -0
- package/dist/server/routes/image-assets.js.map +1 -0
- package/dist/server/routes/project-sessions.d.ts +48 -0
- package/dist/server/routes/project-sessions.js +305 -0
- package/dist/server/routes/project-sessions.js.map +1 -0
- package/dist/server/routes/spatial-sessions.d.ts +3 -0
- package/dist/server/routes/spatial-sessions.js +80 -0
- package/dist/server/routes/spatial-sessions.js.map +1 -0
- package/dist/server/routes/style-library.d.ts +3 -0
- package/dist/server/routes/style-library.js +308 -0
- package/dist/server/routes/style-library.js.map +1 -0
- package/dist/server/routes/ui-sketch-sessions.d.ts +3 -0
- package/dist/server/routes/ui-sketch-sessions.js +14 -0
- package/dist/server/routes/ui-sketch-sessions.js.map +1 -0
- package/dist/server/runtime.d.ts +30 -0
- package/dist/server/runtime.js +123 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/spatial-render.d.ts +5 -0
- package/dist/server/spatial-render.js +360 -0
- package/dist/server/spatial-render.js.map +1 -0
- package/dist/server/start.d.ts +1 -0
- package/dist/server/start.js +3 -0
- package/dist/server/start.js.map +1 -0
- package/licenses/THIRD-PARTY-NOTICES.txt +16664 -0
- package/licenses/YisiUI-LICENSE +21 -0
- package/locales/en/common.json +671 -0
- package/migrations/0001_projects_and_sessions.sql +45 -0
- package/migrations/0002_composition_versions_and_refinements.sql +26 -0
- package/migrations/0003_ui_sketch_draft_versions.sql +12 -0
- package/migrations/0004_image_assets.sql +16 -0
- package/migrations/0005_style_library.sql +31 -0
- package/migrations/0006_session_styles.sql +6 -0
- package/migrations/0007_svg_image_assets.sql +19 -0
- package/migrations/0008_spatial_spaces.sql +20 -0
- package/package.json +82 -0
- package/schemas/composition-draft.schema.json +234 -0
- package/schemas/composition-refinement-plan.schema.json +758 -0
- package/schemas/spatial-draft.schema.json +517 -0
- package/schemas/spatial-operations.schema.json +1082 -0
- package/schemas/ui-layout-standardization-plan.schema.json +29 -0
- package/schemas/ui-sketch-draft.schema.json +197 -0
- package/skills/human2ai/SKILL.md +149 -0
- package/skills/human2ai/agents/openai.yaml +3 -0
- package/skills/human2ai/references/composition-projection.md +170 -0
- package/skills/human2ai/references/composition.md +79 -0
- package/skills/human2ai/references/spatial.md +188 -0
- package/skills/human2ai/references/svg-images.md +27 -0
- package/skills/human2ai/references/ui-layout.md +100 -0
- package/web/out/404/index.html +1 -0
- package/web/out/404.html +1 -0
- package/web/out/__next.__PAGE__.txt +26 -0
- package/web/out/__next._full.txt +21 -0
- package/web/out/__next._tree.txt +4 -0
- package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_buildManifest.js +1 -0
- package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_ssgManifest.js +1 -0
- package/web/out/_next/static/chunks/130-9fadd0432daff55d.js +1 -0
- package/web/out/_next/static/chunks/158-eb00456e1bab68b3.js +52 -0
- package/web/out/_next/static/chunks/20-0801fc297cda2a7a.js +1 -0
- package/web/out/_next/static/chunks/248-d4a79649dae2a3f8.js +259 -0
- package/web/out/_next/static/chunks/678-1305cadf8254d814.js +1 -0
- package/web/out/_next/static/chunks/728-eb8b667f79229443.js +1 -0
- package/web/out/_next/static/chunks/83607670-bc1279370476e59f.js +1 -0
- package/web/out/_next/static/chunks/app/_global-error/page-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/app/_not-found/page-c0cd75ac39fbf9cf.js +1 -0
- package/web/out/_next/static/chunks/app/composition/page-051ee2fabb12110a.js +1 -0
- package/web/out/_next/static/chunks/app/layout-745ca27ef8830f4f.js +1 -0
- package/web/out/_next/static/chunks/app/page-0027378a269a6168.js +1 -0
- package/web/out/_next/static/chunks/app/spatial/page-266dedc81784d4f6.js +1 -0
- package/web/out/_next/static/chunks/app/styles/page-d5cb83af828ea9ed.js +1 -0
- package/web/out/_next/static/chunks/app/ui-sketch/page-2a8436e05a05c618.js +1 -0
- package/web/out/_next/static/chunks/c3f2cda1-9e279dab137b7272.js +342 -0
- package/web/out/_next/static/chunks/c7879cf7-7873c8afd9c9c666.js +1 -0
- package/web/out/_next/static/chunks/framework-6eacf80ec1e4c887.js +1 -0
- package/web/out/_next/static/chunks/main-5ee8fd93319f955c.js +5 -0
- package/web/out/_next/static/chunks/main-app-0cf10803ab17c700.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/app-error-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/forbidden-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/global-error-728204b7cccc4ed2.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/not-found-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/unauthorized-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/web/out/_next/static/chunks/webpack-97ae63c0e0b2a512.js +1 -0
- package/web/out/_next/static/css/3b7982b41ed8eccd.css +4 -0
- package/web/out/_next/static/css/81ae71f1d3e9a866.css +1 -0
- package/web/out/_next/static/css/8c3843f4951fa9f6.css +5 -0
- package/web/out/_next/static/css/c739d0131cdcc891.css +1 -0
- package/web/out/_next/static/css/ce1b4bb3ad3c6073.css +1 -0
- package/web/out/_next/static/css/db96ae2e88545d96.css +1 -0
- package/web/out/_not-found/__next._full.txt +18 -0
- package/web/out/_not-found/__next._not-found.__PAGE__.txt +24 -0
- package/web/out/_not-found/__next._tree.txt +3 -0
- package/web/out/_not-found/index.html +1 -0
- package/web/out/_not-found/index.txt +18 -0
- package/web/out/composition/__next._full.txt +25 -0
- package/web/out/composition/__next._tree.txt +6 -0
- package/web/out/composition/__next.composition.__PAGE__.txt +31 -0
- package/web/out/composition/index.html +1 -0
- package/web/out/composition/index.txt +25 -0
- package/web/out/index.html +1 -0
- package/web/out/index.txt +21 -0
- package/web/out/spatial/__next._full.txt +23 -0
- package/web/out/spatial/__next._tree.txt +4 -0
- package/web/out/spatial/__next.spatial.__PAGE__.txt +29 -0
- package/web/out/spatial/index.html +1 -0
- package/web/out/spatial/index.txt +23 -0
- package/web/out/styles/__next._full.txt +23 -0
- package/web/out/styles/__next._tree.txt +4 -0
- package/web/out/styles/__next.styles.__PAGE__.txt +29 -0
- package/web/out/styles/index.html +1 -0
- package/web/out/styles/index.txt +23 -0
- package/web/out/ui-sketch/__next._full.txt +25 -0
- package/web/out/ui-sketch/__next._tree.txt +6 -0
- package/web/out/ui-sketch/__next.ui-sketch.__PAGE__.txt +31 -0
- package/web/out/ui-sketch/index.html +1 -0
- 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,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;
|