Game · 3D · Python + Blender
Etheric Grove — a 3D explorer-shooter
A three-chapter first-person campaign built in pure Python: gather word-shards through the Twilight Grove, the Ashen Waste and the Inkfall Deep while the Ashbound hunt you. Worlds are modelled procedurally in Blender, rendered in raylib, and lit by a hand-written GLSL day/night shader.
Native desktop capture — first-person view across a prop-scattered clearing at twilight.
Overview
Etheric Grove is a self-contained 3D action game with no game engine and almost no dependencies — just Python, raylib for the window and renderer, and Blender (run headless) to model the art. The pipeline is the interesting part: a build script drives Blender's bpy/bmesh to model trees, rocks, pillars, huts, crystals and enemy spectres, exports them to glTF, and the game loads those .glb props and scatters ~118 of them into a ring-bounded clearing.
What's in it
🌲 Procedural Blender worlds
Every prop is modelled in code via bpy/bmesh and exported to glTF, keeping per-part materials (brown trunks + green canopies, red-roofed huts, horned spectres).
🌅 GLSL day/night cycle
A small embedded shader gives every prop Lambert-shaded relief from a single directional sun; the sun, sky colour and ambient animate over ~150 s from noon to deep twilight.
👾 Six enemy archetypes + bosses
Melee spectres, flocking wisp swarms, splitters, ranged casters and flankable shield-wardens — plus three per-chapter bosses with distinct attack patterns.
🔫 Looted weapon roster
Blaster, Scatter, Lance and Rocket, each looted from crates and bosses, with a right-click charged AoE alt-fire and a fast-kill score-combo multiplier.
♾ Campaign + endless mode
Clear three themed chapters — choosing a boon between each — or take on escalating endless waves with a boss every fifth and a high score saved to disk.
🔊 Procedural sound
A seamless ambient pad plus blaster / hit / kill / hurt / pickup effects generated by the stdlib wave module — no audio assets, no numpy.
How it works
- Asset pipeline
make_assets.pymodels props in headless Blender and exports glTF; the game loads the.glbfiles at startup, so the art is fully reproducible from code. - Rendering raylib draws a first-person view over a grid ground for depth; an embedded GLSL program adds a directional sun, ambient floor and faint sky fill so props read as volumes.
- Game feel hit-flash, explosion shockwave rings, screen shake, floating damage numbers, brief hit-stop and a corner radar/minimap.
- Self-contained assets (meshes + SFX) are generated by scripts;
build_assets.sh+make_sfx.pyregenerate everything, thenpython3 game.pyplays it.