9.6 KiB
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
- Add deterministic physics cache stepping for Cloth/Soft Body/Collision; Build and Wave are complete for the current frame golden.
- 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.
- Enable Grease Pencil modifiers in small dependency batches; keep target and simulation types disabled until their external resources are validated.
- Add native geometry goldens for the remaining Generate/Deform families, including Cast, Remesh, Multires and volume conversions.