Runtime glass fracture
The Glass destruction mode — impact-centred shard generation at runtime, every FSDFGlassFractureSettings property, the glass composite Actor and preserved material slots.
Glass cannot be pre-fractured the way wood or stone are: the crack pattern radiates from wherever
the blow lands, and that point is unknown until the hit arrives. The Glass destruction mode
therefore bakes nothing. When a valid hit lands on a glass pane, the framework builds a
radial-and-ring crack pattern around the actual impact point, cuts the pane into shards, and
spawns each shard as a real simulated rigid body with convex collision.
- The pattern is deterministic for a given seed: the hit’s seed is used by default, so a replay reproduces the same break.
- Shards ignore pawns by design — the player never trips over broken glass.
- By default shards are persistent, Souls style: they settle where they fall, are frozen at rest,
and count against the world budget’s
MaxSettledDebrisActors.
The mode is selected on the destruction profile (DestructionMode = Glass) and tuned by one
struct, FSDFGlassFractureSettings, on the same profile.
Pattern properties
All distances are centimetres.
| Property | Default | Meaning |
|---|---|---|
ImpactRadius | 45.0 | Radius of the shattered zone around the impact. Panel area beyond it is still consumed by the outer shards, so a small radius means a few large pieces, not a hole |
RadialCrackCount | 9 | Cracks running outward from the impact (3 – 24). Odd counts read better: an even fan looks machined |
RingCount | 3 | Concentric cracks crossing the radials (1 – 6). Rings grow apart as they leave the impact |
ShardCountMin | 8 | Floor on the produced shard count |
ShardCountMax | 18 | Ceiling on the produced shard count. Every shard is simulated, so this is also the body budget |
PositionJitter | 0.35 | Radial displacement of each pattern vertex, as a fraction of its ring spacing |
AngleJitter | 0.30 | Angular wobble of each radial crack, as a fraction of the angle between two cracks |
RandomSeedOverride | INDEX_NONE | Overrides the seed carried by the hit. The default keeps the hit’s seed |
Shard thickness
| Property | Default | Meaning |
|---|---|---|
GlassThickness | 0.6 | Fallback thickness when the source panel is too thin to measure |
bPreserveSourceThickness | true | Use the measured thickness of the source panel when it exceeds the minimum below |
MinimumMeasurableThickness | 0.15 | Below this the source thickness is treated as unmeasurable and GlassThickness is used |
A shard with no volume has no valid convex hull and cannot be simulated — which is why a fallback thickness exists at all.
Shard physics
| Property | Default | Meaning |
|---|---|---|
ImpulseStrength | 320.0 | Base impulse magnitude before distance weighting |
RadialImpulseBias | 0.6 | Share of the impulse pushing each shard away from the impact point, within the panel plane |
NormalImpulseBias | 1.0 | Share of the impulse pushing each shard along the blow direction, out of the panel |
DirectionNoise | 0.18 | Random noise added to each shard’s direction, as a fraction of the impulse |
NearImpactImpulseMultiplier | 2.6 | Shards near the impact carry this multiple of the base impulse; distant ones carry 1.0 |
AngularVelocityMin | 90.0 | Minimum random spin, degrees per second |
AngularVelocityMax | 540.0 | Maximum random spin |
Cleanup
| Property | Default | Meaning |
|---|---|---|
bPersistentShards | true | Shards settle where they fall and stay, like every other Souls debris — frozen once at rest, collision dropped, bounded by MaxSettledDebrisActors, restored by the checkpoint reset |
ShardLifetimeMin | 4.0 | Only read when persistence is off: earliest removal delay |
ShardLifetimeMax | 8.0 | Latest removal delay. Jittered per shard so shards do not all vanish on the same frame |
The glass composite Actor
A stained glass window is not one destructible: it is a stone surround, lead tracery and several
independent panes. When the Glass authoring preset commits a multi-material source mesh, the
pipeline splits it by topological material islands and publishes an ASDFGlassCompositeActor
Blueprint instead of a single-pane setup:
- islands dominated by a preserved structural material become the frame — one Static Mesh component that deliberately receives no destructible component. In SDF, a primitive nothing owns is structurally immune, so stone and metal survive every blow by construction rather than by configuration;
- every glass island becomes an independent pane with its own
USDFDestructibleComponent. Hit routing resolves the touched primitive to the destructible that owns it, so a blow to the left pane shatters the left pane alone.
The Actor’s Blueprint-accessible surface:
| Member | Meaning |
|---|---|
GetPanelCount() | Number of independent panes |
GetPanelComponent(Index) | The pane’s Static Mesh component |
GetPanelDestructible(Index) | The pane’s destructible component |
GetFrameComponent() | The unbreakable frame component |
FrameMesh | Structural mesh (read-only property) |
PanelMeshes | One Static Mesh per pane (read-only property) |
PanelProfile | Glass runtime-fracture profile shared by every pane (read-only property) |
Which materials count as structure
The Glass preset ships PreservedMaterialSlotNames = Stone, Metal, Lead, Iron, Frame,
Wood. Matching is a case-insensitive substring test against the slot name and the material
name. Adjust the list on your own preset to match your naming conventions.
Preserved slots on vessels
The same mechanism serves the pre-baked Glass Vessel preset: islands whose material matches
Cork are released as whole fragments instead of being cut with the glass. A corked bottle breaks
around its stopper; a vessel with no cork-named slot fractures exactly as before.
Limitations
- The runtime pane generator handles thin, roughly planar panels. Curved shells — bottles, lanterns — use the pre-baked Glass Vessel path instead.
- V1 simulates every shard; budget with
ShardCountMax. - Network replication is not implemented, as everywhere else in the plugin.
Last updated: 2026-08-25