Projects & Experience

Work Experience
MobilityWare   (Mobile Games, Objective-C/C#) June 2014 - Present

I am currently a Software Engineer II at MobilityWare and have been working on their highly successful mobile solitaire games for 6 years. For the first 3 years I was on the iOS team, supporting the 5 native iOS games built with Objective-C and UIKit. In 2017 I transitioned over to Unity with the rest of the iOS and Android teams and we finished porting our entire suite to Unity and C# the next year. We have since created many new games, including some that branch out from our classic core of casual singleplayer card games. Currently our product team supports a growing suite of 16 games that are played by millions of people every day.


Over the course of my time here I have touched nearly every aspect of the games, from gameplay to UI to serverside code. My knowledge of the games and attention to detail proved to be very useful during our successful efforts to transition millions of existing installs over to the new codebase. In addition to extensive work on the shared libraries powering our suite, I've worked on a variety of new games over the past few years, where my attention has focused on game data models, graphical effects, editor tooling, and audio.


Mobile Audio Relay   (PC->Mobile audio mirror, C#/Objective-C) August 2019

During a short period of time between projects at work, I was inspired by an audio producer's offhand comments to create a tool that would allow our audio team to hear the sound coming from their computer through a mobile device, as if it were a speaker attached to the computer. I created a system that relays audio from a Windows PC to an iOS phone or tablet. The host program was written in C# and sends audio data from a Windows output device (no need to change any system settings) to an iOS device plugged into the computer. The iOS client app was written in Objective-C with a UIKit interface and shows a few basic pieces of information about the audio stream. I was able to bring latency down to inaudible levels and it truly does feel like a wired speaker. Our audio producer was very impressed by and thankful for my efforts, and I was awarded one of our company core values all-star awards for this initiative.


Ants!   (Ant Simulation, Unity / C#) May 2019

As one half of a team of two engineers, I worked on this project as part of a weeklong company game jam. We decided to spend the week exploring new technologies by creating an ant simulation for mobile platforms using Unity's ECS architecture. Of particular interest is that very early on I realized that the prerelease version of ECS we were using did not support correct rendering of alpha blended sprites. Since this was an important feature for our game I wrote a basic render system to efficiently render our game by sorting all sprites back-to-front and then batching by material. I also handled most of the other visual features of the game, including animating the ants (which I also did the offline-rendered 3D work for) and implementing camera controls. (My teammate focused on the ant movement and exploration simulation while I handled most other tasks).

Programming
BOTB WebBuzzer   (Quiz Buzzer, C++/Javascript) May 2020

The UCI Honors Collegium puts on an annual "Battle of the Brains" faculty vs students trivia competition. This year we were forced to go virtual, and as a regular participant on the alumni/faculty team I contacted the organizers about my proposal for a web-based buzz-in system. In the span of a week I made it a reality, using C++ to implement a WebSockets server that communicates over a custom binary protocol with clients visiting a web page. In addition to the core feature of compenstating for network latency to keep things fair, I also put in various visual and sound effects to inform contestants and the moderators of the results. I also handle unexpected disconnection and automatic reconnection to keep things running smoothly.


Hoggit Bogey Dope   (Virtual AWACS, C#) September 2018 - October 2018

This was a tool that I wrote along with a friend for us to use when playing DCS World, a combat flight simulation. The multiplayer server we used had a website set up that would show the positions of enemy aircraft for use by radar intercept controllers. At the time there were not often human controllers online, and the built-in AI controller in the game was very basic. We decided to make our own and wrote this utility in C# to parse the JSON data file used by the online tool in order to handle some basic queries. Our program generated text "radio calls" that got sent to Google's cloud TTS and then played back in the form of audio. I also integrated a hotword detector with P/Invoke so that the system could be triggered by various keywords heard over the PC's microphone. We regularly utilized this tool for a few months until human controllers became more generally available and the game recieved updates adding an in-cockpit map display that provided us with similar information.


DOSI 3D Visualizer   (3D Visualizer, C++) November 2014 - June 2015

Throughout my final year at UCI I worked in support of a research project looking into using noninvasive optical sensors for breast cancer imaging. My work consisted of creating an application for display and analysis of the captured data. Using C++ and OpenGL 3.2 I made this visualizer, which loads in a model of the scanned surface (or a proxy object) and maps the data onto it as a texture. Users are able to blend between various data maps and also can create new mathematical combinations of loaded data files using a text entry box. The data is loaded from MATLAB figure files into floating-point textures, preserving data values and allowing for easily-swapped colormaps and the aforementioned custom layer. When display parameters are changed the data gets rendered out into a standard color texture on the GPU for final display. About halfway into the project I expanded it from a Windows-only application to also support MacOS. This involved the creation of a cross-platform utility layer that allowed me to handle various OS dialogs with a clean and uniform C++ interface.


Marker   (4kb Realtime Intro, C++) October 2013

Developed for a small 4k intro competition on a forum I frequent, I created my first size-limited intro, "Marker", in 2 weeks using a single HLSL shader to render a scene through distance-field raymarching. This shader ran on top of a minimal DirectX 11 framework that I built from scratch for this project. The final compiled executable (with sound provided by 4klang) measures at only 3508 bytes. I ended up winning 1st place as the challenge proved too difficult for my peers, who submitted no other entries.


Source Engine Parallax-Corrected Cubemaps   (Reflection Experiments, C++/HLSL) July 2013

While following the development of a Half-Life 2 mod that aimed to revamp the graphics of the 2004 game, I helped out by spending some time adding support for parallax-corrected cubemaps to the Source engine, following the work of Sébastien Lagarde. First, I had to modify the map tools to interpret specially-tagged volumes as being the cubemap proxy OBBs, and encode that data in a way that the game engine could read for use in the shader. Then, I had to add in my custom shader to use this data in order to calculate a better cubemap lookup vector. While my inexperience with the code-side of the Source SDK and a shader compiler crashing issue made me unable to fully integrate this technique into the usual environment material shader, I did sucessfully demonstrate the technique and released my code publically for others to integrate. After this I did spend additional time trying to expand on this idea by using depth-cubemaps to eliminate the need to manually place proxy OBBs and also to allow the cubemap proxy to more closely match the actual world geometry, though at the time I was unable to get this to perform acceptably.


See this in a video here.


The Wings of Rage   (2D Bullet Hell Shooter, C++) February 2013 - June 2013

This game was built on a completely new codebase on top of the SFML library. A top-down bullet hell space shooter, it combines traditional fixed aiming modes with additional free aiming modes and even close combat attacks.
I served as the lead programmer on a 5-person student team, where I designed and implemented a major part of the game's internal structure.


Loki   (3D Horror, Unity / C#) October 2012 - December 2012

As a programmer on this 11-person student team, my main area of focus on this project was graphical enhancements such as an ambient lighting system and a dynamic "insanity" overlay.
I also created most of the art assets for one of the game's levels.


Race of Spades   (2D Racing, Java) October 2011 - June 2012

I worked with 7 other students to create this fun multiplayer top-down racing game using Java and OpenGL.
One of my major contributions to this project was writing a spline-based track system.


TT-Stranded   (3D Survival and Building, Lua) June 2010 - June 2012

In addition to managing the community around this custom Garry's Mod gamemode, I maintained the codebase that I had inherited from a previous developer. I also provided support, added features, and fixed bugs.


Lunar Lander   (2D Flight Simulation, ActionScript 3) February 2012 - April 2012

In honor of the classic Lunar Lander game, I created an updated version for the Blackberry Playbook tablet. My version of "Lunar Lander" had me working with the Flash runtime on Blackberry TabletOS. Upon completion, I was able to take advantage of the Blackberry World mobile marketplace to gain over 12,000 unique downloads.
In addition to doing all of the programming, I also made all of the art assets and sound effects for this one-man project myself.

This game can be found on BlackBerry World under the title "Lunar Lander" by Brian Charles.


MiniTank Wars   (3D Tank Combat, Lua) January 2010 - April 2010

I created this Garry's Mod gamemode was created as part of a team of two, with me handling all programming, 3D modeling, and some textures.
It can be found online at ModDB and Google Code.


Web Programming and Design
Shadowbox Signature Generator   (Image Generator, PHP/MySQL) May 2013

Made in support of an online gaming group, this web application replaced a slow and ineffective manual process. It retrieves user information from a database and uses it to generate custom forum signature images using ImageMagick.


BMcms   (Content Management System, PHP/SQLite) August 2009

Written to provide me with an unadorned and easy to integrate CMS solution, I created a simple news-post CMS for my former personal site.
It has support for long post preview, captcha-protected comments, and multiple users.


Other / Miscellaneous
Wifi Coffee   (IoT Coffee Maker, C / Objective-C) September 2016

This was a fun side project that I made to allow my mother to turn on her coffee maker when she woke up without needing to get out of bed on the weekends. The embedded side involved programming an AVR in C to interface with a WiFi module, and the app side was written in Objective-C for iOS devices. I used UDP broadcast to implement a discovery protocol so that the coffee pot could be located on the LAN without having to know its IP address, and from there a direct TCP connection is established to read and change the state of the coffee pot (at a high level the project effectively moves the power switch of a coffee pot into an app).


Miscellaneous Electronics Projects   (generally C/C++)

I have long had an interest in electronics and I'd like to share a few smaller projects here:

  • I developed a C++ driver library for a 512x32 VFD to utilize its high-speed parallel interface, capable of driving the display in pixel mode at over 80 fps (the 33 fps photo is due to ADC limitations in the shown application). I also reimplemented my own replacement text features on top of my driver so that text and graphics can be freely mixed.
  • After modifying an Agilent 6624A power supply to have front-panel connections, I wanted to control it with my PC. However, it only had a GPIB interface. Using the protocol specifications, I programmed an Arduino board (directly programming the AVR in C using Atmel Studio) to act as a simple USB serial <-> GPIB interface.
  • While restoring an early-1980's studio tape deck I noticed that the tape counter board stored its firmware on UV-erasable EPROMs. Wanting to backup the data in case of age-related degradation, I developed a quick tool using an Arduino-compatible microcontroller to read the data off of the EPROM chips and onto an SD card.
  • Many flight simulator enthusiasts use TrackIR (an optical motion tracking peripheral) to control their in-game head motion. Most people use the active tracking clip which uses IR LEDs arranged in a way known to the tracking software. However, these LEDs require power, which is normally delivered with a USB power cable that some find annoying, especially if they are using a wireless headset. An offhand discussion with a coworker led me to wondering whether I could design and build my own wireless tracking clip (there are some avaialble but to me the prices felt high for the feature set). I ended up designing a custom circuit and PCB, in addition to designing the 3D-printed clip itself. The final device uses USB to charge an internal battery that provides over 13 hours of runtime.
  • One of my hobbies is photography, mostly with medium and large format film. Large format lenses rely on in-lens leaf shutters, and in addition to mechanical timing tolerances, at higher speeds and wider apertures the opening and closing movement can be a significant part of the exposure time. With slide film it is important to expose correctly as there is little room for adjustment after the fact. With these two facts in mind, I designed and built a small PCB to allow incoming light on a photodiode to be converted into a linear output voltage, which allowed me to connect an oscilloscope and characterize the effective exposure times of my lenses at various shutter speed and aperture combinations. From this data I created correction charts that allow me to set exact exposures without any guesswork.


dr_industrialist   (Game Level, Valve's Hammer) October 2009

This map was the third place winner in a month-long mapping contest. I made this map for the "deathrun" gamemode where a small group of players try to stop the others from running through an obstacle course.
This project had me working closely with Source's entity I/O system to create interactive, moving traps in Hammer.


gm_skydive2008   (Game Level, Valve's Hammer) May 2008 - June 2008

This Garry's Mod map was created as part of a two-person collaboration with a friend. With over 120,000 total downloads, this map has been extremely successful among the game's community.


3D Modelling

I have been making 3D models (mostly for various games) for many years. It is not my primary area of focus, so my output has been limited, but I am more than familiar with the process and pipeline and have many successful creations to show for it.
Many of my 3D models were made for projects I've listed above.


Other Images   (various technologies)

These are various screenshots taken from various, less complete small projects that I have worked on in the past. Short descriptions follow:

  • Image 1: Python and Panda3D, with Cg shaders. 2009
  • Images 2 and 3: C++, SFML and Box2D side-scrolling shooter. 2010
  • Image 4: WxWidgets, C++ and SFML level editor for above. 2010
  • Images 5 and 6: GameMaker 7 top-down tank combat. (Lines are debug features, ignore them). 2008