For all our projects in the second year I was responsible for coding and supporting our particle systems. Seeing as I have always been a big fan of particles and what people call "game juice", I wanted an in engine editor up and running as soon as possbile.
I felt that if we could get such a tool early we would have a lot more time to improve on it as the year progressed, collecting feedback from our technical artists.
ImGui was used for the editor, seeing as it was easy to hook up to our rendering pipeline and lent itself to easily create and edit a UI for the backend system.
After completing the first step of adding normal sprite particles I set my eyes on ribbons.
We were adding homing missiles to our first game and ribbons seemed very useful (and saw continued use throughout all of our game projects).
Mesh particles were the last to be added, it proved rather simple since the pipeline for rendering meshes were already implemented by another group member.
The first iteration only allowed single emitters, and you would have to stack them manually in the gameplay code.
The editor would allow you to edit and play three different effects at once to simulate a system, but it proved a bit cumbersome to use.
On the request of our technical artists it was reworked to use particle systems instead, allowing the user to freely add, remove, create and edit existing emitters collected in a bigger particle system.
Shaders, textures and keyframes
I worked closely with our technical artists to implement as many of their requests as possible.
Some quality of life fixes were added to allow the editor to remember its state when going back and forth between the editor and the game state, others were adding keyframes to various variables to have more control of the particle over its lifetime.
Other features like being able to select which shader to use and adding more textures to use for a particle effect were also added.
After adding a quite significant amount of variables an emitter/system could use the editor started to become cluttered.
Variables were categorized and added into their own setting, this meant you could add and remove settings and easily swap between them without taking up much screen space.
All edits were saved automatically and were hot reloaded, this made it possible to make quick changes to systems and effects and then immediately being able to see how it looked in game.
For our third project I decided to add GPU based particles. They use two structured consume/append buffers that bounce particles back and forth using a compute shader to create and update them.
This allowed us to have a lot more particles at the same time and gave us the possibility to have cheap collisions for them using screen space collisions with the depth buffer.
As always working on a game project at TGA you never have as much time as you would like, patching the existing editor to allow gpu particles would be too time consuming at the time so in the end I only allowed the editor to add, create or remove gpu emitters from a system. They could also be freely mixed with normal cpu effects.
All editing had to be done using their json files, which was slower but still useable since edits would update in the editor automatically thanks to the filewatcher.
The Gpu particles are also not sorted, they are often very small and short lived meaning the need wasn't as high, given time this is also something I would like to have implemented.