cleanup
This commit is contained in:
parent
37af42daaa
commit
1234b801fd
@ -27,6 +27,7 @@ pub fn ComponentStorage(comptime CompT: type, comptime EntityT: type) type {
|
|||||||
set: *SparseSet(EntityT),
|
set: *SparseSet(EntityT),
|
||||||
instances: std.ArrayList(CompOrAlmostEmptyT),
|
instances: std.ArrayList(CompOrAlmostEmptyT),
|
||||||
allocator: ?*std.mem.Allocator,
|
allocator: ?*std.mem.Allocator,
|
||||||
|
super: usize = 0, /// doesnt really belong here...used to denote group ownership
|
||||||
safe_deinit: fn (*Self) void,
|
safe_deinit: fn (*Self) void,
|
||||||
safe_swap: fn (*Self, EntityT, EntityT) void,
|
safe_swap: fn (*Self, EntityT, EntityT) void,
|
||||||
construction: Signal(EntityT),
|
construction: Signal(EntityT),
|
||||||
@ -68,6 +69,7 @@ pub fn ComponentStorage(comptime CompT: type, comptime EntityT: type) type {
|
|||||||
if (!is_empty_struct)
|
if (!is_empty_struct)
|
||||||
store.instances = std.ArrayList(CompOrAlmostEmptyT).init(allocator);
|
store.instances = std.ArrayList(CompOrAlmostEmptyT).init(allocator);
|
||||||
store.allocator = allocator;
|
store.allocator = allocator;
|
||||||
|
store.super = 0;
|
||||||
store.construction = Signal(EntityT).init(allocator);
|
store.construction = Signal(EntityT).init(allocator);
|
||||||
store.update = Signal(EntityT).init(allocator);
|
store.update = Signal(EntityT).init(allocator);
|
||||||
store.destruction = Signal(EntityT).init(allocator);
|
store.destruction = Signal(EntityT).init(allocator);
|
||||||
|
@ -78,13 +78,15 @@ pub fn OwningGroup(comptime n_owned: usize, comptime n_includes: usize, comptime
|
|||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
|
||||||
current: *usize,
|
current: *usize,
|
||||||
|
super: *usize,
|
||||||
registry: *Registry,
|
registry: *Registry,
|
||||||
owned_type_ids: [n_owned]u32,
|
owned_type_ids: [n_owned]u32,
|
||||||
include_type_ids: [n_includes]u32,
|
include_type_ids: [n_includes]u32,
|
||||||
exclude_type_ids: [n_excludes]u32,
|
exclude_type_ids: [n_excludes]u32,
|
||||||
|
|
||||||
pub fn init(current: *usize, registry: *Registry, owned_type_ids: [n_owned]u32, include_type_ids: [n_includes]u32, exclude_type_ids: [n_excludes]u32) Self {
|
pub fn init(super: *usize, current: *usize, registry: *Registry, owned_type_ids: [n_owned]u32, include_type_ids: [n_includes]u32, exclude_type_ids: [n_excludes]u32) Self {
|
||||||
return Self{
|
return Self{
|
||||||
|
.super = super,
|
||||||
.current = current,
|
.current = current,
|
||||||
.registry = registry,
|
.registry = registry,
|
||||||
.owned_type_ids = owned_type_ids,
|
.owned_type_ids = owned_type_ids,
|
||||||
@ -96,6 +98,10 @@ pub fn OwningGroup(comptime n_owned: usize, comptime n_includes: usize, comptime
|
|||||||
pub fn len(self: Self) usize {
|
pub fn len(self: Self) usize {
|
||||||
return self.current.*;
|
return self.current.*;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn sortable(self: *Registry, comptime T: type) bool {
|
||||||
|
return self.super.* == n_owned + n_includes + n_excludes;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,3 +190,32 @@ test "OwningGroup add/remove" {
|
|||||||
reg.remove(i32, e0);
|
reg.remove(i32, e0);
|
||||||
std.testing.expectEqual(group.len(), 0);
|
std.testing.expectEqual(group.len(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "multiple OwningGroups" {
|
||||||
|
const Sprite = struct { x: f32 };
|
||||||
|
const Transform = struct { x: f32 };
|
||||||
|
const Renderable = struct { x: f32 };
|
||||||
|
const Rotation = struct { x: f32 };
|
||||||
|
|
||||||
|
var reg = Registry.init(std.testing.allocator);
|
||||||
|
defer reg.deinit();
|
||||||
|
|
||||||
|
// var group1 = reg.group(.{u64, u32}, .{}, .{});
|
||||||
|
// var group2 = reg.group(.{u64, u32, u8}, .{}, .{});
|
||||||
|
|
||||||
|
var group5 = reg.group(.{Sprite, Transform}, .{Renderable, Rotation}, .{});
|
||||||
|
var group3 = reg.group(.{Sprite}, .{Renderable}, .{});
|
||||||
|
var group4 = reg.group(.{Sprite, Transform}, .{Renderable}, .{});
|
||||||
|
|
||||||
|
var last_size: u8 = 0;
|
||||||
|
for (reg.groups.items) |grp| {
|
||||||
|
std.testing.expect(last_size <= grp.size);
|
||||||
|
last_size = grp.size;
|
||||||
|
std.debug.warn("grp: {}\n", .{grp.size});
|
||||||
|
}
|
||||||
|
|
||||||
|
std.testing.expect(!reg.sortable(Sprite));
|
||||||
|
|
||||||
|
// this will break the group
|
||||||
|
// var group6 = reg.group(.{Sprite, Rotation}, .{}, .{});
|
||||||
|
}
|
@ -22,12 +22,10 @@ pub const TypeStore = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// adds instance, returning a pointer to the item as it lives in the store
|
/// adds instance, returning a pointer to the item as it lives in the store
|
||||||
pub fn add(self: *TypeStore, instance: var) *@TypeOf(instance) {
|
pub fn add(self: *TypeStore, instance: var) void {
|
||||||
var bytes = self.allocator.alloc(u8, @sizeOf(@TypeOf(instance))) catch unreachable;
|
var bytes = self.allocator.alloc(u8, @sizeOf(@TypeOf(instance))) catch unreachable;
|
||||||
var ptr = @ptrCast(*@TypeOf(instance), @alignCast(@alignOf(@TypeOf(instance)), bytes));
|
std.mem.copy(u8, bytes, std.mem.asBytes(&instance));
|
||||||
ptr.* = instance;
|
|
||||||
_ = self.map.put(utils.typeId(@TypeOf(instance)), bytes) catch unreachable;
|
_ = self.map.put(utils.typeId(@TypeOf(instance)), bytes) catch unreachable;
|
||||||
return ptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(self: *TypeStore, comptime T: type) *T {
|
pub fn get(self: *TypeStore, comptime T: type) *T {
|
||||||
@ -42,9 +40,11 @@ pub const TypeStore = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn getOrAdd(self: *TypeStore, comptime T: type) *T {
|
pub fn getOrAdd(self: *TypeStore, comptime T: type) *T {
|
||||||
if (self.has(T)) return self.get(T);
|
if (!self.has(T)) {
|
||||||
var instance = std.mem.zeroes(T);
|
var instance = std.mem.zeroes(T);
|
||||||
return self.add(instance);
|
self.add(instance);
|
||||||
|
}
|
||||||
|
return self.get(T);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove(self: *TypeStore, comptime T: type) void {
|
pub fn remove(self: *TypeStore, comptime T: type) void {
|
||||||
@ -60,22 +60,22 @@ pub const TypeStore = struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
test "TypeStore" {
|
test "TypeStore" {
|
||||||
const Vector = struct { x: f32 = 0, y: f32 = 0, z: f32 = 0};
|
const Vector = struct { x: f32 = 0, y: f32 = 0, z: f32 = 0 };
|
||||||
|
|
||||||
var store = TypeStore.init(std.testing.allocator);
|
var store = TypeStore.init(std.testing.allocator);
|
||||||
defer store.deinit();
|
defer store.deinit();
|
||||||
|
|
||||||
var orig = Vector{.x = 5, .y = 6, .z = 8};
|
var orig = Vector{ .x = 5, .y = 6, .z = 8 };
|
||||||
var inserted = store.add(orig);
|
store.add(orig);
|
||||||
std.testing.expect(store.has(Vector));
|
std.testing.expect(store.has(Vector));
|
||||||
std.testing.expectEqual(inserted.*, Vector{.x = 5, .y = 6, .z = 8});
|
std.testing.expectEqual(store.get(Vector).*, orig);
|
||||||
|
|
||||||
var v = store.get(Vector);
|
var v = store.get(Vector);
|
||||||
std.testing.expectEqual(v.*, Vector{.x = 5, .y = 6, .z = 8});
|
std.testing.expectEqual(v.*, Vector{ .x = 5, .y = 6, .z = 8 });
|
||||||
v.*.x = 666;
|
v.*.x = 666;
|
||||||
|
|
||||||
var v2 = store.get(Vector);
|
var v2 = store.get(Vector);
|
||||||
std.testing.expectEqual(v2.*, Vector{.x = 666, .y = 6, .z = 8});
|
std.testing.expectEqual(v2.*, Vector{ .x = 666, .y = 6, .z = 8 });
|
||||||
|
|
||||||
store.remove(Vector);
|
store.remove(Vector);
|
||||||
std.testing.expect(!store.has(Vector));
|
std.testing.expect(!store.has(Vector));
|
||||||
|
@ -41,12 +41,12 @@ pub fn sortSub(comptime T1: type, comptime T2: type, items: []T1, sub_items: []T
|
|||||||
|
|
||||||
/// comptime string hashing for the type names
|
/// comptime string hashing for the type names
|
||||||
pub fn typeId(comptime T: type) u32 {
|
pub fn typeId(comptime T: type) u32 {
|
||||||
return hashStringFnv(u32, @typeName(T));
|
comptime return hashStringFnv(u32, @typeName(T));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// comptime string hashing for the type names
|
/// comptime string hashing for the type names
|
||||||
pub fn typeId64(comptime T: type) u64 {
|
pub fn typeId64(comptime T: type) u64 {
|
||||||
return hashStringFnv(u64, @typeName(T));
|
comptime return hashStringFnv(u64, @typeName(T));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// u32 Fowler-Noll-Vo string hash
|
/// u32 Fowler-Noll-Vo string hash
|
||||||
|
@ -77,9 +77,9 @@ test "singletons" {
|
|||||||
defer reg.deinit();
|
defer reg.deinit();
|
||||||
|
|
||||||
var pos = Position{ .x = 5, .y = 5 };
|
var pos = Position{ .x = 5, .y = 5 };
|
||||||
var inserted = reg.singletons.add(pos);
|
reg.singletons.add(pos);
|
||||||
std.testing.expect(reg.singletons.has(Position));
|
std.testing.expect(reg.singletons.has(Position));
|
||||||
std.testing.expectEqual(inserted.*, pos);
|
std.testing.expectEqual(reg.singletons.get(Position).*, pos);
|
||||||
|
|
||||||
reg.singletons.remove(Position);
|
reg.singletons.remove(Position);
|
||||||
std.testing.expect(!reg.singletons.has(Position));
|
std.testing.expect(!reg.singletons.has(Position));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user