An ever-so-curious Game Developer with a passion for creating polished experiences_
Interested in Gameplay & Graphics Programming, A.I, UI/UX and the way they all tie together to form experiences that leave a lasting impression
I delved deep into romhacking & emulation forums and found out about the intricacies of the Wii file formats, giving me the tools & ability to understand and manipulate the specific data needed for this project. This specific game was never documented throughly so I had to go through some trial & error as I explored the assets structure.
During the assets export process I encountered several issues with smoothing groups, missing backfaces and animations that were not behaving as intended, not looping correctly or containing incorrect rotations on some bones due to bone scaling. Using
Autodesk Maya I adressed these issues. I manually fixed many of the animations and remade a few simple ones from scartch in Maya (Flowers animations), as well as animated some assets by code using solutions such as sign waves. (Bushes/Bomb squishing, Butterflys flight).
In an attempt to create a polished result that's true to the original game, I ran into several challenges, mostly involving draw order & transparency. While I used a particle system for the central explosion, I created an animated diffuse shader for the spreading ground explosions, and sampled the opacity map in order to render accurate real-time shadows for the butterflies who are made out of two animated quads. (improved on the original game that had butterflys, but not real-time shadows for them!)
When setting up the scene, I was using the Levels tools in photoshop to match the graphics it to the original game, then instead of playing with the light values in the scene, I opted to create a Post-Process Levels shader in HLSL to help me reach the exact result I got from Photoshop.
Draw order situations can often become complex, especially when transparency is involved. A prominent example of this in my game was with the bushes. To solve the issue, I utilized the
clip() function of the pixel shader. This function allowed me to effectively manage complicated transparency draw order situations, ensuring that each bush was rendered in its correct order without any visual artifacts, against it's own submeshes as well as other bushes.
Incorporating smooth transitions between animations is crucial for a natural game experience. For this, I implemented an
AnimationBlender class, designed to manage and execute seamless transitions between animation clips. Here's a more in-depth look into the technical aspects of it:
ModelAnimator. This animator handles the current animation state, and the blender utilizes it to transition from one animation to the next.
StartBlendfunction is invoked. It stores the current animation clip and its progress, marking the beginning of a blending phase.
Updatefunction ensures that the blending happens smoothly over time. It calculates a blend factor based on the elapsed time and the predefined blend duration. By using this factor, the function then interpolates between the ending frame of the previous animation and the starting frame of the new one.
GetInterpolatedKeyfunction fetches an interpolated animation keyframe based on the given time. It determines the two closest keyframes (before and after the given time) and interpolates between their bone transforms.
Updatefunction sets the new animation clip as the active one in the animator, ending the blending phase.
Since the point of this project was a Graphics Programming exercise, I would first add another player, then set up two RenderTargets, one for each horizontal half of the screen and have the screen dynamically split when one player goes off the edge of the screen. When both players are back in view (in terms of screenspace distance), I would simple render the main camera back to the backbuffer again. The desired effect would be a polished & dynamic split screen.
I would add 4-Player versus mode, utilizing the already present controllers & keyboard support.
Sound wasn't the focus of this exercise, but I would like to add better sound effects as well as a proper
SoundManager class. Right now sounds were added last minute using SDL and are very hacky.