Crates.io | brres |
lib.rs | brres |
version | 0.1.7 |
source | src |
created_at | 2024-06-13 21:36:27.87749 |
updated_at | 2024-08-03 07:11:44.002192 |
description | brres is a Rust crate designed for reading and writing .brres 3d model archives used in the Nintendo Wii games. The library provides C bindings, making it useful in both Rust and C/C++ based projects. |
homepage | https://github.com/riidefi/RiiStudio/tree/master/source/brres |
repository | https://github.com/riidefi/RiiStudio |
max_upload_size | |
id | 1271408 |
size | 849,737 |
brres
WIP Rust/C++ crate for reading BRRES files
BRRES (.brres) is Nintendo's first-party 3D model format for the Nintendo Wii. Used in games like Mario Kart Wii, Twilight Princess and Super Smash Bros: Brawl, .brres is a versatile and efficient file format. Nearly all data is stored as raw GPU display lists that are directly read by the Wii's "flipper" GPU.
gctex
[https://crates.io/crates/gctex]: For encoding/decoding raw Wii texture datarsmeshopt
[https://crates.io/crates/rsmeshopt]: For performing "triangle strip" mesh optimization for Wii.At the very root, ".brres" is an archive format for the following sub-files. All but SHP0 are supported.
Filetype | Description | Rust structure |
---|---|---|
BRRES v0 | 3D Resource | Archive |
MDL0 v11 | 3D Model | Model |
TEX0 v1/v3 | Texture | Texture |
SRT0 v5 | Texture scale/rotate/translate animation | JSONSrtData |
VIS0 v4 | Bone visibility animation | JSONVisData |
CLR0 v4 | Shader uniform animation | JSONClrAnim , editing limitations |
CHR0 v4 | Bone/character animation | ChrData , editing limitations |
PAT0 v4 | Texture image animation | JSONPatAnim , editing limitations |
SHP0 | Vertex morph animation | Unsupported |
Filetype | Description | Rust structure |
---|---|---|
MDL0.ByteCode | Draw calls + Skeleton | Merged into JSONBoneData , JSONDrawMatrix |
MDL0.Bone | Bone | JSONBoneData |
MDL0.PositionBuf | Holds vertex positions | VertexPositionBuffer |
MDL0.NormalBuf | Holds vertex normals | VertexNormalBuffer |
MDL0.ColorBuf | Holds vertex colors | VertexColorBuffer |
MDL0.UVBuf | Holds UV maps | VertexTextureCoordinateBuffer |
MDL0.FurVecBuf | Fur related | Not supported |
MDL0.FurPosBuf | Fur related | Not supported |
MDL0.Material | Material data | JSONMaterial |
MDL0.TEV | Shader data | Merged into JSONMaterial |
MDL0.Mesh | 3D mesh data | Mesh |
MDL0.TextureLink | Internal | Recomputed |
MDL0.PaletteLink | Internal | Recomputed |
MDL0.UserData | Metadata | Not supported |
Thus, the Rust view of a MDL0 file looks like this:
struct Model {
pub name: String,
pub info: JSONModelInfo,
pub bones: Vec<JSONBoneData>,
pub materials: Vec<JSONMaterial>,
pub meshes: Vec<Mesh>,
// Vertex buffers
pub positions: Vec<VertexPositionBuffer>,
pub normals: Vec<VertexNormalBuffer>,
pub texcoords: Vec<VertexTextureCoordinateBuffer>,
pub colors: Vec<VertexColorBuffer>,
/// For skinning
pub matrices: Vec<JSONDrawMatrix>,
}
Read a .brres file from a path on the filesystem.
let archive = brres::Archive::from_path("kuribo.brres").unwrap();
assert!(archive.models[1].name == "kuribo");
println!("{:#?}", archive.get_model("kuribo").unwrap().meshes[0]);
Read a .brres file from a raw slice of bytes.
let raw_bytes = std::fs::read("kuribo.brres").expect("Expected kuribo :)");
let archive = brres::Archive::from_memory(&raw_bytes).unwrap();
assert!(archive.models[1].name == "kuribo");
println!("{:#?}", archive.get_model("kuribo").unwrap().meshes[0]);
(to a file)
let buf = kuribo.write_path("kuribo_modified.brres").unwrap();
(to memory)
let buf = kuribo.write_memory().unwrap();
std::fs::write("kuribo_modified.brres", buf).unwrap();
fn test_read_raw_brres() {
// Read the sea.brres file into a byte array
let brres_data = fs::read("sea.brres").expect("Failed to read sea.brres file");
// Call the read_raw_brres function
match brres::Archive::from_memory(&brres_data) {
Ok(archive) => {
println!("{:#?}", archive.get_model("sea").unwrap().meshes[0]);
}
Err(e) => {
panic!("Error reading brres file: {:#?}", e);
}
}
}
Implements a Rust layer on top of librii::g3d
's JSON export-import layer. Importantly, large buffers like texture data and vertex data are not actually encoded in JSON but passed directly as a binary blob. This allows JSON files to stay light and results in minimal encoding latency (tests TBD).
Format | Supported |
---|---|
MDL0 | Yes |
TEX0 | Yes |
SRT0 | Yes |
PAT0 | Yes* |
CLR0 | Yes* |
CHR0 | Yes* |
VIS0 | Yes |
SHP0 | No |
clang
compiler is needed on Windows. The Microsoft Visual C++ compiler cannot be used.Unit tests are being used to validate correctness. Run the suite with cargo test
brres-sys
Low level documentation available here.