4 releases
new 0.1.8 | Nov 7, 2024 |
---|---|
0.1.7 | Nov 7, 2024 |
#33 in Data formats
435 downloads per month
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.
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