87 lines
5.3 KiB
Markdown
87 lines
5.3 KiB
Markdown
# W-075 Status
|
|
|
|
status: in_progress
|
|
task: 实现三种模式和修改器堆栈求值
|
|
|
|
The React Properties editor now exposes a Blender-style Decimate inspector for
|
|
all three native modes. Collapse has ratio, triangulate and optional symmetry
|
|
axis controls; Un-Subdivide has bounded iterations; Dissolve Planar has angle,
|
|
boundary handling and Normal/Material/Seam/Sharp/UV delimit toggles. A shared
|
|
attribute-policy selector makes preservation or dropping explicit. Browser E2E
|
|
switches through the mode-specific controls, while native probes confirm all
|
|
three BMesh entry points execute against the local WASM artifact.
|
|
|
|
Applying the inspector commits a revisioned `decimateMesh` command. A
|
|
`previewDecimateMesh` command now evaluates the profile in a separate WASM
|
|
module instance, returns temporary geometry to the Three.js viewport, keeps
|
|
the authoritative handle/revision unchanged and supports explicit cancellation
|
|
from the inspector.
|
|
|
|
The SceneIR contract now carries modifier UUID/type/name/enabled state and a
|
|
deterministic modifier-stack hash. The native `.blend` reader traverses each
|
|
`Object.modifiers` list, uses Blender's persistent modifier UID for a stable
|
|
UUID when available, and exports viewport/render modes plus common Subsurf,
|
|
Mirror, Decimate and Bevel parameters. The generated
|
|
`rigged_shape_scene.blend` fixture verifies the real Decimate modifier payload
|
|
instead of a mock stack. The native command
|
|
`setModifierEnabled` toggles a declared modifier, and the native history ring
|
|
implements bounded undo/redo with revisioned snapshots. React exposes the
|
|
modifier checkbox and top-bar undo/redo commands; browser E2E verifies that
|
|
undo/redo changes the authoritative native snapshot rather than a Three.js
|
|
shadow copy. Native smoke now covers the same modifier toggle and its
|
|
undo/redo cycle against a local WASM engine.
|
|
|
|
`protocol/modifier-graph.ts` now builds a stable per-mesh topological order from
|
|
stack order and explicit `dependsOn` edges. Cycles and unresolved external
|
|
inputs produce `BLOCKED` with the offending IDs; declared but unexecuted
|
|
modifiers remain `METADATA_ONLY`. The WebEngine Worker requires `EVALUATED`
|
|
before Decimate preview, commit or LOD generation. Browser E2E checks the
|
|
topological order, metadata-only handling and cycle blocking.
|
|
|
|
The WebEngine exposes `evaluateDepsgraph` and the native module executes
|
|
Blender 5.2's `BLO_read_from_memory` loader, headless runtime bootstrap,
|
|
view-layer sync, graph build, tagged update and frame evaluation. A wasm32 DNA
|
|
alignment bridge and the Web ID registry for NodeTree/Camera/Light preserve the
|
|
current C++ layout. The report contains evaluated mesh positions/triangles,
|
|
source Mesh IDs, object world matrices and modifier counts. The report also
|
|
contains ordered modifier entries with persistent UID, mode flags, stack
|
|
dependencies and explicit `EVALUATED`, `DISABLED` or `BLOCKED` status with
|
|
stable error codes and suggestions. Empty,
|
|
basic and rigged/shape-key fixtures now pass without a WASM trap; the rigged
|
|
positions match the Blender deformation golden. Broader modifier and constraint
|
|
parity is tracked separately and unsupported cases remain structured errors.
|
|
The lightweight reader's name table now covers all Blender 5.2 DNA modifier
|
|
slots 0 through 86, including the Grease Pencil range, with a compile-time size
|
|
check. Recognition remains separate from evaluated parity in
|
|
`docs/web/modifier-support-matrix.md`.
|
|
SceneIR now extracts target IDs and core parameters for Lattice, Curve,
|
|
Armature, Hook, Mesh Deform, Shrinkwrap and Surface Deform, and appends their
|
|
external objects to `dependsOn`; they deliberately remain `METADATA_ONLY`.
|
|
|
|
Six reproducible Blender 5.2 category goldens now cover Generate, Deform,
|
|
legacy Curve, Physics/time, Geometry Nodes and Grease Pencil. The native report
|
|
now includes non-Mesh objects, including all 26 Grease Pencil modifier types
|
|
exposed by Blender 5.2 Python. Twenty-four category types now have evaluated Web
|
|
goldens. Subdivision uses the local OpenSubdiv 3.7.0 CPU evaluator and matches
|
|
the 26-vertex/48-triangle desktop result. Exact Boolean uses local GMP 6.3.0
|
|
and matches the 12-vertex/20-triangle surface result; coplanar triangulation is
|
|
compared by oriented surface area because wasm32 and desktop can select
|
|
different valid diagonals. Curve now runs its native modifier and matches the
|
|
desktop golden after the Web ID registry was extended for Curves data.
|
|
|
|
Geometry Nodes has bounded native implementations for a single constant
|
|
Transform Geometry or Set Position node. Both topology/position results match
|
|
Blender 5.2. Unknown graphs retain `BLENDER_MODIFIER_ERROR`; simulation zones
|
|
and bake data preserve input geometry and return
|
|
`GEOMETRY_NODES_SIMULATION_UNAVAILABLE`. The full node registration/lazy-function
|
|
runtime is not claimed. Displace adds a bounded constant local-space closure;
|
|
resource-dependent configurations return `MODIFIER_CONFIGURATION_UNSUPPORTED`.
|
|
Grease Pencil modifiers remain disabled.
|
|
Mesh and Surface Deform fixtures continue to serialize real bind caches and
|
|
deform their cage/target after binding.
|
|
|
|
This is not yet complete native Blender dependency-graph parity. Unsupported
|
|
external runtime resources and unsupported modifier/constraint types return
|
|
structured errors; the lightweight SceneIR history remains separate and is not
|
|
silently serialized as a full Blender undo stack.
|