# 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.