CSG Toolkit 1.8.0
This release is a major internal rework of the procedural generator nodes with a strong focus on performance, persistence, and correctness, plus two new distribution modes for the spreader.
✨ Highlights
CSGSpreader3D — two placement modes
- Volume mode: scatter inside a movable, gizmo-editable area node (
CollisionShape3Dor any node containing one). The volume has a visible wireframe and its own transform — no more scattering blind around the node origin. Box / Sphere / Cylinder / Capsule with volume-correct uniform distribution. - Surface mode (new): raycast instances onto scene geometry (CSG combiners,
MeshInstance3D) with optional normal alignment, slope filtering, overhang detection, and surface offset. Works on plain CSG blockouts withoutuse_collision— target meshes are extracted automatically. - Spatial-hash collision avoidance: minimum-distance rejection is now near-constant time per candidate instead of O(n²) — comfortable with thousands of instances.
CSGRepeater3D — better patterns & variations
- New NoisePattern (FastNoiseLite) alongside Grid / Circular / Spiral
- Per-axis position jitter joins rotation and scale as a full variation group
- Spiral fix:
total_height = 0now means flat (previously it silently climbed by the template height); the old behavior is opt-in viause_template_height - Pattern resources are auto-detected as edits — no manual refresh needed
Bake — non-destructive and persistent
- Bake now moves the generated instances into a
Baked_<Generator>container under the scene root, keeping world transforms — the generator stays free to keep previewing - Baked content survives save/reopen (previous builds could lose the inner CSG children or regenerate over the bake)
- Fully undoable; want a standalone file? Right-click the container → Save Branch as Scene
Performance
- Freeze-to-mesh: above
freeze_threshold(default 200) instances the preview collapses into a single mesh — orbit, select and edit at full speed; unfreeze any time from the top toolbar - Debounced regeneration: dragging properties rebuilds once when input settles, not once per frame
- Auto-refresh: editing the template subtree, an inner generator, the spread area node/shape, or the pattern marks the generator dirty automatically
Configuration — the official Godot way
- Settings moved to Editor Settings (
Editor → Editor Settings → CsgToolkit): no autoload, noproject.godotchanges, nothing ships in exported games - Key bindings stored as physical keycodes — correct on non-QWERTY layouts
- Key capture in the config window is cancel-safe; operation + material selection persist across editor restarts
- Migration from the old
csg_toolkit_config.cfghappens automatically (seeSETTINGS.md)
General
- New top toolbar for generators: Refresh / Bake / Freeze
hide_templateoption (template node hides so only instances show)generate_in_gameopt-in for runtime generation in exported games- Nested generators are supported: use a Spreader as a Repeater's template safely
- Godot 4.7+
⚠️ Migration notes
- From ≤ 1.6.x: your
csg_toolkit_config.cfgvalues are imported once, then the file is removed. - From 1.7.x: settings moved from ProjectSettings to Editor Settings — rebind once if you had custom keys. Old
addons/csg_toolkit/*ProjectSettings entries are no longer read and can be deleted. - Spread scenes: the old
spread_area_3dshape resource was replaced by the area node (area_node_path). Existing spreader setups need the area node re-assigned. - Spiral patterns relying on the implicit template-height climb: enable
use_template_height.