
Over the past few years I’ve been been working on the Mac version of Cyan’s Plasma engine. This engine was used for Cyan titles like RealMyst, Myst V, and Uru. I’ve been maintaining the port as part of the open source H’uru project.
I always wanted to port to iPad as well. Plasma has never run on iOS1 – but the Mac/Metal port seemed like a great starting point. But Plasma relies on CPython for its scripting system, and CPython has not supported iOS. That changed with the release of Python 3.13 for iOS. I now have a build of Uru running on top of an iOS version of Plasma.
Porting Process
I had to make a few changes getting Uru from macOS to iOS:
- The Mac port had an AppKit frontend that was not compatible with iOS. I wrote a new SwiftUI front end that can run on any Apple platform. (I’m keeping the Mac version on AppKit for now.)
- The Metal renderer needed minor changes. Some resource modes like MTLStoreModeManaged are not permitted on iOS.
- The Mac version used AppKit for input – so a new input engine had to be written for iOS.
- Touch and Apple Pencil input is received through UIKit.
- Keyboard input was added through the Game Controller framework.
- Plasma supports DXT/BC compressed textures. While M series and A17 or better Apple chipsets support this texture format – older devices don’t. I added software decompression to support these older devices.
- Python has a custom integration process on iOS. I had to bring in Python as a framework. Then I had to integrate the custom scripts necessary to bundle the dynamically linked Python modules.
iPad
Uru on iPad runs great!
Keyboard input works. Apple Pencil Pro’s hover feature controls the cursor, and works with rollover elements.
Here’s Uru running on an iPhone.
Apple’s mobile hardware is great for games. The OLED displays on my iPhone and iPad make the game pop – and the audio quality is great.
Limitations
Uru on iOS is intended as a demo. There are a few limitations that would hold it back from production release.
- Each individual Uru server expects to patch the Uru executable. This would make it impossible to ship a single client. Each server would need to submit their own client to the App Store and update regularly.
- The Uru user interface is designed around larger displays and really requires a mouse and keyboard. It would be difficult to play Uru on an iPad or an iPhone without input devices. And Uru’s content was not designed for an iPhone sized display.
- Text chat is not functional. The Game Controller framework doesn’t provide character input – only key input.
Vision Pro
I’m also working towards a native build of Uru for Vision Pro. Here’s the iPad version running on Vision Pro.
A visionOS version would not be a VR experience. Uru’s content was not designed for VR. Instead – I’m looking at building a wraparound 2D window with stereoscopic rendering and traditional mouse/keyboard input.
There are a few blockers to getting a visionOS build:
- Plasma uses the vcpkg dependency manager. It’s unclear if vcpkg will work well with the visionOS SDK.
- Plasma’s physics library – Nvidia PhysX – does not support visionOS. It supports iOS – so the process of adding visionOS support should be somewhat trivial.
- At the time of porting Python did not support visionOS. Within the last few weeks visionOS has been added as a supported platform and I’m eager to try it out.
Over the next few months I’m hoping to get a version of Uru running on visionOS devices natively. I think stereoscopic rendering would be a great fit for Uru and it would be amazing to bring Cyan’s work to Vision Pro!
- RealMyst did have a port to iPad. But this port used Unity instead of the Plasma engine. ↩︎