human2ai 0.1.3 → 0.1.4
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/README.en.md +36 -4
- package/README.md +36 -4
- package/dist/cli/main.js +26 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/database/style-library-repository.d.ts +14 -1
- package/dist/database/style-library-repository.js +59 -0
- package/dist/database/style-library-repository.js.map +1 -1
- package/dist/domain/composition/analysis.d.ts +3 -0
- package/dist/domain/composition/analysis.js +4 -0
- package/dist/domain/composition/analysis.js.map +1 -1
- package/dist/domain/composition/draft.d.ts +1 -0
- package/dist/domain/composition/draft.js +73 -2
- package/dist/domain/composition/draft.js.map +1 -1
- package/dist/domain/composition/frame.d.ts +1 -0
- package/dist/domain/composition/frame.js +6 -0
- package/dist/domain/composition/frame.js.map +1 -1
- package/dist/domain/composition/index.d.ts +4 -1
- package/dist/domain/composition/index.js +4 -1
- package/dist/domain/composition/index.js.map +1 -1
- package/dist/domain/composition/planning-intersections.d.ts +20 -0
- package/dist/domain/composition/planning-intersections.js +119 -0
- package/dist/domain/composition/planning-intersections.js.map +1 -0
- package/dist/domain/composition/planning.d.ts +25 -0
- package/dist/domain/composition/planning.js +152 -0
- package/dist/domain/composition/planning.js.map +1 -0
- package/dist/domain/composition/render.js +8 -0
- package/dist/domain/composition/render.js.map +1 -1
- package/dist/domain/composition/states.js +4 -1
- package/dist/domain/composition/states.js.map +1 -1
- package/dist/domain/composition/types.d.ts +46 -0
- package/dist/domain/spatial/camera-render-key.d.ts +7 -0
- package/dist/domain/spatial/camera-render-key.js +63 -0
- package/dist/domain/spatial/camera-render-key.js.map +1 -0
- package/dist/domain/spatial/lighting.js +3 -2
- package/dist/domain/spatial/lighting.js.map +1 -1
- package/dist/domain/spatial/model.d.ts +2 -0
- package/dist/domain/spatial/model.js +82 -27
- package/dist/domain/spatial/model.js.map +1 -1
- package/dist/domain/spatial/preview.d.ts +4 -0
- package/dist/domain/spatial/preview.js +23 -0
- package/dist/domain/spatial/preview.js.map +1 -0
- package/dist/domain/spatial/reference-lines.d.ts +12 -3
- package/dist/domain/spatial/reference-lines.js +37 -16
- package/dist/domain/spatial/reference-lines.js.map +1 -1
- package/dist/domain/spatial/render-inputs.d.ts +1 -1
- package/dist/domain/spatial/render-inputs.js +10 -2
- package/dist/domain/spatial/render-inputs.js.map +1 -1
- package/dist/domain/spatial/scene-cache.d.ts +13 -1
- package/dist/domain/spatial/scene-cache.js +88 -10
- package/dist/domain/spatial/scene-cache.js.map +1 -1
- package/dist/domain/spatial/scene-update.d.ts +6 -0
- package/dist/domain/spatial/scene-update.js +52 -0
- package/dist/domain/spatial/scene-update.js.map +1 -0
- package/dist/domain/spatial/scene.d.ts +3 -1
- package/dist/domain/spatial/scene.js +78 -20
- package/dist/domain/spatial/scene.js.map +1 -1
- package/dist/domain/style/model-input.d.ts +3 -0
- package/dist/domain/style/model-input.js +36 -0
- package/dist/domain/style/model-input.js.map +1 -0
- package/dist/domain/style/types.d.ts +7 -0
- package/dist/server/routes/spatial-sessions.js +28 -12
- package/dist/server/routes/spatial-sessions.js.map +1 -1
- package/dist/server/routes/style-library.js +39 -0
- package/dist/server/routes/style-library.js.map +1 -1
- package/dist/server/spatial-render-service.d.ts +21 -0
- package/dist/server/spatial-render-service.js +67 -0
- package/dist/server/spatial-render-service.js.map +1 -0
- package/dist/server/spatial-render-worker.d.ts +1 -0
- package/dist/server/spatial-render-worker.js +15 -0
- package/dist/server/spatial-render-worker.js.map +1 -0
- package/dist/server/spatial-render.d.ts +14 -2
- package/dist/server/spatial-render.js +38 -7
- package/dist/server/spatial-render.js.map +1 -1
- package/locales/en/common.json +60 -4
- package/migrations/0010_style_preview_models.sql +8 -0
- package/package.json +1 -1
- package/schemas/composition-draft.schema.json +457 -0
- package/skills/human2ai/SKILL.md +12 -4
- package/skills/human2ai/references/composition.md +192 -1
- package/skills/human2ai/references/spatial-modeling.md +20 -0
- package/web/out/404/index.html +1 -1
- package/web/out/404.html +1 -1
- package/web/out/__next.__PAGE__.txt +6 -6
- package/web/out/__next._full.txt +6 -6
- package/web/out/__next._tree.txt +3 -3
- package/web/out/_next/static/chunks/101.6ef34adad3e9815b.js +1 -0
- package/web/out/_next/static/chunks/130-7e9e715a084569bb.js +1 -0
- package/web/out/_next/static/chunks/166-96a8c6ae1e9aed59.js +1 -0
- package/web/out/_next/static/chunks/218.7b89674409b344b8.js +1 -0
- package/web/out/_next/static/chunks/484.92b016222d6749f2.js +1 -0
- package/web/out/_next/static/chunks/{773-24ba65074da7fa71.js → 635-611c009924b842be.js} +50 -50
- package/web/out/_next/static/chunks/653-6dfb97fec9a2d91b.js +1 -0
- package/web/out/_next/static/chunks/678-32d3aa1859450d63.js +1 -0
- package/web/out/_next/static/chunks/83607670-fd2f339702a222e4.js +1 -0
- package/web/out/_next/static/chunks/app/_not-found/page-b92817fdc4609975.js +1 -0
- package/web/out/_next/static/chunks/app/composition/page-6c12ee8472715448.js +1 -0
- package/web/out/_next/static/chunks/app/{layout-3b5f82ced220ef42.js → layout-1dd9196cde94389c.js} +1 -1
- package/web/out/_next/static/chunks/app/{page-d41d1cdb1d6ed018.js → page-741ecaf9ee8c3c07.js} +1 -1
- package/web/out/_next/static/chunks/app/spatial/page-5ba0940650df6c7f.js +1 -0
- package/web/out/_next/static/chunks/app/styles/page-1ccfc2c5fbc1e646.js +1 -0
- package/web/out/_next/static/chunks/app/ui-sketch/page-ef4f2e531583e684.js +1 -0
- package/web/out/_next/static/chunks/{c3f2cda1-9e279dab137b7272.js → c3f2cda1-ef85a0897724e46b.js} +1 -1
- package/web/out/_next/static/chunks/{main-app-ec9e35d71481270a.js → main-app-cf37a257d91ce62e.js} +1 -1
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/global-error-33b4f58f02e82215.js +1 -0
- package/web/out/_next/static/chunks/webpack-d16ce1f994e98178.js +1 -0
- package/web/out/_next/static/css/06743b5635914999.css +5 -0
- package/web/out/_next/static/css/0b43ff4a0439c97e.css +1 -0
- package/web/out/_next/static/css/39e8cace36461a15.css +1 -0
- package/web/out/_not-found/__next._full.txt +3 -3
- package/web/out/_not-found/__next._not-found.__PAGE__.txt +3 -3
- package/web/out/_not-found/__next._tree.txt +1 -1
- package/web/out/_not-found/index.html +1 -1
- package/web/out/_not-found/index.txt +3 -3
- package/web/out/composition/__next._full.txt +6 -6
- package/web/out/composition/__next._tree.txt +3 -3
- package/web/out/composition/__next.composition.__PAGE__.txt +6 -6
- package/web/out/composition/index.html +1 -1
- package/web/out/composition/index.txt +6 -6
- package/web/out/index.html +1 -1
- package/web/out/index.txt +6 -6
- package/web/out/spatial/__next._full.txt +6 -6
- package/web/out/spatial/__next._tree.txt +3 -3
- package/web/out/spatial/__next.spatial.__PAGE__.txt +6 -6
- package/web/out/spatial/index.html +1 -1
- package/web/out/spatial/index.txt +6 -6
- package/web/out/styles/__next._full.txt +6 -6
- package/web/out/styles/__next._tree.txt +3 -3
- package/web/out/styles/__next.styles.__PAGE__.txt +6 -6
- package/web/out/styles/index.html +1 -1
- package/web/out/styles/index.txt +6 -6
- package/web/out/ui-sketch/__next._full.txt +6 -6
- package/web/out/ui-sketch/__next._tree.txt +3 -3
- package/web/out/ui-sketch/__next.ui-sketch.__PAGE__.txt +6 -6
- package/web/out/ui-sketch/index.html +1 -1
- package/web/out/ui-sketch/index.txt +6 -6
- package/web/out/_next/static/chunks/130-027b022c82d30077.js +0 -1
- package/web/out/_next/static/chunks/678-6f33e7277564a5df.js +0 -1
- package/web/out/_next/static/chunks/728-7597352c3a7eeaf9.js +0 -1
- package/web/out/_next/static/chunks/83607670-bc1279370476e59f.js +0 -1
- package/web/out/_next/static/chunks/app/_not-found/page-58bf95050b473956.js +0 -1
- package/web/out/_next/static/chunks/app/composition/page-30184e9c21352991.js +0 -1
- package/web/out/_next/static/chunks/app/spatial/page-fc3c66e1f94ed210.js +0 -1
- package/web/out/_next/static/chunks/app/styles/page-194a16109270e08d.js +0 -1
- package/web/out/_next/static/chunks/app/ui-sketch/page-c28eeab67fea766e.js +0 -1
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/global-error-f62e60e5a6e74304.js +0 -1
- package/web/out/_next/static/chunks/webpack-fdd377b620f7ea99.js +0 -1
- package/web/out/_next/static/css/2ed56cbf8f662d23.css +0 -5
- package/web/out/_next/static/css/96839f63fcc5e50d.css +0 -1
- /package/web/out/_next/static/{Wakl9xK54qWYuP4Hpi0W9 → n4UcxqMmr_2CBmSxBp52z}/_buildManifest.js +0 -0
- /package/web/out/_next/static/{Wakl9xK54qWYuP4Hpi0W9 → n4UcxqMmr_2CBmSxBp52z}/_ssgManifest.js +0 -0
|
@@ -15,6 +15,90 @@ Requests such as “把这张图的构图画到画布上”, “按参考图画
|
|
|
15
15
|
|
|
16
16
|
This is full draft authoring. `composition apply` below only refines existing geometry and cannot create the recovered regions. A reference picture does not require a style-library entry or an image node on the canvas.
|
|
17
17
|
|
|
18
|
+
## Design content from composition planning
|
|
19
|
+
|
|
20
|
+
Use this workflow to create or redesign content from focuses and `plans`, and to
|
|
21
|
+
preserve those relationships during style processing, refinement and authorized
|
|
22
|
+
image generation. For a request to edit only the guides, use
|
|
23
|
+
[Shared composition planning](#shared-composition-planning) and leave content alone.
|
|
24
|
+
|
|
25
|
+
Read the latest capture, user notes and all active-state plans, including hidden
|
|
26
|
+
ones, then inspect the rendered composition. Preserve the user's
|
|
27
|
+
`processingSemantic`; ask for Scene or Editorial if it is null. Read planning in
|
|
28
|
+
frame fractions and directions in physical geometry as documented below. Treat
|
|
29
|
+
focus placement, directional flow, visual weight and negative space as distinct
|
|
30
|
+
relationships. Intersections locate crossings; they do not require a subject at
|
|
31
|
+
every crossing, and a radial origin is not automatically a focus or a light source.
|
|
32
|
+
|
|
33
|
+
With complex planning, such as radial fans, spirals or several interacting guides,
|
|
34
|
+
make a compact correspondence before authoring: **plan id / relevant line or
|
|
35
|
+
relationship → visible content that carries it → expected visual effect**.
|
|
36
|
+
Account for every plan's intent, including its interaction with the others; do not
|
|
37
|
+
silently discard an inconvenient direction. Keep this reasoning in the working
|
|
38
|
+
explanation, with node-specific roles in `annotation`, rather than adding schema
|
|
39
|
+
fields or overwriting user notes. User-specified subjects and priorities remain
|
|
40
|
+
constraints. When the subject is open, choose one whose structure can express the
|
|
41
|
+
planned relationships. Resolve material conflicts with the user if their intent
|
|
42
|
+
cannot be retained; do not move their guides to accommodate a convenient subject.
|
|
43
|
+
|
|
44
|
+
Choose nodes by their contribution to the whole: concentrated weight, directional
|
|
45
|
+
extension, repeated rhythm, enclosure or a boundary of negative space. A node may
|
|
46
|
+
combine several objects or cover only part of one. Split it when a distinct
|
|
47
|
+
relationship would otherwise disappear; merge parts that only improve object
|
|
48
|
+
recognition without changing the composition. Do not default to one node per body
|
|
49
|
+
part, object or guide line. Use the coordinate and draft format in
|
|
50
|
+
[Author a complete draft](composition-projection.md#author-a-complete-draft), with
|
|
51
|
+
`origin: "agent"` for new design nodes. Preserve existing identities, notes and
|
|
52
|
+
plans within the requested edit scope. Save through `capture.commands.save`, or
|
|
53
|
+
`style.commands.save` when applying a style; adding content is full draft authoring.
|
|
54
|
+
|
|
55
|
+
### Make radial and other guide relationships visible
|
|
56
|
+
|
|
57
|
+
For each radial plan, read its convergence point and every authored direction
|
|
58
|
+
(`angles` for Free, or directions derived from the Uniform fields). Preserve the
|
|
59
|
+
recognizable center, principal directions and angular spread of the fan through
|
|
60
|
+
actual contours, elongated masses, repeated elements, tonal
|
|
61
|
+
boundaries or gaps. Several rays may be expressed by one coherent fan or sequence;
|
|
62
|
+
one ray may continue across several shapes. There is no requirement for one node
|
|
63
|
+
or a literal straight stroke per ray, or for content to reach every ray's endpoint
|
|
64
|
+
at the frame boundary. Curvature, interruption and overlap are
|
|
65
|
+
acceptable when the overall directional relationship remains legible. For multiple
|
|
66
|
+
radial centers, check each fan and how the fans meet, cross or remain separated.
|
|
67
|
+
Correct focal placement does not satisfy a radial plan whose fan is absent or
|
|
68
|
+
whose visible directions relate to a different center.
|
|
69
|
+
|
|
70
|
+
Apply the same reasoning to other plans: a spiral needs a turning progression
|
|
71
|
+
around its pole; a triangle needs a corresponding arrangement or directional
|
|
72
|
+
envelope; symmetry needs a perceptible relationship across its axis; thirds and
|
|
73
|
+
golden-section guides inform placement and division of mass or space. Combined
|
|
74
|
+
guides must work as one composition. Not every intersection needs content, and
|
|
75
|
+
matching guides does not by itself establish visual quality. Use approximate visual
|
|
76
|
+
correspondence unless the user requests exact alignment; do not invent universal
|
|
77
|
+
angle tolerances or turn guide marks into decorative artwork.
|
|
78
|
+
|
|
79
|
+
### Verify the draft and carry the structure into generation
|
|
80
|
+
|
|
81
|
+
Inspect the saved draft at the original framing before adding detail. Compare it
|
|
82
|
+
with the planning overlay to check origins, directions, extent and relationships,
|
|
83
|
+
then inspect content without the overlay to check whether the intended structure
|
|
84
|
+
is visible on its own. If needed, hide plans in a temporary local inspection copy;
|
|
85
|
+
preserve their saved geometry and visibility. Judge shape, spacing and contrast,
|
|
86
|
+
not only descriptions or metadata. Correct missing relationships before proceeding.
|
|
87
|
+
|
|
88
|
+
For separately authorized generation, carry the correspondence into the prompt
|
|
89
|
+
alongside subject and style: include the relevant guide centers and directions,
|
|
90
|
+
their visible carriers, and the spaces or intersections that should remain open.
|
|
91
|
+
The generation-reference PNG omits planning lines, so attaching it alone cannot
|
|
92
|
+
communicate all planning intent. Keep these relationships explicit in follow-up
|
|
93
|
+
edits, including when changing subject size, pose or focal position.
|
|
94
|
+
|
|
95
|
+
Inspect the generated image against the same relationships at the same framing,
|
|
96
|
+
and also without guides at thumbnail scale. Focal placement and directional
|
|
97
|
+
structure must both work; attractive detail, a correct node count or a successful
|
|
98
|
+
geometry audit cannot substitute for this review. Revise the missing relationship
|
|
99
|
+
within the authorized task. If it cannot be achieved or visually checked, report
|
|
100
|
+
the specific limitation instead of claiming the planned composition is fulfilled.
|
|
101
|
+
|
|
18
102
|
## Apply a session style to the editable canvas
|
|
19
103
|
|
|
20
104
|
Use the style workflow in `SKILL.md` and save a complete draft through `style.commands.save`. This supports proportion changes and new accents. The `composition apply` workflow below remains a separate Agent-directed derivative workflow; explicit ratio and geometry-symmetry rules may resize existing areas, while node identity and content remain intact.
|
|
@@ -49,7 +133,7 @@ Refinement clarifies the user's composition through deliberate, optional relatio
|
|
|
49
133
|
|
|
50
134
|
6. Require `result.audit.passed` and read every final relation check. Then inspect the final image at the same framing as the source. Does the chosen rule actually strengthen the intended attention, balance, space or flow? Has it harmed a more important relationship or made an incidental mark too prominent? Has changed clipping undermined the subject? Technical satisfaction alone does not answer these questions. Revise the independent result when needed and report the observed outcome and tradeoffs; never claim that the numeric audit proves beauty. A `null` before-value means that relationship was undefined on the source (such as a directional axis before a round mass is elongated).
|
|
51
135
|
|
|
52
|
-
7. Open or provide `ui.editUrl`. The independent result appears in **Refined / 精修**, with objective, evidence, preservation intentions, tradeoffs and relation measurements.
|
|
136
|
+
7. Open or provide `ui.editUrl`. The independent result appears in **Refined / 精修**, with objective, evidence, preservation intentions, tradeoffs and relation measurements. Refinement-audit guides are not rendered and have no display toggle; saved composition `plans` have their own visible overlay as described below. The canvas shows the authored composition elements; relation measurements remain in the result explanation. Guide coordinates in audit data are not artwork or generation-reference content. Original captures are not modified or appended by refinement. New user edits make an older result stale. If the source revision changes while working, reconnect and reconcile the new intent before presenting the result as current.
|
|
53
137
|
|
|
54
138
|
### Available relationships
|
|
55
139
|
|
|
@@ -72,6 +156,113 @@ Version 1 plans and stored results remain readable and executable for compatibil
|
|
|
72
156
|
|
|
73
157
|
When downstream image generation is authorized, export the saved run through `composition reference --session <session-id> --run <run-id> --output <reference.png>`. Attach the returned image path as a soft spatial map, not line art, and carry the mode-specific interpretation and required typography into the generation instruction. The CLI preview SVG includes guides and outside content and must not replace that PNG.
|
|
74
158
|
|
|
159
|
+
## Shared composition planning
|
|
160
|
+
|
|
161
|
+
People and Agents edit the same optional `plans` array in a composition draft.
|
|
162
|
+
Read the latest capture, preserve its content and other states, edit `plans`, and
|
|
163
|
+
save the complete draft through `capture.commands.save` with the latest revision.
|
|
164
|
+
Do not use `composition apply` just to change planning: that command creates a
|
|
165
|
+
separate refinement result. Editing a plan must leave all content nodes untouched.
|
|
166
|
+
Only change content when the task separately asks for a layout adjustment.
|
|
167
|
+
|
|
168
|
+
Each plan has a unique `id` within its state (for example `plan-1`), `type`,
|
|
169
|
+
and `visible`. All plans contribute to composition intent, including hidden plans.
|
|
170
|
+
`visible` only controls editor/inspection display. Planning has no individual notes
|
|
171
|
+
or adoption switch; use the draft's overall requirements for user instructions.
|
|
172
|
+
Legacy `enabled` and `note` fields are removed when loading earlier drafts.
|
|
173
|
+
Preserve existing plans unless the task calls for changes.
|
|
174
|
+
|
|
175
|
+
In the editor, Shift-click (or Ctrl/Cmd-click) selects multiple plans. Drag a
|
|
176
|
+
selected guide or use arrow keys to move the selected movable plans together;
|
|
177
|
+
thirds, golden-section and symmetry guides keep their frame-relative positions.
|
|
178
|
+
Thirds and golden-section lines do not intercept canvas clicks; select and edit
|
|
179
|
+
these plans in the sidebar.
|
|
180
|
+
Unselected guides are light gray. The planning header lock disables manual add,
|
|
181
|
+
geometry, per-plan visibility and delete controls, without restricting Agent saves.
|
|
182
|
+
The header also has a master display icon that hides all planning lines and controls
|
|
183
|
+
without changing per-plan `visible` or generation intent; it works while locked.
|
|
184
|
+
Both master display and lock are local editor state, outside the persisted draft.
|
|
185
|
+
|
|
186
|
+
All planning positions are **fractions of the current frame**, measured from its
|
|
187
|
+
top-left. They are not the world-unit positions used by content nodes. Clockwise
|
|
188
|
+
rotation is measured in physical geometry from the rightward horizontal, so it
|
|
189
|
+
stays correct for portrait frames. Supported plan fields are:
|
|
190
|
+
|
|
191
|
+
| `type` | Additional fields |
|
|
192
|
+
| --- | --- |
|
|
193
|
+
| `thirds` | `axes`: `both`, `horizontal` or `vertical`. Equal thirds fixed to the frame. New drafts start with a visible `both` plan; existing drafts are not backfilled. |
|
|
194
|
+
| `golden-section` | `axes: "both" / "horizontal" / "vertical"`; divisions stay attached to the frame. |
|
|
195
|
+
| `symmetry` | `x`, `y` are fixed to `(0.5, 0.5)` on validation. `rotation` snaps to the nearest of eight 45° directions plus the four directions from the frame center to its corners. Corner directions follow the frame aspect ratio, giving twelve positions for non-square frames and eight merged positions for square frames. Pointer and arrow-key controls use the same positions. Only the outer control moves; the center and radius stay fixed. Default 90° is vertical. |
|
|
196
|
+
| `golden-spiral` | `x`, `y` locate the convergence pole; `rotation` aims the outer radius; positive `scale` is that radius divided by the shorter physical frame side; `mirrored` reverses winding. Clicking the center dot toggles winding; dragging it moves the pole, and dragging the outer dot rotates/resizes. Radius grows by φ per outward quarter-turn. |
|
|
197
|
+
| `triangle` | `x`, `y` locate the center; `rotation` is clockwise from the upright triangle; positive `width` and `height` are the unrotated base width / frame width and perpendicular height / frame height. Both legs always have equal physical length. Dragging the apex rotates and adjusts height; dragging a base corner resizes both sides symmetrically. |
|
|
198
|
+
| `radial` | `x`, `y` locate the convergence point. `mode: "uniform"` uses `rotation`, integer `rayCount` (2–36), and `spread` (1–360°); angles are evenly spaced, and a full circle has no repeated terminal ray. `mode: "free"` instead uses `angles`, an array of 2–36 independent clockwise directions in degrees from the rightward horizontal; omit `rotation`, `rayCount` and `spread`, since the count is `angles.length`. Each free ray has its own direction control; the center control moves the entire plan. New radial plans default to uniform with `(0.5, 0.5)`, 0°, 8 rays and 360°. Earlier radial plans without `mode` load as uniform. |
|
|
199
|
+
|
|
200
|
+
Switching radial planning to Free preserves all current directions. Switching back
|
|
201
|
+
to Uniform keeps the convergence point, ray count and first ray direction, then
|
|
202
|
+
uses a 360° spread. Increasing the count in Free adds rays in the largest angular
|
|
203
|
+
gaps without changing existing directions; decreasing it removes trailing entries.
|
|
204
|
+
Drag or nudge a free ray's control to change only that ray's angle. Free directions
|
|
205
|
+
are saved in `plans` and included individually in the generated composition prompt.
|
|
206
|
+
|
|
207
|
+
Example: `{ "id": "plan-1", "type": "golden-spiral",
|
|
208
|
+
"visible": true, "x": 0.618,
|
|
209
|
+
"y": 0.382, "rotation": 135, "scale": 0.65, "mirrored": false }`.
|
|
210
|
+
|
|
211
|
+
`composition inspect` exposes active `plans`; its SVG preview renders visible
|
|
212
|
+
plans using the same geometry as the browser. Planning guides never enter the
|
|
213
|
+
generation-reference PNG. Carry all planning intent into any
|
|
214
|
+
separately authorized generation work using the
|
|
215
|
+
[content correspondence and visual checks](#design-content-from-composition-planning)
|
|
216
|
+
above; do not ask the model to draw the guides.
|
|
217
|
+
Each state owns its complete planning array in `layout.plans`. The top-level
|
|
218
|
+
array is the active state's editable copy and synchronizes on save, like geometry.
|
|
219
|
+
Switching states restores that state's plans; adding/deleting plans affects only
|
|
220
|
+
the current state. Existing drafts without `plans` remain valid.
|
|
221
|
+
Earlier triangle `points` are converted on load by retaining the base and
|
|
222
|
+
projecting the apex onto its perpendicular bisector. Earlier `thirds` plans are
|
|
223
|
+
retained as ordinary planning; there is no separate nine-cell grid overlay.
|
|
224
|
+
|
|
225
|
+
### Read guide intersections
|
|
226
|
+
|
|
227
|
+
Both local and saved-revision `composition inspect` results include
|
|
228
|
+
`planningIntersections`. They are derived from the active state's planning geometry,
|
|
229
|
+
including hidden plans, and contain isolated crossings inside or on the frame.
|
|
230
|
+
The editor's visibility and lock controls do not affect this data. Empty planning
|
|
231
|
+
or no crossings produces an empty array. Crossings within a plan are included,
|
|
232
|
+
such as the four thirds-grid points, triangle vertices and radial convergence.
|
|
233
|
+
Coincident points merge their sources. Continuous overlaps have no unique point
|
|
234
|
+
and are omitted; a third line crossing overlapping lines can still yield a point.
|
|
235
|
+
|
|
236
|
+
Each intersection provides:
|
|
237
|
+
|
|
238
|
+
- `id`: an inspection-local identifier, ordered by physical Y then X. Re-inspect
|
|
239
|
+
after geometry changes; these ids are not persistent anchors.
|
|
240
|
+
- `framePoint`: fractions of the current frame from its top-left, in `[0, 1]`.
|
|
241
|
+
Use this coordinate system for planning positions.
|
|
242
|
+
- `canvasPoint`: signed canvas coordinates in the same units as content-node
|
|
243
|
+
`x` and `y`, ready for requested node placement. These are not preview pixels
|
|
244
|
+
or output pixels; one canvas unit is 1200 physical units horizontally and 800
|
|
245
|
+
vertically. Frame position and size are already accounted for.
|
|
246
|
+
- `sources`: all participating `{ planId, type, lineId, visible }` records.
|
|
247
|
+
Numbering starts at 1. Grid line ids are `vertical-1/2` from left to right and
|
|
248
|
+
`horizontal-1/2` from top to bottom. Symmetry uses `axis`; a spiral uses `spiral`.
|
|
249
|
+
Triangle `edge-1/2/3` follows apex → left base → right base → apex before rotation.
|
|
250
|
+
Radial `ray-1`, `ray-2`, etc. follow uniform generation order or the free `angles`
|
|
251
|
+
array order.
|
|
252
|
+
- `precision.kind`: `exact` for analytical straight-segment intersections, subject
|
|
253
|
+
to floating-point tolerance; `approximate` when a golden spiral participates.
|
|
254
|
+
Spirals use the same 240-segment polyline as the canvas and CLI preview.
|
|
255
|
+
`precision.maxCurveDeviationPx` bounds the curve-to-polyline deviation in output
|
|
256
|
+
pixels (zero for straight lines). It is **not** a bound on intersection-position
|
|
257
|
+
error, which can be larger near a tangent. Coincidence and frame-boundary checks
|
|
258
|
+
use a tolerance of `1e-7` physical canvas units.
|
|
259
|
+
|
|
260
|
+
For a request such as placing a focus at a golden-section/radial crossing, find
|
|
261
|
+
the entry with the requested `planId` and `lineId` sources, copy its `canvasPoint`
|
|
262
|
+
to that focus's `x` and `y`, and save the complete capture against the inspected
|
|
263
|
+
revision. Preserve unrelated content and plans. Do not write these derived facts
|
|
264
|
+
into the draft. This is a one-time placement; later guide edits do not move nodes.
|
|
265
|
+
|
|
75
266
|
## Canvas stacking order
|
|
76
267
|
|
|
77
268
|
Preserve the optional draft-level `layerOrder` array when editing captures. It lists content node ids from back to front, independently of array numbering, geometry, visual weight or scene depth. Without it, the existing type-based draw order applies. Keep ids unique; remove deleted ids and append new ids after the saved order. Browser layer actions preserve selected nodes’ relative order. UI groups move together in this order, which is shared across motion states. Frame boundaries, guides and selection controls are outside the content order. Preview and SVG/PNG output follow this order.
|
|
@@ -35,6 +35,26 @@ draft and the user's request. An unsaved space has no saved revision to inspect;
|
|
|
35
35
|
do not invent guidance or silently create a guide when the task is standalone
|
|
36
36
|
modeling. Export additional views only when they clarify occlusion or geometry.
|
|
37
37
|
|
|
38
|
+
## Save a generated style example
|
|
39
|
+
|
|
40
|
+
When asked for a 3D style preview, generate a fixed model that demonstrates the
|
|
41
|
+
style's forms, joints, palette and materials. Export a self-contained GLB 2.0 to
|
|
42
|
+
ignored `.human2ai-data/output/`, with embedded geometry and textures, no external
|
|
43
|
+
decoder dependencies, and a file size of at most 10 MB. Human2AI stores the model
|
|
44
|
+
and provides a read-only orbit/zoom preview; it does not execute generator code
|
|
45
|
+
or generate geometry from the description when a user opens the style.
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
<runner> style set-model --style <id> --input .human2ai-data/output/style-example.glb --expected-revision <n>
|
|
49
|
+
<runner> style remove-model --style <id> --expected-revision <n>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Each style has at most one model; setting another replaces it. Read the current
|
|
53
|
+
revision with `style list` before writing. `style get` returns its optional
|
|
54
|
+
`previewModel.url` alongside the images and specification. Review the saved model
|
|
55
|
+
in the style detail view. Revisit the example when the specification changes;
|
|
56
|
+
it is reference evidence, not a substitute for the user's spatial layout.
|
|
57
|
+
|
|
38
58
|
## Interpret the inputs
|
|
39
59
|
|
|
40
60
|
- The user's requested content, functions, dimensions, pose constraints and
|
package/web/out/404/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/db96ae2e88545d96.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/3b7982b41ed8eccd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/db96ae2e88545d96.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/3b7982b41ed8eccd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-d16ce1f994e98178.js"/><script src="/_next/static/chunks/c7879cf7-7873c8afd9c9c666.js" async=""></script><script src="/_next/static/chunks/158-eb00456e1bab68b3.js" async=""></script><script src="/_next/static/chunks/main-app-cf37a257d91ce62e.js" async=""></script><script src="/_next/static/chunks/20-0801fc297cda2a7a.js" async=""></script><script src="/_next/static/chunks/678-32d3aa1859450d63.js" async=""></script><script src="/_next/static/chunks/app/layout-1dd9196cde94389c.js" async=""></script><meta name="robots" content="noindex"/><title>以形塑形</title><meta name="description" content="使用基础图形规划画面重心、主体占比与视觉方向。"/><link rel="icon" href="/favicon.ico?8ea2c044dfe599d2" type="image/x-icon" sizes="16x16"/><link rel="icon" href="/icon.svg?e28b017365bd9a4d" type="image/svg+xml" sizes="any"/><title>404: This page could not be found.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-d16ce1f994e98178.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[84954,[\"20\",\"static/chunks/20-0801fc297cda2a7a.js\",\"678\",\"static/chunks/678-32d3aa1859450d63.js\",\"177\",\"static/chunks/app/layout-1dd9196cde94389c.js\"],\"AppI18nProvider\"]\n3:I[91133,[],\"\"]\n4:I[4297,[],\"\"]\n5:I[66999,[\"20\",\"static/chunks/20-0801fc297cda2a7a.js\",\"678\",\"static/chunks/678-32d3aa1859450d63.js\",\"177\",\"static/chunks/app/layout-1dd9196cde94389c.js\"],\"YisiUiInspectorHost\"]\n6:I[31872,[],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\na:I[31872,[],\"ViewportBoundary\"]\nc:I[31872,[],\"MetadataBoundary\"]\ne:I[57567,[],\"default\",1]\n:HL[\"/_next/static/css/db96ae2e88545d96.css\",\"style\"]\n:HL[\"/_next/static/css/3b7982b41ed8eccd.css\",\"style\"]\n9:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/db96ae2e88545d96.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/3b7982b41ed8eccd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L5\",null,{}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,null]},null,false,\"$9\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Ld\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"n4UcxqMmr_2CBmSxBp52z\"}\n9:C\nb:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nf:I[12569,[],\"IconMark\"]\n8:null\nd:[[\"$\",\"title\",\"0\",{\"children\":\"以形塑形\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"使用基础图形规划画面重心、主体占比与视觉方向。\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?8ea2c044dfe599d2\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/icon.svg?e28b017365bd9a4d\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$Lf\",\"4\",{}]]\n"])</script></body></html>
|
package/web/out/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/db96ae2e88545d96.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/3b7982b41ed8eccd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/db96ae2e88545d96.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/3b7982b41ed8eccd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-d16ce1f994e98178.js"/><script src="/_next/static/chunks/c7879cf7-7873c8afd9c9c666.js" async=""></script><script src="/_next/static/chunks/158-eb00456e1bab68b3.js" async=""></script><script src="/_next/static/chunks/main-app-cf37a257d91ce62e.js" async=""></script><script src="/_next/static/chunks/20-0801fc297cda2a7a.js" async=""></script><script src="/_next/static/chunks/678-32d3aa1859450d63.js" async=""></script><script src="/_next/static/chunks/app/layout-1dd9196cde94389c.js" async=""></script><meta name="robots" content="noindex"/><title>以形塑形</title><meta name="description" content="使用基础图形规划画面重心、主体占比与视觉方向。"/><link rel="icon" href="/favicon.ico?8ea2c044dfe599d2" type="image/x-icon" sizes="16x16"/><link rel="icon" href="/icon.svg?e28b017365bd9a4d" type="image/svg+xml" sizes="any"/><title>404: This page could not be found.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-d16ce1f994e98178.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[84954,[\"20\",\"static/chunks/20-0801fc297cda2a7a.js\",\"678\",\"static/chunks/678-32d3aa1859450d63.js\",\"177\",\"static/chunks/app/layout-1dd9196cde94389c.js\"],\"AppI18nProvider\"]\n3:I[91133,[],\"\"]\n4:I[4297,[],\"\"]\n5:I[66999,[\"20\",\"static/chunks/20-0801fc297cda2a7a.js\",\"678\",\"static/chunks/678-32d3aa1859450d63.js\",\"177\",\"static/chunks/app/layout-1dd9196cde94389c.js\"],\"YisiUiInspectorHost\"]\n6:I[31872,[],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\na:I[31872,[],\"ViewportBoundary\"]\nc:I[31872,[],\"MetadataBoundary\"]\ne:I[57567,[],\"default\",1]\n:HL[\"/_next/static/css/db96ae2e88545d96.css\",\"style\"]\n:HL[\"/_next/static/css/3b7982b41ed8eccd.css\",\"style\"]\n9:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/db96ae2e88545d96.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/3b7982b41ed8eccd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L5\",null,{}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,null]},null,false,\"$9\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Ld\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"n4UcxqMmr_2CBmSxBp52z\"}\n9:C\nb:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\nf:I[12569,[],\"IconMark\"]\n8:null\nd:[[\"$\",\"title\",\"0\",{\"children\":\"以形塑形\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"使用基础图形规划画面重心、主体占比与视觉方向。\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?8ea2c044dfe599d2\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/icon.svg?e28b017365bd9a4d\",\"type\":\"image/svg+xml\",\"sizes\":\"any\"}],[\"$\",\"$Lf\",\"4\",{}]]\n"])</script></body></html>
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[1076,[],"ClientPageRoot"]
|
|
3
|
-
3:I[49,["460","static/chunks/83607670-
|
|
3
|
+
3:I[49,["460","static/chunks/83607670-fd2f339702a222e4.js","746","static/chunks/c3f2cda1-ef85a0897724e46b.js","20","static/chunks/20-0801fc297cda2a7a.js","635","static/chunks/635-611c009924b842be.js","653","static/chunks/653-6dfb97fec9a2d91b.js","678","static/chunks/678-32d3aa1859450d63.js","130","static/chunks/130-7e9e715a084569bb.js","974","static/chunks/app/page-741ecaf9ee8c3c07.js"],"default"]
|
|
4
4
|
6:I[31872,[],"OutletBoundary"]
|
|
5
5
|
7:"$Sreact.suspense"
|
|
6
6
|
b:I[31872,[],"ViewportBoundary"]
|
|
7
7
|
c:I[31872,[],"MetadataBoundary"]
|
|
8
8
|
d:I[12569,[],"IconMark"]
|
|
9
|
-
f:I[84954,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-
|
|
9
|
+
f:I[84954,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-32d3aa1859450d63.js","177","static/chunks/app/layout-1dd9196cde94389c.js"],"AppI18nProvider"]
|
|
10
10
|
10:I[91133,[],""]
|
|
11
11
|
11:I[4297,[],""]
|
|
12
|
-
12:I[66999,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-
|
|
13
|
-
:HL["/_next/static/css/
|
|
14
|
-
:HL["/_next/static/css/
|
|
12
|
+
12:I[66999,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-32d3aa1859450d63.js","177","static/chunks/app/layout-1dd9196cde94389c.js"],"YisiUiInspectorHost"]
|
|
13
|
+
:HL["/_next/static/css/06743b5635914999.css","style"]
|
|
14
|
+
:HL["/_next/static/css/39e8cace36461a15.css","style"]
|
|
15
15
|
:HL["/_next/static/css/1f8501a43042a5a2.css","style"]
|
|
16
16
|
:HL["/_next/static/css/db96ae2e88545d96.css","style"]
|
|
17
17
|
:HL["/_next/static/css/3b7982b41ed8eccd.css","style"]
|
|
18
18
|
a:X
|
|
19
|
-
0:{"buildId":"
|
|
19
|
+
0:{"buildId":"n4UcxqMmr_2CBmSxBp52z","data":[{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/06743b5635914999.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/39e8cace36461a15.css","precedence":"next"}],["$","link","2",{"rel":"stylesheet","href":"/_next/static/css/1f8501a43042a5a2.css","precedence":"next"}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":"$@9","staleTime":"$a","varyParams":null},{"rsc":["$","$1","h",{"children":[null,["$","$Lb",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$Lc",null,{"children":["$","$7",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"以形塑形"}],["$","meta","1",{"name":"description","content":"使用基础图形规划画面重心、主体占比与视觉方向。"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?8ea2c044dfe599d2","type":"image/x-icon","sizes":"16x16"}],["$","link","3",{"rel":"icon","href":"/icon.svg?e28b017365bd9a4d","type":"image/svg+xml","sizes":"any"}],["$","$Ld","4",{}]]}]}]}],null]}],"isPartial":"$@e","staleTime":"$a","varyParams":null},{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/db96ae2e88545d96.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/3b7982b41ed8eccd.css","precedence":"next"}]],["$","html",null,{"lang":"zh-CN","children":["$","body",null,{"children":[["$","$Lf",null,{"children":["$","$L10",null,{"parallelRouterKey":"children","template":["$","$L11",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}],["$","$L12",null,{}]]}]}]]}],"isPartial":"$@13","staleTime":"$a","varyParams":null}],"isUpgradeableISRFallback":false,"a":"$@14","rootVaryParams":null,"needsRuntimeRequest":"$@15"}
|
|
20
20
|
4:{}
|
|
21
21
|
5:"$0:data:0:rsc:props:children:0:props:serverProvidedParams:params"
|
|
22
22
|
8:null
|
package/web/out/__next._full.txt
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[84954,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-
|
|
2
|
+
2:I[84954,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-32d3aa1859450d63.js","177","static/chunks/app/layout-1dd9196cde94389c.js"],"AppI18nProvider"]
|
|
3
3
|
3:I[91133,[],""]
|
|
4
4
|
4:I[4297,[],""]
|
|
5
|
-
5:I[66999,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-
|
|
5
|
+
5:I[66999,["20","static/chunks/20-0801fc297cda2a7a.js","678","static/chunks/678-32d3aa1859450d63.js","177","static/chunks/app/layout-1dd9196cde94389c.js"],"YisiUiInspectorHost"]
|
|
6
6
|
6:I[1076,[],"ClientPageRoot"]
|
|
7
|
-
7:I[49,["460","static/chunks/83607670-
|
|
7
|
+
7:I[49,["460","static/chunks/83607670-fd2f339702a222e4.js","746","static/chunks/c3f2cda1-ef85a0897724e46b.js","20","static/chunks/20-0801fc297cda2a7a.js","635","static/chunks/635-611c009924b842be.js","653","static/chunks/653-6dfb97fec9a2d91b.js","678","static/chunks/678-32d3aa1859450d63.js","130","static/chunks/130-7e9e715a084569bb.js","974","static/chunks/app/page-741ecaf9ee8c3c07.js"],"default"]
|
|
8
8
|
a:I[31872,[],"OutletBoundary"]
|
|
9
9
|
b:"$Sreact.suspense"
|
|
10
10
|
d:I[31872,[],"ViewportBoundary"]
|
|
@@ -12,10 +12,10 @@ f:I[31872,[],"MetadataBoundary"]
|
|
|
12
12
|
11:I[57567,[],"default",1]
|
|
13
13
|
:HL["/_next/static/css/db96ae2e88545d96.css","style"]
|
|
14
14
|
:HL["/_next/static/css/3b7982b41ed8eccd.css","style"]
|
|
15
|
-
:HL["/_next/static/css/
|
|
16
|
-
:HL["/_next/static/css/
|
|
15
|
+
:HL["/_next/static/css/06743b5635914999.css","style"]
|
|
16
|
+
:HL["/_next/static/css/39e8cace36461a15.css","style"]
|
|
17
17
|
:HL["/_next/static/css/1f8501a43042a5a2.css","style"]
|
|
18
|
-
0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/db96ae2e88545d96.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/3b7982b41ed8eccd.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"zh-CN","children":["$","body",null,{"children":[["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L5",null,{}]]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L6",null,{"Component":"$7","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@8","$@9"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/
|
|
18
|
+
0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/db96ae2e88545d96.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/3b7982b41ed8eccd.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"zh-CN","children":["$","body",null,{"children":[["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L5",null,{}]]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L6",null,{"Component":"$7","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@8","$@9"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/06743b5635914999.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/39e8cace36461a15.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","2",{"rel":"stylesheet","href":"/_next/static/css/1f8501a43042a5a2.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","$La",null,{"children":["$","$b",null,{"name":"Next.MetadataOutlet","children":"$@c"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$b",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"n4UcxqMmr_2CBmSxBp52z"}
|
|
19
19
|
8:{}
|
|
20
20
|
9:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
|
|
21
21
|
e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
package/web/out/__next._tree.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
:HL["/_next/static/css/db96ae2e88545d96.css","style"]
|
|
2
2
|
:HL["/_next/static/css/3b7982b41ed8eccd.css","style"]
|
|
3
|
-
:HL["/_next/static/css/
|
|
4
|
-
:HL["/_next/static/css/
|
|
3
|
+
:HL["/_next/static/css/06743b5635914999.css","style"]
|
|
4
|
+
:HL["/_next/static/css/39e8cace36461a15.css","style"]
|
|
5
5
|
:HL["/_next/static/css/1f8501a43042a5a2.css","style"]
|
|
6
|
-
0:{"tree":{"name":"","param":null,"prefetchHints":4176,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":4256,"slots":null}}},"staleTime":300,"buildId":"
|
|
6
|
+
0:{"tree":{"name":"","param":null,"prefetchHints":4176,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":4256,"slots":null}}},"staleTime":300,"buildId":"n4UcxqMmr_2CBmSxBp52z"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{var e,t,n,o,r,i,a={12399:(e,t,n)=>{"use strict";n.d(t,{b5:()=>f,i1:()=>d,ms:()=>h,p:()=>c});var o=n(84910),r=n(54996),i=n(29169),a=n(2872),s=n(79283);let l=Math.PI/180,d=e=>new o.Pq0(...e),f=e=>new o.PTz().setFromEuler(new o.O9p(...e.map(e=>e*l),"XYZ"));function c(e,t){let n=d(t.offset),o=e.bones.find(e=>e.endJointId===t.id)?.modelPart;if(o&&(0,i.dS)(o)){let n=e.bones.find(e=>e.endJointId===t.id),o=(0,i.oT)(e,n);if(o)return(0,i.xT)(e,t,o)}let l=(0,r.G_)(e.headRatio);if(o&&(["spine","chest","neck"].includes(o)||/-(shoulder|hip)$/.test(o))){let t=6*(0,r.UB)(l,o)*e.headRatio/(7*(e.headRatio-1));n.x*=t;let i=6*l.torsoDepth*e.headRatio/(7*(e.headRatio-1));n.z*=1+(i-1)*(1-l.softness)}let f=e.neckLength??1;if("neck"===o&&n.multiplyScalar(l.neck*f),"spine"===o||"chest"===o){let t=e.joints.find(e=>"neck"===e.id);t&&(n.y+=t.offset[1]*(1-l.neck)/2,n.z+=t.offset[2]*(1-l.neck)*l.torsoDepth*6*e.headRatio/(7*(e.headRatio-1))/2*(1-l.softness))}o&&/-(elbow|wrist)$/.test(o)&&n.multiplyScalar(l.armLength),o?.endsWith("-hand")&&n.multiplyScalar(l.handLength*(e.palmSize??1));let c=(0,r.kF)(e.footSize);if(o?.endsWith("-ankle")&&1!==c){let o=e.bones.find(e=>e.startJointId===t.id&&e.modelPart.endsWith("-foot"));if(o){let t="female"===e.bodyType?s:a,r=t.parts.find(e=>e.id===o.modelPart),i=d(e.joints.find(e=>e.id===o.endJointId).offset).length()/d(r.end).sub(d(r.start)).length();n.y+=(r.start[1]-t.bottom)*i*(c-1)}}return o?.endsWith("-foot")&&(n.x*=e.footSize??1,n.y*=c,n.z*=l.footLength*(e.footSize??1)),n}function h(e,t){let n=Object.create(null),r=new Map(e.joints.map(e=>[e.id,e])),a=new Map(e.bones.map(e=>[e.endJointId,e])),s=new Set,l=h=>{if(n[h])return n[h];if(s.has(h))throw Error("SPATIAL_INVALID: cyclic skeleton");s.add(h);let p=r.get(h);if(!p)throw Error("SPATIAL_INVALID: missing parent joint");let m=p.parentId?l(p.parentId):{position:d(e.position),rotation:f(e.rotation)},u=a.get(h),g=t?.[h].basis,w=u?g?g.clone().multiply(f(u.rotation)).multiply(g.clone().invert()):function(e,t,n=t.rotation){let o=(0,i.IA)(e,t);return o.clone().multiply(f(n)).multiply(o.invert())}(e,u):new o.PTz,y=m.rotation.clone().multiply(w).normalize(),b=(t?.[h].offset.clone()??c(e,p)).applyQuaternion(y).add(m.position);return s.delete(h),n[h]={position:b,rotation:y}};return e.joints.forEach(e=>l(e.id)),n}},13101:(e,t,n)=>{"use strict";var o=n(84910),r=n(5105),i=n(52798),a=n(12399),s=n(54996),l=n(18989),d=n(29169),f=n(17340),c=n(77902);let h=new o.Pq0(0,1,0),p=Object.fromEntries(Object.entries({male:r,female:i}).map(([e,t])=>{let n=t.parts.map(e=>{let t=new o.Pq0(...e.start),n=new o.Pq0(...e.end).sub(t);return{length:n.length(),inverse:new o.kn4().compose(t,new o.PTz().setFromUnitVectors(h,n.normalize()),new o.Pq0(1,1,1)).invert()}}),r=t.modules.map(e=>{let n=[...new Set(e.indices)],o=new Map(n.map((e,t)=>[e,t]));return{...e,vertices:n,indices:e.indices.map(e=>o.get(e)),normalKeys:n.map(e=>t.positions.slice(3*e,3*e+3).join(","))}});return[e,{asset:t,modules:r,targets:(0,l.F)(t),sourceFrames:n,sourceBodyHeight:t.height-n[t.parts.findIndex(e=>"head"===e.id)].length}]})),m=new WeakMap,u=e=>"joint"===e?new o.Gu$(1,12,8):new o.Ho_(1,1,1,10);function g(e){e.traverse(e=>{if(e instanceof o.eaF||e instanceof o.DXC)for(let t of(e instanceof o.ZLX&&e.dispose(),e.geometry.dispose(),Array.isArray(e.material)?e.material:[e.material]))t.dispose()})}let w=globalThis;w.onmessage=({data:e})=>{let t=function(e,t={}){let n=new o.YJl,r=(e,t,r,i,a,s=new o.Pq0(1,1,1))=>{let l=new o.eaF(e,new o.G_z({color:new o.Q1f(t),side:o.$EB}));return l.position.copy(r),l.quaternion.copy(i),l.scale.copy(s),l.userData=a,n.add(l),l};for(let r of e.characters)n.add(function(e,t={}){if("geometric"===e.appearance)return(0,c.s)(e);let n=new o.YJl,r={key:JSON.stringify([e.id,e.appearance,e.bodyType??"male",e.bones.map(e=>[e.id,e.modelPart])]),handCreases:t.handCreases??!0,parts:[]};return m.set(n,r),function(e,t,n){let r,i=n.handCreases,l=n.headRatio!==e.headRatio,{asset:c,modules:m,targets:u,sourceFrames:g,sourceBodyHeight:w}=p[e.bodyType??"male"],y=(0,a.ms)(e),b=e.height/c.height,P=(0,s.G_)(e.headRatio),[z,k,q]=(0,s.r8)(e.headRatio),x=new Map,I=[],v=(t,n)=>{let r,i=`${t?.id??"root"}/${n}`;if(x.has(i))return x.get(i);let l=g[n],f=c.parts[n],p=b*(0,s.UB)(P,f.id)*(f.id.endsWith("-hand")?e.palmSize??1:1),m=t?y[t.startJointId].position:(0,a.i1)(e.position),u=e.joints.find(e=>e.id===(t?.endJointId??"spine")),z=u?(0,a.p)(e,u):new o.Pq0(0,l.length*b,0),k=f.id.endsWith("-foot")?e.footSize??1:1,q=(0,s.kF)(k);z.x/=k,z.y/=q,z.z/=k;let I=z.length()/l.length,v="head"===f.id?I:p,S=t?y[t.endJointId].rotation.clone():(0,a.b5)(e.rotation),T=t&&(0,d.dS)(f.id)?(0,d.oT)(e,t):void 0;if(T)r=new o.kn4().compose(m,S,new o.Pq0(1,1,1)).multiply((0,d.PA)(e,T,f.id)).multiply(new o.kn4().makeTranslation(-f.start[0],-f.start[1],-f.start[2]));else if(["pelvis","spine","chest","neck"].includes(f.id)||/-(shoulder|hip)$/.test(f.id)){let t=(0,a.i1)(f.end).sub((0,a.i1)(f.start)),n=Math.abs(t.y)>1e-4?z.y/t.y:(e.height-e.height/e.headRatio)/w,i=new o.Pq0(p,n,b*P.torsoDepth),s=S.clone().multiply(new o.PTz().setFromUnitVectors(t.clone().multiply(i).normalize(),z.clone().normalize())),l=new o.kn4().makeTranslation(-f.start[0],-f.start[1],-f.start[2]);r=new o.kn4().compose(m,s,i).multiply(l);let d=u&&(0,a.i1)(u.offset).normalize().dot(t.clone().normalize())>1-1e-6;if(P.softness>0&&d&&["pelvis","spine","chest","neck"].includes(f.id)){let e=new o.kn4().set(i.x,(z.x-t.x*i.x)/t.y,0,0,0,i.y,0,0,0,(z.z-t.z*i.z)/t.y,i.z,0,0,0,0,1),n=new o.kn4().compose(m,S,new o.Pq0(1,1,1)).multiply(e).multiply(l);r.elements.forEach((e,t)=>{r.elements[t]=e+(n.elements[t]-e)*P.softness})}}else{let e=S.clone().multiply(new o.PTz().setFromUnitVectors(h,z.clone().normalize()));if(r=new o.kn4().compose(m,e,new o.Pq0(v,I,"head"===f.id?v*P.headDepth:v)).multiply(l.inverse),f.id.endsWith("-foot")&&P.softness>0){let e=(0,a.i1)(f.end).sub((0,a.i1)(f.start)),t=new o.Pq0(p,z.y/e.y,z.z/e.z);S.multiply(new o.PTz().setFromUnitVectors(e.multiply(t).normalize(),z.clone().normalize()));let n=new o.kn4().compose(m,S,t).multiply(new o.kn4().makeTranslation(-f.start[0],-f.start[1],-f.start[2]));r.elements.forEach((e,t)=>{r.elements[t]=e+(n.elements[t]-e)*P.softness})}}if(1!==k){let n=new o.kn4().compose(m,t?y[t.endJointId].rotation:(0,a.b5)(e.rotation),new o.Pq0(1,1,1));r.premultiply(n.clone().multiply(new o.kn4().makeScale(k,q,k)).multiply(n.invert()))}return x.set(i,r),r},S=new Map(e.bones.filter(e=>e.id===e.modelPart).map(e=>[e.modelPart,e])),T=0,A=[],D=(t,a)=>{let s=a&&a.id.endsWith(a.modelPart)?a.id.slice(0,-a.modelPart.length):"",d=!!(a&&a.id!==a.modelPart),h=!d&&r?r:c.parts.map((n,o)=>{let r=d?e.bones.find(e=>e.id===`${s}${n.id}`):S.get(n.id);return r?v(r,o):d&&a?v(a,t.part):v(void 0,o)});d||(r=h);let{vertices:p}=t,m=n.parts[T++];if(!m){let r=new o.LoY().setAttribute("position",new o.qtW(3*p.length,3));r.setIndex(t.indices);let i=new o.eaF(r,new o.G_z({side:o.$EB}));i.userData={characterId:e.id,...a?{boneId:a.id}:{},modelPart:c.parts[t.part].id},m={mesh:i,rest:new Float64Array(3*p.length),posed:new Float64Array(3*p.length),segments:[]},n.parts.push(m)}let{mesh:g,rest:w,posed:y}=m,b=g.geometry,x=new o.Pq0,D=new o.Pq0,j=new o.Pq0;for(let e=0;e<p.length;e++){let t=p[e],n=3*t,o=u[z],r=u[k];l&&(w[3*e]=o[n]+(r[n]-o[n])*q,w[3*e+1]=o[n+1]+(r[n+1]-o[n+1])*q,w[3*e+2]=o[n+2]+(r[n+2]-o[n+2])*q),j.fromArray(w,3*e),x.set(0,0,0);let i=0;for(let e=0;e<4;e++){let n=c.weights[4*t+e];n&&(D.copy(j).applyMatrix4(h[c.influences[4*t+e]]),x.addScaledVector(D,n),i+=n)}x.divideScalar(i),y[3*e]=x.x,y[3*e+1]=x.y,y[3*e+2]=x.z}let M=b.getAttribute("position");M.array.set(y),M.needsUpdate=!0,b.boundingBox=null,b.boundingSphere=null,b.computeVertexNormals(),"body"===t.material&&P.softness>0&&I.push({geometry:b,keys:t.normalKeys.map(e=>`${s}/${e}`)});let L=new o.Q1f("brows"===t.material?"#514235":"eyes"===t.material?"#e7ded1":e.color),F=(z<2?1-q:0)+(k<2?q:0);if("brows"===t.material&&L.lerp(new o.Q1f(e.color),.9*F),"eyes"===t.material&&L.lerp(new o.Q1f("#514235"),F),g.material.color.copy(L),A.push(g),i){l&&(m.segments=(0,f.xQ)(e,c.parts[t.part].id,w,t.indices));let n=(0,f.HK)(e,m.segments,y,m.creases);!n&&m.creases&&(m.creases.geometry.dispose(),m.creases.material.dispose(),m.creases=void 0,g.material.polygonOffset=!1),n&&(g.material.polygonOffset=!0,g.material.polygonOffsetFactor=1,g.material.polygonOffsetUnits=1,n.userData={...g.userData,reference:"finger-crease"},A.push(n),m.creases=n)}};for(let t of m){let n=c.parts[t.part].id;if("pelvis"===n)D(t);else for(let o of e.bones.filter(e=>e.modelPart===n))D(t,o)}let j=new Map,M=new o.Pq0,L=new o.Pq0,F=new o.Pq0;for(let{geometry:e,keys:t}of I){let n=e.getAttribute("position"),r=e.index;for(let e=0;e<r.count;e+=3){let i=[r.getX(e),r.getX(e+1),r.getX(e+2)];M.fromBufferAttribute(n,i[0]),L.fromBufferAttribute(n,i[1]),F.fromBufferAttribute(n,i[2]);let a=L.sub(M).cross(F.sub(M));for(let e of i){let n=t[e];j.has(n)||j.set(n,new o.Pq0),j.get(n).add(a)}}}for(let e of j.values())e.normalize();for(let{geometry:e,keys:t}of I){let n=e.getAttribute("normal");t.forEach((e,t)=>{M.fromBufferAttribute(n,t).lerp(j.get(e),P.softness).normalize(),n.setXYZ(t,M.x,M.y,M.z)})}(t.children.length!==A.length||A.some((e,n)=>t.children[n]!==e))&&(t.clear(),A.length&&t.add(...A)),n.headRatio=e.headRatio}(e,n,r),n}(r,t)),t.showRig&&"geometric"!==r.appearance&&function(e,t,n=!1){let r=function(e){let t=(0,a.ms)(e),n=[];for(let r of e.joints.filter(t=>!t.terminal||!!(0,d.dS)(e.bones.find(e=>e.endJointId===t.id)?.modelPart??"")))n.push({data:{characterId:e.id,rig:"joint",jointId:r.id},position:t[r.id].position,rotation:t[r.id].rotation,scale:new o.Pq0().setScalar(r.radius)});for(let r of e.bones){let i=(0,d.dS)(r.modelPart);if(i?.segment===0)continue;let a=t[r.startJointId].position,s=t[r.endJointId].position,l=s.clone().sub(a),f=l.length(),c=e.height*(i?.0018:.009);n.push({data:{characterId:e.id,rig:"bone",boneId:r.id},position:a.clone().add(s).multiplyScalar(.5),rotation:new o.PTz().setFromUnitVectors(new o.Pq0(0,1,0),l.normalize()),scale:new o.Pq0(c,f,c)})}return n}(t);if(n){let n=new o.kn4;for(let i of["joint","bone"]){let a=r.filter(e=>e.data.rig===i),s=e.children.find(e=>e instanceof o.ZLX&&e.userData.characterId===t.id&&e.userData.rig===i);s&&s.count!==a.length&&(e.remove(s),g(new o.YJl().add(s)),s=void 0),s||((s=new o.ZLX(u(i),new o.G_z({side:o.$EB,depthTest:!1}),a.length)).renderOrder=2,e.add(s)),s.userData={characterId:t.id,rig:i,instances:a.map(e=>e.data)};let l=new o.Q1f("joint"===i?"#e6a65c":"#728aa1");a.forEach((e,t)=>{s.setMatrixAt(t,n.compose(e.position,e.rotation,e.scale)),s.setColorAt(t,l)}),s.instanceMatrix.needsUpdate=!0,s.instanceColor&&(s.instanceColor.needsUpdate=!0),s.computeBoundingSphere()}return}let i=new Map(e.children.filter(e=>e.userData.rig&&e.userData.characterId===t.id).map(e=>[`${e.userData.rig}/${e.userData.jointId??e.userData.boneId}`,e])),s=(n,r)=>{let a=`${n}/${r}`,s=i.get(a);return i.delete(a),s||((s=new o.eaF(u(n),new o.G_z({side:o.$EB,depthTest:!1}))).userData={characterId:t.id,rig:n,["joint"===n?"jointId":"boneId"]:r},s.renderOrder=2,e.add(s)),s.material.color.set("joint"===n?"#e6a65c":"#728aa1"),s};for(let e of r){let t=s(e.data.rig,e.data.jointId??e.data.boneId);t.position.copy(e.position),t.quaternion.copy(e.rotation),t.scale.copy(e.scale)}for(let t of i.values())e.remove(t),t.geometry.dispose(),t.material.dispose()}(n,r);for(let t of e.objects){let e=(0,a.i1)(t.size),n="sphere"===t.kind?new o.Gu$(.5,16,12):new o.iNn(1,1,1);"plane"===t.kind&&(e.y=.015),r(n,t.color,(0,a.i1)(t.position),(0,a.b5)(t.rotation),{objectId:t.id},e)}return n.updateMatrixWorld(!0),n}(e);try{let n=function(e,t){let n,r=(n=[],e.traverse(e=>{e instanceof o.eaF&&!e.userData.rig&&n.push(e)}),n),i=[],a=(e,t)=>{e.geometry.getAttribute("color")?.array!==t&&e.geometry.setAttribute("color",new o.THS(t,3));let n=e.material;n.vertexColors=!0,n.shadowSide=o.$EB,e.castShadow=!0,e.receiveShadow=!0};for(let e of r){let t=e.geometry.getAttribute("position"),n=e.geometry.index;for(let r=0;r<(n?.count??t.count);r+=3){let[a,s,l]=[0,1,2].map(i=>new o.Pq0().fromBufferAttribute(t,n?n.getX(r+i):r+i).applyMatrix4(e.matrixWorld));i.push({a,b:s,c:l,bounds:new o.NRn().setFromPoints([a,s,l]),center:a.clone().add(s).add(l).multiplyScalar(1/3)})}}if(!i.length)return[];let s=[],l=function e(t){let n=new o.NRn;for(let e of t)n.union(e.bounds);if(t.length<=12)return{bounds:n,triangles:t};let r=n.getSize(new o.Pq0),i=r.x>r.y&&r.x>r.z?"x":r.y>r.z?"y":"z";t.sort((e,t)=>e.center[i]-t.center[i]);let a=Math.floor(t.length/2);return{bounds:n,left:e(t.slice(0,a)),right:e(t.slice(a))}}(i),d=new o.RlV,f=new o.Pq0,c=(e,t)=>!(e.bounds.distanceToPoint(d.origin)>t)&&!!d.intersectsBox(e.bounds)&&(e.triangles?e.triangles.some(e=>null!==d.intersectTriangle(e.a,e.b,e.c,!1,f)&&f.distanceToSquared(d.origin)<t*t):c(e.left,t)||c(e.right,t)),h=new o.Pq0,p=new o.Pq0,m=new o.Pq0,u=new o.Pq0,g=Array.from({length:8},(e,t)=>{let n=Math.sqrt(1-(t+.5)/8),o=Math.sqrt(1-n*n),r=2.399963229728653*t;return[o*Math.cos(r),o*Math.sin(r),n]});for(let e of r){let n=e.geometry.getAttribute("position"),r=e.geometry.getAttribute("normal"),i=new o.dwI().getNormalMatrix(e.matrixWorld),f=t.characters.find(t=>t.id===e.userData.characterId),w=(f?.height??Math.max(...t.objects.find(t=>t.id===e.userData.objectId)?.size??[1]))*.025,y=new Float32Array(3*n.count);for(let t=0;t<n.count;t++){h.fromBufferAttribute(n,t).applyMatrix4(e.matrixWorld),p.fromBufferAttribute(r,t).applyNormalMatrix(i),m.set(.9>Math.abs(p.y)?0:1,+(.9>Math.abs(p.y)),0).cross(p).normalize(),u.crossVectors(p,m),d.origin.copy(h).addScaledVector(p,.025*w);let o=0;for(let[e,t,n]of g)d.direction.copy(p).multiplyScalar(n).addScaledVector(m,e).addScaledVector(u,t),c(l,w)&&o++;y.fill(1-.5*o/g.length,3*t,3*t+3)}a(e,y),s.push(y)}return s}(t,e);w.postMessage({colors:n},n.map(e=>e.buffer))}finally{g(t)}}},29169:(e,t,n)=>{"use strict";n.d(t,{IA:()=>p,Jf:()=>c,PA:()=>h,Yu:()=>d,dS:()=>s,oT:()=>f,t6:()=>l,xT:()=>m});var o=n(84910),r=n(2872),i=n(79283),a=n(54996);function s(e){let t=/^(left|right)-(thumb|index|middle|ring|little)-([0-3])$/.exec(e);return t?{side:t[1],finger:t[2],segment:Number(t[3])}:null}let l=e=>e.endsWith("-hand")||!!s(e),d=e=>"female"===e.bodyType?i:r;function f(e,t){let n=t;for(;n;){if(n.modelPart.endsWith("-hand"))return n;n=e.bones.find(e=>e.endJointId===n.startJointId)}}function c(e,t,n=!0){let r=d(e),i=r.parts.find(e=>e.id===t.modelPart),s=new o.Pq0(...i.end).sub(new o.Pq0(...i.start)),l=new o.Pq0(...e.joints.find(e=>e.id===t.endJointId).offset),f=l.length()/s.length(),h=(0,a.G_)(e.headRatio),p=n?e.palmSize??1:1,m=n?e.height/r.height*h.hand*p:f,u=new o.Pq0(0,1,0);return new o.kn4().compose(new o.Pq0,new o.PTz().setFromUnitVectors(u,l.normalize()),new o.Pq0(m,f*(n?h.handLength:1)*p,m)).multiply(new o.kn4().makeRotationFromQuaternion(new o.PTz().setFromUnitVectors(u,s.normalize()).invert()))}function h(e,t,n){let r=c(e,t);if(s(n)?.segment===0||(e.fingerLength??1)===(e.palmSize??1))return r;let i=d(e).parts.find(e=>e.id===n),a=new o.Pq0(...i.end).sub(new o.Pq0(...i.start)).normalize(),l=new o.kn4().makeRotationFromQuaternion(new o.PTz().setFromUnitVectors(new o.Pq0(0,1,0),a));return r.multiply(l).multiply(new o.kn4().makeScale(1,(e.fingerLength??1)/(e.palmSize??1),1)).multiply(l.clone().invert())}function p(e,t){let n=s(t.modelPart),r=n&&f(e,t);if(!n||!r||0===n.segment)return new o.PTz;let i=d(e).parts.find(e=>e.id===t.modelPart),a=new o.Pq0(...i.end).sub(new o.Pq0(...i.start)).normalize(),l=a.clone().cross(new o.Pq0(0,-1,0)).normalize(),h=l.clone().cross(a).normalize(),p=c(e,r,!1);return new o.PTz().setFromRotationMatrix(new o.kn4().makeBasis(l.transformDirection(p),a.transformDirection(p),h.transformDirection(p)))}function m(e,t,n){let r=e.bones.find(e=>e.endJointId===t.id).modelPart,i=h(e,n,r).multiply(c(e,n,!1).invert());return new o.Pq0(...t.offset).applyMatrix4(i)}},54996:(e,t,n)=>{"use strict";n.d(t,{G_:()=>a,UB:()=>s,kF:()=>r,r8:()=>i});let o=[{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},{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},{heads:4,softness:.5,torso:.84,torsoDepth:1,headDepth:.94,shoulder:.84,hip:.84,arm:.75,forearm:.78,thigh:.84,calf:.8,hand:.88,foot:.94,armLength:.98,handLength:1.04,footLength:1.08,neck:.72},{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}],r=(e=1)=>1+(e-1)*.5;function i(e){let t=o.findIndex(t=>t.heads>=e);if(0===t)return[0,0,0];if(-1===t)return[3,3,0];let n=(e-o[t-1].heads)/(o[t].heads-o[t-1].heads);return[t-1,t,n*n*(3-2*n)]}function a(e){if(e>7){let t={...o[3]},n=Math.sqrt(7/e);for(let e of["torso","torsoDepth","shoulder","hip","arm","forearm","thigh","calf","hand","foot"])t[e]=n;return t}let[t,n,r]=i(e),a=o[t],s=o[n];return Object.fromEntries(Object.keys(a).map(e=>[e,a[e]+(s[e]-a[e])*r]))}function s(e,t){return t.endsWith("-shoulder")?e.shoulder:t.endsWith("-hip")?e.hip:t.endsWith("-elbow")?e.arm:t.endsWith("-wrist")?e.forearm:t.endsWith("-hand")?e.hand:t.endsWith("-knee")?e.thigh:t.endsWith("-ankle")?e.calf:t.endsWith("-foot")?e.foot:e.torso}}},s={};function l(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}},o=!0;try{a[e](n,n.exports,l),o=!1}finally{o&&delete s[e]}return n.exports}l.m=a,l.x=()=>{var e=l.O(void 0,[460,653],()=>l(13101));return l.O(e)},e=[],l.O=(t,n,o,r)=>{if(n){r=r||0;for(var i=e.length;i>0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[n,o,r];return}for(var a=1/0,i=0;i<e.length;i++){for(var[n,o,r]=e[i],s=!0,d=0;d<n.length;d++)(!1&r||a>=r)&&Object.keys(l.O).every(e=>l.O[e](n[d]))?n.splice(d--,1):(s=!1,r<a&&(a=r));if(s){e.splice(i--,1);var f=o();void 0!==f&&(t=f)}}return t},l.d=(e,t)=>{for(var n in t)l.o(t,n)&&!l.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((t,n)=>(l.f[n](e,t),t),[])),l.u=e=>"static/chunks/"+(460===e?"83607670":e)+"-"+({460:"fd2f339702a222e4",653:"6dfb97fec9a2d91b"})[e]+".js",l.miniCssF=e=>{},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),l.tt=()=>(void 0===t&&(t={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(t=trustedTypes.createPolicy("nextjs#bundler",t))),t),l.tu=e=>l.tt().createScriptURL(e),l.p="/_next/",n={101:1},l.f.i=(e,t)=>{n[e]||importScripts(l.tu(l.p+l.u(e)))},r=(o=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push.bind(o),o.push=e=>{var[t,o,i]=e;for(var a in o)l.o(o,a)&&(l.m[a]=o[a]);for(i&&i(l);t.length;)n[t.pop()]=1;r(e)},i=l.x,l.x=()=>Promise.all([l.e(460),l.e(653)]).then(i),_N_E=l.x()})();
|