https://youtu.be/hPN2TpN3FSs

I've been working on CSG Blockout, a Godot plugin for blocking out levels with Godot's built-in CSG nodes. Version 3.0 is out today. It's the first version I'd call a level prototyping tool rather than a shape helper. It's free and MIT licensed.

What it does

  • Build. Drag on any surface to draw a box or a whole room, click a wall to cut a door or a window, push faces with arrows, type exact sizes.
  • Measure. A player reference shows your character's height, jump height and sprint-jump arc. Select two platforms to check whether the gap is jumpable, or run a level check that flags slopes too steep to walk and ceilings too low to stand under.
  • Play. Play From Here drops a first-person test character where you're looking. It jumps exactly as high and as far as your player metrics say, the same numbers the checks use, so when the jump check says a gap is jumpable, the character can actually make it.
  • Freeze. A finished room becomes a plain mesh with collision, and Unfreeze gives you the exact CSG back. When the level moves on, you can export to a MeshLibrary for GridMap, or send it to Blender as .glb and swap the refined mesh back in.

It's just Godot nodes

Every shape you draw is a stock CSGBox3D, CSGCylinder3D and so on. There's no level format of its own and no hidden data. Disable the plugin and your scenes open and run exactly as before.

If you delete it entirely, here's what changes: stairs are a CSGPolygon3D underneath and keep their shape; frozen blockout stays a regular MeshInstance3D with collision, you just can't unfreeze it; the grid materials live in the addon folder, so copy them out first; and bake any Repeater/Spreader before you go.

"Isn't CSG slow?"

It can be, so I measured it. Godot only rebuilds the CSG tree you change. With one tree per room, moving a wall takes about 2 ms no matter how big the level is; with 400 primitives in a single tree, it's about 30 ms. In a running game, live CSG costs nothing per frame, but it has to compute everything while the scene loads: on my machine a 400-primitive level started in 166 ms live and 38 ms frozen. Freezing it takes under 0.1 s, and exports strip the stored CSG. The benchmark is in the repo if you want to run it on your own hardware.

What it isn't

It's not a brush editor: there's no vertex editing and no per-face UVs. If that's what you need, Cyclops Level Builder or TrenchBroom with func_godot are good choices. CSG Blockout is for the step before that: getting the layout right and knowing it plays.

Godot 4.6+. Interface in 7 languages.

It started as a rewrite of LuckyTepot's CSG Toolkit. I'd love to hear what's missing from your blockout workflow, and bug reports are very welcome.

 

Hey everyone!

I've just released v2.0 of CSG Blockout, my open-source plugin for faster CSG-based level blockout in Godot 4.

For this update, I mainly wanted to solve two things that were getting in the way of my own workflow: grid materials getting stretched on slopes and boolean shapes, and having to think about CSG hierarchy every time I created a new shape.

1. Procedural world-aligned grid materials

The new grid_triplanar.gdshader uses world-space triplanar mapping, so the grid stays aligned to the world instead of following the object's UVs.

It supports:

  • Major and minor grid lines
  • fwidth()-based anti-aliasing
  • Clean grid alignment on slopes, ramps, and boolean cutouts
  • No UV setup required

I also added Light, Dark, Orange, and Custom material presets, which are stored in ProjectSettings.

You can switch between them or apply one to selected meshes directly from the sidebar.

The Shift+A pie menu also uses the currently active preset when creating new geometry, with full Undo/Redo support.

2. Context-aware CSG node placement

Previously, creating a new CSG shape sometimes meant deciding whether it should be a child or a sibling, either through preferences or modifier keys.

For v2.0, CSG Blockout now uses the current selection to infer what you probably want:

  • Selecting a CSGCombiner3D → new shapes are added as children at the bottom.
  • Selecting a CSGShape3D → new shapes are inserted as adjacent siblings.
  • Selecting something else or nothing → falls back to the normal parent/root placement.

This also required refactoring the creation and deletion logic to keep node order, ownership, and Undo/Redo behavior intact.

Links

GitHub: https://github.com/qwqzhanqwq/Godot-CSG-Blockout

Godot Asset Store: https://store.godotengine.org/asset/qwqzhanqwq/csg-blockout/

I'd love to hear what you think, especially if you run into any edge cases or have other blockout workflow features you'd like to see!

 

I made a Godot plugin called CSG Blockout, based on another MIT-licensed plugin. I refactored a large part of the code, added a pie menu, and made some other improvements.

I've been using it in my own workflow, and it makes blockout and level prototyping much more convenient. I recently got it published on the Godot Asset Library, so I figured I'd share it here.

This is my first time making something like this and publishing it on the Asset Library, so I'd love to hear any feedback or suggestions!

https://store.godotengine.org/asset/qwqzhanqwq/csg-blockout/