Bit-Buster

Bit-Buster is a cooperative voxel game created using Voxagine engine, a custom engine I helped create during my 2nd year at BUas. In Bit-Buster, you (and ideally a friend) get thrown into steampunk-inspired japan, that got overrun by yokai – japanese spirits. By passing a deadly shuriken between each other, you can blaze through any enemy or obstacle that blocks your way. With the power of Voxagine most of the voxel world is destructible, create mayhem the likes of which you’ve never seen before!

  • Technology Used:
    DX12, Visual Studio, Jenkins, Perforce, Mantis
  • Student Year:
    Second Year
  • Platform(s):
    Windows, PS4 (dropped mid development)
  • Engine:
    Custom C++ DX12 engine (Voxagine)
  • Development Time:
    24 weeks
  • Programming Language(s):
    C++, HLSL
  • Team Size:
    9 programmers, 9 designers, 7 artists, 1 producer

Role(s):

  • Engine Programmer

Highlighted Contribution(s)

Physics:
I implemented various physics features, such as voxel precise collision and continuous collision. The voxel precise collision was resolved by taking the gradient of the overlapping voxels and using that gradient to derive an estimated surface normal for the collision resolution. The continuous collision was done by extruding the player's bounding box by its velocity. This way I can check what objects might intersect and based on distance check for hits (also works voxel precise). These two features combined allowed for smooth gameplay and fixed tunneling through thin walls.


Compute shader:
Our renderer uses raymarching to render voxels from a 3d texture. This 3d texture is the viewport in our voxel world. The voxels within the texture are often moved around by copy and paste operation on the CPU, which took a toll on the bandwidth between the CPU and GPU. To help safe some bandwidth, I implemented a compute shader to copy and paste from one 3d texture to another. This way we could save the bandwidth of moving voxel models for other systems like the particles system (which was fully CPU based).


Memory Management:
I researched and implemented memory allocator strategies as preparation for running our game on the PS4. Custom allocators can greatly improve performance or memory usage, or both. Using your own allocator you can choose a strategy that fits best per use case. For example a std::vector allocates infrequently and therefore can do with the standard C Heap function, used by operator new, to allocate large chunks. However a container like std::map which frequently allocates small objects benifits from allocating from a memory pool. I implemented a linear-, stack-, freelist-, pool- allocators and made a wrapper so we could use them with STL containers.


Trailer