Features & limitations

The Spyro Model Extractor is a tool for extracting 3D models from the original PlayStation trilogy.
Besides aiming to render these models properly, it also allows them to be exported to common interchange formats for use in other applications.
Single-frame model dumps can be done to the Wavefront OBJ and Stanford PLY formats, however the main feature is that fully animated models can be exported to the common interchange formats Collada or FBX. This means that they can then be imported into most any 3D modelling application or drag-and-dropped into a game engine to play around with.
Four-side high resolution renders can also be exported of any viewable model, optionally with a transparent background for image compositing projects and similar.

This project focuses on extracting level entity models (ie. most anything that isn't part of the main levels, skies or 2D UI - there are already other tools available for that). In this initial release version it can view and export most such models, including npc's, enemies, fodder, chests, obstacles, gems, Spyro himself, Sparx and the other playable characters from Spyro 3.
Cutscene models can currently be extracted from Spyro 1, but for Spyro 2 and 3 they unfortunately appear to use a different format that has yet to be figured out. For gameplay models most everything except for certain special effects (smoke puffs etc.) should be readily accessible from all three games.

Download

Click here to download the Spyro Model Extractor.
Make sure to unzip the downloaded archive somewhere before trying to run it, or it won't work.
A copy of this reference document is included in the downloaded archive.

Requirements

The extractor application should work on Windows 7 or later (32- or 64-bit), though it has almost exclusively been developed and tested using Windows 10.
DirectX 11 is required, as is a screen resolution of at least 1640x960px (ie. a regular 1080p display will do fine).
You will also need a PSEMU-compliant emulator (such as ePSXe, PCSX-R or PSXeven) and a copy of the game you'll wish to extract models from.

The model extractor may also require administrative privileges depending on your UAC settings - it needs this to inject code into your emulator.
You may also receive a firewall warning - the application will check for available updates on startup. If you do not allow it to access the internet it will be unable to do this, however internet access is not required to use the currently installed extractor version.

Supported software

Emulators

The Spyro Model Extractor has been tested with and should work with the following emulator versions:
Emulator Tested versions
ePSXe 1.5.2, 1.7.0, 1.8.0, 2.0.0, 2.0.5
PCSX-R Final official released version
PSXeven 0.19
It is likely to also work with other versions of these same emulators; if you encounter one with which it does not work, feel free to let me know.
Note: the extractor has been most extensively tested using ePSXe 1.8.0 during development.

Games

The following Spyro games are supported:
Title Region Type Notes
Spyro the Dragon PAL Retail “Fully” supported
Spyro the Dragon NTSC Retail “Fully” supported
Spyro the Dragon NTSC June 15:th Prototype Partially supported (brute-force scanning only, no player model)
Spyro 2: Gateway to Glimmer PAL Retail Cutscene models are not supported
Spyro 2: Ripto's Rage NTSC Retail Cutscene models are not supported
Spyro 3: Year of the Dragon PAL Retail Cutscene models are not supported
Spyro 3: Year of the Dragon NTSC Retail Cutscene models are not supported
Spyro 3: Year of the Dragon NTSC Greatest Hits Cutscene models are not supported
A curious thing to note is that the start menu models from Spyro 2 can be accessed, however the start menu for Spyro 3 appears to use a different model format (probably the same as is used for the cutscenes). This is interesting as otherwise there are essentially no differences in model formats at all between Spyro 2 and 3, unlike with Spyro 1.

Operation

The application will automatically detect any running emulator process that is supported and attach to it when launched.
The extractor works by taking snapshots of the emulated PSX' system and video memory and parsing through that for models. Such snapshots will be taken immediately when an emulator is detected - this may not be the right time for doing it however. Use the [L] key to take a new memory snapshot (see the hotkeys section for further details).
If the emulator is in a bad state (for example during very early game booting), it could transpire that either the extractor or the emulator itself will crash. If this happens, please try to let the emulator get to an in-game level before launching the extractor.
Also beware that going into the pause menu in-game in Spyro 1 or 2 will destroy parts of the PSX' VRAM - this could then result in not properly extracting textures. To avoid this, simply do not take any snapshots while the game itself is paused (NOTE: it is perfectly fine for the emulator application to be in a paused state however, just not in-game as the Spyro games overwrite part of the video memory with what it needs to display the pause menu graphics at that point).
In Spyro 3, the same type of problem occurs when viewing the atlas, but not on the pause menu itself due to how it is drawn.
Similarly, it is a bad idea to try to take snapshots while in a transition between levels, when loading into cutscenes, etc.

Model types

The extractor supports three types of models: The type to focus on can be selected using the tab-like buttons in the upper left of the screen. The green one is the currently selected category.

Brute force scanning

The Spyro games maintain most level-specific models in certain memory regions, however there are other models to be found elsewhere in memory.
In order to access such models, you can tick the use brute force model scanning checkbox. As its name implies, this may result in some garbage being displayed, but it will also let you view otherwise hidden ones such as Sparx or Spyro 1 cutscene models (including the elder dragons).

Take note that while Spyro 1 cleans up its old models from memory each time a new level is loaded, Spyro 2 and 3 does not and simply overwrites old data as it needs to. This will commonly result in getting lots of half-broken models from previous levels when the brute force scanning checkbox is ticked in these games.

Channels

Subsets of the faces (polygons) belonging to a model are split across channels - these correspond to different rendering attributes as available on the PSX. There are also a couple of special channels which serve to emulate more complex rendering paths to achieve special effects, such as flat-shaded lighting or the warpy metal armour shading.
You can essentially think of the channels as material sub-meshes.

Exporting

Models can be exported in two different ways; Note that certain information cannot be exported to any of these formats, namely:

User interface

The Spyro Model Extractor uses a mix of GUI components, hotkeys and a command prompt to receive user input and provide feedback, all coming together in a glorious mess and showcasing why I'm a programmer and not a UX designer ;-)
The GUI components should be relatively self-explanatory, but let's go over the other two in some more detail as they hide some of the core functionality.

Hotkeys

Hotkeys are used for commonly used operations to make them easy to access.
For a hotkey to trigger, the extractor application must have keyboard focus. The following hotkeys are available:
Key(s) Description
L Fetches a new RAM / VRAM snapshot from the emulator, capturing its current state.
You will want to use this whenever going into a new level to access the models from there.
Ctrl + L This works akin to the L key alone as outlined above, however it will also reprocess information about the current game.
You'll want to use this if you change the current game in the emulator - only using the L key in that case will keep assuming the previous game and thus not work as expected.
G Toggles the display of the transform gizmo.
Sometimes you may not want this drawn on top of the model while at other times you'll want to use it.
T Activates translation (positioning) mode for the transform gizmo.
R Activates rotation mode for the transform gizmo.
S Activates scaling mode for the transform gizmo.
C Resets the transform of the currently loaded model.
There is a bug with the rotation gizmo where using it will sometimes invalidate the model's world matrix and cause it to disappear, at which point this button can be quite handy to avoid having to reload it completely.
Ctrl + A Selects all faces belonging to the currently enabled channels.
Return Enter command input mode / submit command if already entering one.
See the section below for more details.
Esc Closes the extractor application.
F1 Displays the raw VRAM snapshot in place of the texture preview.
F2 Displays the texture of the currently loaded model, if any, in place of the VRAM snapshot if that was currently displayed.
F3 Highlights pixels that have the semi-transparency bit set in the currently displayed texture.
Such pixels are highlighted in purple.
Note: this exists mainly for internal debugging purposes and is unlikely to be of interest to most users.
Scroll The scroll wheel can be used to zoom in / out on the currently loaded model.
Hold down the [Ctrl] key to zoom a greater distance per turn of the wheel.

Command prompt

The bottom left region of the extractor window is dominated by a command prompt. This is used to enter commands, typically to carry out more advanced operations.
To begin entering a command, simply press the [Return] key. The available commands are as follows:
Command Example Description
list list Prints a list of all the available commands.
help help command-name Displays detailed information about the command with the given command-name, including its syntax and meaning of arguments, if any.
You will find more information using this command than from just browsing this reference.
man man topic Displays manual-type information directly in the extractor console about the given topic.
While this reference serves as an initial overview, you may find more detailed information about specific parts of the extractor in the topics given here.
Issue this command without any topic argument to see a list of all the available topics.
about about Displays some information about the currently installed extractor application itself.
mfc mfc channel Moves the currently selected faces (polygons) from their current to the given channel.
If you just want to extract models as-is you will probably not need to use this command.
flip flip Flips the winding order (and thus normals) of the currently selected face(s).
This may be useful prior to exporting a model from Spyro 1, whose triangle's winding order seem to be more or less arbitrary (in Spyro 2 and 3 they seem to always be the same on the other hand).
It may be easier to flip normals by importing the exported model into an actual 3D modelling application, but the option exists to do it directly from the extractor if you're not afraid of manual labour.
noffset noffset distance Offsets the currently selected faces by the given distance along their normal vector.
As the PSX had no Z buffer, polygons were manually sorted prior to drawing and as such the extracted triangles will sometimes end up Z-fighting when drawn using modern hardware. This provides a way to alleviate such issues.
zoffset zoffset depth Offsets the currently selected faces by the given depth in screen space.
This is a superior way to alleviate overlapping faces compared to the noffset command, however z-offset data cannot be exported to any common interchange formats.
A default depth offset to apply to textured faces can be set via the GUI to prevent the most common Z-fighting issues in the extractor itself; by default it is set to a value of one, though you may find that better results can be achieved by tweaking this for different models.
weld weld maxDistance Snaps vertices that are within the given maxDistance from eachothers to the same point in space.
This can be useful after using the noffset command if it results in the offset faces becoming disjointed.
Vertices that are part of the same face will not be merged, so this is useful for snapping edges together even for small faces.
colv colv vertex, colour Sets the colour of the given vertex to the specified colour.
colr colr old, new Replaces any instances of the given old vertex colour with the new one for all currently selected faces.
mas mas Opens the metal armour settings dialogue.
The metal armour faces uses a kind of fixed environment mapping; in the original game this seems to be somewhat differently implemented from model to model. The settings accessible through this command can be used to tweak how this effect is rendered.
Beware that the metallic shading settings can not be exported to any common interchange formats.
dump dump [-ao|-ap] Dumps the current state of the loaded model to a still frame model file.
The model can be dumped to either the Wavefront OBJ or Stanford PLY format.
Beware that the OBJ format does not support vertex colours - when saving to this format vertex colours will be packed as per-vertex normals where R = X, G = Y and B = Z.
The PLY format on the other hand does support vertex colours and as such is recommended to use if you mean to import the models into any other piece of software without having to convert the normals to colours first.
The associated texture, if any, can also be exported.
If the -ao or -ap flag is supplied, all frames of the current animation will be dumped as individual model files.
Use -ao to dump all the frames to the OBJ format, or -ap to dump them to the PLY format.
export export Opens the export dialogue, from where the currently loaded model can be exported to either the Collada or FBX formats.
For multi-mesh models (“channel blocks”) only a single model can be exported at a time (for example all gems in Spyro 2 / 3 are stored in the same 'object', but each individual gem uses its own mesh and so must be separately exported), however animations and textures will be exported as well.
ss4 ss4 [-h=xxx], [-bg=yyy] Exports a 4-side render of the currently loaded model as it appears in the extractor application.
This can be used to produce high-resolution images of various Spyro characters, objects, etc. The height of the exported image can be set (the width is determined based on the height), as well as a background colour (which may be transparent). The resulting render is saved to the PNG format.

Good to know

Known issues

Troubleshooting

Here are some potential issues and suggestion to try to resolve them:
Problem Suggestion
Objects do not appear to be properly textured Try to re-fetch the VRAM snapshot by pressing the [L] key once or twice.
If this does not help, check that you're not on the pause menu / atlas / inventory screen in-game.
If this is not the case either, check whether you may have the brute force scanning option enabled in Spyro 2 or 3 - in these games models from prior levels are commonly left half-intact in memory and will be detected in brute force scanning mode. This is normal and you can simply skip past those models if you need to use said mode.
If you get no textures at all (press the [F1] button to check whether the VRAM display is all black) the GPU plugin you're using with your emulator may not be well-behaved and you could try again using a different such plugin.
Models are not correctly shaded For some models you'll want to check the use metal armour shading for lightmapped faces checkbox, and for others you do not. Try to toggle it from its current state and reload the model (for example by dragging the model slider to load a different model and then back again - pressing the [L] button may not retain a change to these checkboxes).
Gems / orbs / etc. are grey These models have their colour set per-instance in the game, ie. it is not part of the model data that the extractor reads itself.
You can use the light colour box to set a desired colour for such objects - if you tick the retain checkbox next to it the set colour will be retained when loading a different model, otherwise it will revert back to grey.
Models appear broken In Spyro 1 it is necessary to check the ignore invalid faces checkbox to properly extract some models, such as the green and blue wizards.
If this is checked for a model that does not need it, it is likely to break that model instead.
If this is not the case, could it be a leftover model from a prior Spyro 2 / 3 level that hasn't been properly evicted from memory?
Some animations just look like a mess of triangles This can happen for some as-of-current unsupported special effects that use line and / or point primitives rather than triangles and quads.
Exported models do not import properly into a third party application As a first stab in the dark you can try to export to the other format (OBJ/PLY or DAE/FBX) and see whether that works better. Some applications may have troubles with certain file formats.
The application and / or emulator crashes Try to launch the emulator first and wait until you're in a game level to start the extractor.
If this does not help, verify that you have a supported game / emulator and if so, perhaps try to change your GPU plugin (Next3D 1.5 or Pete's OpenGL2 Driver 2.9 are known to work).
The extractor is not working Please verify that you are using a supported emulator and game version (for example demos or Japanese releases are not currently supported).

Credits & licensing

The Spyro Model Extractor has been developed by Husbjörn on and off since late 2018.
The games that it targets were developed by Insomniac Games (ca. 1997 - 2000).
The Spyro the Dragon intellectual property is currently owned by Activision.

I am unsure whether the original models are legally considered as belonging to Insomniac Games, Activision or the individual modellers / concept artists who made them back in the day, however they certainly DON'T belong to me or you.
As such the outputs of this application should be considered fit for personal use only.
It is probably fine to use them for things like screenshots and animated videos under some kind of fair use, but I take no responsibility for any such (or other) creations.
That said, if you do end up making something with them, a mention would of course be appreciated.
Please do not make any unmodified extracted models directly available to other people due to copyright considerations - at least when using the extractor, the user must provide their own game image, which they hopefully legally own.
- Husbjörn, 2020-09-23