const std = @import("std"); const warn = std.debug.warn; const ecs = @import("ecs"); const Registry = @import("ecs").Registry; const Velocity = struct { x: f32 = 0, y: f32 = 0 }; const Position = struct { x: f32 = 0, y: f32 = 0 }; const Empty = struct {}; const Sprite = struct { x: f32 = 0 }; const Transform = struct { x: f32 = 0 }; const Renderable = struct { x: f32 = 0 }; const Rotation = struct { x: f32 = 0 }; fn printStore(store: var, name: []const u8) void { warn("--- {} ---\n", .{name}); for (store.set.dense.items) |e, i| { warn("e[{}] s[{}]{}", .{e, store.set.page(store.set.dense.items[i]), store.set.sparse.items[store.set.page(store.set.dense.items[i])]}); warn(" ({d:.2}) ", .{store.instances.items[i]}); } warn("\n", .{}); } test "sort component" { var store = ecs.ComponentStorage(f32, u32).initPtr(std.testing.allocator); defer store.deinit(); store.add(22, @as(f32, 2.2)); store.add(11, @as(f32, 1.1)); store.add(33, @as(f32, 3.3)); comptime const desc_u32 = std.sort.desc(f32); store.sort(f32, desc_u32); var compare: f32 = 5; for (store.raw()) |val, i| { std.testing.expect(compare > val); compare = val; } } test "nested OwningGroups add/remove components" { var reg = Registry.init(std.testing.allocator); defer reg.deinit(); var group1 = reg.group(.{Sprite}, .{Renderable}, .{}); var group2 = reg.group(.{ Sprite, Transform }, .{Renderable}, .{}); var group3 = reg.group(.{ Sprite, Transform }, .{ Renderable, Rotation }, .{}); std.testing.expect(!reg.sortable(Sprite)); std.testing.expect(!reg.sortable(Transform)); std.testing.expect(reg.sortable(Renderable)); var e1 = reg.create(); reg.addTypes(e1, .{ Sprite, Renderable, Rotation }); std.testing.expectEqual(group1.len(), 1); std.testing.expectEqual(group2.len(), 0); std.testing.expectEqual(group3.len(), 0); reg.add(e1, Transform{}); std.testing.expectEqual(group3.len(), 1); reg.remove(Sprite, e1); std.testing.expectEqual(group1.len(), 0); std.testing.expectEqual(group2.len(), 0); std.testing.expectEqual(group3.len(), 0); } test "nested OwningGroups entity order" { var reg = Registry.init(std.testing.allocator); defer reg.deinit(); var group1 = reg.group(.{Sprite}, .{Renderable}, .{}); var group2 = reg.group(.{ Sprite, Transform }, .{Renderable}, .{}); var i: usize = 0; while (i < 5) : (i += 1) { var e = reg.create(); reg.add(e, Sprite{ .x = @intToFloat(f32, i) }); reg.add(e, Renderable{ .x = @intToFloat(f32, i) }); } std.testing.expectEqual(group1.len(), 5); std.testing.expectEqual(group2.len(), 0); var sprite_store = reg.assure(Sprite); var transform_store = reg.assure(Transform); // printStore(sprite_store, "Sprite"); reg.add(1, Transform{.x = 1}); // printStore(sprite_store, "Sprite"); // printStore(transform_store, "Transform"); // warn("group2.current: {}\n", .{group2.group_data.current}); }