forked from vv/efemra
1
0
Fork 0
efemra/src/rendering/Entities.zig

133 lines
3.7 KiB
Zig

const std = @import("std");
const assert = std.debug.assert;
const UUID = @import("../common/uuid.zig").UUID;
const mat = @import("../math/mat.zig");
const Mat4f = mat.Mat4f;
const Mat3f = mat.Mat3f;
const vec = @import("../math/vec.zig");
const Vec4f = vec.Vec4f;
const Quat = @import("../math/quat.zig").Quat;
const Box3d = @import("../math/box.zig").Box3d;
const Mesh = @import("meshes.zig").Mesh;
const Material = @import("materials.zig").Material;
// TODO memory
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
const Entities = @This();
var s_entities: Entities = undefined;
names: std.ArrayList(UUID),
meshes: std.ArrayList(Mesh.Id),
bounds: std.ArrayList(Box3d),
materials: std.ArrayList(Material),
matrices: std.ArrayList(Mat4f),
inv_matrices: std.ArrayList(Mat3f),
translations: std.ArrayList(Vec4f),
rotations: std.ArrayList(Quat),
scales: std.ArrayList(Vec4f),
mod_time: std.time.Instant,
pub fn init() void {
s_entities.names = std.ArrayList(UUID).init(allocator);
s_entities.meshes = std.ArrayList(Mesh.Id).init(allocator);
s_entities.bounds = std.ArrayList(Box3d).init(allocator);
s_entities.materials = std.ArrayList(Material).init(allocator);
s_entities.matrices = std.ArrayList(Mat4f).init(allocator);
s_entities.inv_matrices = std.ArrayList(Mat3f).init(allocator);
s_entities.translations = std.ArrayList(Vec4f).init(allocator);
s_entities.rotations = std.ArrayList(Quat).init(allocator);
s_entities.scales = std.ArrayList(Vec4f).init(allocator);
s_entities.mod_time = std.time.Instant.now();
}
pub fn update() void {}
pub fn get() *const Entities {
return &s_entities;
}
pub fn deinit() void {
delete(get());
s_entities.names.deinit();
s_entities.meshes.deinit();
s_entities.bounds.deinit();
s_entities.materials.deinit();
s_entities.matrices.deinit();
s_entities.inv_matrices.deinit();
s_entities.translations.deinit();
s_entities.rotations.deinit();
s_entities.scales.deinit();
}
pub fn add(self: *const Entities, name: UUID) !i32 {
self.names.append(name);
self.translations.append(Vec4f.zero);
self.scales.append(Vec4f.one);
self.rotations.append(Quat.id);
self.matrices.append(Mat4f.id);
self.inv_matrices.append(Mat3f.id);
self.mod_time = std.time.Instant.now();
}
pub fn destroyAtIndex(ents: *const Entities, i: i32) void {
assert(i >= 0);
assert(i < ents.names.len);
ents.meshes[i].release();
ents.materials[i].albedo.release();
ents.materials[i].rome.release();
ents.materials[i].normal.release();
}
pub fn removeAtIndex(ents: *const Entities, i: i32) void {
ents.destroyAtIndex(i);
ents.names.swapRemove(i);
ents.meshes.swapRemove(i);
ents.bounds.swapRemove(i);
ents.materials.swapRemove(i);
ents.matrices.swapRemove(i);
ents.inv_matrices.swapRemove(i);
ents.translations.swapRemove(i);
ents.rotations.swapRemove(i);
ents.scales.swapRemove(i);
}
pub fn rm(ents: *const Entities, name: UUID) bool {
if (ents.find(name)) |i| {
ents.removeAtIndex(i);
ents.mod_time = std.time.Instant.now();
return true;
}
return false;
}
pub fn find(ents: *const Entities, name: UUID) ?i32 {
return ents.names.find(name);
}
pub fn clear(ents: *const Entities) void {
for (ents.names) |_, i| {
ents.destroyAtIndex(i);
}
ents.mod_time = std.time.Instant.now();
}
pub fn delete(ents: *const Entities) void {
ents.clear();
ents.names.clearAndFree();
ents.meshes.clearAndFree();
ents.bounds.clearAndFree();
ents.materials.clearAndFree();
ents.matrices.clearAndFree();
ents.inv_matrices.clearAndFree();
ents.translations.clearAndFree();
ents.rotations.clearAndFree();
ents.scales.clearAndFree();
}