Wave Overhang Settings Reference
This document describes every config option added by the wave-overhangs fork of OrcaSlicer, what it does, and how to tune it. For an overview of what wave overhangs are and why they exist, see the main README.
Contents
- What wave overhangs are
- How to enable
- Tier 1: Simple mode
- Tier 2: Advanced tuning
- Known limitations
- G-code markers
What wave overhangs are
Wave overhangs let you print steep cantilevered overhangs without supports. Instead of dropping support columns from the bed, each ring of extrusion anchors to the one before it and the nozzle marches outward into empty space one fused-plastic rung at a time. The generator emits expanding wavefronts seeded at the supported edge of the overhang.
Wave overhangs are angle-agnostic. The trigger is geometric, not an angle threshold: any perimeter Orca's Strength → Detect overhang walls + Overhang reverse threshold pipeline flags as overhang becomes a candidate for wave. So angled overhangs (slopes anywhere between vertical and fully horizontal) are supported, with the wave only filling the part of each layer that protrudes past the previous one. The wave_overhang_min_angle setting on the profile is inert (kept for compat); see its entry under General below for the rationale.
How to enable
- Open a model with an overhang.
- Go to Print Settings → Wave overhangs.
- Toggle Use wave overhangs (Experimental) on.
- Slice. Wave extrusions will appear in the G-code preview wherever overhangs are detected.
Simple mode only shows the master toggle. Switch the top-right mode selector to Advanced to see individual tunables.
Tier 1: Simple mode
One control, always visible.
wave_overhangs
Master on/off switch. When off, none of the other wave-overhang settings have any effect and overhangs are printed with Orca's normal perimeter generator.
- Type: bool · Default:
false
No presets yet. The tunable space is large and the "right" bundles depend on printer, material, and geometry. Rather than ship opinionated defaults now, we want community test prints to surface what actually works. Expect presets to return once there's real data.
Tier 2: Advanced tuning
Every option below appears on the Wave overhangs page in Advanced mode, grouped by section.
General
wave_overhang_min_angle
Soft/metadata-only slope threshold. Currently not enforced; retained on the profile for future use.
- Type: float (°) · Default:
0· Range:0 to 90 - Why it's inert: the actual slope filter for what becomes an overhang is Orca's upstream Strength → Detect overhang walls + Overhang reverse threshold pipeline. By the time a region reaches the wave generator, it has already been classified as
erOverhangPerimeter. A secondary local envelope check (earlier implementations) rejected every legitimate strip because the strip extends roughly one layer-height beyond the supported region by construction. If you want fewer or more overhangs flagged, adjust Orca's upstream thresholds instead. - What to do today: leave it at
0. Use Overhang reverse threshold (Strength tab) to control which walls the slicer considers overhangs.
wave_overhang_min_length
Minimum perimeter length (mm) of a detected overhang below which wave generation is skipped.
- Type: float (mm) · Default:
0.0· Range:0 to 50 - Tuning: raise to 2 to 5 mm to avoid waving tiny overhang fragments (curved corners, small notches) where the travel/seam overhead isn't worth it.
Geometry
wave_overhang_outer_perimeters
Number of outer perimeters preserved inside the overhang region. Everything inward of that becomes wave pattern. Independent of Strength > Walls (wall_loops): if you set this to 1, the overhang zone always has one outer wall + wave regardless of how many walls the rest of the object prints.
- Type: int · Default:
1· Range:0 to unbounded - How it works: the overhang region of the layer is computed from the island geometry (island − lower_slices). The outermost
Nnormal perimeters in that region are kept untouched; inner perimeters are clipped away and replaced by wave pattern. The wave starts exactly where the preserved walls end, so there is no gap between them. - Interaction with
wall_loops: the setting is capped at the effective wall count for the layer. Two cases matter:- If you set
wave_overhang_outer_perimeters = 5butwall_loops = 2, only 2 walls exist, so effectively 2 are preserved and wave fills everything inside. - On topmost layers with
only_one_wall_topenabled, only 1 wall is generated regardless ofwall_loops, so the cap pulls effective preservation down to 1. Without the cap the wave region would be over-shrunk and the slicer would fill the leftover band with bridge paths instead of wave.
- If you set
- Tuning:
1is usually plenty. Raise to2or3for thicker outer shells on structural parts. Set to0for pure wave from the model boundary inward (no outer perimeter, experimental).
wave_overhang_pattern
Travel pattern between wave lines.
- Type: enum (
monotonic|zigzag|smart) · Default:smart
| Choice | Behavior |
|---|---|
monotonic |
Each line printed independently, same direction. Safest flow consistency, most travel. |
zigzag |
Lines connected into a back-and-forth meander. Minimum travel, but start-of-line is sometimes on the unsupported side. |
smart |
Starts each line from the better-supported end. Best default. |
wave_overhang_perimeter_overlap
Extends the wave propagation boundary outward toward kept perimeter lines so the outermost wave sits closer to the shell.
- Type: float (mm) · Default:
0.1· Range:0 to unbounded - Tuning: raise toward
0.2 to 0.3if you see a visible gap between the last wave ring and the outer perimeter. Too high can cause wave lines to print into the perimeter.
wave_overhang_minimum_width
If a neck in the wave region is narrower than this width, insert a thin split there before propagation so fragile wave branches do not form.
- Type: float (mm) · Default:
0.7· Range:0 to unbounded - Tuning: raise to split more aggressively if wave rings skip over thin necks between lobes. Lower to
0to disable splitting.
wave_overhang_line_spacing
Center-to-center distance between adjacent wave extrusions.
- Type: float (mm) · Default:
0.35· Min:0.01 - Tuning: tighter (0.28 to 0.30) = denser fill, stronger, slower, risk of over-extrusion on cantilevers. Wider (0.40 to 0.50) = faster, visible gaps between rings, weaker.
wave_overhang_flow_mm3_per_mm
Absolute volume of plastic extruded per millimetre of wave-overhang line. Replaces the old wave_overhang_flow_ratio.
- Type: float (mm³/mm) · Default:
0.16· Range:0.02 to 1.5 - Why absolute (not a ratio): a wave-overhang line hangs in air, not squished against a layer below. Nothing to squish into means layer height has no effect on the bead's cross-section; the bead size is set by nozzle bore and mm³/mm extrusion rate alone. An absolute mm³/mm captures that directly.
- Why 0.16: equals
nozzle²for a 0.4 mm nozzle, which also matches the oldflow_ratio = 2.0at 0.2 mm layer height. - For other nozzle sizes: use
nozzle_diameter²as a starting point. 0.3 mm → 0.09, 0.5 mm → 0.25, 0.6 mm → 0.36, 0.8 mm → 0.64. The setting is not automatically adjusted when you change the printer profile, so update it by hand if you move between nozzle sizes.
Tuning guide:
- Start at
0.16(ornozzle²for your nozzle) and print. - If wave lines look thin / starved / broken: raise by 10 to 20 % (e.g. 0.18 to 0.20 for a 0.4 mm nozzle).
- If wave lines blob or merge: lower by 10 to 20 % (e.g. 0.13 to 0.14).
wave_overhang_end_retract_length
Forced retraction (in mm) emitted at the end of every wave-overhang line. Independent of the filament's normal retraction settings.
- Type: float (mm) · Default:
0.0· Range:0 to 10 - Why: wave lines finish in mid-air, so residual nozzle pressure dribbles a small blob that sticks to the next travel path or piles up against the enclosing perimeter. Orca's normal retraction is travel-distance-gated; short inter-wave travels often don't cross the threshold, so most wave line ends never retract.
- What it does: after each wave line, emits
G1 E-<length> F...(labelled; WAVE_OVERHANG_ENDin the G-code). The next wave line's lead-in travel automatically unretracts via the filament's existing state tracking. - Tuning:
0= disabled, use normal retraction heuristic (current behaviour for existing profiles). Start at0.4 to 0.8 mmif you see end-of-line blobs or over-extrusion piled against the outer perimeter; raise until the artifacts go away. Above1.5 mmyou risk under-extrusion at the start of the next line.
wave_overhang_spacing_mode
How ring-to-ring step varies across the wave.
- Type: enum (
uniform|progressive) · Default:uniform uniform= constant step.progressive= tight at the supported root, widens toward the cantilever tip (better anchoring, slightly weaker tip).
wave_overhang_seam_mode
Direction pattern across successive rings.
- Type: enum (
alternating|aligned|random) · Default:alternating
| Choice | When to use |
|---|---|
alternating |
Boustrophedon (zig-zag). Minimum travel. Default. |
aligned |
Every ring same direction, for more consistent flow, at the cost of extra travel jumps between rings. |
random |
Scatters seam start points to hide the visible seam on show faces. |
Propagation
These control the wavefront propagation.
wave_overhang_min_new_area
Terminate propagation when a new wavefront adds less than this much new area.
- Type: float (mm²) · Default:
0.01· Range:0 to 100 - Mode: Develop (not in Advanced page by default; expose via Develop mode).
- Tuning: lower to keep propagating deep into tight regions; raise to terminate early on diminishing returns.
wave_overhang_max_iterations
Safety cap on the generator's main loop: max wavefronts per overhang region.
- Type: int · Default:
0(= unlimited) · Range:0 to 500 - The generator stops naturally when it can't grow further; this is a hard cap for pathological cases or to bound print time on very large overhangs.
Speed
wave_overhang_print_speed
Print speed for wave extrusions.
- Type: float (mm/s) · Default:
2.0· Min:0.1 - Tuning: slower = better cooling and adhesion of cantilever rings.
1.5 to 2.5mm/s is the usual useful range. Going above ~5 mm/s defeats the point of wave overhangs.
wave_overhang_travel_speed
Travel speed within wave regions between non-extruding hops.
- Type: float (mm/s) · Default:
40.0· Min:1.0 - Save-only in the current build; see Known limitations.
Cooling
wave_overhang_fan_speed
Part-cooling fan percentage forced during wave extrusions.
- Type: int (%) · Default:
100· Range:0 to 100 - Save-only in the current build; see Known limitations.
- Tuning: keep at 100 % for PLA/PETG. Drop to 40 to 60 % for ABS/ASA to reduce warping, but note cantilever rings benefit hugely from fast cooling.
Floor layers
wave_overhang_floor_layers
Number of solid floor layers placed directly above a wave region. Authoritative: this value overrides Orca's bottom_shell_layers behavior within the wave shadow. N means exactly N solid layers above the wave, not N-plus-whatever-bottom-shell-layers-adds.
- Type: int · Default:
2· Range:0 to 20 N = 0= zero solid layers above the wave footprint. The layer directly above the wave strip goes straight to sparse infill. Use for max material savings on purely aesthetic overhangs.N = 2(default) = two solid-infill layers above the wave before sparse infill resumes. Standard mechanical backing.N = 3+= heavier structural cap (slower, more filament, but stiffer).- All N layers are
stInternalSolid(regular solid infill); no bridge classification is used, since these layers sit on top of the wave extrusions (which are solid material) rather than spanning air. Layer L+1 was previously misclassified asstBottomBridgeand rendered as "Internal bridge" in the preview; that has been fixed so the whole floor window is uniform solid infill. - Interaction with
bottom_shell_layers: inside the wave shadow, the floor_layers value wins. Outside the wave shadow, Orca's normal shell rules still apply. Implementation: each affected layer gets awave_overhang_shadow_polygonsmask that is subtracted from the bottom-shell seed set in bothdiscover_vertical_shellsanddiscover_horizontal_shells, preventing further solid propagation above N.
Support integration
support_remaining_areas_after_wave_overhangs
When wave overhangs are on, generate supports only for overhang areas that weren't filled by wave toolpaths.
- Type: bool · Default:
false - Explicit support enforcers still apply normally.
- Tuning: turn on for conservative prints where wave coverage might miss edge cases; you get supports only where the wave algorithm gave up.
Debug
wave_overhang_debug_gcode
Emit ;WAVE_OVERHANG_START / ;WAVE_OVERHANG_END comments around wave extrusions and ;WAVE_OVERHANG_CONFIG banners at region boundaries.
- Type: bool · Default:
true - Comments only; no effect on the actual print. See G-code markers for format.
Known limitations
All user-facing options are now plumbed end-to-end. The table below notes mode exposure and any gotchas.
| Option | Status |
|---|---|
wave_overhang_print_speed |
Fully plumbed; per-path speed override. |
wave_overhang_travel_speed |
Fully plumbed; GCodeWriter::travel_to_* extended with optional per-move override, applied around wave extrusions. |
wave_overhang_fan_speed |
Fully plumbed; new ;_WAVE_OVERHANG_FAN_START/END marker emitted around wave paths and handled in CoolingBuffer to drive the part-cooling fan percentage. |
wave_overhang_min_angle |
Inert (save-only). Kept on the profile but not enforced; Orca's upstream Detect overhang walls + Overhang reverse threshold (Strength tab) is the real slope filter. See key description above. |
support_remaining_areas_after_wave_overhangs |
Fully plumbed; residual polygons (wave-uncovered area) are collected and passed into Orca's support generation as enforcer regions. |
wave_overhang_min_new_area |
Develop mode only. |
G-code markers
When wave_overhang_debug_gcode = true (the default), four kinds of comments appear in the output. They are pure comments (no motion, no effect on the print), but they're invaluable for verifying that waves were emitted and for bug reports (the full wave setup can be reconstructed from the header alone).
Build context (once, before any region banners):
; WAVE_OVERHANG_BUILD printer="<model>" printer_variant="<nozzle/variant>"
filament_type=<PLA|PETG|...>
layer_height=<mm> initial_layer_height=<mm>
nozzle_diameter=<mm>
nozzle_temp=<C> nozzle_temp_initial=<C>
filament_flow_ratio=<ratio>
(Emitted as a single line; split here for readability.)
Region banner (once per wave region, before any extrusion):
; WAVE_OVERHANG_CONFIG region=<N> outer_perim=<int>
spacing=<mm> width=<mm> flow_mm3_per_mm=<x> speed=<mm/s> travel=<mm/s> fan=<%>
floor_layers=<int> min_angle=<deg> min_length=<mm> max_iterations=<int>
pattern=<smart|monotonic|zigzag> spacing_mode=<uniform|progressive> seam_mode=<alternating|aligned|random>
perimeter_overlap=<mm> minimum_wave_width=<mm>
min_new_area=<mm²>
support_remainder=<0|1>
(Emitted as a single line in the G-code; split across lines here only for readability.)
Extrusion block markers (wrap every wave extrusion):
; WAVE_OVERHANG_START
G1 X... Y... E...
...
; WAVE_OVERHANG_END
Verifying waves were emitted: slice your model, then grep the output for WAVE_OVERHANG_START. No matches means either Orca's upstream overhang-wall detection didn't flag any regions (check Strength → Detect overhang walls / Overhang reverse threshold), wave_overhangs is off, or your min_length threshold filtered everything. If you want the markers off for a production print, set wave_overhang_debug_gcode = false.