Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

116 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UEFormat

An intermediate 3D exchange format for Unreal Engine asset extraction.

Discord Blender Unreal Release Downloads

Plugins

Supported Exporters

Format Specification

Core Library

C++23 library under core/ for reading and writing the latest format (AttributeSetFormat / v10).

Compression (GZIP / ZSTD) is provided via git submodules under core/external/ (zlib, zstd). After cloning, run:

git submodule update --init --recursive
Target CMake Role
ueformat::ueformat core/lib Native C++ types + Context load/save
ueformat::ueformat_c core/api C FFI for other languages
add_subdirectory(path/to/UEFormat/core)
target_link_libraries(your_target PRIVATE ueformat::ueformat)
target_link_libraries(your_target PRIVATE ueformat::ueformat_c)

Link ueformat::ueformat for C++, or ueformat::ueformat_c for the C FFI.

C++ usage

#include "ueformat/generic/context.h"
#include "ueformat/generic/save_options.h"
#include "ueformat/model/model.h"

using namespace UEFormat;

Context ctx;
UEFormatContainer container = ctx.Load(bytes);
UEModel& model = std::get<UEModel>(container.Object);

FSaveOptions options;
options.ObjectName = "MyMesh";
options.ObjectPath = "/Game/Meshes/MyMesh";
options.Compression = EFileCompressionFormat::ZSTD;

TArray<u8> out = ctx.Save(model, options);

Typed helpers also exist under UEFormat::API (LoadModel / LoadAnim / LoadPose, plus matching Save overloads) if you already know the file type.

C FFI usage

Stable C entry points for interop (descriptors in, buffers out):

#include "ueformat/api/api.h"

UEFormatSaveOptions options = {
    .object_name = "MyMesh",
    .object_path = "/Game/Meshes/MyMesh",
    .compression = UEFORMAT_COMPRESSION_ZSTD,
    .compression_level = 6, // default level
};

UEFormatBufferResult saved = ueformat_save_model(&desc, &options);
if (saved.status == UEFORMAT_OK)
{
    ueformat_buffer_free(&saved.buffer);
}

UEFormatModelResult loaded = ueformat_load_model(data, size);
if (loaded.status == UEFORMAT_OK)
{
    UEFormatBufferResult again = ueformat_model_save(loaded.model, &options);
    ueformat_buffer_free(&again.buffer);
    ueformat_model_free(loaded.model);
}

The same pattern applies to anim (ueformat_save_anim / ueformat_load_anim) and pose (ueformat_save_pose / ueformat_load_pose). Always free buffers with ueformat_buffer_free and loaded objects with ueformat_*_free.

About

An intermediate 3D exchange format for Unreal Engine asset extraction

Topics

Resources

Stars

Watchers

Forks

Releases

Used by

Contributors

Languages