Skip to content

1.8.0

Latest

Choose a tag to compare

@fabian-becker fabian-becker released this 20 Sep 00:03

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 (CollisionShape3D or 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 without use_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 = 0 now means flat (previously it silently climbed by the template height); the old behavior is opt-in via use_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, no project.godot changes, 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.cfg happens automatically (see SETTINGS.md)

General

  • New top toolbar for generators: Refresh / Bake / Freeze
  • hide_template option (template node hides so only instances show)
  • generate_in_game opt-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.cfg values 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_3d shape 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.