WEEK 13 · 2026-04-06 ~ 12
Building the forest
The first week of East Coast Park. The Bugis system was copied across and rebuilt for a natural place. Procedural sky, pond with editable terrain, eight tree models. ECP had a body, even if not yet light or life.
Open Studios closed the previous week with Bugis working as a full district. Glass interior, four religious motifs, thirteen-track audio mix, particle fluid, all holding together. The question the project now had to answer was whether the same system could hold a second district built on none of the same ideas. This week was the start of that answer. East Coast Park opens as the project’s second location.
Most of the underlying system carried over untouched. What had to be rebuilt was everything on top of it. The sky. The ground. The architecture of the place itself. This week gave ECP its body. Procedural sky, pond with real terrain underneath, eight tree models populating the space. Lighting, ECP audio, and the particle rewrite all wait for next week. This week was the work of laying the ground those will stand on.
A DIFFERENT KIND OF PLACE
Bugis is architecture. Religion. Dense streets. Glass as the visual language because the place is about four cultures sitting transparently on top of each other. None of that applies to East Coast Park. ECP is a coastal park on the east side of Singapore. People come here to run, to cycle, to picnic, to watch the planes land at Changi, to hear the waves. The buildings are gone. The religious structures of Bugis are replaced by trees, water, sky, and distance.
So the week opened on a question. What visual language should ECP have. Copying the Bugis treatment onto a park would have been absurd. Transparent glass, four coexisting motifs, hologram scanlines belong to a neighbourhood where cultures negotiate their visibility. A park is not a negotiation between cultures. It is an unbroken natural surface that people happen to move through. Whatever ECP ended up looking like, it had to come from the place itself rather than from the system Bugis had used.
The direction the week moved toward was a forest at dusk. Something continuous and atmospheric rather than architectural and layered, to match what ECP actually is. Open space, trees at different distances, a sky with weather in it. This week ended before the forest was lit. But it ended with the forest built.
THE FOREST GROUND
The sky was the first piece. In Bugis the sky had been a photographic HDRI of a real Singapore twilight, because Bugis needed the recognisable weight of the actual city at dusk. ECP needed something an HDRI could not provide. A static image cannot change mood. It cannot respond. It cannot do anything but sit there. So the ECP sky was written from scratch as a shader. Three atmospheric bands (horizon haze, mid-sky, zenith) stacked with colour gradients chosen for a forest clearing rather than a coastline. FBM noise clouds scattered across the zenith band, animated slowly. A low-altitude fog layer near the horizon, composited through ray-marching so it feels volumetric rather than painted. Every parameter is a uniform, which means the sky can later be driven by whatever I want to drive it by. For this week the sky sat in its default state so the rest of the scene could be built against it.
The pond came next. A single mega-asset at 256 thousand triangles, glTF format, four sub-meshes. In Bugis the pond is a glass object that refracts light. In ECP the pond is a natural water surface that reflects the sky above it. Imported, placed, parented to a simulation region so the particle system has a volume to occupy fluidly once it arrives.
The ground underneath the pond could not be a flat plane. A flat plane reads as a film set, not as a coast. A 1000×1000 editable floor mesh was added, and the grass instancing system was bound to a heightmap of that mesh so every blade sits at the correct elevation for the terrain beneath it. Editing the terrain in the scene propagates to the grass in real time. About one million grass instances populate the surface, placed procedurally with position jitter and scale variation, rendered with alpha-cutout silhouettes so the grass reads as blades rather than rectangles. It is the largest instanced system in the project so far, and it holds frame rate because of the instancing pipeline rather than because each blade was cheap.
Two smaller pieces closed out the foundation. A Real Shadow Map pass was added, rendering the scene from the sun direction into a 2048×2048 depth atlas and sampling it with PCF 3×3 filtering for soft edges. A GGX specular model was written into the mesh shader so the pond water, the grass, and the tree surfaces could carry correct specular responses through their roughness maps. An SSAO pass was implemented at half resolution, tested, and then disabled. In ECP the cost was not producing enough visible improvement to keep it in the pipeline. A rare case of code written and immediately removed.
EIGHT TREES
The forest needed trees, and enough kinds of trees that the space would not read as repetitive. Eight assets were integrated across three groups.
The first group, Tree 1 to Tree 3, is three tree models from the same source. Multi-material OBJ files, trunk and leaves on separate materials, leaves as alpha-cutout masks rather than as modelled geometry. That is how most real-time forest rendering works. Polygon counts are moderate, which makes Tree 1 to 3 the population trees, the ones placed in clusters to fill space.
Tree 1 to 3 is also where the multi-material OBJ loader had to be written. The OBJ loader the project had been using assumed a single material per mesh. It worked for the Bugis architecture and broke on the first tree. A new loader parses the accompanying MTL file, auto-discovers textures by filename fallback when explicit paths are wrong, handles alpha compositing for leaf cutouts, and caches the parsed output as a compressed NumPy archive on the first load. The second load of the same mesh reads from the cache and is nearly instant.
The second group is two high-detail anchor trees. Big Tree 1 is a one-million-triangle OBJ, the most geometrically detailed asset in the set, and the one that reads in foreground shots where individual branches have to be perceivable. Big Tree 2 is a glTF at 2.36 million triangles, the first glTF mesh the project has loaded. A static glTF loader was written to handle the import, extracting each primitive’s vertex positions, normals, UV coordinates, and material assignments, merging primitives by material so the VAO count stays low. The glTF format brings something OBJ cannot, which is correctly authored vertex normals and material binding without a separate MTL file. With both paths working, tree models from any source load from here on.
The third is a single asset, Wood Stump, a 282-thousand-triangle OBJ placed as ground-level detail rather than a canopy element. It has separate materials for the wood and for the moss growing on it, the smallest but most material-rich of the four model groups.
Together, the caching that the new multi-material loader adds is what brings the ECP scene’s load time from something painful down to something acceptable. For a scene with eight trees totalling several million triangles, the caching is what makes working with the scene practical at all.
FINAL RESULT · END-OF-WEEK STATE