Since I was uncertain about what I wanted to do as my specialization I spent the first part of this week to gather information on my options and then deciding which one to choose.
Once I had decided on making the Animation Controller I went to the Animators and sat down with them for a day to see how they worked, what features they wanted, and how they used them.
Was sick the entire week. But still got a little work done on the project while I had enough energy.
Managed to create the base that I would use for showing Animations and Skeletons, and to edit blend spaces.
Was also able to try out a way to make Animation Layers, but did not have time to actually implement it.
Was still sick during the first half of this week.
During this week I realized that the current way my AnimatedMeshComponent handled its Animation would make it impossible to implement Animation Layers and Blend Spaces. Thus I decided to move the responsibility of swapping frames and updating the bone cache from AnimatedMesh to the Animation.
I also started looking into how to interpolate between Animation frames, and came to the conclusion that it would be easier to handle it with Quaternions.
Spent a bit more than a day to learn how Quaternions work and to implement a Quaternion class in my engine.
Once the Quaternion class was done it was a breeze to get interpolation working for both Animations and Animation-Layer.
Then I had just enough time to gather some information from the Animators and Educators about what is to be expected from a Blend Space, such as supporting animations of different length and fps.
Messed up the order of some matrix multiplication
The first problem with the old implementation was that Animation was a base class, and even though I could have Animation Layer inherit from Animation, it would not be logical to have BlendSpace inherit from it, and might have caused issues further down the line.
To solve it I simply created a new base class, AnimationBase, and made Animation and BlendSpace inherit from it. Then I had AnimationLayer inherit from Animation, since the only difference in data between the two is that AnimationLayer keeps an index to the bone it plays from. This also made it easier later when creating the logic for BlendSpace since I wanted to only accept Animations and AnimationLayers in BlendSpaces.
The second issue I had with it was that Animation was only a data container and AnimatedMeshComponent handled all the logic. This made it very hard to create a simple way to play most of the Animation classes, especially if I wanted it to support all of them.
So I moved all of that logic into AnimationBase and the Animation classes. AnimationBase would hold most of the variables needed, such as timers and flags for different settings. It would also take care of logic that worked the same for all the classes. The other classes simply had to override the functions that needed unique logic.
Since it was easier to let the Animations themself update the bone cache I made them hold a pointer to the cache they are responsible for. But I still wanted to be able to handle an Animation manually, so I created an interface that allowed for the option of stepping through an Animation and using an external bone cache as well. This was used in the editor later.
Started out this week by implementing an external library, created by the school, that acts as a node editor with a completed base for a script graph. I also created a base for the State Machine and State classes i was planning to use.
This was the last thing I did that still followed the original time plan I had created at the start of the project.
Spent the rest of the week creating the BlendSpace class and creating a way to save and load them.
Also refactored AnimatedMeshComponent since I had updated the interface of the Animation classes again.
Since my engine and my groups engine both used my component system, but my groups engine had a more recent version of it with a lot of stability and performance improvements, I choose to update the component system in my engine.
This sadly broke my project settings in my new engine and forced me to spend a couple of hours on fixing the errors, but I learned a lot about vxproj files in the process.
After that I created the editor for Blend Spaces and fixed the last bits that was needed to make them work properly.
Then I had to stay home for 2 days caring for sick children.
The end of the week was spent merging all the work I had done so far into my groups engine so that the Animators could start using it.
First half of the week was spent creating a new resume and cover letter.
The rest of the week was mostly spent caring for my sick children.
Only managed to fix some of the bugs that had been discovered while the group tested out the new system, and also implemented a way to handle if the animation used namespaces or not.
It was during this week that I took a final decision that I would cut the State machine from the project and focus entirely on additive animations and root motion instead. I had considered it in the previous week but never decided anything then.
This entire week was spent on creating this website, and all assets shown here.
The logo was created by Malvina Petersson.
I spent some time during Easter to create the structure needed for additive animations.
Then once the school week began I rushed to complete the logic. This led to a row of different issues that forced me to wait while a third party had time to help me.
While waiting I managed to implement root motion. Though I could not properly verify that it worked as intended, just that it moved the object in the desired direction.
Once I received the material needed to continue work on additive animations I was able to create a flawed implementation that only partially worked.
I did manage to figure out how I could solve the problem, but ran out of time before I could apply it to my code.
Found an issue that caused Blend Spaces to warp the model if the animations did not have matching fps
During Easter I began working on creating the interface and structure needed for Additive Animations and the Animation Controller that would handle them. This did not take too long and I still had a lot of time to spend with my family.
Once school started again I began working on the logic to run the Additive Animations. Though once it was done it looked weird and I spent a couple of hours testing out different ways to calculate the bone cache (I sadly can not show the troubleshooting process here on the website since I do not have the rights to the model or animations used during testing, but the weirdness was most notably that the fingers and hands curled backwards in a highly unnatural way).
After consulting my teacher about what it could be, I was told to use animations designed to be additive. Luckily enough I did have some that I had gotten from Hedvig Kronnäs the week before, but had not yet tested.
Sadly due to some issues with the fbx-importer used in my engine I could not load the model and animations she had supplied, and I had to ask her to reexport them with some other settings.
While I was waiting to get the new files I decided to start experimenting with root motion.
Writing the logic for it went a lot faster than I had expected, but I now faced another issue. I had no animations with root motion, and none of the Animators I knew had any available.
So I headed to Epic and found some free animations that had root motion and exported them using Unreal.
When I tried them it at least proved to me that I had done something right, because the animation moved the object it was attached to. Though it seemed to move it way faster than expected. But since I was unsure exactly how it was supposed to look, and if I had exported it using the correct settings in Unreal, I decided to count it as a success until I had an animation where I could confirm the export settings and verify that the movement speed was correct.
By this point I had gotten hold of the newly exported animations from Hedvig and they worked perfectly. I was finally able to properly test additive animations and managed to work out a way to make them look a lot better than before. But there was still some problems. The arms of the animation was raised slightly and the steps of the walk got shorter.
Thankfully I managed to finally find a better keyword for the search engine I used and managed to find some resources that actually described the logic behind additive animations and not just how you use them in Unreal.
Unfortunately I did not have enough time left to apply my new knowledge to the project before the course ended, but I plan on finishing it in order to use it in our groups engine for the eight and last game project.
This was the first game I ever made.
I worked on power-ups, pick-ups and sound in this project.
Since it was my first time working with game development a lot of time went into learning how Unity works and how to structure the files and code.
Spent most of the remaining time with finding and editing sound effects and music for use in the game. I was responsible for implementing everything related to sound and music in-game.
This game was made using Unity and was mainly built for Android, but we did produce some versions for PC as well.
In this project i worked mainly with UI, but was also responsible for handling level loading and some minor parts of game play.
The UI was created with Unity's UI Toolkit, so a lot of time went into learning how it works and how I could make the menus responsive, so that they would look good both in mobile and PC versions.
The first game project we made in the schools own engine TGE.
During this project i was mainly working with developing systems for the engine, but also created the pipes that drop scrap on the player and the upgrade the player unlocks later in the game.
Some of the systems i created for this game includes:
The second and last game project produced using the schools game engine TGE.
Since i had not tried it yet I went for tools programming during this project.
For this project that mostly meant creating tools in Unity, since the level designers and graphical artists were building the levels there and then exporting them to our engine.
Some of the tools i created was:
Towards the end of the project I also helped with optimizing the game since we were suffering from low frame rates.
Some of the optimizations i did was:
This was the first game we created by using an engine made by us students.
It is a very short game mostly meant as a way for us to get the basics of the engine ready for later projects.
I was meant to create a Component-system for the engine during this game, but due to sickness I was absent for a large part of the first half of the project.
So since the game was small with few types of objects the group designed a simple system with actors instead, and I went on to create some of the game play elements during the second half of the production.
The first large project in our own engine.
This project I was mostly working on developing the engine further.
The first thing I did was to restructure our engine from the previous project in order to make it more modular, since it had been very rushed and pretty much everything was handled by a single class, and we wanted a Component-system instead of using Actors.
Once that had been accomplished I began working on creating a Collision-system with callbacks to the objects that collided.
I also created a large part of the Components that were used, such as Camera, Mesh, AnimatedMesh, etc.
Towards the end I also made it possible to serialize our animations and models to binary format in order to be able to load them easier with a threaded loader.
During this project I mostly worked on integrating PhysX in the game engine.
This included:
I also reworked the base of our component system in order to solve issues we had when copying and moving GameObjects.
Created a couple of macros that was used to declare new component types. These ensured correct inheritance and created some basic functions and friend declarations that needed to be implemented for every component.
It was also during this project that I copied over my work on Animations from my specialization, so spent some time adapting it for use with the groups graphics engine.
This was our final project that we worked on full time for 9 weeks.
I started out creating the base for the system that was used for all items that could be picked up in the game. This was in order to have a single interface that was used for all interactions. It was created using inheritance and function-overloading.
Then I went on to create all stations that spawned items as well as the thrash can, and was also responsible for some of the tools used to create stations and items in the editor.
Spent a lot of time reworking and adding more functionality to our Component-system and in adding support for multiple controllers.
Towards the end I implemented sockets in Animations. These were used for the player characters and some of the workstations.
My name is Olaus, and I have wanted to work in Game Development since I was a kid. My plan had been to study Game Development directly after my Upper Secondary Education, but I was so tired of school that I decided to take a one year sabbatical from school in order to get some work experience. Almost 15 years later I finally decided that it was time to get back to school again, and it was probably the best choice I have made.
I find programming to be extremely fun and I really like building systems and tools that can help others with their work.
Working closely with other disciplines is also something i truly enjoy. It also an important part of developing systems that others find easy to interact with and that fulfils their needs.
So far I have mostly been working as a Tools and Engine programmer, but I also have some experience with gameplay, I do not really have a preference between the 3 so long as I enjoy my work environment and colleagues.
During my "short study break" I worked in a wide variety of jobs in different sectors. Thus I learned a little about a lot of things, and have experienced how daily life is for people in various parts of society.
If you want more information feel free to reach out to me via any of the social media platforms below.
Olaus Klaveness