A cross-platform program/library for exporting files from Warframe. Provides a Command-line and Graphical interface. "Easily" extensible to support new formats and upgrades to existing formats.
Download the latest release.
Warframe-Exporter
is the easy-to-use program with a Graphical User Interface.Warframe-Exporter-CLI
is a Command-Line interface. This is useful for writing scripts to export files.Warframe-Exporter-CLI-Advanced
is a Command-Line interface with extra features. You probably don't need this unless you're familiar with the inner workings of Warframe.
- LotusLib: Provides an interface for the Warframe files. See requirements for Oodle.
- Binary-Reader Read binary data into primitive data types.
- Qt6: GUI framework.
- TCLAP: Command-line interface library
- spdlog: Logging
- ddspp: For exporting textures as DDS
- fx-gltf: For exprting models as glTF.
- nlohmann-json: Required by fx-gltf.
- glm: A helper library for models. Provides matrix and vector math operations.
- QtOpenGLViewer: View 2D/3D scenes with mouse rotation/pan/zoom
- bcdec: Decode block-compressed DDS images.
- libspng: Effieciently encode images as PNG.
Inside the utils
folder, you'll find a collection of .hexpat
files. These are patterns for ImHex. If you're interested in the file formats analyzed in this repo, I highly recommend using these.
- Download and install ImHex
- Copy all
.hexpat
files intoC:\Users\<Username>\AppData\Local\imhex\patterns
or~/.local/share/imhex/patterns
- Load a raw file into Imhex for analysis
- Using the advanced tool, find specific formats using the
--print-enums
flag - Write raw files from the advanced tool using the
--write-raw
flag
- Using the advanced tool, find specific formats using the
- Within ImHex, go to File -> Import -> Pattern File and select the appropriate pattern
CMake is very nice and I love it. See how easy this is to compile? I hate GUIs and Windows.
- Packages
- Windows: CMake, git, Visual Studio 2022
- Other OSs: CMake, git, any C++ compiler
- A copy of the Oodle SDK (Provided by Unreal Engine)
- Download the files.
- Easy: Download from here.
- Hard: Download from the engine
- Download Unreal Engine from the official website (You will need an account and the Epic launcher)
- Once downloaded find the SDK folder
Engine/Source/Runtime/OodleDataCompression/Sdks/2.9.5/lib
- Create a folder in the root of this repository named
bin
- Copy folders
Linux
andWin64
intobin
. We want the static libraries here.
- Download the files.
Rather than duplicate build commands here, please refer to the runners inside .github/workflows
.
For more information on the cache file structure, read the LotusLib documentation.
Inside the Cache files Warframe stores on your computer (.toc and .cache), lie all the game's assets. The assets are not stored in standard formats like PNG images or FBX 3D models, they're stored in custom formats. This program reads these custom assets from the cache and converts them into sandard formats. Since it's only reading files from the cache, there is 0 risk of being banned from Warframe. Unless you run this while Warframe is running, then Warframe may detect something is reading the cache files.
Every virtual file inside the cache begins with the Common Header structure. Inside the Common Header is an integer enumeration indicating the file type. This file type indicates how the remaining data is formatted. This Extractor maintains a mapping of supported file types to an extractor (All model enumerations are processed by the model extractor, texture by the texture extractor, etc).
I've implemented my own flow to extract assets. The goal was to ensure new formats can easily be added. Each folder (ex. Model, Texture, Material, etc) implements this basic structure:
- Read the virtual file into an external data structure. The external structure should resemble the source file structure as closely as possible.
- Convert the external structure into an internal structure. This stage removes any game-logic, engine transformations, or anything else that may interfere with basic assumptions about the structure. The internal structure should be compatable for any possible use case.
- Export the internal structure into a standard format. These often require the use of external libraries to accomodate standard file formats (ex. glTF, PNG).
You may also notice an enum map structure floating about. The goal here is to link integer enumerations with C++ classes which process them. The file type enumeration (mentioned previously) is slightly more complex, in that the enumeration is specific to the game (Warframe/Soulframe) and the Package Category (Misc, Texture, AnimRetarget, etc). Extractors have their own Enum Map structure to handle game/package mappings, however there is also a basic Enum Map structure which simply links an integer to a processor class. This is used by other enumerations like texture compression and audio compression.