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.
#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.
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.
