Please sign in to access this page
I built a 3D software rasterizer (renderer) and game engine that runs in the terminal from scratch, and a space navigation game built in it. Low-dependency and a simple build (and even simpler to run precompiled), but no online demo due to it requiring a fast terminal and significant resources. The project was started before Summer of Making, so by the first devlog the project was already pretty far along.
---
The year is 2525. You're yet another expendable contractor, assigned to one of the deadliest jobs in the galaxy: crystal extraction from unstable asteroid belts deep in space. Armed with only your teleportation blasters, you'll have to harvest as many alien crystals as possible before the asteroids accelerate faster than you can react. One collision, and it's over...
xapqrt
Whoops! Looks like they don't have a project yet. Maybe ask them to start one?
Thomas McConkey
Check their projects out: UIL Forces, Finite Element Visualizer, Fractal Desmos
KingWaffleIII
Check their project out: Ticket Checker
Kevin
Check their projects out: Beacon, MonteCraplo, ValAmi, PZChessBot, int0x80.ca
augie
Check their projects out: Dashboarded, asdf
Once you ship this you can't edit the description of the project, but you'll be able to add more devlogs and re-ship it as you add new features!
Added fragment shaders. Like everything else in this project, it's done on the CPU, so I don't know if shader is exactly the right term. The main reason I added this is to modify the distance fog to work horizontally as well. I also put together everything to be good for another github release!
Ignore the messed up devlogs earlier, the Summer of Making site was freaking out. Anyways, I finally turned my precompilation for GitHub Releases into a Makefile option. Now I don't need to spend like 30 minutes manually putting releases together! I also decided to add another zip archive that includes the source code WITH LIB INCLUDED, so that people can build it easier without needing to manually find miniaudio. I also made debugging a make flag instead of a hardcoded variable in debug.cpp.
Added a starfield that rotates with the player! Also implemented it as a post-processing layer, which required me to add some features to post processing.
Added post-processing, and as a form of post-processing, distance fog! I chose to lerp by distance to calculate the fog amount, looking pretty good and making it easier to set the bounds of the fog. Post-processing is still kind of limited ATM, as post processing layers don't have access to each pixel's original object or mesh yet, but they do have access to distance, hence why the fog works.
Finally figured out the segfault and memory corruption issues! I was accidentally creating then copying the AudioEngine instance after it was automatically initialized, which means the destructor was called which affected the used instance because of shallow copying (i think). Basically this meant that I had to disable the copy constructors of the class, and as a result just constructed it in the initializer list of the GameEngine. I also moved the instance to the heap instead of the stack which fixed a bunch of issues, but I can't begin to explain why that helped.
The attachment is a screenshot of my now memory-safe (i think) AudioEngine class.
Added audio with the MiniAudio library, but dealing with some insane bugs while doing so. Check out this video of my audio system corrupting the program's memory! You can see that some object's rotation speed is way too high, and some crystal vertex colors get majorly messed up. Honestly this is the coolest looking bug I've ever seen, it's what I think non-programmers would imagine bugs look like after seeing hacker movies
Added some basic particle effects to crystals when destroyed. Looks pretty good IMO and isnt that costly because each particle is just 4 tris. Looking to add it to more things now!
Finally took the leap and added fixed updates! It actually wasn't that hard, partially because my scripts are responsible for mainly physics stuff anyways. This is also generally the direction I want to take for my next ship: primarily engine improvements, because it's honestly rough at the moment.
This fixes a ton of issues with my engine previously regarding frame safety. Notably, the hud would behave super weirdly, flying further away from the camera at low framerates and looking super stiff at high framerates. This makes it so I don't need to do actual math to fix this, and can just throw it in FixedUpdate instead!
Spent way too much time creating a release. I tried to make an online demo with Emscripten compiling to webassembly and using online terminal simulators, but that ended up being just way too complicated. Then, I decided to just add a precompiled binary to the GitHub release and call it a day, but I needed to compile with an old version of glibc to ensure compatibility on old OS's, so I needed to make a Docker script to simulate an old OS with an old glibc just to compile. Overall way too much hassle, but at least I know how to go about it now.
The project is finally in a first-shippable state! As for the changes I made, I just fixed a bad attempt at frame safety that caused the HUD to jitter, and did a few other adjustments to difficulty scaling. In the future, I'm looking to change the way the score text is displayed (unify it with the rest of the physical HUD), add more visuals to make the world feel alive (like stars), and implement multithreading to improve performance and add true frame safety.
Here's a cool GIF I put together that showcases the game:
Started working on Game Over text. I'm implementing it a little differently than the start text, in part because it has a specific destination rather than just move to the side, but also because I wanted to try something a little different. I also improved organization a bit by moving all assets to a resources folder, and did some other minor adjustments to improve gameplay.
Updated the title text and prepared to add game over text. Also other misc polish in preparation for shipping
Finally got some decent text working, just chose to make it in the image buffer rather than separately printing. This approach is ultimately way easier, keeps the screen modular, and allows usage of many different fonts
Added numeric text rendering thats highly sketchy at the moment. ASCII art is cool, and if I'm making a terminal engine, I need to have support for it, so I wrote code to make working with actual text (rather than my pseudo-screenbuffer) easier
Spent some time on maintenance, cleaning up terrible code, commenting it, and so on. One of the most notable things I did was fix an extremely major issue with the crystal collisions: when a crystal was hit, it would not necessarily delete the crystal that was hit, but rather the oldest (or newest? not 100% sure) crystal in the scene.
Added a cool little title screen, which took a while to make as I needed to improve my image support. Also, I made some much-needed clean-ups, with many more likely to come.
Finally got a functional version of the game working! Harmful asteroids spawn in, and occasionally crystals spawn that the player must shoot and collect. I used a trick to make the asteroid spawn rate increase with the player's forward movement, as though there are asteroids evenly spaced throughout z-space. It also ended up being a more fun experience than I initially expected, which is a pleasant surprise.