Whats all this fuss about Godot? As a long time Unity user, often frustrated by its very fragmented development over the past 5 or so years, I’d been following the course of Godot’s progress with great interest. The first time I ever looked at it with any serious intent was during the infancy of Godot 4, where Godot 3 was still recommended for use and 4 was very unstable with a lot of missing functionality. 2D was very much a thing and there was a lot of potential just around the corner for 3D, so I set about getting my head around the editor and delving into GD Script.
One of the first projects I set myself was to get to grips with the general pipeline, how to get data into the engine, how to read and write arbitrary data to and from disk, how to build custom tools to solve workflow demands. This project took the form of a 2k by 2k landscape, authored as mesh chunks in Houdini, and populated with scattered foliage generated in Houdini and stored as point data in a text file that could be parsed by my own custom add-on in order to place individual mesh instances or to generate multi-mesh instances. In order to achieve more granular culling with the MMI’s my custom pipeline exported “chunks“ from Houdini that would output multiple MMI blocks in Godot.
Shown here in the property editor in Houdini, you can see a snippet of my custom Python code responsible for writing out blocks of point data, in this case grass scatter. This included position, rotation, scale, and the chunk ID a given point was associated with.
Here you can see the chunk operation used to break the scatter data into blocks for culling. The size of these chunks was determined by the bounds of underlying terrain tiles, which were also used to set the chunk ID.
Here you can see the raw output once parsed into Godot. Trees and grass assets here were created using the popular tool “Tree-It” and exported to Godot as separate LOD meshes with an imposter used for far distance. Once lit as shown in the opening image on this page, with atmospherics, the LOD distances were set to avoid any noticeable transitions. I was pleasantly surprised by how well Godot performed under this kind of load, with the GPU typically ticking along at around 5ms and peaking at around 7 or 8ms if viewing the map from corner to corner.