Lia's code and crafts

The Witness iOS

The Witness is a first-person puzzle game from Thekla Inc, released in January 2016 for Windows PCs and PS4 and in September 2016 for XBox One. It was designed mostly by Jonathan Blow, known for Braid. The game is set on a colorful island covered in vegetation, beautiful if slightly ominous: it uses a custom multi-platform game engine and a number of advanced techniques to achieve its unique look. I joined the team on a contract basis to put together an iOS port of the game, which released in autumn 2017. The game is also available on Mac OS and was once available for the NVidia Shield.

The Witness iPad Pro screenshot, showing most of the island covered in trees in various colors, a deep blue sky and a jetty over a mirror lake.
The Witness: view of the island on iPad Pro.

Some base porting tasks had already been done and so my main job early on was shader translation. This was before SPIR-V and easy-to-use shader translators, meaning the work was significantly more... ad-hoc. The original shaders were written in a subset of HLSL and there was already a parser and a syntax tree-builder available: I ended up focusing on code generation, handling edge cases and API quirks, as well as fixing the shaders to be more translator-friendly. The translator is open-source and available on GitHub though as mentioned there are much better tools out there nowadays.

With my focus being on shaders, it also meant that bug-hunting on rendering issues took up a lot of my time. Two especially nasty ones turned out to be shader compiler bugs. One of them affected the terrain. The other made the vegetation black in seemingly random locations. That's fine, it's not like the game has plants everywhere, right?

The Witness PC screenshot, showing a lot of dense green vegetation.
oh no

Some other platform-specific issues I handled were iCloud saving and audio notification handling. Both of those features include a lot of complex edge cases that can cause data loss or annoying sound bugs: trawling through Apple's recommendations and getting everything just right is never trivial! I also helped the team decide on whether to use Metal or OpenGL, back when the choice was still available. Metal was still fairly new and buggy, especially on MacOS, but turned out easier to use than OpenGL. My previous experience with XCode and its interface also allowed me to share a lot of tricks with the team and save everyone a lot of time.