
Spite: To Hel and Back (& R.O.S.E.)
2024
Specifications
​
Genre: 3D Action RPG
Engine: R.O.S.E.
Language: C++
Editor: Unreal
Time: 14 Weeks (50%)
Team: 17 People​​​​
Introduction
As a Viking with a death wish, reclaim the shards of your axe as you fight your way through an undead-infested mountain to prove you're too strong for death.​
​
Spite: To Hel and Back is a 3D action RPG inspired by Diablo with a Viking theme. It features similar mechanics with an isometric view where the player has multiple unique abilities to combat their foes.
Contribution
​My role during Spite was mainly to act as the engine programmer in the team, where I focused on adding or improving essential systems in the engine. However, I did also work on some AI, graphics and UI features.
​​​
-
Engine
-
AI​
-
Graphics​
-
UI
Details
R.O.S.E.
You can read about my contributions to the engine here. During Spite, I worked with, for example, improving the component system, adding entity hierarchy, component import, asset registry, asset serialization, threaded scene loading, and render pipeline.
Video Player
We required the ability to play videos in the engine to show the intro cinematic when beginning the game. The implementation was largely inspired by a solution that the in-house engine at The Game Assembly has. The difference is that I had to modify it quite a bit to work with how we have threaded our engine by separating update & rendering. Instead of directly presenting frames in the video, they are instead pushed onto a queue in the rendering thread that the update thread then extracts from when ready.
Because of time-constraints, we made the decision that it was easier to implement a basic collision system instead of implementing a complex library such as PhysX. My contribution to this was implementing some basic primitive shapes and the intersection code between some of them. For example, I implemented the capsule shape, and the intersection logic for it against a couple of the other shape types, where you can even get the point of contact, normal, and penetration depth.​
Funneling
Funnel Algorithm was implemented for pathfinding in a NavMesh. The solution is largely inspired by this source: https://digestingduck.blogspot.com/2010/03/simple-stupid-funnel-algorithm.html
FXAA
​FXAA was implemented to make the jagged edges appear smoother. It works by measuring the difference in luminance to find the areas to improve. (Screenshot below is taken from Shattered because FXAA hasn't been changed since it was introduced).
​

Before

After
Cascaded Shadow Mapping
Cascaded shadow mapping was implemented for the directional light to improve the quality of shadows. The camera frustum is divided into three smaller sections, which defines the orthographic projection for rendering to the shadow maps. Later, when rendering the actual shadows, a section is sampled from based on the view distance from the camera to a pixel. PCSS was furthermore implemented with the modification of adjusting the search region by the ratio of the current section compared to the first.
User Interface System
​I implemented an extensive UI architecture which makes use of a StateStack.​​​​ For each State in the stack, there exists a Canvas wherein UI elements can be added. Rendering order and input logic is handled in the Canvas that forwards cursor position, mouse press, and more to its children. All elements that exist in the UI must inherit from UIComponent that contains its size, if it is selectable, bounding rect, and more. Furthermore, I added the Container, which acts as a mini-canvas that can move and set the opacity for all of its children. For example, fading out the buttons when unpausing the game by modifying the Container and not each element individually.