Havenly Inc.
3d Software Engineer,
March 2023 - December 2023 - Seattle, WA (Remote)
Havenly is an interior design service and furniture store. They create digital twins of customers rooms and match them with a designer to help redecorate. As part of this process the designer would furnish the digital room to create accurate to scale, photorealistic renderings showing how it would all look and fit together.
I was responsible for maintaining and improving Creator, their internal 3d design tool. Creator was a mix of a Unity WebGL app rendering to a React Canvas. Most of the 3d interaction happened in Unity, where as most of the connections to the rest of Havenly’s systems was through the webpage.
One of my first projects there was automating test renders for new build. Previously a designer would manually render out a scene before releasing an update. To automate this and increase the frequency, I added a new step in the gitlab CI/CD process. Whenever a new dev build would come out, a Cypress script would connect and load up a pre-built room. Cypress could only ‘see’ the React side so I adding some hooks in the Unity client to manipulate the scene and kick off a new render. The resulting image would then get posted to Slack channel and show us if we had any visual regressions.
Another project I worked on there was improving the asset pipeline. Anytime a designer wanted to use a piece of furniture we didn’t already have a model of, they we would need to submit a ticket and get a 3d modeler to make a new asset from scratch. This became untenable when we started adding customizable item that had dozens of fabric and finish options.
To reduce the workload we switch to modular assets. I working with an artist to developed a system for consistently tagging different parts of a mesh like the ‘frame’ or ‘fabric’ or ‘trim’. We then created a separate asset bundle for each model and each material. The assets would get stored separately on AWS but the relations(and permutations) could be retrieved with a GraphQL query. Then at runtime we could download the necessary bundles and assembly them in Unity.
Insight Global at Meta Reality Labs
Product Design Prototyper,
July 2021 - January 2022 - Seattle, WA (Remote)
At Meta Reality Labs I was a product design prototyper working on the communications team for Project Nazere, which would eventually become the Meta AI Glasses. My job was to build prototypes using existing hardware to show what the experience would be like so we could figure out best practices. Additionally I support user experience researchers by creating demos for them to use and gauge participants reactions to new methods of communication.
PlutoVR
Software Engineer,
September 2019 - April 2021 - Seattle, WA
PlutoVR was a Seattle based start up trying to envision the future of communication by pushing the limits of today tech. Their main product was a SteamVR overlay that allowed you have spatial conversations and share your point of view with friends, all while running on top any other XR experiences you were running.
During my time at Pluto I worked on most parts of the code base, but there are a few highlights that stand out.
Pluto hosted daily standup in the App, to make connecting more convenient, especially for those out of the office, we made an iOS app that could call in. While the mostly worked as we were using WebRTC, there were some considerations for how we rendered this to the VR users. To them, they saw just a flat floating plane in space. Viewing the plane from oblique angles made them hard to see and if their phone jostled a bit it was like their whole head was dodging and weaving like Rocky Balboa. To solve this we implemented Gravity Aligned Video and Depth Rendering.
For gravity alignment we took our video plane and rolled it in the opposite direction of rotation the phone was experiencing. This allowed the user to remain still and their frame instead to rotate around them.
For depth rendering we combined the color and depth data for each frame into one larger image. The depth camera runs at a lower frame rate, so we would just send the most recent each time with each color image. Then on the receiving end we split them back up, created a procedural mesh with a quad for each pixel and extruded them based on the value from their corresponding depth pixel. If the depth value was near zero (very far away), we would clip the pixel as to remove the background and only show the head. There was still some artifacting, some of it probably caused by the depth data being altered by the video compression. Other issues like glasses and eyes sometimes not showing happened because they reflect IR light differently than visible light. Overall however, the results was an improvement in VR.
Pluto also contributed to OpenXR, a part of Khronos Group trying to make standards to XR ecosystem. Pluto advocated for a Multiapps ecosystem where separate developers could individually create applications that could coexists in the same space.
One of the ways I prototyped this was with Web XR and Metachromium. Metachromium is a version of chrome where each tab is a WebXR overlay. The tabs themselves were invisible but otherwise worked like you’d expect. I mostly stuck to 3js to render objects and scenes, but most normal webdev works flows should work. And just like chrome tabs you could open as many as you want at run time, but rendering could get messy since they were each a separate layer.
Unfortunately As of March 2024, PlutoVR has shutdown.
Valence Group Inc.
Ar/VR Developer
November 2018 - August 2019, Bellevue, WA
At Valence, I was the lead developer on was ULA Anywhere AR, an education mobile app designed to show off the scale and capabilities of Unite Launch Alliances upcoming Vulcan Centaur Rocket at the 35th Space Symposium.
The project started in late November and needed to be completed before the symposium on April 8th. With the short timeline of the project, we initially decided to use Unity with Vuforia to be ability to build once and deploy to both android and iOS. This worked well at small scales, but struggled to maintain stable tracking when looking up at the full 67.4 meter tall rocket, especially on android. To solve this we switched to using the separate ARKit and ARCore plugins and relied heavily on preprocessor directives to split up platform specific code.
Another interesting challenge was accurately describing orbital launch capabilities. Low earth orbit requires much less power than geosynchronous orbit. Luckily the space industry uses a common format called the Two-line Element Set (TLE) to predict orbits over time. This was invented in the late 60s and early 70s for use with punch card, but it’s still effective to this day. I was able to integrate an orbital tracking library and get some historical TLEs previous ULA launches to accurately plot at scale the different orbits.
We successfully made our deadline and ULA Anywhere AR was available at 35th Space Symposium on Android and iOS.
After the success of ULA Anywhere AR I took on another project for Valence, this time on a virtual factory tour for Purina, the pet food company.
The idea was to capture 360 video of the factory and add training voice over and informational cards to help onboard new employees. To do they would load the tour on an Oculus Quest and ship it to the employee who would use this as part of their orientation before coming on site.
The problem was that the project started in April of 2019, the Quest released on May 21, and the initial app review was to take place in June. To achieve this we initially built a playable demo on the Oculus Rift with some demo 3d videos while the real video and audio was recorded. Then it would just be a matter of porting to the quest and swapping assets.
The approach mostly worked, but we ran into two issues once we finally got a Quest. The first was our scene transitions used a white sphere that was fade it’s alpha channel in and out between videos. On the Quest this flat out didn’t work and we were stuck with a white screen. While this initially panicked me, simply rewriting this effect directly in the 3d video shader solved this.
The other issue was file size. Our test video files were small, but the full tour took up way too much space and android apks have a size limit of 4gb. Streaming was out of the question because we couldn’t guaranty the employees internet. Instead we trimmed a lot of the videos down to the bare minimum to see a full loop. For mostly static scenes we held just one frame, but preserved the full background audio as a separate audio track to keep the space feeling somewhat alive.
We successfully delivered the first build in June with some additional support into July and early August.
Valence group is now know as Kopius, and you can find out more about these projects at their website.
https://kopiustech.com/case-studies/augmented-reality-application-ula/
https://kopiustech.com/case-studies/virtual-reality-nestle-purina/
Level11
Unity Developer
April 2017 – April 2018 / August 2018 - November 2018, Seattle, WA
During my time at Level11 I was consulting for Carnival, the cruise ship company, on their Ocean Medallion project. Being at sea inside a large metal structure, phones GPS and magnetometers both have issues orienting themselves. The medallion is a wearable IoT device that in combination with numerous BLE beacons at fixed points around the ship allows for more accurate positioning.
Along with the companions app, the Medallions allows for guests to easily navigate around the ship to find each other and meet up or allow for waitstaff to bring refreshments to them anywhere on the ship. Additionally these wearables were connected with a profile set up by the guest ahead of time to make onboarding and offboarding much quicker.
Initially I worked as a front end unity developer on their iOS app for the communications team where we developed ShipMates, the onboard friends list and chat. Cell service is unreliable out at sea so ShipMates utilized the ships internal network for stable communication.
Once ShipMates was relatively feature complete I moved onto the navigation team. OceanCompass acted much like google maps showing your near by ShipMates and Points of Interest with the ability to provide 3D routes to them.
I developed a lot of the UI/UX for both 2D and 3D deck interaction. Most of the unity code base was shared between the iOS mobile app and the linux 4k touchscreen portals around the ship. One main feature I was in charge of was routing. I wrote a custom spline mesh generator that would show an animated path to your destination across decks.
We successfully shipped OceanCompass in 2018 to the Regal Princess, and 10 more ships in the Princess line over the following months.
Level11 has since merged and become part of Launch Consulting. You can find out more about this at their website. https://www.launchconsulting.com/case-studies/carnival