Files
PCG_6/src/gl_helper/model.zig
2026-03-28 22:36:32 +01:00

45 lines
1.2 KiB
Zig

const std = @import("std");
const ArrayList = std.ArrayList;
const zm = @import("zmath");
const Mesh = @import("mesh.zig");
const Shader = @import("shader.zig");
const Tree = @import("../tree.zig").Tree;
pub const JointData = struct {
mesh: Mesh,
translation: zm.Mat,
rotation: zm.Quat,
};
data: Tree(JointData),
pub fn init(
data: Tree(JointData),
) @This() {
return .{ .data = data };
}
pub fn draw(self: *@This(), shader: Shader) void {
var iter = self.data.depthFirstIterator();
while (iter.next()) |node| {
var rotation = node.val.rotation;
var current = node;
while (current.parent) |parent| {
rotation = zm.qmul(rotation, parent.val.rotation);
current = parent;
}
const model_matrix = zm.mul(zm.quatToMat(rotation), node.val.translation);
const normal_matrix = zm.transpose(zm.inverse(model_matrix));
shader.updateUniformMatrix("u_model_matrix", &.{model_matrix});
shader.updateUniformMatrix("u_normal_matrix", &.{normal_matrix});
node.val.mesh.draw(shader);
}
}
pub fn deinit(self: *@This(), allocator: std.mem.Allocator) void {
self.data.deinit(allocator);
}