Files
workinf_Blender_Wasm/docs/web/modifier-support-matrix.md
2026-08-12 04:47:48 -04:00

144 lines
9.6 KiB
Markdown

# Blender 5.2 Modifier Web Support Matrix
This matrix separates file recognition, dependency extraction and evaluated
result parity. Loading a modifier type is not evidence that its Web result
matches Blender desktop.
## Status levels
| Level | Meaning |
| --- | --- |
| `IDENTITY` | Type code/name, UUID, stack order and mode flags are preserved. |
| `PARAMETERS` | Declared parameters are present in SceneIR. No evaluated mesh is implied. |
| `TARGET_EDGE` | Cross-object target IDs are present in the native Depsgraph report. |
| `NATIVE_FIXTURE` | Native WASM Depsgraph behavior is covered by a Blender fixture/golden. |
| `COMMAND` | A revisioned Web command can execute and has undo/redo or isolated-preview coverage. |
| `BLOCKED` | No parity claim. An enabled unsupported/invalid entry must return a structured block. |
## Current verified set
| Modifier | Identity | Parameters | Target edge | Native fixture | Command |
| --- | --- | --- | --- | --- | --- |
| Subdivision Surface | yes | levels/type | no | desktop/WASM topology and geometry parity through local OpenSubdiv 3.7.0 CPU evaluator | no |
| Mirror | yes | axis/merge flags | optional mirror object | desktop/WASM geometry parity | no |
| Boolean (Exact) | yes | operation/solver | target object | desktop/WASM surface parity through local GMP 6.3.0 | no |
| Decimate | yes | mode/ratio/iterations/delimit | no | structured small-mesh error | Collapse/Un-Subdivide/Dissolve command |
| Armature | yes | target/group/deform flags | yes | rigged shape-key golden | enable/disable + undo/redo |
| Bevel | yes | width/segments/profile | no | desktop/WASM geometry parity | no |
| Lattice | yes | target/group/strength/flags | yes | desktop/WASM geometry parity | no |
| Curve | yes | target/group/axis/flags | yes | desktop/WASM topology and geometry parity | no |
| Hook | yes | target/subtarget/group/falloff/force | yes | desktop/WASM geometry parity | no |
| Mesh Deform | yes | target/group/grid/flags | yes | bound-cache desktop/WASM geometry parity | no |
| Shrinkwrap | yes | targets/group/distance/type/mode/limit | primary/aux targets | desktop/WASM geometry parity | no |
| Surface Deform | yes | target/group/falloff/strength/flags | yes | bound-cache desktop/WASM geometry parity | no |
| Array/Solidify | yes | fixture parameters | object edges where used | desktop/WASM geometry parity | no |
| Triangulate/Weld | yes | fixture parameters | no | desktop/WASM topology and geometry parity | no |
| Build/Wave | yes | frame/time parameters | object/texture edges where used | frame-6 desktop/WASM geometry parity | no |
| Geometry Nodes | yes | node group/default socket values | node-group edge | bounded Transform Geometry and Set Position closures match desktop | no |
| Edge Split | yes | angle/sharp flags | no | desktop/WASM topology and geometry parity | no |
| Screw | yes | axis/angle/steps/merge | optional axis object | desktop/WASM topology and geometry parity | no |
| Displace | yes | direction/strength/mid-level/space | optional mapping object | constant local-space desktop/WASM parity; resource configurations block | no |
Native `targetObjectIds` currently covers Array, Mirror, Boolean, Lattice, Curve, Armature, Hook,
Mesh Deform, Shrinkwrap, Surface Deform, Screw and Displace mapping objects.
The ordered `dependsOn` list contains the prior stack entry followed by those
external object IDs. These SceneIR entries remain `METADATA_ONLY`; the Worker
still blocks topology/LOD commands until evaluated input is available.
## Complete Blender 5.2 identity coverage
The lightweight reader now covers every DNA slot from `0` through `86`; a C++
`static_assert` fails the build when `NUM_MODIFIER_TYPES` grows without a table
update. The category-golden native whitelist contains 24 evaluated types:
`SUBSURF`, `MIRROR`, `ARRAY`, exact `BOOLEAN`, `BEVEL`, `SOLIDIFY`,
`TRIANGULATE`, `WELD`, `LATTICE`, `HOOK`, `SHRINKWRAP`, `SIMPLE_DEFORM`,
`MESH_DEFORM`, `SURFACE_DEFORM`, `CURVE`, `BUILD`, `WAVE` and the bounded
`NODES` closures, plus `SMOOTH`, `CAST`, `WIREFRAME`, `EDGE_SPLIT`, `SCREW` and
bounded `DISPLACE`.
Armature, Shape Key and Decimate have earlier dedicated
fixtures. The remaining identity-only types are:
`NONE`, `SOFT_BODY`, `UV_PROJECT`,
`PARTICLE_SYSTEM`, `PARTICLE_INSTANCE`, `EXPLODE`, `CLOTH`,
`COLLISION`, `FLUID_SIM`, `MASK`, `MULTIRES`, `SURFACE`, reserved slot `31`,
`WARP`, `WEIGHT_VG_EDIT`, `WEIGHT_VG_MIX`, `WEIGHT_VG_PROXIMITY`,
`OCEAN`, `DYNAMIC_PAINT`, `REMESH`, `SKIN`, `LAPLACIAN_SMOOTH`, `UV_WARP`,
`MESH_CACHE`, `LAPLACIAN_DEFORM`, `DATA_TRANSFER`,
`NORMAL_EDIT`, `CORRECTIVE_SMOOTH`, `MESH_SEQUENCE_CACHE`, `WEIGHTED_NORMAL`,
`FLUID`, `MESH_TO_VOLUME`, `VOLUME_DISPLACE`, `VOLUME_TO_MESH`,
`GREASE_PENCIL_OPACITY`, `GREASE_PENCIL_SUBDIV`, `GREASE_PENCIL_COLOR`,
`GREASE_PENCIL_TINT`, `GREASE_PENCIL_SMOOTH`, `GREASE_PENCIL_OFFSET`,
`GREASE_PENCIL_NOISE`, `GREASE_PENCIL_MIRROR`, `GREASE_PENCIL_THICKNESS`,
`GREASE_PENCIL_LATTICE`, `GREASE_PENCIL_DASH`, `GREASE_PENCIL_MULTIPLY`,
`GREASE_PENCIL_LENGTH`, `GREASE_PENCIL_WEIGHT_ANGLE`,
`GREASE_PENCIL_ARRAY`, `GREASE_PENCIL_WEIGHT_PROXIMITY`,
`GREASE_PENCIL_HOOK`, `GREASE_PENCIL_LINEART`, `GREASE_PENCIL_ARMATURE`,
`GREASE_PENCIL_TIME`, `GREASE_PENCIL_ENVELOPE`, `GREASE_PENCIL_OUTLINE`,
`GREASE_PENCIL_SHRINKWRAP`, `GREASE_PENCIL_BUILD`,
`GREASE_PENCIL_SIMPLIFY`, `GREASE_PENCIL_TEXTURE`.
## Blocking contract
An enabled unregistered native modifier returns `UNSUPPORTED_MODIFIER_TYPE`.
An enabled target-based modifier without a target returns
`MODIFIER_TARGET_MISSING`. An error raised by Blender itself returns
`BLENDER_MODIFIER_ERROR`. Resource/configuration-dependent Displace returns
`MODIFIER_CONFIGURATION_UNSUPPORTED`; simulation/bake GN returns
`GEOMETRY_NODES_SIMULATION_UNAVAILABLE`. A target path that reaches the owner returns
`MODIFIER_DEPENDENCY_CYCLE`. All blockers include the modifier object/name/type,
`error`, and an actionable `suggestion`. Viewport-disabled modifiers remain
`DISABLED` and do not inherit stale evaluated errors.
## Category fixtures
| Category | Blender 5.2 golden | Current Web result |
| --- | --- | --- |
| Generate | Subdivision, Mirror, Array, Boolean, Bevel, Solidify, Triangulate, Weld | All eight execute native Blender code. Subdivision matches the 26-vertex/48-triangle OpenSubdiv golden; Exact Boolean matches the 12-vertex/20-triangle surface golden. |
| Deform | Lattice, Hook, Shrinkwrap, Simple Deform, Mesh Deform, Surface Deform | All six match desktop geometry; Mesh/Surface fixtures contain real bind caches and target deformation. |
| Curve | Curve target and evaluated output in a dedicated fixture | Native Curve evaluation matches desktop topology and positions within the declared floating-point tolerance. |
| Physics/time | Build and Wave at frame 6; disabled Cloth, Soft Body and Collision | Build and Wave match desktop geometry at frame 6; simulation entries remain `DISABLED`. |
| Geometry Nodes | Self-contained Transform Geometry, Set Position and simulation-zone graphs | Constant Transform and Set Position match desktop positions/topology. Simulation zones preserve input and return `GEOMETRY_NODES_SIMULATION_UNAVAILABLE` without consuming temporal state. |
| Grease Pencil | One drawing plus all 26 GP modifier types exposed by Blender 5.2 Python | GP data loads; all modifier codes/modes are preserved and remain `DISABLED`. |
| Extended native | Edge Split, Screw and bounded Displace | All match desktop topology/positions; RGB/resource Displace preserves input and returns `MODIFIER_CONFIGURATION_UNSUPPORTED`. |
Line Art is exposed as `LINEART` rather than with the `GREASE_PENCIL_` prefix;
the generator includes it explicitly. The fixtures, desktop goldens and
comparison runner are generated by
`tools/web/generate-modifier-fixtures.py`,
`tools/web/generate-modifier-goldens.py` and checked offline with
`npm --prefix web run test:modifier-goldens`.
## Local native dependencies
Subdivision uses the local OpenSubdiv 3.7.0 source and archive under
`blender-5.2.0/extern/opensubdiv-source`. The Web build enables its CPU-only
static evaluator and disables GPU, examples, documentation and tests. The
archive MD5 is `470d53c4d4335a601c33a052ce7c33b4`; SHA-256 is
`f843eb49daf20264007d807cbc64516a1fed9cdb1149aaf84ff47691d97491f9`.
Exact Boolean uses the local GMP 6.3.0 DFSG source plus Emscripten static
archives under `blender-5.2.0/extern/gmp-source` and
`blender-5.2.0/extern/gmp-wasm`. The source archive MD5 is
`d4a3890b5e28df535b653b07798b11b2`; SHA-256 is
`bd2966e6d277f79328e894a5a9f3ba3fbf2ed2be81def5f48623e30c23fb1572`.
`WITH_MANIFOLD` remains off: Blender 5.2's verified Exact solver path uses GMP,
so Manifold is not part of the tested runtime closure. wasm32 and desktop may
choose different valid diagonals on coplanar faces; the golden therefore
compares oriented surface area and geometry instead of requiring identical
triangle indices.
`npm --prefix web run check:local-deps` verifies both source archive hashes,
the OpenSubdiv CMake source and the local GMP/GMPXX headers and WASM archives.
## Future whitelist expansion
1. Add deterministic physics cache stepping for Cloth/Soft Body/Collision;
Build and Wave are complete for the current frame golden.
2. Expand Geometry Nodes from the verified Transform Geometry and Set Position closures in small
node/dependency batches. Simulation zones, bake data, fields, instances and
the full lazy-function graph remain outside the current whitelist.
3. Enable Grease Pencil modifiers in small dependency batches; keep target and
simulation types disabled until their external resources are validated.
4. Add native geometry goldens for the remaining Generate/Deform families,
including Cast, Remesh, Multires and volume conversions.