The past two weeks were productive. I’m still working on my portfolio and applying to jobs in addition to game development. Here’s what I did.
Rotary Hammer
I added another portfolio piece. I always wanted to make power tools because they have intricate shapes and designs. I tried once a long time ago but abandoned it because I was way in over my head. I spent a lot of time texturing and detailing it, I’m quite happy with the result. Check out the ArtStation post for more renders : https://www.artstation.com/artwork/Ez8VL2




Dream Stability
I already had the concept of dream stability implemented a very long time ago, but now I made it super easy to control. Just add the dream controller to a level and set the stability value, and it will take care of adjusting the post-process effect and the distortions. Below is a test with in in the main world, where it’s normally not supposed to be used, but it looks trippy.
I need to fine tune the look and add support for sounds when I need to use it. But this will do for now.
New Skeleton
When making the robot nodel I experimented a lot with the skeletons and rigs, and I ended up with about 5 different skeletons and rigs. I decided that the best course of action would be to adjust the Mannequinn rig and add the missing bones, like the ear antennae and the jaw. I did that, and retargeted the animations, so now it works fine and I don’t have any unnecessary assets. I can make animations for it without worrying about invalidating them.
Facial Expressions
With the new skeleton, I made a few animations for facial expressions. The term is used loosely because it can also refer to nodding and similar things. The decision to add “dog ears” antennae was made a long time ago, to compensate for the lack of actual facial expressions. I’m taking inspiration from exaggerated animations from old WB and Disney cartoons and some stylized and expressive new ones.
Below is an example animation, from Blender.
With the animation exported I had to integrate it with the interaction system. I already had a “facial expression” interaction type that I didn’t properly implement yet, so I added the actual logic to it. If you interact with an NPC and you reach a facial expresison line (eg. `Facial Expresison, Happy`), the interaction system will search the expressions data table for a row called Happy, and from there it will retreive the animation asset and the shader parameters used for the eye (eye size, open/closed eyelids, random movement, use a custom animation…etc).
Here is an example from Unreal, with everything implemented and working properly. (Ignore the weight painting issues, I was still in the process of transitioning to the new skeleton)
offsensive words detection
I will eventually allow the player to pick a name for their character, and for that I had to add a list to block some offensive words. I made two lists : Strict offensive words, and normal offensive words.
The strict offensive words will ban any word containing them, even as a substring in the middle of the name. For example let’s say “Cat” is a strictly banned word, that will mean the words “category”, “placate”, “educate”, “provocative” and so on will all be banned too. This is only reserved for severe ones, like slurs.
As for the normal list, it will only bad a word if it’s very similar to what’s on the list. If “Hose” is in the list for example, “chose” and “those” will be fine, and only “hose”, “HOSE”, “Hoses” and so on will be banned.
I’m fine with letting the player use profanity in their name, it’s their choice after all, I’m just trying to prevent slurs for obvious reasons, and also the very lazy and obvious ones, at least be creative with it lol.
Fun fact : I banned SteamUser, Username, User, Player and so on for the username autofill (detailed below). But internally they’re handled like offensive words.
Username
I had the idea of reading the username from the PC and using it in a 4th wall breaking dialog. I quickly wrote a short interaction with the subject of simulation theory, and my goal is to surprise some players by knowing their username and using it in dialog, especially if it’s different from the picked player name.
While doing this I also fixed some bugs with the chatter system, and used it here to portray a character reading a book out loud.
If the username happens to match the player name, or it’s in the forbidden list (this is why User, SteamUser…etc are banned), then it will be replaced by a fallback name called “Elidith”. It’s just an inside joke I had with a friend.
Optimization
While I was optimizing some lights and converting everything to static/stationary, I noticed a significant drop in performance for some reason.


Performance on the steamdeck was even worse, it went from ~60 down to ~15. I isolated the issue to the directional light being stationary at first. It didn’t happen with it being dynamic or static. The next day while discussing some environment art stuff with a friend we mentioned double-sided shadows and I remembered I had that temporarily enabled for the terrain, a massive (placeholder) single object with a few hundred thousand triangles. Disabling it gave a performance uplift, and things are actaully a bit faster with baked lighting, as they should be.


The good thing is that I got a huge performance increase on the SteamDeck too, ~110FPS at 75% resolution, vs ~60 at 50% resolution previously. Even the challenging parts where all unoptimized rooftops and trees were visible it still hovered comfortably above 60m that’s a good sign.

Misc
I made a batch .exr/.hdr to .tbsky converter plugin for Marmoset Toolbag. I needed it to convery my HDRI library and add it to Marmoset’s user library without doing so by hand.
The plugin can be downloaded from here if you want it. It is compatible with Marmoset 5.02 Beta, maybe other versions too https://pastebin.com/AYPRS3ks
I also finished Chapter 3 of Deltarune, things are starting to get interesting. I played Blender Studio’s Dog Walk too, it was cute and I really liked the paper and watercolor style, it’s very well executed.
That’s about it for this week, thanks for reading, and I hope to see you again next time!