Troubleshooting
Problem, cause and solution for the authoring, batch, regeneration and runtime issues Souls Destruction Framework reports, with their issue codes.
Every blocking condition the plugin reports carries an issue code. Search this page for the code shown in the dialog, the Message Log or the batch CSV report.
Authoring
| Problem | Cause | Solution |
|---|---|---|
Geometry Collection does not generate (SDF-AUTH-GC-002) | Deterministic Voronoi fracture failed for this mesh. LOD0 is not closed or manifold enough for planar cutting | Repair the source geometry, or author this asset manually with hand-made fragment meshes |
Conversion produced no geometry (SDF-AUTH-GC-001) | Static Mesh conversion produced no Geometry Collection transforms | Confirm LOD0 has real triangles and is not an empty or proxy mesh |
Generation refused: source and interior material required (SDF-AUTH-GEN-001, SDF-AUTH-REQ-001) | The preset has no interior material and none was supplied per object | Assign an interior material in the Advanced section, or use a preset that ships with one |
Interior material could not be resolved (SDF-AUTH-MAT-001) | The material reference is unresolvable | Reassign the material asset; check it was not deleted or renamed |
Interior faces do not use the expected material (SDF-AUTH-VAL-003) | The generated internal faces did not receive the interior material object | Regenerate; if it persists, test with a plain opaque material to rule out a material-domain problem |
Mesh is open or non-manifold (SDF-AUTH-SRC-003, SDF-AUTH-GC-002) | No usable LOD0, or geometry that cannot be cut | Import or build a valid, closed LOD0 before authoring |
Fragments are too small (SDF-AUTH-VAL-008, warning) | Fragments remain below the configured minimum dimension after conservative merging | Increase the preset’s MinimumFragmentSizeCm, or lower the fracture density. SDF does not delete geometry to satisfy the minimum |
| Pot fracture looks too dense | Ceramic at High density on a small object | Use Low or Medium, or a Custom density with an explicit fragment count |
Preflight warns about triangle count (SDF-AUTH-PERF-001) | LOD0 exceeds the warning threshold (default 250 000) | Use a lower-complexity source mesh, or accept the warning knowingly for a hero prop |
A dimension is below the safe minimum (SDF-AUTH-SRC-004) | The mesh is too small, or its scale is wrong at import | Fix the source scale and reimport |
Missing material slots (SDF-AUTH-SRC-005, SDF-AUTH-SRC-006) | Exterior material slots are empty | Assign every exterior material before generating |
Exterior materials missing from the collection (SDF-AUTH-MAT-007) | The generated collection lost one or more source exterior materials | Verify the source material slots, then regenerate |
Fragment budget exceeded (SDF-AUTH-VAL-005) | Requested fragment count is above the bounded limit | Reduce the custom fragment count; the supported range is 2–150 |
Collision or simulation data missing (SDF-AUTH-VAL-004) | The generated collection has no cooked simulation data | Regenerate; if it persists, the source geometry is likely unsuitable for cooking |
Output package already exists (SDF-AUTH-COMMIT-001) | A previous setup occupies the planned path | Choose another output folder, or regenerate the existing setup explicitly instead |
Packages could not be saved (SDF-AUTH-COMMIT-002) | Source control checkout or filesystem permissions | Check out the files, verify write permissions, remove the diagnosed output packages and retry |
Source signature changed during staging (SDF-AUTH-SRC-007) | The source mesh was modified while generation was running | Do not edit or reimport the source during generation; retry |
Generated Blueprint failed validation (SDF-AUTH-ACTOR-001) | The destructible Actor could not be validated; publication was cancelled | Retry with Create Destructible Actor disabled to isolate the problem, then report it |
Batch
| Problem | Cause | Solution |
|---|---|---|
Batch item is Blocked | The row failed preflight; the CSV report contains the exact code | Fix the reported cause and preflight again |
No authoring preset selected (SDF-BATCH-GLOBAL-001) | The batch has no preset | Select a preset before preflighting |
No interior material (SDF-BATCH-GLOBAL-002) | The preset has none and no batch override was supplied | Set the batch interior material override |
Mesh already managed (SDF-BATCH-GEN-001) | The mesh already has an SDF manifest | Use Batch Regenerate instead of Batch Generate |
No manifest references this mesh (SDF-BATCH-MANIFEST-001) | Validate or Regenerate was run on an unmanaged mesh | Generate a setup first |
Planned output already exists (SDF-BATCH-GEN-003) | A package occupies the planned path | Change the output policy or remove the stale asset |
Several meshes resolve to the same output (SDF-BATCH-GEN-004) | Identically named sources with a shared output folder | Use the source-sibling output policy, or rename the source meshes |
Unsupported backend (SDF-BATCH-GEN-002) | The resolved backend is not supported by automatic batch generation | Author that asset individually |
| Preflight became stale | The operation, preset, density, output policy, material override or selection changed after preflight | Run Preflight All again; the previous confirmation no longer applies |
| Editor freezes briefly during a batch | One expensive fracture occupies the editor thread until that asset finishes | Expected. Cancellation is sampled between assets, not inside a fracture |
Validation and regeneration
| Problem | Cause | Solution |
|---|---|---|
| Regeneration detects manual changes | A generated asset was edited by hand and saved | Confirm the replacement explicitly, or keep the manual edits and stop regenerating that setup |
| Unsaved changes block regeneration | The source, preset, profile or Blueprint has unsaved editor changes | Save or discard those changes first. In-memory work is never overwritten |
Legacy manifest refuses to regenerate (SDF-REGEN-ADOPT-001 to 003) | The manifest predates the current schema version (4), or ownership is ambiguous | Adopt the setup explicitly when prompted. Ownership is never guessed |
Regeneration refuses a simulated setup (SDF-REGEN-013) | The source mesh can no longer simulate as it stands — its simple collision was removed, or it now uses Use Complex As Simple — and the setup owns no simulation copy to rebuild | Restore simple collision on the source, or set the setup to Static. No output was modified |
| Managed output is missing | A generated asset was deleted or moved | Restore or redirect it, so replacement can preserve external references |
| Geometry Collection reports as changed after simply opening it | Derived simulation data was rebuilt on load | That dirty flag alone is not treated as a manual edit; saved package changes are what fingerprints detect |
Runtime
| Problem | Cause | Solution |
|---|---|---|
| Object does not break | The hit’s DestructionPower is below the profile’s MinimumDestructionPower | Raise the hit’s power or lower the profile’s requirement. Outcome will read Rejected |
| Damage is applied but nothing breaks | Damage is passing, but power is insufficient, or health has not reached zero | Check AppliedDamage and RemainingHealth in the result. Consider bDestroyOnSingleValidHit for fragile props |
| Hits do nothing at all | No profile assigned, or no intact component resolved | Outcome reads InvalidConfiguration. Assign a profile and confirm the intact primitive component |
| Chaos representation does not appear | DestructionMode is not GeometryCollection, or no collection asset is assigned | Check the profile; verify the Geometry Collection asset reference |
| Fallback is used unexpectedly | The Chaos representation budget was saturated | bUsedFallback is true. Raise MaxActiveChaosRepresentations, or shorten DebrisLifetime so slots return faster |
| Debris never appears on a large blast | The per-frame presentation budget suppressed it | bPresentationSuppressedByBudget is true. Raise MaxDestructionEventsPerFrame for that scene |
| Fallback destroys the object with no visuals | The profile has an empty Debris array | Always provide debris entries, even on GeometryCollection profiles |
| Melee swing does nothing | No swing window is open | bRejectedBecauseSwingInactive is true. Call Begin SDF Melee Swing first |
| One swing removes several times the damage | Duplicate suppression disabled | Enable bSuppressRepeatedActorsPerSwing |
| Collision behaves incorrectly — nothing breaks while moving | Contact speed is below MinimumContactSpeed | bRejectedBelowMinimumSpeed is true and ContactSpeed reports the measured value. Lower the gate or drive faster |
| Collision fires repeatedly during one roll | The collision window is not used, or duplicate suppression is disabled | Open a window with Begin SDF Collision Window and keep bSuppressRepeatedActorsPerWindow enabled |
| Projectile does nothing | No projectile profile assigned | bMissingProfile is true. Assign a USDFProjectileHitProfile |
| Pooled projectile stops working after reuse | Per-target impact history persists | Call Reset SDF Projectile Impacts when the projectile is taken from the pool |
| Debris flies toward the attacker | ImpactDirection or AttackDirection is reversed | It must point from the attacker toward the target |
| No sound or VFX although requests fire | Built-in playback or spawning is disabled on the profile | Either enable the built-in path or handle the delegate requests in your own systems |
| Hit reaction request fires but nothing moves | The intact component does not simulate physics | Expected for Static, Keep Existing and older non-migrated setups: the built-in impulse only applies to a simulating intact. Drive your own reaction from the request, or use Simulated |
| Decals stop appearing on an object | The per-object decal limit was reached | bSuppressedByObjectLimit is true. Raise MaximumImpactDecals or shorten LifeSpan |
| Chain reaction never propagates | Propagation is disabled, or neighbours reject the propagated power | Enable bAllowDestructionPropagation; compare PropagationPower against the neighbours’ MinimumDestructionPower |
| Wood splinters fall through the floor | The splinters land on surfaces that block the Camera trace channel, and this floor ignores it | Use a collision preset that blocks Camera (BlockAll and the default static mesh collision do). Splinters more than 10 m below the object are removed |
| Splinters keep the default brown instead of the object’s wood | No usable colour texture was found on the object’s material | Run Modify Destructible… or Regenerate Destructible… once so the Base Color texture is recorded. Normal, roughness, AO, mask and virtual textures never qualify. See Splinters that look like the object |
| The whole wood break effect disappeared after editing it | One emitter fails to compile, which stops the entire Niagara system | Open the system, fix the compile error (often a custom HLSL module reading User. values directly), recompile and save |
| A spring-arm camera no longer collides with debris | SDF debris ignores the Camera channel so splinters can pass through it | Expected. The camera passes through broken pieces instead of being pushed in by them |
Modify Destructible
| Problem | Cause | Solution |
|---|---|---|
| The menu entry asks to regenerate first | The setup was published by an older plugin version | Run Regenerate Destructible… once to adopt it, then use Modify |
Switching preset is refused (SDF-REGEN-014) | A Glass setup and another family produce different kinds of assets | Create a new destructible with the other preset |
| Modify is blocked by unsaved changes | The source, preset, profile or Blueprint has unsaved editor changes | Save or discard them first. In-memory work is never overwritten |
Generation stops with SDF-AUTH-GC-WOOD-005 | Cuts Along Length is 0 on a mesh made of one single piece, which would not break at all | Use at least 1, or model the prop as separate pieces |
Physics and falls
| Problem | Cause | Solution |
|---|---|---|
Generation stops with SDF-AUTH-PHYS-001 | Physics is Simulated, the mesh has no usable simple collision (none, Use Complex As Simple, or undersized), and Generate Simulation Collision if Needed is off | Turn the option back on so SDF publishes a simulation copy, add simple collision to the source, or choose Static |
Generation stops with SDF-AUTH-PHYS-002 | The simulation collision copy could not be generated | Check the source mesh’s LOD0 geometry and retry; nothing was published |
The report mentions SM_SDF_<Name>_Sim (SDF-AUTH-PHYS-004) | The source could not simulate as it stands, so the Blueprint uses an SDF-owned copy | Expected. The source mesh was not modified; keep the copy with the setup |
| An older prop does not fall when its support breaks | It was generated before this feature: its profile reads Keep Existing | Migrate it explicitly with SDF.MigrateToSimulatedPhysics (run VerifyOnly first), or set its instance to Force Simulated |
| A new prop does not fall | It is Static, its instance is forced static, or Simulated was refused | Read GetEffectivePhysicsMode and GetIntactPhysicsStatus; a Refused… status names the reason |
RefusedIntactNotRoot | The destructible component sits on your own Actor class and its intact is not the root | Make the intact mesh the root of that Actor, or use Force Static |
RefusedMultipleDestructibles | The Actor carries several destructibles and cannot move as one body | Split them into separate Actors, or keep them Static |
RefusedNoSimpleCollision / RefusedComplexAsSimple | The intact mesh on a placed Actor cannot simulate | Fix the mesh’s simple collision, or generate the setup as Simulated through authoring so SDF can publish a simulation copy |
| A prop tips over, sinks or slides at rest | Its simple collision does not match the visible mesh, or it was placed overlapping or floating above its support | Check the collision in the Static Mesh editor, and place the prop resting on its support |
| A prop hangs in the air after its support broke | The support was not a destructible, or it did not actually destroy (rolled back) | The support wake only follows committed destruction of a destructible. GetLastSupportWakeCount on the support shows how many bodies were woken |
| A pot falls but does not break | The drop was below MinimumFallHeightCm, fall damage is off, or the landing failed the profile’s power, speed or health rules | Read GetLastFallHeightCm / GetLastFallDamage; compare with ComputeFallDamage and the profile’s gates |
| A statue falls and does not break | Stone generations keep fall damage off | Expected. Enable bEnableFallDamage on its profile and raise FallDestructionPower to at least the profile’s MinimumDestructionPower |
| A prop took fall damage on something that looked like a wall | Only contacts on surfaces facing upward count as landings; a slope less steep than about 78° still does | Check the surface it hit. Wall scrapes, ceilings, Pawns and repeated contacts of one landing are ignored; the damaging hit carries the SDF.Source.Collision.Fall tag |
| A pushed prop reappears at its placed pose after loading | Physics transforms of intact props are not saved | Expected. Reset and load restore the placed pose |
Editor and project
| Problem | Cause | Solution |
|---|---|---|
| Plugin content not visible | Plugin content is hidden in the Content Browser | Content Browser Settings → Show Plugin Content |
Souls Destruction context menu missing | The plugin is not enabled, or the editor was not restarted | Enable the plugin and restart; check the Output Log for load errors |
| Blueprint does not load after removing the plugin | The Blueprint derives from ASDFDestructibleActor | Re-enable the plugin, or rebuild the Actor on your own base class before uninstalling |
| Generated Blueprint fails to open | A managed reference is missing | Run Validate Destructible; it reports OutputMissing or ReferenceMismatch with the affected asset |
Still stuck
Collect the plugin version, engine version, reproduction steps, the issue code and the batch CSV when relevant, then write to support.
Last updated: 2026-10-01