Growing up, I was obsessed with Legos. Having the freedom to build whatever I wanted was exciting and rewarding. Eventually, I transitioned from Legos to Minecraft due to its similar—and admittedly cheaper—building capabilities.
For my Console Programming course at Champlain College, I have the exciting opportunity to explore any programming topic of my choice. Since I like to build things, I’ve chosen to examine voxels as both an art form and as a medium for data storage.
Over the next 14 weeks, my goal is to create a voxel art program that users can design, edit, save, and load voxel models in as well as export to a .obj file.
Both of these editors come with amazing features and are very powerful, but they can be intimidating to someone new getting into voxel art. My goal is to create a voxel editor that has intuitive UI and is easy for anyone to pick up.
If I haven’t over-scoped and end up with free time towards the end of the semester, I’d like to implement the ability to voxelize non-voxel meshes. I’d also like to explore the Marching Cubes algorithm and compute shaders to render voxel data.
I believe good architecture is an essential part of any maintainable codebase. One of my interests as a programmer is writing back-end framework/engine code. I’m also extremely passionate about graphics programming and voxels. Creating a reusable voxel engine that other applications build off of not only is a fun challenge to tackle, but is also a great showcase of how I design and implement core systems. Creating a visual voxel editing application on top of this engine also showcases my skills as a graphics programmer.
Since I’m writing both the voxel engine and editor in C++, I’ll be using Visual Studio 2019 for development. To help ease shader development in Visual Studio, I’ll also be using Daniel Scherzer’s GLSL Language Integration plugin to highlight glsl syntax. For repository management, I’ll be using GitHub as version control and GitKraken to push and pull. Finally, I’m using CMake for cross-platform development and library management.
As for library dependencies, I’ll be using a few to help speed up the development process. For rendering, OpenGL and glad take the cake, since I’m familiar with them, allowing me to focus more on the voxel editor. For rendering UI in the voxel editor, I’ve chosen to use nanogui since it’s a light-weight yet robust library—and looks very pretty. The window library I’ve decided to use is glfw, as I’m most comfortable using it and nanogui depends on it. For math, I’ll be using glm, and for logging/debugging, I’ll be using spdlog. I haven’t had any issues with these libraries not being available, but there are plenty of alternatives I can use if need be.
Currently, the biggest unknown is learning nanogui and implementing UI using C++. Looking at the documentation, nanogui seems manageable to have fun with and learn in the time frame that I have. The second biggest unknown is how I’m going to implement the voxel data structure to allow for quick interaction with the user. Creating a fast and reliable data structure to handle potentially thousands of voxels is going to be an exciting task. Finally, if I have enough time to implement marching cubes, that is a big unknown as well. I have never worked with marching cubes, or algorithms similar to it, so that will be exciting to explore.
Timeframe and Scope
This project seems like a huge undertaking, but I’m confident what I’ve proposed is scalable. My main focus is to experiment with voxels and create an intuitive, simple, editor that users can swiftly jump into and get building.
I’ll be posting development blog posts with updates on the project in the near future, so stay tuned. See you in the next one!