Information
August 2022 – Current
Engine:Custom ECS engine with C++ and OpenGL
My Role: Producer and Programmer
- Worked with a sound designer as the team’s audio programmer
- Created UI system and implemented most UI
- Implemented json-loaded scenes
- Created event system based on this
- Refactored the entire engine to use shared and unique pointers
- This was done the summer after and made the game way more stable for publishing
- Created a generalized state machine system
- Integrated GGPO Multiplayer
Relevant Code Samples
Copyright © 2022 DigiPen (USA) Corporation.
ImGui Wwise Window
One of my jobs on the project was to implement the audio events created by our sound designer. However, there was no easy way to hear those events so I made this ImGui window that would read the header file that Wwise generates and create a list of buttons so each event could be previewed. This greatly helped with audio implementation and debugging.
namespace Editor::WwiseWindow
{
// Initialize an input file stream for reading Wwise header file
std::ifstream wwiseIDs;
// Runs every frame ImGui updates the window. This code is only used in debug mode.
// Open variable is unused as this code is only run when the window is open
void Show(bool* open)
{
ImGui::Begin("WwiseWindow", open, ImGuiWindowFlags_NoCollapse);
// Check if the file is open; if not, open the Wwise header file
if (wwiseIDs.is_open() == false)
{
wwiseIDs.open("./Assets/Audio/Banks/Wwise_IDs.h");
}
// Check if the file is in a bad state such as if it reached the end of the file, and reset it if needed
if (wwiseIDs.good() == false)
{
wwiseIDs.clear();
wwiseIDs.seekg(0);
}
std::string myline;
bool inEvents = false;
// Read the file line by line
while (wwiseIDs.good())
{
std::getline(wwiseIDs, myline);
if (inEvents)
{
// Check if we're inside the EVENTS namespace.
// This is since the header file from Wwise contains a bunch of stuff other than events
if (myline.find("namespace EVENTS") != std::string::npos)
{
inEvents = false;
continue;
}
// Skip lines containing '{' or '}' as they are not events
if (myline.find("{") != std::string::npos || myline.find("}") != std::string::npos)
{
continue;
}
// Extract the event name
std::size_t nameStart = myline.find("AkUniqueID") + strlen("AkUniqueID ");
std::size_t nameEnd = myline.find(" = ");
std::string name = myline.substr(nameStart, nameEnd - nameStart);
// Create a button for the event
if (ImGui::Button(name.c_str(), ImVec2(200, 20)))
{
// Trigger the event using SoundManager
SoundManager::GetInstance().TriggerEvent(AK::SoundEngine::GetIDFromString(name.c_str()));
}
}
else
{
// Check if we're entering the EVENTS namespace
if (myline.find("namespace EVENTS") != std::string::npos)
{
inEvents = true;
continue;
}
}
}
ImGui::End();
}
}