GameCube Framework
A Devlog from start to finish
October 24, 2025 - Tommy Dräger
- Introduction
- Setting Up
- Devlog
- Hello Cube
- Basic and Lambert Material, Direct Light, Geometry
- More Geometry
- Point Lights & Light Attenuation
- Textures and Loaders
- Deployment with a Custom Banner
- Benchmark Polycount
- ObjLoader, MtlLoader, Transparency, AlphaMaps
- Box3Helper, AxesHelper, GridHelper, Box3, Line & Points
- Object2D, GUI Elements, Fonts & GDB Debugger
- KeyframeTrack and Interpolators
- AnimationClip, Action and Mixer
- Wireframe Geometry
Prologue
If you found this article, chances are high that we are from the same generation growing up when games made the jump from 2D to 3D. Game Developers back then were simply another breed. I don't wanna start another console war, but I found the gameCube to be one of the most fascinating platforms to develop for since the technology was pretty mature for its time. I always wanted to develop my own game for one of Nintendo's Consoles but I was born too late to be a part of it and these days we have unreal and unity so why bother? Because it is not just me who wants to give their tribute. I want to understand the machine and give something back to the community. The goal of this GameCube Engine is to be useable by everyone. Most of the engines and frameworks I come along are a complete mess: terrible documentation, inconsistent, horrible formatted and structured. And I know exactly one framework that is doing everything right and that is three.js! A flawless documentation, tons of examples and a class hierarchy that just makes sense. My framework is using the same class names and methods like Object3d, BasicMaterial, Vector3 etc. Cause the goal of this project is to provide an intuitive and easy to use SDK for developers who wanna focus on what is most important: developing the actual game by giving them a tool that feels familiar!
Existing Toolchains
Nothing is easier than developing a game for the Nintendo GameCube. Just build a time machine and travel back in to become an officially licensed developer. You would have to fill out tons of forms in order to get Nintendo to ship you a giant devkit with the official “Dolphin SDK” with proprietary compilers, low-level GX graphics API and barely any documentation unless you had internal connections. Finally, make it run on the real hardware, then you submit it to Nintendo where they’d simply cancel it. That might be one of the many reasons why the GameCube became a flop commercially speaking.
If the first method is not to your liking then you have one more choice, and that is to use DevkitPPC / DevkitPro which is an open-source toolkit which uses a gcc-based powerpc compiler. A huge reverse-engineering effort made that project a reality. Notice that the developers would not use leaked files, since it would mean the end of that project. So devkitPPC (libogc) is the absolute minimum you need in order to put some lines and triangles onto your screen.
I for myself decided to go with the second method and use libogc as the base foundation. libogc is pretty comparable to open-gl. But printing red triangles are only the very first baby steps when it comes to ship a usable framework for other people.
PowerPC Architecture Overview
The fact that I had to create my own PowerPC Instruction Reference is saying a lot of how deep I had to dive in order to fully grasp the whole scope of the system. I have been reverse engineering “The Legend Of Zelda - Twilight Princess” for years now and building an Online Level Viewer for it and my understanding gets less blurry over time. I highly recommend you to join a decompile community since they build a lot of useful tools that I ended up using myself too.
Compilers and Assemblers
As written above dekitPPC is used as the primary development toolkit, which provides a PowerPC GCC cross-compiler specifically designed for the PowerPC 750CXe processor. The tool collection also includes the most essential library libogc.
Debugging Tools and Emulators (Dolphin, etc.)
In the current state I heavily rely on the usage of custom make scripts. I have scripts that build the dol file from the cross compile elf file. I have scripts that can generate a banner file and place it into a iso file which will then get packed with a filetree for external file access via DVD mount. For quick testing I rely heavily on Dolphin emulator which is a whole topic on its own. The project integrates Dolphin's GDB server for remote debugging, allowing developers to set breakpoints, inspect variables, and step through C++ code using powerpc-eabi-gdb. I also added in-game console log overlay to make debugging more convenient when it’s tested on the real hardware.
Hello Cube
August 17, 2025
At this point I had a vague understanding of how GX (Nintendo's Version of OpenGL) is working. So I tried to make a few hardcoded triangles with some vertex colors. Remember back then GLSL wasn't a thing yet. Creating a camera and a triangle is the hello world project everyone is starting with I guess.
A teaser about my upcoming framework for anyone who is obsessed with the gamecube like me and always wanted to bring his own project on the real hardware. written in C++ for powerpc gekko and inspired by threejs. #Nintendo #GameCube #RetroGames #IndieGameDev #GameDev #threejs pic.twitter.com/cGsz0wgn3j
— Tommy Dräger (@mlsprwr) August 16, 2025
Basic and Lambert Material, Direct Light, Geometry
August 18, 2025
As you can see I already started to tackle some of the primitive Geometries like Box. So I already had BufferGeometry, Light, DirectLight, BoxGeometry, TorusGeometry, SphereGeometry and PlaneGeometry. But the focus here was the Basic and Lambert Material Classes which was a huge load of work. At this point I wouldn't know how often I had to refactor that Material Class.
🛠️Basic & LambertMaterial, DirectLight and procedual Geometry were added. The roadmap is still long 🔰. This threejs inspired framework is for anyone who always wanted to build their game for the gamecube hardware.#Nintendo #GameCube #IndieGameDev #GameDev #threejs #cpp pic.twitter.com/3vG55fJST0
— Tommy Dräger (@mlsprwr) August 18, 2025
More Geometry
August 19, 2025
If you check out the Geometries section in the threejs documentation you can see that there are like 21 different Geometry classes I have no intention of implementing all of them but I really try my best to come as close as possible. I had to really do my homework again on Polyhedron again. A week of hard work for 15 Likes felt quite rewarding also^^.
🛠️More procedual Geometry are coming. Just love the addition of Polyhedron ⭐. Looking for devs who’ve always wanted to create their own GameCube game . Dev followers💻, any help / requests are more than welcome🙌よろしくね#Nintendo #GameCube #IndieGameDev #GameDev #threejs pic.twitter.com/sRrEf77KKV
— Tommy Dräger (@mlsprwr) August 18, 2025
Point Lights & Light Attenuation
August 19, 2025
At this point I only had a single directional light in my scenes. The GameCube however is providing 8 Light Channels that I could make use of. I also wanted to have a cornell box this time. At this point of development everything went quite smooth and without big blockers. Something that would change in the next Step.
💡PointLights and LightAttenuation got added! The GameCube supports 8 LightChannels. Make the most of them! A framework for anyone who wants to develop for GC. Devs welcome ( dm / comment )! 💻#Nintendo #GameCube #RetroGames #IndieGameDev #GameDev #threejs pic.twitter.com/JDqFoTAukI
— Tommy Dräger (@mlsprwr) August 19, 2025
Textures and Loaders
August 24, 2025
When I had to deal with Textures I had to come up with a solution to load files. Up until now I could only build a dol file (the equivalent to an exe file). The only things you would put into an executable would be your program code and let the program load the external data later from png. Fortunately devkitPPC had some examples where I could find a compromise. At that point I didn't had a disc image and file tree. Also the image format had to be in tpl format (a custom format for GameCube). So I did the following: I created a folder /data for embedded files. I then converted it to tpl when building it with make. I made a script that would create an obj and header file from that tpl image. This way I could load small embedded files that would get directly baked into the dol file. After I was able to load the file into memory I could finally focus on the most important part: creating a texture and enhancing my material classes to actually project that image onto the mesh.
🚨Added Textures and Loader classes, also fixing some bugs! A full week of headaches. That GameCube framework needs a name soon! For anyone who always wanted to develop for GC. Devs welcome ( dm / comment ) #Nintendo #GameCube #RetroGames #IndieGameDev #GameDev #threejs pic.twitter.com/5fF6lBnGHb
— Tommy Dräger (@mlsprwr) August 24, 2025
Deployment with a Custom Banner
August 27, 2025
I had to compromise with the file loader by only using embedded files, cause I couldn't deploy a disc image yet. I had to try multiple methods that were legally okay to distribute. I struggled pretty hard with this. I could create an gcm iso file with mkisofs. But I realized that the banner file would not be shown inside the dolphin emulator. Also the file tree was completely missing. Most of the toold used by the community are in a grey area by injecting / replacing stuff from an already existing image file (which is not what I wanted!). In the end I found a good and legal solution by using makegcn from the nodtool collection.
🎨Made a cute Banner (96x32)! GCM / ISO pipeline is now ready to deploy a project. Workingtitle: "Fenix Engine" .. a threejs like framework for anyone who wants to develop for GC. Devs welcome ( dm / comment )! 💻 #Nintendo #GameCube #RetroGames #IndieGameDev #GameDev #threejs pic.twitter.com/7ZIUUViPuO
— Tommy Dräger (@mlsprwr) August 26, 2025
Benchmark Polycount
August 29, 2025
This time, I wanted to kinda test if the promise of a maximum polycount of 8 million faces would hold true. You can really crank up the number of cubes in this demo until the FPS finally starts to drop.
It's #FeedbackFriday! Created a benchmark for my threejs like GameCube Framework. Push the polycount until FPS drops. For anyone who wants to develop for GC. written in C++, Devs welcome ( dm / comment ) 🙌#Nintendo #GameCube #RetroGames #IndieGameDev #threejs #FollowFriday pic.twitter.com/v9zje8esyY
— Tommy Dräger (@mlsprwr) August 29, 2025
ObjLoader, MtlLoader, Transparency, AlphaMaps
September 14, 2025
This update introduced support for loading wavefront object using OBJLoader and MTLLoader. With these classes, it finally became possible to import external models and materials beyond hardcoded geometry. This was definitly a huge and important step that I was looking forward to a long time. In the end transparency and alpha map support gave me real headaches. But I have the feeling this is not the last time that I have to refactor the Material class.
🔥Update: Added OBJLoader, MTLLoader, transparency, alpha maps, and more! Used an old 3D model of mine for this demo. Creating a three.js-like framework for developers who wanna build GameCube games in C++ (dm / comment) 🎨. pic.twitter.com/93C7pkdYqY
— Tommy Dräger (@mlsprwr) September 14, 2025
Box3Helper, AxesHelper, GridHelper, Box3, Line & Points
September 14, 2025
Helper classes like Box3Helper, AxesHelper, and GridHelper were actually super fun to implement. When it comes to collider or trigger boxes those classes will come in handy. Basic geometric helpers like Line and Points were also implemented (of course since GridHelper etc are based on the Line class).
✨HelperObjects: Box3Helper, AxesHelper, GridHelper, Box3, Line, and Points classes added. A Three.js-like framework for GameCube development. Devs, DM or comment! ♨️#screenshotsunday #indiedev #threejs pic.twitter.com/wMWO4abjfX
— Tommy Dräger (@mlsprwr) September 14, 2025
Object2D, GUI Elements, Fonts & GDB Debugger
September 20, 2025
I always wondered why threejs would never add a Object2D class to handle UI elements separate from the 3D scenes. Methods and members are pretty similar to Object3D. I also made sure to include a fallback font for the text elements. I will definitely add kana later. For now we can use Logging functions like Console::log, Console::error, and Console::info to directly display an in-game Overlay. GDB remote debugging support was integrated through USB Gecko and BBA using Dolphin’s ports (55020 & 2828), giving proper breakpoint and inspection support while running code on hardware or emulator. I kinda like those "Borland Cpp Turbo Vision Aeasthetics" ^^ (have a look at my Adlib Editor and then you know why.
I focused on debug mode. Added a new "Object2D" class, similar to "Object3D," for GUI elements (including fonts). Created Console::log, error, and info. GDB (Debugger) is now attachable via USBGekko & BBA (ports 55020 & 2828).#GameCube #IndieGameDev #threejs #FollowFriday pic.twitter.com/JUggfQVufu
— Tommy Dräger (@mlsprwr) September 19, 2025
KeyframeTrack and Interpolators
September 24, 2025
At this point I covered everything so far you needed for a simple car game without any characters, because one important part is still missing: Animation! the groundwork was laid by adding KeyframeTrack and three interpolation modes. This enables smooth animations for properties like position, rotation, and scale. It’s a crucial advanced animation systems like character rigs and skeletal animations.
KeyframeTrack & Interpolators classes got added🔥. An important step towards imported Character AnimationClips. A #threejs-like framework for developers who wanna build GameCube games (dm / comment) pic.twitter.com/XHIfJMETBX
— Tommy Dräger (@mlsprwr) September 24, 2025
AnimationClip, Action and Mixer
September 25, 2025
AnimationClip, Action, and Mixer is coming straight from the threejs documentation! The framework is now capable of managing and blending multiple animations! AnimationClip stores keyframe data, Action represents a running instance of an animation, and Mixer coordinates playback and blending of those actions. This brought the system closer to supporting skeletal animation.
🙋♂️Let me show you my progress: AnimationClip -Action and -Mixer classes are now ready. We getting closer towards character animation! Next up: Bones, Skinning and Wireframe. GameCube Devs welcome ( dm / comment )!#Nintendo #GameCube #RetroGames #IndieGameDev #GameDev #threejs pic.twitter.com/iHCh2Fqwv8
— Tommy Dräger (@mlsprwr) September 25, 2025
Wireframe Geometry
September 25, 2025
At this point I already had a lot of HelperGeometry classes, but WireframeGeometry was skipped until now. It was a nice and straight forward implementation, cause the SkinnedMesh and GLBImporter class is giving me a real headaches right now.
📻Another Update: Picked up some low hanging fruits by implementing WireframeGeometry, since I need it really soon. Stay tuned! Follow me if you wanna see the project hitting actual release. 🧊GameCube Devs welcome!#Nintendo #GameCube #RetroGames #IndieGameDev #GameDev #threejs pic.twitter.com/WHCuNj5wC9
— Tommy Dräger (@mlsprwr) September 25, 2025