Surface presets¶
What every preset field does, and the order to tune them in.
The shipped presets already carry these values. GP_Concrete, GP_Brick
and the others in /GridDestruction/Presets/ are ready to use, so you do not
type anything from this page to get a working wall. The value tables are folded
away: open them when you make a preset of your own, want to compare materials,
or need to get back to the shipped numbers after experimenting.
Three assets carry them, and the split matters:
| asset | answers |
|---|---|
GridSurfaceMaterialDataAsset (shipped: DA_GridSurfaceMaterials) |
how this material fails: shared by every wall made of it |
GridWallPreset (shipped: GP_*) |
what this wall is: thickness, density, how much of it may go |
GridCollapseVisualComponent on the wall |
what its rubble does after it falls |
Use one project-wide surface material asset and reference it from every preset.
A surface type missing from its Configs map falls back to neutral values, so a
partial map is valid.
Editing the numbers: GridMaterials.csv¶
Every number in tables 1 and 2 lives in one spreadsheet, Config/GridMaterials.csv
in the plugin's folder: one column per preset, one row per field, and a Notes
column saying what each does. The plugin's folder is Plugins/GridDestruction/
in your project, or Engine/Plugins/Marketplace/GridDestruction/ for a Fab
install. Edit the CSV in Excel, Google Sheets or a text editor, then in the
editor choose Tools → Execute Python Script and pick
scripts/ue_apply_material_table.py from the same folder. The Python Editor
Script Plugin must be enabled (it is by default).
It creates or updates each column's preset (row Asset) and its entry in the
surface material asset (DA.* rows), then presses Apply Preset on every wall in
the open level that uses one of them. Save the level afterwards. The log
prints each field it changed as old -> new.
- An empty cell leaves that value alone.
- Point
Assetat your own preset to tune it from the table; add a column for a second kind of brick. Two columns of oneSurfaceTypemust agree on theDA.*rows, and the script stops if they do not. WallMeshandWallMaterialtake asset paths. A preset the script created has neither, so fill them before a wall uses it.- Masks, effects and
CapEdgesstay on the assets. - The CSV wins. A value you changed by hand in the editor is overwritten on the next run unless its cell is empty.
- It reaches only walls in the open level whose preset is a column. In
another level using the same presets, run it there too or press Apply Preset;
a wall that missed it logs
GRIDSTAMPat BeginPlay.
Work on copies
Copy the shipped GP_* presets and the surface material asset into your
project, and point the CSV's Asset and SurfaceMaterialData rows at the
copies. A plugin update then never overwrites your tuning.
Table 1: the surface material asset¶
DA_GridSurfaceMaterials → Configs → one row per surface type.
Shipped values: open the table
| Concrete | Brick | Stone | Wood | Metal | Glass | |
|---|---|---|---|---|---|---|
DamageResistance |
1.0 | 0.9 | 1.4 | 0.6 | 2.0 | 0.3 |
FalloffScaleU |
1.0 | 1.6 | 0.9 | 3.0 | 0.8 | 1.2 |
FalloffScaleV |
1.0 | 0.7 | 0.9 | 1.0 | 0.8 | 1.2 |
SmoothingAngleDeg |
30 | 25 | 20 | 35 | 60 | 15 |
RicochetAngleDeg |
15 | 15 | 18 | 10 | 30 | 0 |
GrazingDamageScale |
0.35 | 0.35 | 0.30 | 0.50 | 0.10 | 1.0 |
EdgeProfile.Style |
Rounded | Square | Rounded | Shard | Rounded | Shard |
EdgeProfile.AmplitudeU |
0.30 | 0.30 | 0.25 | 0.30 | 0.08 | 0.35 |
EdgeProfile.AmplitudeV |
0.30 | 0.04 | 0.25 | 0.06 | 0.08 | 0.35 |
EdgeProfile.QuantiseU |
0 | 0.15 | 0 | 0 | 0 | 0 |
EdgeProfile.QuantiseV |
0 | 0 | 0 | 0 | 0 | 0 |
EdgeProfile.DepthNoise |
0.25 | 0.15 | 0.30 | 0.20 | 0.05 | 0.10 |
bBrittle |
false | false | false | false | false | true |
BrittleBreakFraction |
0.35 | 0.35 | 0.35 | 0.35 | 0.35 | 0.35 |
BrittleShardSizeCm |
12 | 12 | 12 | 12 | 12 | 12 |
Why each column looks the way it does¶
- Concrete is the reference: resistance 1.0, chaotic spall on both axes, a circular blast. Every other column is a departure from it.
- Brick fails along its courses.
QuantiseU 0.15againstAmplitudeU 0.30gives discrete levels that read as mortar joints rather than noise, andAmplitudeV 0.04keeps the courses straight.FalloffScaleU 1.6against0.7spreads a hit sideways along a course instead of down through one. - Stone is the hardest masonry: high resistance, the highest
DepthNoiseso the crater surface is rough, and a low smoothing angle so chips stay faceted. - Wood splits along the grain:
FalloffScaleU 3.0against1.0makes a hit reach three times as far along the grain as across it. U and V are the visible texture's axes, so rotatingWall | UVby 90° for upright boards turns the grain with them. - Metal deforms rather than breaks: the highest resistance, the smallest edge amplitude and a 60° smoothing angle, so it reads as bent sheet.
- Glass shatters: the lowest resistance, the largest amplitude and a hard 15° smoothing angle.
The fields¶
DamageResistance- How much of each bite this material takes. It changes how many shots a wall takes and almost nothing about how it looks. Thickness is the real durability knob; resistance saturates once a blast is deep enough to open a cell.
FalloffScaleU/FalloffScaleV- The blast's shape along and across the texture. The single most recognisable knob, and it costs nothing.
SmoothingAngleDeg- Normals are smoothed across folds flatter than this.
-1means unset (the wall mesh component's own value),0is flat shading. An angle aboveatan(halfThickness / cellSize)never engages: at 10 cm cells and 15 cm thickness that limit is 37°. RicochetAngleDeg/GrazingDamageScale- What a shallow hit takes off. The angle is measured off the surface: 90
is straight on, 0 is along the wall. Below it the bite ramps down to
GrazingDamageScaleat 0°. A ricochet angle of 0 means the material never grazes. KeepGrazingDamageScaleabove 0 for anything that spalls: a skipping round still ploughs a furrow, and a shot that leaves no mark reads as a broken wall. The plugin decides how much material came off; whether the projectile deflects, sparks or stops is your weapon's call, usingObliquityandbGrazingin the damage result. EdgeProfile.Style- How a hole's outline is drawn.
Squarefollows the cells' sides, honest for brick.Shardcuts outward corners on the diagonal, so a staircase becomes a straight cut.Roundedrelaxes the contour so stairs become straight runs and corners round off. Render only: the collider stays on the cells. EdgeProfile.AmplitudeU/V,QuantiseU/V,DepthNoise- The rim's jitter in the wall's plane, its banding, and the roughness of the
crater's floor. Amplitude above 0.40 is refused: two neighbouring
vertices would swap places. Keep
Quantisearound half the amplitude; at twice the amplitude or more every vertex rounds to zero and the axis has no jitter at all. Apply Preset warns about both. bBrittle,BrittleBreakFraction,BrittleShardSizeCm- A brittle cell is whole or gone, so a pane never shows a dish or a dent.
BrittleBreakFractionis the share of a cell's thickness one hit must take to break it for certain; smaller hits break it with a proportional chance, so a blast's edge cracks unevenly and repeated hits always get through. Lower it for thin panes, raise it for laminated glass. The pane is divided into irregular shards aboutBrittleShardSizeCmacross, and a hit breaks out whole shards connected to the impact. The roll is made on the server, so every machine sees the same holes.
Two kinds of brick¶
SurfaceType has six values and no Custom. That is deliberate: the enum is a
lookup key for "what is this physically", for effects and sounds. Everything
that differs between a red brick and a grey one lives on the preset.
| You want | Do this |
|---|---|
| Two brick walls that break differently | Two presets, both SurfaceType = Brick |
| ...that also resist differently | Point their SurfaceMaterialData at two different data assets |
| Glass that shatters vs glass that spiders | Two presets, different FractureWeightMask |
Table 2: the wall preset¶
Shipped values: open the table
| Concrete | Brick | Stone | Wood | Metal | Glass | |
|---|---|---|---|---|---|---|
ThicknessCm |
25 | 20 | 40 | 8 | 4 | 2 |
CellDensity |
4 | 4 | 3 | 5 | 5 | 6 |
SubdivisionFactor |
2 | 4 | 2 | 2 | 1 | 1 |
StructuralThreshold |
0.25 | 0.30 | 0.20 | 0.40 | 0.15 | 0.60 |
MaxOverhangCm |
200 | 150 | 120 | 150 | 300 | 60 |
MaxDestructionPercent |
1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
MinSpallRadiusCells |
1.5 | 1.4 | 1.2 | 1.6 | 0.8 | 1.5 |
ExitSpallDepthScale |
0.35 | 0.40 | 0.30 | 0.45 | 0.15 | 0.40 |
ExitSpallRadiusScale |
1.6 | 1.7 | 1.5 | 1.8 | 1.2 | 1.2 |
ObliquityStretch |
1.0 | 1.2 | 0.8 | 1.2 | 0.6 | 0.4 |
ObliquitySkew |
1.0 | 1.2 | 0.8 | 1.2 | 0.6 | 0.4 |
BreachFalloffCells |
3.0 | 2.5 | 3.5 | 2.5 | 1.5 | 4.0 |
FractureNoise |
0.40 | 0.30 | 0.45 | 0.30 | 0.10 | 0.20 |
FractureNoiseScaleCm |
20 | 20 | 25 | 10 | 15 | 15 |
FractureMaskContrast |
2.0 | 2.0 | 2.0 | 2.0 | 2.0 | 2.0 |
bDeriveFractureMaskFromMaterial |
true | true | true | true | false | false |
SpikeSuppressionChance |
0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 |
MinSupportingNeighbours |
2 | 2 | 2 | 2 | 2 | 2 |
HoleRimThicknessFraction |
0.10 | 0.12 | 0.10 | 0.18 | 0.30 | 0.45 |
EdgeCrumbleScale |
1.0 | 1.0 | 1.0 | 0.8 | 0.25 | 0.9 |
RevealCrushScale |
1.5 | 1.8 | 1.3 | 2.0 | 1.0 | 2.5 |
CornerChipScale |
4 | 4 | 4 | 4 | 0 | 0 |
EdgeFirst |
1 | 1 | 1 | 1 | 0 | 0 |
DentStepCm |
3 | 4 | 4 | 2 | 0 | 0 |
CapEdges |
per placement |
Size and structure¶
ThicknessCm,CellDensity- How deep the wall is, and cells per metre. Bigger cells hold more depth, so a wall that opens with no dent first wants a lower density or more thickness.
SubdivisionFactor- A cell splits into
factor × factorfine children on its first bite. Detail, and its cost on the wire, exist only where the wall was hit. Raise it when aMASKSCALEline asks for it, or when an edge on show looks too smooth. StructuralThreshold- The remaining fraction below which a cell stops carrying load. Wood gives up its load path long before it opens; reinforced concrete carries down to a shell; glass sheds whole panes at the first serious crack.
MaxDestructionPercent- The share of the wall that shooting may remove:
0for a level boundary,0.3for a load-bearing element. Per wall, not per material, which is why the row is uniform. It gates shooting only: a severed piece still falls, and a collapse counts against the cap.
MaxOverhangCm and BuiltOverhangs¶
A cell is held only if it is within MaxOverhangCm sideways of a column that
stands on, or hangs from, a support. Up and down are free on an upright wall, so
an intact wall always stands; a cantilever longer than the limit loses its tip,
and a beam held at both ends spans twice the limit. On a ceiling or floor neither
axis is free.
- Keep it above half the widest opening with no wall under it, or the lintel over it falls on the first hit anywhere on the wall.
0turns it off. The limit is rounded down to whole cells.
What was built stands: the limit counts from how far a wall reached when damage
first came to it, so it drops only what damage leaves overhanging. A wall built
past the limit logs an OVERHANG line once. BuiltOverhangs on the preset
(Wall | Durability, advanced) picks a stricter rule:
| value | a span built past the limit |
|---|---|
Keep (default) |
stands; the limit judges only what damage leaves |
SettleSilently |
is gone when the level starts, with no debris or sound |
Collapse |
comes down when the level starts, with debris and falling pieces |
Shape of a hit¶
MinSpallRadiusCells- The crater of a hit that brings no radius of its own (
RadiusCm = 0). A weapon that passes a radius keeps it on a wall that subdivides, so a small round can leave a small mark without a denser grid; atSubdivisionFactor1 this is the floor under every hit. If an edge looks too smooth, lower it to 0.8–1.0 on brick and concrete for a more local bite, and raiseFractureNoiseto keep small holes from reading as squares. Do not take it to 0. ExitSpallDepthScale,ExitSpallRadiusScale- The blowout of the far face, as a fraction of the wall's thickness and a
multiple of the hit's radius. It starts once the deepest cell in a hit is
eaten past
ThroughCouplingThresholdof the thickness (0.8 by default, on the wall's GridData component). Brittle materials throw more off the back; metal petals instead.0switches it off for the material. ObliquityStretch,ObliquitySkew- A glancing hit becomes a furrow instead of a dish. The stretch lengthens the crater along the shot's direction; the skew slides it forward. Keep the two equal: that pins the trailing edge where a square-on crater's would be and sends all the added length forward. Below it the crater grows backwards, above it the crater leaves the impact point.
FractureNoise,FractureNoiseScaleCm- Varies each cell's resistance by a fixed amount, so a small hole does not read as a square. Above about 0.6 the rim turns noisy and specks survive inside holes. Clamped at 0.9.
FractureMaskContrast,bDeriveFractureMaskFromMaterial- Strength of the break pattern, and whether it comes from the wall material's height map. See Setup → Where the wall breaks.
SpikeSuppressionChance,MinSupportingNeighbours- Clean slivers off a hole's rim. A cell with fewer standing neighbours than
the minimum is pruned with this chance. The chance is 0.7 on purpose: a rim
with every spike pruned reads as machined. Keep the minimum at 2: higher
strips the rim of every hole. By default the chance follows the break
pattern, so brick cleans up along its joints and keeps its teeth on the
bricks.
SpikeSuppressionMaskpaints it per wall;SpikeMaskStrengthsets how far a mask moves it.
Edges and rims¶
HoleRimThicknessFraction- The band of wall left standing at a hole's edge, as a fraction of the thickness: what makes a hole read as a break in a solid rather than a cut in paper. Thin materials need more to show anything. It is also depth the crater cannot reach, so too much flattens craters; above about 0.5 a hole reads as a bevelled port.
EdgeCrumbleScale- How much an exposed edge (a capped side, a reveal) wanders as it erodes:
crisp when intact, the material's own jitter when eaten. It needs a real
EdgeProfileamplitude to show. RevealCrushScale- A shot into a side (a reveal, a capped end, the bore of a hole) cuts that
side along its own normal by
PeakDepthCm × RevealCrushScale.0makes such a shot an ordinary face hit. CornerChipScale- A shot at the face near an edge also chips the edge. Values near 1 make an
edge give way about as fast as a shot straight into it; the shipped 4 makes
corners crumble visibly faster than the face. Lower it toward 1–1.5 for a
sturdier look.
0switches it off. EdgeFirst- In a cell at an edge, a face hit dents the face by
1 − EdgeFirstof its bite. At 1 the corner crumbles away before the face behind it gives. Does nothing whileCornerChipScaleis 0. DentStepCm- Dents are drawn in whole steps of this depth, so a hit drops a chip instead of
crumpling the face. A hit shallower than one step leaves the geometry flat
and is shown by the damage material. The collider uses the same steps.
0draws the exact depth. BreachFalloffCells- Purely visual: how far, in cells, the "near a hole" channel of the damage material reaches. Glass at 4.0 is the deliberate outlier: its cracks radiate far past what was removed.
CapEdges: closing the wall's own sides¶
Per placement, not per material. A wall's outer perimeter is open by default, because most walls are seated in a frame or a facade. Tick the sides a player can see:
| the wall is | tick |
|---|---|
| seated in a frame, or flush between two others | nothing |
| protruding from another wall at 90° | the exposed end only |
| a free-standing barricade or a pillar of wall | all four |
| a panel whose top the player can see over | Top |
A cap breaks with the wall: it is built from the same cells as a hole's rim. If
a capped edge looks like a knife edge, raise HoleRimThicknessFraction.
Table 3: rubble¶
On the wall's GridCollapseVisual component, not on the preset.
Shipped values: open the table
| Concrete | Brick | Stone | Wood | Metal | Glass | |
|---|---|---|---|---|---|---|
DebrisMassScale |
1.0 | 0.9 | 1.3 | 0.35 | 0.8 | 0.5 |
ChunkLifetimeSeconds |
1.6 | 1.6 | 2.0 | 1.4 | 1.4 | 1.0 |
KeepSettledAboveSizeCm |
0 | 0 | 0 | 0 | 0 | 0 |
- Mass comes from the physical material first. Set
PhysicalSurfaceon the preset;DebrisMassScaleis taste on top. Leave it at 1.0 until the physical materials are in place. - Keep
KeepSettledAboveSizeCmat 0 in multiplayer (it is read as 0 in any networked game). Rubble never replicates, so a piece left standing would be cover in a different place on every client that nothing can remove.
| knob | default | raise it when | lower it when |
|---|---|---|---|
SettleLinearVelocityThresholdCmS |
2.0 | rubble twitches instead of resting | a chunk freezes in the air |
SettleHoldSeconds |
0.5 | a chunk freezes in the air | settled rubble simulates longer than needed |
EjectImpulse |
400 | chunks fall back into the hole they made | chunks fly like litter |
TumbleDegreesPerSecond |
45 | rubble reads as rigid | rubble spins like a prop |
The first two are clamped to a safe range when read. A wall carrying an
out-of-range value says so once at BeginPlay in a HANGRISK line.
Where each knob lives¶
| knob | lives on | survives Apply Preset? |
|---|---|---|
| table 1 | the surface material asset → Configs[SurfaceType] |
read live |
| table 2 | GridWallPreset |
stamped, so the preset wins |
bAutoLinkSeams, SeamToleranceCm |
GridWallPreset |
stamped |
AnchorEdges |
the placed wall's GridData, Grid | Anchors | not stamped: edit it on the wall |
ThroughCouplingThreshold, ThroughCouplingScale |
the placed wall's GridData, Grid | Config | not stamped: edit them on the wall |
bEmitDamageAttributes |
the placed wall's GridWallMesh, Grid | Visual | not stamped: edit it on the wall |
| table 3 | the placed wall's GridCollapseVisual | not stamped |
Checking that a wall runs what the preset says¶
GridDestruction.CheckPresets
GRIDSTAMP [BP_Wall_Brick_7]: MATCH against preset 'GP_Brick' — ...
GRIDSTAMP [BP_Wall_Brick_9]: STALE against preset 'GP_Brick' — 1 field(s) differ:
MinSupportingNeighbours live=2 preset=3. ...
GRIDSTAMP SUMMARY: 11 wall(s) — 1 stale, 0 without a preset, 10 current.
STALE means your edit never reached that wall: press Apply Preset on it and
save the level. MATCH means the wall really runs the asset's values, so a knob
that still looks inert is not a stamping problem. The same check runs on its own
at BeginPlay on the server, and Log Preset Stamp Drift beside Apply Preset
checks one wall. It reports and never corrects: a value set on the component
alone is a legitimate per-wall override.
A Blueprint's own Class Defaults override the C++ defaults. If a knob does nothing, look at the placed actor's Details panel before anywhere else.
Tuning order¶
The tables are meant to be right on the first build. When a wall does not look like its material, work in this order, because each step changes what the next one is looking at. Change one number at a time.
1. Silhouette: does the hole have the right shape?¶
Look at one hole from the front.
| what you see | do |
|---|---|
| the hole is a square | raise FractureNoise, or give it a break pattern |
| the rim is noisy rather than rough | lower FractureNoise below 0.6 |
| specks of wall survive inside the hole | lower FractureNoise, or raise SpikeSuppressionChance |
| the rim has no teeth | raise EdgeProfile.AmplitudeU/V, or lower SpikeSuppressionChance |
| brick cracks through the bricks, not the joints | give it the material's height map, or raise FractureMaskContrast |
2. Thickness: does the hole read as a break in a solid?¶
Look at the same hole from an angle.
| what you see | do |
|---|---|
| the edge is a knife edge | raise HoleRimThicknessFraction |
| a visible band, but the crater looks shallow | lower it |
| the wall's own outer edge is open | tick the right CapEdges |
| a shot at a doorway's reveal dents the face | raise RevealCrushScale |
| a shot at the face next to an edge never chips it | raise CornerChipScale |
| the rim looks like the face, not like broken material | use the damage material |
3. Depth: does a hit dent before it opens?¶
Shoot the same spot repeatedly.
| what you see | do |
|---|---|
| the wall opens with no dent first | lower CellDensity, or raise ThicknessCm |
| the crater is a flat disc | raise EdgeProfile.DepthNoise |
| the crater bottoms out early | lower HoleRimThicknessFraction |
| the far face stays flat until it opens | lower ThroughCouplingThreshold on the wall, or raise ExitSpallDepthScale |
| holes are crisp but cost too much | lower SubdivisionFactor; see Multiplayer |
4. Identity: is it the right material?¶
The three knobs that carry most of a material's identity, in order:
FalloffScaleU/V, SmoothingAngleDeg, EdgeProfile.QuantiseU.
DamageResistance comes last: it changes how many shots a wall takes, not how
it looks.
Then fire along the wall:
| what you see | do |
|---|---|
| a glancing hit leaves the same disc as a square one | ObliquityStretch is 0: type table 2's row |
| the furrow reaches behind where the round touched | raise ObliquitySkew to equal ObliquityStretch |
| the crater has left the impact point | lower ObliquitySkew below ObliquityStretch |
| a glancing hit on steel digs as deep as a square one | RicochetAngleDeg is 0: type table 1's row |
5. Weight: does the rubble belong to the wall?¶
Author PhysicalSurface physical materials before touching DebrisMassScale.
6. The overlay: does the damage read as damage?¶
See Damage material.