Project techno was a rhythm racer group project where I was tasked with implementing networked multiplayer support and to create the documentation for all of the code for the project.
UATanks (AI System)
I designed the different AI personalities each with their own strengths and weaknesses to complement each other while still maintaining some commonalities through the class they inherit form
My OpenGL renderer is still a work in progress but has served as a fantastic learning opportunity in the world of graphics programming. The current state of the renderer is a combination of two different tutorial series that I have been following
Hex Grid Map Editor
This editor serves as the basis of an RTS game I hope to someday make. During the development of the editor, I learned a ton about complex mesh generation, which was required for adding rivers and terrain elevation options.
Throughout Aegir's development, I have tried to recreate the steps of a professional development environment as much as possible in order to learn real software development practices that I will be able to utilize in my future career.
One of the main things I have learned over the development of this renderer is that OpenGL can be quite finicky and particular. Because of this, I have had to put in a lot of extra time to solve the problems that have occurred.
My ray-tracer was the first C++ project I ever made, following the "Ray-Tracing In One Weekend" book by Peter Shirley. I have since updated the project to support timing the rendering of a frame and to export multiple files from different camera angles (creating an orbiting camera shot).
Aegir is my first advanced development project created without following an overall tutorial, throughout the development of this project I have expanded on my knowledge about surface and compute shaders, optimized mesh generation, and various other techniques used in achieving a good looking result.
This was a group project simulating the game studio environment, in the group we had programmers, designers, and artists. Even though I was the only remote member of the group I still got to know everyone and was happy to offer support whenever I could. I also created the documentation for the project which I was told became very useful for a refresher on what the scripts did.
Although we don't yet have any completed projects, Half-Way Games as been by far the endeavor that has taught me the most, both as a programmer and as a co-worker. Working with friends, some who knew little about game development, has taught me so much about how to work with and manage people.
My first completed project while at UAT, this features 4 different AI personalities with designer specified attributes, seeded random tile placement & various level generation methods (level of the day, custom seeded, and time-based random), and Cinemachine split-screen co-op.
Objective 1: UATanks is a feature-complete project created in Unity, built for PC (but could easily have touch or controller support), utilizing the Cinemachine plugin for smooth camera movements.
Objective 2: The AI system features 4 different personality types and a difficulty scaling system, which can be tuned by designers to change how the game plays. Each AI personality is its own class that inherits from a polymorphic base tank class that contains basic tank behaviors and stats.
Top-down shooter was a project that featured a lot of firsts for me in game development. Throughout the 5 week development period I learned about root motion, blend trees, inverse kinematics, pathfinding, UI, shaders and HLSL, and Audio Systems. All characters are animated using root motion animations from Mixamo and Arm/Hand IK unique to each of the different weapon types. Each weapon has a different shooting/spray pattern and customizable attributes.
This was also my first school project using source control, a link to the repo can be found below.
Objective 1: Top-down shooter was created in Unity and built for PC. I gained a lot of information about how animation and root motion works through utilizing the built-in animator and its blend tree features.
Project Techno was a group project at UAT. The game is a co-op rhythm racer where one player serves as the DJ having to hit "Guitar Hero style" falling notes in order to increase their partner's (the Driver) view radius. The Driver must avoid obstacles and other racers to complete the course.
When I joined the group much of the base functionality was already implemented and the game already worked for local co-op. I was tasked with expanding on the project by adding networked multiplayer, in order to complete this task I decided to use the Photon plugin for Unity. A few weeks into the project I requested to be able to generate some documentation for it since the codebase was getting pretty large. I figured this would serve as a good introduction to the project for newcomers and as a quick refresher resource for the other developers working on it.
Objective 2: Since I was the sole developer tasked with implementing networking functionality, I had to research, design, develop, and integrate into the main project, while other members were working on adding more gameplay content into the project. I also added the additional feature of allowing teammates (Drivers and DJs) to connect to each other over the network, meaning we could have a total of 8 remote clients connecting to each other in a 4 team race.
Objective 6: Even though I worked on my branch by myself while the other members all had their own assignments, it was still a very collaborative environment. Between the different channels we had, there were at least a few messages sent each day. In our group, I was the only member of the team who wasn't on campus, so I didn't get to take on too much of a leadership role but I was still able to help a few different team members with issues in Unity. Through the creation of the documentation, I was also able to provide some assistance to members of the team, and those in non-programming disciplines could read the script summaries to understand why a game object had a certain script attached to it or what it was being used for.
In the following images, I don't show any of the game just parts that I worked on (excluding the title menu).
The OpenGL renderer is one of my favorite projects that I have worked on thus far. I aspire to become a graphics programmer/ rendering engineer, so this was something I was very excited to learn. While the render is not yet complete, I have already learned a ton about how OpenGL and graphics APIs work. At the time of this writing, I have model importing, vertex and fragment shaders, all of the appropriate buffers, ImGui added, and a basic testing framework. All the information that I have learned is from the youtube channel "The Cherno" and the fantastic LearnOpenGL site.
Objective 3: Rendering definitely makes use of fundamental data structures, from all of the buffer arrays (vertex buffers, vertex arrays, index buffers, and element buffers) to the shaders which are parsed as strings. This also goes into supporting gameplay because without a renderer all you would have is a black screen, making it a crucial component.
Objective 4: OpenGL and more specifically GLFW can be very finicky, so naturally I encountered quite a few different problems over the course of development. Some of the most annoying issues were with textures and shaders, in order to prevent those issues I created some tests for textures and a dedicated loading script for parsing shaders so that they didn't have to be written in string literals in the middle of my main source file.
Hex Grid Map Editor
The Hex Grid Map Editor is an in-development project which will eventually be used as the basis of an RTS game that I hope to build. This project features a UI that allows the user to change between biome types, elevations, river placement, and a scalable brush for painting multiple tiles. The hex grid utilizes advanced mesh generation techniques to create and update hexes and chunks in realtime when interactively editing. The mesh features elevation transitions for blending between flat, stepped, and sloped (or cliff) neighboring cells. Rivers offset the middle vertices of cells to give them a depth relative to the surface. I created this project with the help of the in-depth tutorials on catlikecoding.com.
Objective 3: Mesh generation makes use of fundamental data structures because it takes arrays and/or lists of vertices, triangle indexes, tangents, and UVs to create the mesh. This project, in particular, introduced me to a number of advanced techniques for positioning vertices in order to get a subdivided hex grid pattern that could transition between cells of any elevation, with or without rivers. This tool works great for allowing players of a game to create their own maps or just for a designer to create the environments for the game, although there isn't a save feature implemented yet.
Aegir is my student innovation project at UAT, which is a rebrand of the original project SUDS (the page will be updated in the coming weeks). Aegir is a scalable, tiled mesh generation, water system that utilizes compute shaders and physical particle simulations to represent reactive large body water simulations in any environment. Through an easy to use window, users can specify parameters for the system to use which can generate massive, tiled, high-vertex, meshes in just a few milliseconds. The meshes are then simulated using Gerstner(Trochoidal) waves in the surface shaders and physical particles are spawned and simulated on collisions and at wave crests using compute shaders. The system is set to adapt to any terrain a user has through a custom depth texture that can be generated when the mesh is created. I have plans to add mechanics for the"fluid" to flow after the core project is complete, this will most likely be done using vector fields which will generate at the same time as the texture to adapt to various terrains and landscapes.
Objective 4: Throughout my development of Aegir I have approached the project from a professional software development perspective. I wanted to learn how a professional project is created so I mimicked the techniques as best as possible. In my software development process, I made use of a solo version of SCRUM to keep track of what I was learning and working on and added unit tests throughout my project to make it much easier to maintain in the long run and avoid breaking things unintentionally.
Objective 5: Aegir is the most advanced project I have worked on without any sort of overall tutorial. While I have definitely used a number of tutorials to learn the things I am implementing, the actual implementation of the project is all my own. The thing in this project I would classify as "most advanced" is the physical particle simulations with screen-space collisions which are created using compute shaders. This allows me to create a bunch of particles that can semi-physically react to objects they hit without having to send a bunch of data back to the CPU, greatly increasing the visual quality of the project with splashes and mist.
*Images to be added after update of SIP documentation*
The Ray-Tracer from "Ray-Tracing in One Weekend" by Peter Shirley, was my first C++ project. This is written entirely from scratch using Rays, Cameras, and Materials all defined in the project. The output is a PPM file that contains colors for every pixel. I then convert those files to PNG to be more easily displayed. This approach to ray-tracing is far from speedy, taking about 6 minutes to render each of the images displayed below, at 1280 x 720 and 64 rays per pixel. I do think it achieves some really nice results especially in the multiple layers of reflections. I plan to continue working on this project progressing through the other two books in the series.
Objective 5: The vast majority of my projects are created in Unity using C#, so I was very excited for this to be my first C++ project. Working through this project was what really sparked my interest in graphics programming, I loved the idea of writing code that could turn into high-quality images. With real-time raytracing becoming so popular these days thanks to advancements in graphics cards, I figure this would be a good way to learn some of the basics of the technique, albeit in an old school far from real-time way.
Half-Way Games is the wannabe indie game development studio started by myself and 3 friends. We share a common dream of releasing our own games and have worked on multiple prototypes over the past 2 years to find the engine and project that is a perfect fit for us. We have finally settled on our current project, and are deep into the pre-production process. We currently call it by the codename: Isla Inca. It is a first-person branching narrative puzzle adventure to find a lost Incan treasure on a mysterious chain of islands with some anomalous properties in regard to time and space. In the game, you must learn to utilize the Islands' bizarre properties to solve the puzzles and find the treasure while working with your crew and maintaining, building, or destroying your relationships with them.
Objective 6: Even though HWG doesn't have any completed projects, I think it fits this objective really well, just because of how much I have learned about working in a team and managing people over these past 2 years. As the "CEO" of the company and the only member majoring in something related to game development, I have definitely taken on a leader and mentor role in the company. I have set up for us to have weekly meetings where we progress the development of the game and update each other on our learning progress. We are also very active on our Slack and Discord servers allowing anyone with a question to easily get help. Since everyone was new to working in Unreal, I developed a series of personalized learning plans on our Trello board for each member to follow to learn the important aspects of the engine and the requirements of their role on the project.
Some of the hardest things I have had to learn so far are, how to keep the team motivated, how to manage a project and people, and the most difficult, how and when to mentally separate my best friends from my co-workers. The mental barrier is something I have just recently figured out, I would get so caught up in my passion for HWG that I would just always see my friends as my co-workers and feel that the only thing I had to talk about was game dev and the progress on our game. Obviously, after more than a year of this everyone grew tired of me only talking about game development and it drastically hurt our friendships because it felt that development was the only thing we could talk about. Not wanting to lose my best friends I realized that there is a time and a place for talking game dev and a time for just being friends. It was a challenge at first, but I think I have now come up with a healthy balance where we can just hang out without even mentioning the game and then jump right back into it at our meetings and in the Slack channels. Since making this mental barrier, I have noticed productivity to have greatly increased when working on game development with everyone and when we hang out or just play games, I can relax and we can all have fun again. While HWG hasn't yet delivered any highly polished and completed projects, it has taught me more about collaboration, mentorship, and leadership than all of my other projects combined.