Iconoclasm is a 3D hack-n-slash action game powered by Engine², a custom C++ engine. It was developed for the Software Engineering Project 5 and Software Engineering Project 6 modules at the DigiPen Institute of Technology Singapore by Team GodKillers, a 10 men group.

Team GodKillers logo.

Table of Contents

Showreel:

1 / 15
2 / 15
3 / 15
4 / 15
5 / 15
6 / 15
7 / 15
8 / 15
9 / 15
10 / 15
11 / 15
12 / 15
13 / 15
14 / 15
15 / 15

Gameplay Showcase:

Credit: Gavin Lim, Product Manager of Team GodKillers.

Gameplay Development Showcase:

Credit: Joel Hoon, Design Lead of Team GodKillers.

Engine Showcase:

Development:

Introduction:

The creation of this entire project took two trimesters (~8 months). As a student of the Computer Science track, my focus was on building the custom engine (Engine²) that would support the application. The tight deadlines and milestone set by the school, pushed me to design and build the finest solutions I could in the least amount of time. In retrospect, there is much that could have been done to improve the engine, particularly with more foresight given that this was only my second attempt at building an engine.

Features:

As our designers worked on the prototype in Unity, they provided the features that they used with us so that we know what tools they needed to produce this game.

A non-exhausitive list of features available in Engine² are:

  • 3D graphics with lighting and shadow.
  • 3D spatial audio.
  • Level editor.
  • Physics simulation.
  • Skeletal Animation with blending.
  • C# Scripting with hot reloading.
  • Particle system.
  • Post processing.
  • Prefabs.

Check out some of the features offered by Engine² here.

Tools:

Tools that we used during development:

  • C++
  • GitHub for version control.
  • Visual Studio choice of IDE for development.
  • Discord/Trello for communication and task tracking.

Libraries:

This project made use of many third party libraries. The entire list of libraries used are:

  • Assimp : Model importing.
  • DearImGui: Building blocks for the engine’s GUI.
  • EnTT: Entity Component System (ECS), for managing game entities and components.
  • FMOD: Audio Engine.
  • FreeType: Font rendering.
  • GLFW: Creating and managing windows, as well as for creating the OpenGL rendering context.
  • GLM: Mathematics library.
  • ImGuizmo: Gizmo tooling.
  • Mono: C# .NET Framework for gameplay scripting.
  • PhysX: Physics engine.
  • RapidJSON: Serialization of data into JSON files.
  • Spdlog: Logging library.
  • stb: Texture loading library.
  • TinyDDSLoader: DDS texture loading library.

Contributions:

Editor:

Note: Maybe add more ss and some writeup on development process, challenges, success/regrets, etc.

Because the designers came from a Unity background, I tried my hardest as the primary editor programmer to reproduce the experience of using Unity’s editor. Some of the editor features which I have worked on are:

  • Editor & game viewport.
  • Scene Graph.
  • Content browser panel.
  • Searching/filtering.
  • Entity property inspector.
  • Adding/removing entities.
  • Adding/removing components.
  • Undo/redo changes.
  • Copy/pasting values.
  • Gizmo tools.
  • Importing assets.
  • Asset import settings.

The designers were also kind enough to present me with mockups for some of the features they desired and how they should function. I tried my hardest to replicate the mockups and am pleased with the results.

(Left) Feature design document, (Right) Implementation.

Some pictures and gifs of the Engine² editor:

Level 1 of Iconoclasm inside the Engine² Editor.
Running & testing the game from the editor.
Instantiating prefabs.
Importing assets.
Property inspector.
Entity filtering.
Copy paste values.

Others:

Aside from the editor, I also helped out with some tools development, engine features and the usual debugging and optimization.

Asset Packer:

This feature was inspired by a video I saw on YouTube. An asset packer compiles all of the game’s assets (such as models, textures, audio, animation, level data, and so on) into a single file. This provides a plethora of advantages, such as compressing files to an efficient engine-specific format and protecting one’s intellectual property.

Because the asset pack was designed to be used primarily when releasing games, I chose to make it binary. This allows for a more computer-friendly reading of the file during deserialization. I did some load time tests and was pleasantly surprised to see that using the asset pack accelerated our loading time up to three folds.

Despite the successes, there were parts of the asset packer I did not manage to attempt. These are compression and obfuscation. As a result, the Iconoclasm asset pack size came in at just under 1.4GB. While I considered working on obfuscation by incorporating some simple encryption, such as the Caesar cipher, I ultimately decided against it in favor of doing less work during runtime for a smoother experience. If I ever have to work on another asset packer, these are two main areas I’d like to focus on.

Root motion:

This was a feature that the designers requested be supported by the engine’s skeletal animation. You may refer to unreal engine’s documentation on root motion here to learn more.

Side by side comparison (Model further back does not have root motion on).

Dirty flag optimization:

I also worked on optimization using the dirty flag pattern described in a famous book titled “Game Programming Patterns”. The impetus for this optimization came from a profiling session that indicated a significant bottleneck in the way we first handled our scene graph. This optimization strategy increased our frame rate from roughly 27 to 66 frames per second. More information on this optimization technique can be found here.

The book that disscusses the dirty flag optimization pattern.

Post mortem:

It was a long journey, starting from inception all the way to completion. It started with the designers pitching to us their vision for the game and they proved that they had what it takes to see their idea through with a prototype. Since then the pressure was on the programmers, we knew we had to go above and beyond the scope of what was required from us and really push our skills to the limit. Overall, I am very proud of what our team has achieved collectively.

During the final milestone of this project, the school invited guests from the industry to watch our presentation. And thankfully, it seemed like our hardwork had not gone unnoticed as our team had the pleasure of being invited to two private networking sessions.

TiMi Studio: Networking & Demo session:

During the semester break, we were contacted by the school’s career services and invited to a networking and demo session with TiMi Studio’s Technical Director, Principal Audio Designer and other representatives!

TiMi studio trying Iconoclasm!

Ubisoft Singapore Studio Visit:

We also had the pleasure of being invited by Ubisoft Singapore for a studio visit! We had the chance to showcase our projects to the Ubisoft team, receive feedback from professionals, and speak to some of their developers.

Team GodKillers minus Ching Yin.
Team GodKillers minus Ching Yin.
Presenting our project.
Setting up playtest session.
Getting feedback from Ubisoft developers.

Final words:

This was my first time working on a project that received such excellent reviews and considering that this was the final major project module at DigiPen, I couldn’t have asked for a better finish. Perhaps it was the satisfaction of knowing I had a hand in the accomplishment that prompted me to consider a career in the games industry, something I had never considered before.

Moving foward, I’ll be starting an internship as a Gameplay Programmer at Ubisoft Singapore in August 2023, and I’m still in disbelief that I’ve been accepted into South East Asia’s largest AAA studio. I’m looking forward to having a good time and learning a lot while I’m there.