eek.digital

CliperVolume

Real-time volume-based geometry clipping for Unreal Engine.

Drop a BP_CliperVolume into your level, scale it over part of your scene, and the geometry inside the volume disappears — with the cut cross-section filled live by a GPU pass, recomputed every frame. Built for architectural sections, exploded views and cinematic reveals: anywhere you would otherwise be carving meshes by hand.

Version 1.0.0 Unreal Engine 5.8
Showcase — 60-second overview. Watch on YouTube  ·  All CliperVolume videos (playlist)

1. Quick Start

Drop a BP_CliperVolume into your level, scale it over part of your scene, and the geometry inside the volume disappears — with the cut cross-section filled live by a GPU pass, recomputed every frame. Before you can see the clip you need to patch your materials so they know about the volume.

What you get after installing — a tour of the content, windows and settings the plugin adds. Watch on YouTube
  1. Install Copy the plugin folder into your project's Plugins/ directory (or install it through Fab) and restart the editor.
  2. Patch your materials WindowCliperVolumeMaterial Patcher…  Rescan Scene lists the materials used by primitives a registered volume would affect (scene-scoped — not a project-wide /Game scan). Patch Selected inserts MF_CliperClip into the material's Opacity Mask input, flipping Opaque → Masked where needed. Fully reversible per row via Unpatch Selected.
  3. Read-only parents are mirrored, never modified Materials whose parent is read-only engine or marketplace content are not modified: the patcher mirrors the parent into /Game/Cliper/Patcher/ and re-points your instance at the mirror. Unpatch restores the original parent.
  4. Place a volume Drag BP_CliperVolume (in /CliperVolume/Blueprints/) into your level. Scale it to cover the region you want hidden.
  5. Done Geometry inside the volume is hidden and the cut cross-section fills with the volume's Cap Color (unlit, per-volume).
Quick Start — the five steps above, end to end. Watch on YouTube
Before you patch

The patcher tells you what each row will become before you click. The Blend Mode column shows Opaque → Masked on rows that will be converted, and materials that cannot be clipped at all are greyed out with the reason. See What Can Be Patched.

↑ Back to top

2. What Can Be Patched

Clipping works by inserting MF_CliperClip into a material's Opacity Mask pin (Opacity for translucent blend modes). A material can be clipped when that pin is actually live for it. The patcher asks Unreal itself rather than guessing, so the answer always matches what the engine will compile — unsupported rows are greyed out in the list with the reason and cannot be selected.

Supported

Blend modeWhat happens
OpaqueConverted to Masked — shown as Opaque → Masked in the Blend Mode column.
MaskedPatched as-is.
TranslucentClip routes through the Opacity pin. Glass and windows work normally.
AdditiveClip routes through the Opacity pin.
AlphaCompositeClip routes through the Opacity pin.
AlphaHoldoutClip routes through the Opacity pin.

Substrate materials are supported and patch like any other on Opaque, Masked and AlphaComposite.

Not supported

CaseWhy
Material domains other than Surface — Deferred Decal, Light Function, Volume, Post Process, User Interface The clip reads its per-object mask from Custom Primitive Data, which only exists on a primitive placed in the scene. These domains have no primitive to carry it.
Modulate blend mode Unreal does not expose a usable Opacity pin for Modulate, so the clip has nowhere to connect.
Materials whose entire parent chain is read-only (engine, Fab or USD content with no writable instance) There is nothing the plugin is allowed to write and no Material Instance to re-parent. Create a Material Instance under /Game, assign it to the mesh, and patch that.
Authored Substrate materials on a translucent-family blend other than AlphaComposite Only applies to materials built as a Substrate slab graph (the Front Material pin connected). Unreal exposes the Opacity override for AlphaComposite only in that case. Classic materials in a Substrate-enabled project are unaffected.
These are patcher limits, not cap limits

A material being patchable is a separate question from how its cut is filled. Nanite fallback meshes, instanced and skeletal meshes, and World Position Offset each affect the cap rather than the clip — see Limitations.

↑ Back to top

3. Shapes

Each volume picks one shape via the Shape dropdown. Switch at any time — clipping and the cap update immediately.

ShapeWhat it doesProperties
Box Hides geometry inside the actor's scaled (100, 100, 100) cube. None — the scale gizmo defines the box size on each axis independently.
Sphere Hides geometry inside a sphere of radius 50 × Scale.X. Scale on Y/Z is ignored — the sphere stays uniform regardless. None — actor X scale defines the radius.
Capsule Z-aligned cylinder + hemisphere caps. Radius = 50 × Scale.X. Capsule Half Height (cm) × Scale.Z
Shapes — box, sphere and capsule, and how scale drives each. Watch on YouTube

Capsule half height

Half-height comes from the Capsule Half Height property (centimeters) times Scale.Z, clamped so it can never drop below the radius. The default Capsule Half Height of 100 gives a 200 cm pill at default scale.

Analytic caps

Sphere and capsule caps are computed analytically (ray-marched), so the cut edge is an exact curve, not a mesh approximation.

↑ Back to top

4. Cap Appearance

The cut cross-section is filled by a GPU pass every frame. All cap properties live under the volume's CapMesh category.

PropertyDescription
Cap Color Base fill color for the cut. The cap draws after lighting by design, so this shows as-is (no shadows or Lumen on caps). With a pattern or texture fill this is the background the pattern sits on.
Cap Fill What fills the cut: Solid Color (default), the procedural patterns Hatch / Cross Hatch / Dots / Checker, or Texture.
Pattern Color Color of the hatch lines, dots or odd checker cells, drawn over Cap Color. Unused by Solid Color and Texture.
Pattern Spacing (cm) Distance between hatch lines, dot centers or checker cells. Default 10.
Pattern Thickness (cm) Hatch line width or dot diameter, clamped to the spacing at draw time (a thickness at or above the spacing would fill solid). Unused by Checker.
Pattern Angle Rotation of the pattern on the cut face, in degrees. 45 is the drafting convention for hatched section fill, and the default.
Cap Texture The bitmap tiled across the cut face when Cap Fill is Texture. Its alpha blends it over Cap Color, so a masked texture acts as a custom pattern.
Texture Size (cm) World size of one texture tile, in centimeters. Default 100.
Cap fills — solid colour, the four procedural patterns, and texture fill. Watch on YouTube

Patterns are world-scale on the cut face

Spacing, thickness and texture size are world centimeters measured on the cut face, aligned to the volume's own axes. The pattern is therefore locked to the geometry: it does not swim as the camera moves, rotating the volume rotates the hatch with the cut, and scaling the volume does not stretch the density.

Texture fill

Set Cap Fill to Texture, assign a Cap Texture, and set Texture Size (cm) to the world size you want one tile to cover. The texture's alpha blends it over Cap Color, so a masked texture acts as a custom hatch pattern of your own. Leave the texture's sRGB setting ON (the default) so its colors match what the Cap Color picker produces. A missing or unstreamed texture degrades to solid color rather than failing.

Sequencer

Volume properties carry the Interp specifier, so Sequencer discovers them as ordinary property tracks — no custom track types. Enabled, Cap Color, Pattern Color, Pattern Spacing (cm), Pattern Thickness (cm), Pattern Angle and Texture Size (cm) all animate, alongside the actor transform.

Six properties are not animatable — they are switches and asset slots, not curves: Shape, Capsule Half Height, Cap Fill, Cap Texture, Occlude Light and Debug Visualization. The filter lists are arrays and are likewise not animatable.

Sequencer — animating a volume and its cap properties. Watch on YouTube
↑ Back to top

5. Filtering (Whitelist / Blacklist)

By default every volume affects every clippable primitive. To narrow that down, use the filter lists on each volume.

  • Whitelist Actors — drag actors from the World Outliner into the list (or use the eyedropper). Only listed actors get clipped by this volume.
  • Whitelist Tags — plain actor tags. Actors whose Tags array (Actor → Advanced → Tags) contains any of these names get clipped. Useful for tagging large sets without enumerating them. These are ordinary tag names, not Gameplay Tags — nothing needs registering first.
  • Blacklist Actors / Blacklist Tags — exclude specific actors. Only consulted when the whitelist is empty.
  • Whitelist / Blacklist Component Names — the same idea at component granularity, matched against the component's FName.
Filtering — targeting one volume at a subset of the scene. Watch on YouTube

Precedence

The component-name lists run first, then the actor lists. Within each pair the whitelist wins — a non-empty whitelist makes the matching blacklist irrelevant. Filtering is per-volume, so different volumes can target different subsets. Empty whitelist + empty blacklist = affects everything.

↑ Back to top

6. Lighting

Occlude Light (per volume, default OFF) spawns hidden shadow / Lumen proxy meshes for every primitive the volume affects. The proxies sit at the source primitive's world transform and feed the lighting solver as if the clipped wall were still intact — direct sun stays blocked, indirect bounce still behaves, and no light leaks through the cut opening. The visible clip is unchanged; only the lighting sees the wall as solid.

Off by default because most archviz section views want light to spill in through the cut. Toggling reconciles the proxy set on the next tick — no manual rebuild. Static-mesh sources only; skeletal and dynamic-mesh sources are skipped with a verbose log line.

Lighting / Occlude Light — letting light through the cut, or keeping the wall solid to the lighting solver. Watch on YouTube
↑ Back to top

7. Project Settings

Edit → Project Settings → Plugins → CliperVolume. Eight settings, split over two categories: four under Performance, and four more under Performance → Plugin Content.

Project Settings — a walk through all eight, and when to touch them. Watch on YouTube

Group Mask CPD Slot (default 30)

Which Custom Primitive Data slot the per-primitive group mask is written to. Slot 0 collides too often with Quixel tints and colour drives, which is why the default is 30.

Warning

The read side of that slot is authored into MF_CliperClip's CliperPrimMask parameter. Changing this setting silently kills clipping unless you also edit MF_CliperClip to match. The moment you change it, a log line compares your value against the slot the asset is actually authored to read and names both — trust that line rather than any number quoted in documentation, since the asset is what decides. Leave it at 30 unless you know why you are moving it.

Skip Hidden-In-Game Meshes (default ON)

Components flagged hidden in game, or whose owner actor is hidden, are excluded from cap geometry so bounding / trigger helper meshes cannot produce ghost caps.

Max Primitive Half Extent (cm) (default 50000)

Skip primitives whose world half-extent on any axis exceeds this. Keeps sky spheres and world-scale helpers out of cap collection. 0 disables the filter.

Skip Foliage Primitives (default ON)

Foliage HISMs never register. Sectioning through grass produces visual noise, not a useful cut.

Performance → Plugin Content

The remaining four settings decide how much plugin-provided geometry enters the registry at all. They are a cost control, and nothing else — what keeps sky spheres, cloud domes and water out of your caps is the patched-material rule below, not these.

Plugin Actor Policy (default Register All)

How to treat primitives whose owning actor's class comes from a plugin rather than from project content or the engine. Register All Plugin Actors (Recommended) is the default and the recommendation: registration is cheap, and getting this wrong costs you geometry that silently refuses to clip. Skip Code Plugins Only and Skip All Plugin Actors exist for plugin-heavy scenes where registration cost is measurable. Project content under /Game and engine actor classes always register.

Why the default changed

This used to be a single skip anything from a plugin switch, added to keep sky and weather content out of caps. It guessed from the asset's folder, so it was wrong in both directions — it dropped this plugin's own demo content, and because Fab asset packs install under Engine/Plugins/Marketplace/ it silently dropped the furniture and model libraries that are exactly the geometry an archviz user wants to section.

Always Register Plugins / Never Register Plugins

Per-plugin overrides, by plugin folder / .uplugin name. Both are checked before the policy, so an explicit list always beats the heuristic; a name in both lists registers.

Warn On Plugin Actor Skip (default ON)

Logs one warning per plugin the first time its actors are skipped, naming the plugin and the primitive count, so content that silently refuses to clip is diagnosable instead of mysterious.

Per-actor escape hatch

Add the tag CliperInclude to any actor and it registers regardless of every plugin heuristic above. The tag travels with the level, so it works for levels whose author does not control project settings.

Only patched meshes get capped

Clipping happens in the material, so a mesh whose material does not reference MF_CliperClip has no cut — and a cap over a cut that does not exist is a ghost cap. Cap collection therefore skips any mesh that is not patched, and such a mesh gets no cap at all.

This — not Plugin Actor Policy — is what keeps sky spheres, cloud domes, water bodies and weather meshes out of your caps: nobody patches those materials, so they fall out automatically, with no per-plugin allowlist to maintain. It also means the fix for “my mesh isn't capping” is always the same: patch it. The skip is not silent — the first mesh dropped for each material is named in the log at Warning level:

Not capping meshes using '/Game/M_Sky' — it does not reference MF_CliperClip …

Set r.CliperVolume.CapRequiresPatchedMaterial 0 to cap regardless (no rebuild needed). CliperVolume.DumpState reports clipFn= per material slot to audit what the rule is doing, and prints MISMATCH when it disagrees with the material's function list. The Material Patcher window always ignores this rule — it exists to find the meshes that are not patched yet.

When changes take effect

The skip filters are evaluated at registration time, so they apply to newly-spawned actors; existing registrations need an editor restart to be re-evaluated. The Plugin Content settings are the exception: changing them drops the cached per-actor verdicts, so they re-evaluate on the next world sync (about half a second).

↑ Back to top

8. Debug & Diagnostics

Toggle Debug Visualization on any volume to tint its wireframe cyan so it stands out in a busy scene, and to promote that volume's collection diagnostics from Verbose to Log so they appear in the Output Log without reconfiguring LogCliperVolume.

Console commands

r.CliperVolume.GpuCap 0        — kill switch for the whole cap pass; clipping is unaffected
r.CliperVolume.GpuCapDebug 1   — stencil parity heatmap (0 = off)
CliperVolume.DumpState         — one-shot report on the selected actor(s)
Log LogCliperVolume Verbose    — per-primitive registration / resolve logging

GpuCapDebug modes

  • GpuCapDebug 1 — parity heatmap: green = a clean single-solid cut, cyan = nested solids, red/magenta = open or reversed-winding geometry.
  • GpuCapDebug 2 — the cap's far-face depth, blue (far) to white (near).
  • GpuCapDebug 3 — occlusion verdict where the stencil is set: green = the cap is visible, red = the scene occludes it. Use it when parity reads clean but the fill still looks wrong.

CliperVolume.DumpState

Select the mesh that misbehaves and run it. DumpState prints every link in the clip chain: each registered volume with its group bit and whether it holds a clip slot, then per primitive whether it is registered, the expected vs the actual group mask read back from live Custom Primitive Data (neither is visible in the details panel), and per material slot the patch state plus the authored and effective blend mode.

↑ Back to top

9. Limitations

Read this first

Read this before building a shot around the plugin. These are design boundaries, not bugs.

Volume count

  • Maximum 4 simultaneously clipping volumes. Enabled volumes past that are completely inert — they neither clip nor cap. An on-screen viewport error names them and a log warning is emitted; DumpState reports them as clipSlot=NO.
  • Past 32 registered volumes the extras share group bit 31, so they can no longer be filtered apart from each other.

Cap appearance

  • Caps are UNLIT by design — solid colour, procedural pattern or texture, never shaded. Arbitrary cap materials are not supported.
  • The cut silhouette is drawn after the anti-aliasing resolve, so the cap outline is not anti-aliased. Pattern edges inside the cap are — except Checker, which has no AA and can shimmer at grazing angles. Prefer Hatch where that matters.
  • Translucent surfaces in front of a cap: the opaque cap fill draws over them, so window-glass tint does not affect cap pixels behind it.
  • Overlapping volumes: one volume's cap can appear inside another volume's cut region. Avoid overlapping capping volumes.

What can be capped

  • Only patched meshes get capped. A mesh whose material does not reference MF_CliperClip has no cut, so it draws no cap at all — see Only patched meshes get capped.
  • Only closed (watertight), correctly-wound static meshes are capped. Open shells, inside-out meshes and zero-thickness sheets still clip, but their cut draws no cap. Each is named once in the log with the reason.
  • Skeletal and dynamic meshes clip but draw no cap.
  • ISM / HISM instances clip but draw no cap. Their group mask uses per-instance custom data index 0 — if your project already stores its own data there (tint, random seed) it will be overwritten. A warning is logged when that is detected.
  • Packaged builds: mesh verification needs CPU mesh data, which cooking strips. Enable Allow CPU Access on your meshes for editor-identical cap behaviour in a cooked build. Unverifiable meshes are capped as-is, so an open or inverted mesh the editor would have excluded can show parity artifacts there.

Which geometry the cap follows

  • Nanite meshes: the cap is built from the mesh's fallback mesh, not its Nanite cluster geometry, so a heavily decimated fallback makes the cap outline deviate from the rendered cut. Raise the asset's Nanite fallback (Relative Error / Percent Triangles) to tighten the match. A Nanite asset with an empty fallback draws no cap at all. Both cases are named in the log, with the fallback-vs-Nanite triangle ratio.
  • Why: the cap counts every surface crossing along the view ray to decide what is inside solid material. Nanite's visibility buffer only resolves the visible surface, so it cannot feed that count — a conventional triangle mesh has to be rasterized instead.
  • LOD: cap parity always rasterizes LOD 0, the highest-detail conventional geometry the asset has, so a distance-LOD'd mesh's cap can be slightly more detailed than its visible cut (never less).
  • Mixed-material meshes: parity counts every triangle of a closed mesh, including sections whose material is masked or translucent — geometrically solid beats visually transparent.
  • World Position Offset: the clip cuts the displaced surface, but the cap follows the mesh's rest pose — WPO-animated meshes (flags, fabric) can show a cap that does not hug the displaced cut.
  • Very large worlds: the material clip reads float32 volume data, so the clip boundary develops sub-centimeter wobble beyond roughly 10 km from the world origin. The cap itself is camera-relative and unaffected.
↑ Back to top

10. Troubleshooting

A patched material does not clip, but its cut still gets a cap.

The cap never reads materials, so a cap without a clip always points at the material. Select the mesh and run CliperVolume.DumpState. If a slot reports authoredBlend=BLEND_Masked but effectiveBlend=BLEND_Opaque, the asset carries a stale engine flag (bCanMaskedBeAssumedOpaque) inherited from an older engine version. It compiles the opacity mask out of the shader, is invisible in every editor panel, and re-running Patch on that material repairs it.

The other ways a clip goes missing

  • registered=NO — the mesh never reached the subsystem. The line states the reason in brackets; read that rather than guessing. It is not the volume's whitelist or blacklist — those are not consulted at registration at all. Usual causes are a component type that is not a static, dynamic or skeletal mesh (billboards, sprites, text), a foliage owner, or the Plugin Actor Policy.
  • clipSlot=NO — the line states which of the two causes applies, and they have opposite fixes. Volume is disabled means tick Enabled on that volume. Over the limit means more volumes are enabled than the 4 MPC clip slots, so disable a different one.
  • clips=NO — the material does not clip, and the line names which of the four causes applies: not patched, half-patched wiring, an instance overriding Blend Mode to Opaque, or an effective blend mode of Opaque. All but the instance override are repaired by running Patch again.

A mesh clips, but its cut draws no cap.

Most often the mesh is not patched: an unpatched material has no cut, so it gets no cap at all — see Only patched meshes get capped. Otherwise check the capping boundaries in Limitations: skeletal, dynamic and ISM/HISM meshes clip but never cap, and open, inside-out or zero-thickness meshes are excluded with a reason in the log.

↑ Back to top

11. Asset Reference

Plugin content under /CliperVolume/ in the content browser:

PathPurpose
/CliperVolume/Blueprints/BP_CliperVolume The drag-and-drop volume actor (use this).
/CliperVolume/Materials/MF_CliperClip Function the patcher inserts into every clippable material.
/CliperVolume/Materials/MF_CliperRefraction Companion function wired for refractive materials.
/CliperVolume/Materials/MPC_CliperVolume Per-slot volume data (center, extents, rotation).

MF_CliperClip holds the per-slot inside test and reads the group mask from the Custom Primitive Data slot authored into its CliperPrimMask parameter (per-instance custom data index 0 for ISM/HISM). It ships reading slot 30, matching the default setting. Editing it by hand is only needed if you move the Group Mask CPD Slot setting.

↑ Back to top

12. Support

Found a bug? File a repro at fab@eek.digital. Include:

  • The volume shape and scale.
  • Your engine version.
  • A screenshot of the LogCliperVolume output with Verbose enabled (Log LogCliperVolume Verbose).
  • For cap artifacts, a screenshot with r.CliperVolume.GpuCapDebug 1 active.

The same guide is available inside the editor at any time from WindowCliperVolumeDocumentation. Every video on this page is also collected in the CliperVolume playlist.

↑ Back to top