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,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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"}
|