Backlog/lib/objLoader/README.md

83 lines
2.2 KiB
Markdown

# obj_loader - a zig obj file loader
This was very rapidly written to provide a simple interface for loading `.obj` files in zig.
![Suzanne](https://peterino.com/Monkey2.png)
At this time I make no garauntees on correctness or performance, will eventually support all .obj and .mtl
directives.
To load an obj,
```zig
const obj_loader = @import("path/to/obj_loader.zig");
var contents: ObjContents = obj_loader.loadObj("suzanne.obj", your.favorite.allocator);
defer contents.deinit();
```
Transforming a mesh into your vertex/model format should be quite easy.
```zig
const mesh = fileContents.meshes.items[0];
try vertices.ensureTotalCapacity(mesh.v_faces.items.len * 4);
for (mesh.v_faces.items) |face| {
var i: u32 = 0;
while (i < face.count) : (i += 1) {
const p = mesh.v_positions.items[face.vertex[i] - 1];
const n = mesh.v_normals.items[face.normal[i] - 1];
const v = Vertex{
.position = .{ .x = p.x, .y = p.y, .z = p.z },
.normal = .{ .x = n.x, .y = n.y, .z = n.z },
.color = .{ .r = n.x, .g = n.y, .b = n.z, .a = 1.0 },
};
try vertices.append(v);
}
}
```
## Details
The ObjContents contains a list of ObjMesh objects.
```zig
std.debug.print("obj: {s}, Vertices count = {d} Normals count = {d}, faces = {d}\n", .{
contents.meshes.items[0].object_name,
contents.meshes.items[0].v_positions.items.len,
contents.meshes.items[0].v_normals.items.len,
contents.meshes.items[0].v_faces.items.len,
});
```
```zig
pub const ObjMesh = struct {
object_name: []u8,
v_positions: ArrayListUnmanaged(ObjVec) = .{},
v_colors: ArrayListUnmanaged(ObjColor) = .{},
v_normals: ArrayListUnmanaged(ObjVec) = .{},
v_textures: ArrayListUnmanaged(ObjVec2) = .{},
v_faces: ArrayListUnmanaged(ObjFace) = .{},
...
}
```
## Faces
The faces produced by this library are currently coded to a maximum of 4. If you want more advanced
n-gon triangulation, give [`zmesh`](https://github.com/michal-z/zig-gamedev/tree/main/libs/zmesh) a try.
```zig
pub const ObjFace = struct {
vertex: [4]u32,
texture: [4]u32,
normal: [4]u32,
count: u32,
};
```