Files
workinf_Blender_Wasm/docs/status/W-075.md
2026-08-12 04:47:48 -04:00

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.