4 releases

new 0.1.8 Nov 7, 2024
0.1.7 Nov 7, 2024

#33 in Data formats

Download history 435/week @ 2024-11-04

435 downloads per month

Custom license

24KB
642 lines

RNM: Blazingly Fast + Tiny 3D Format

its 3d format for my game.
how is it blazigly fast ?
thanks to:

  • rkyv and zero-copy deserialization.
  • lz4_flex for realtime decompression.
  • qoi_rs for ultra fast image format.
60% smaller | 300% faster

Types:

Scene:

Scene {
    meshes: [Mesh]?,
    materials: [Material]?,
    lights: [Light]?,
    textures: [ImageData]?, // QOI format
}

Mesh:

Mesh {
    positions: [Vec3],
    uvs: [Vec2]?,
    normals: [Vec3]?,
    colors: [Color]?,
    tangents: [Vec3]?,
    bitangents: [Vec3]?,
    indices: [3 x u16]?, // must be triangles
    material: u8?, // material index in scene
}

Material:

Material {
    albedo: Color | u8,
    metallic_roughness_emission: (m: f32, r: f32, e: f32) | u8,
    normal_texture: u8?,
    specular: f32,
}
// all u8 are textures index in scene

Lights:

Light (
    Point {
        position: Vec3,
        color: Color,
        power: f32,
        radius: f32,
    } | Sun {
        direction: Vec3,
        color: Color,
        power: f32,
    } | Spot {
        position: Vec3,
        direction: Vec3,
        color: Color,
        power: f32,
        radius: f32,
        blend: f32,
    }
)

Image:

Image {
    width: u32,
    height: u32,
    data: [u8],
}

Example:

// from raw data:
let positions = vec![...];
let colors = vec![...];
let indices = vec![...];
let mesh = Mesh::new(positions, None, None, Some(colors), None, None, Some(indices), None).unwrap();
let meshes = vec![mesh];
let scene = Scene::new(Some(meshes), None, None, None).unwrap();
// save:
scene.save(path).unwrap();
// load:
let scene = Scene::load(include_bytes!(path)).unwrap();         // embedded
let scene = Scene::load(std::fs::read(path).unwrap()).unwrap(); // from file

Todo:

  • Documentation
  • Examples to convert from other formats (.obj, .gltf)
  • Animation support
  • LZ4 Compression (realtime decompression)
  • Features
  • Other languages support

Contributing:

Feel free to open issues or submit pull requests to improve the format.

License:

This project is licensed under the MIT License.

Dependencies

~3MB
~65K SLoC