Just Released: The “Ultima 9” Model Importer for Blender

This might just be the most exciting thing I’ve seen come out of the Ultima fan project community in 2023.

While the source code for Ultima 9 is safely stored in our offline archives, it seems unlikely that any EA studio will take us up on the offer to make it available to facilitate the development of a remaster. And while there have been a couple of very excellent fan projects — Forgotten World and Beautiful Britannia — that have pushed the boundaries of what can be done with the game in-engine (e.g. restoring bits of lost content, fixing bugs, improving textures, etc.), this Blender plugin offers the possibility of something…bigger.

This can import most models used in Ultima 9, with reasonable approximations of the in-game shaders for Eevee and Cycles. Overall it should allow for a fairly faithful viewing experience.

Two importers are provided. The terrain importer can read the terrain files in the static directory, which are textured terrain heightmaps. The model importer can read the fixed files in the static directory and nonfixed files in the runtime directory. Those file contain map objects in the same space as their respective terrains, so importing the fixed, nonfixed and terrain files of a given map will give you a pretty faithful reconstruction.

The model importer has a second mode, when opening the sappear.flx model archive file directly. The importer will ask for a model ID and, optionally, a range. This can be used to import a single model, or several models in one go using the range to specify how many models should be imported in one go. The model IDs range from 0 to 3764. However, some of the entries are invalid. Placeholder cubes are filtered but other script objects are not. MEshes are labeled with their model ID so the ranged import can be used to hunt for interesting IDs. It is however not advised to import the whole range in one go as performance can degrade fast.

Terrains are imported as single meshes. Models are segmented by limb, each parented to an empty. If a model has LODs, they currently all reside within the same hierarchy. Water planes are not imported

The plugin is still in development, and there are a few issues that the developer still needs to work through (e.g. handling alpha transparency in some of the textures).

Still, what this plugin means is that there’s now a means of setting up a pipeline to take all of the models and maps from Ultima 9, import these into Blender, and then from there move them into a modern game engine (e.g. Unreal). Which could make for some…interesting developments on the part of the fandom.