Merge branch 'master' of github.com:prime31/zig-ecs

# Conflicts:
#	.vscode/tasks.json
master
Mike 4 years ago
commit 5840b0709f

@ -1 +1,4 @@
zig-cache zig-cache
zig-arm-cache
.DS_Store

@ -2,6 +2,11 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558 // See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format // for the documentation about the tasks.json format
"version": "2.0.0", "version": "2.0.0",
"options": {
"env": {
"ZIG_SYSTEM_LINKER_HACK": "1",
}
},
"tasks": [ "tasks": [
{ {
"label": "Build Project", "label": "Build Project",
@ -12,9 +17,9 @@
], ],
}, },
{ {
"label": "Build and Run Project", "label": "Build and Run Specific Target",
"type": "shell", "type": "shell",
"command": "zig build run", "command": "zig build ${input:zigTarget}",
"problemMatcher": [ "problemMatcher": [
"$gcc" "$gcc"
], ],
@ -27,9 +32,9 @@
} }
}, },
{ {
"label": "Pooooooooop", "label": "Build and Run Project",
"type": "shell", "type": "shell",
"command": "zig build ${input:zigTarget}", "command": "zig build run",
"problemMatcher": [ "problemMatcher": [
"$gcc" "$gcc"
], ],
@ -41,6 +46,18 @@
"clear": true "clear": true
} }
}, },
{
"label": "Build and Run Project (x64 on arm)",
"type": "shell",
"command": "~/zig/zig-x64/zig build run",
"problemMatcher": [
"$gcc"
],
"group": "build",
"presentation": {
"clear": true
}
},
{ {
"label": "Build and Run Project (release-fast)", "label": "Build and Run Project (release-fast)",
"type": "shell", "type": "shell",
@ -120,13 +137,15 @@
"inputs": [ "inputs": [
{ {
"id": "zigTarget", "id": "zigTarget",
"description": "choose which target to run", "type": "command",
"type": "pickString", "command": "zig.getTargets",
"options": [ // "description": "choose which target to run",
"run", // "type": "pickString",
"group_sort" // "options": [
], // "run",
"default": "run" // "group_sort"
// ],
// "default": "run"
} }
], ],
} }

@ -1,8 +1,12 @@
const Builder = @import("std").build.Builder; const std = @import("std");
const Builder = std.build.Builder;
const builtin = @import("builtin"); const builtin = @import("builtin");
pub fn build(b: *Builder) void { pub fn build(b: *Builder) void {
const buildMode = b.standardReleaseOptions(); const build_mode = b.standardReleaseOptions();
// use a different cache folder for macos arm builds
b.cache_root = if (std.builtin.os.tag == .macos and std.builtin.arch == std.builtin.Arch.aarch64) "zig-arm-cache" else "zig-cache";
const examples = [_][2][]const u8{ const examples = [_][2][]const u8{
[_][]const u8{ "view_vs_group", "examples/view_vs_group.zig" }, [_][]const u8{ "view_vs_group", "examples/view_vs_group.zig" },
@ -25,7 +29,7 @@ pub fn build(b: *Builder) void {
// first element in the list is added as "run" so "zig build run" works // first element in the list is added as "run" so "zig build run" works
if (i == 0) { if (i == 0) {
exe.setOutputDir("zig-cache/bin"); exe.setOutputDir(std.fs.path.joinPosix(b.allocator, &[_][]const u8{ b.cache_root, "bin" }) catch unreachable);
const run_exe_step = b.step("run", b.fmt("run {}.zig", .{name})); const run_exe_step = b.step("run", b.fmt("run {}.zig", .{name}));
run_exe_step.dependOn(&run_cmd.step); run_exe_step.dependOn(&run_cmd.step);
} }
@ -33,12 +37,12 @@ pub fn build(b: *Builder) void {
// internal tests // internal tests
const internal_test_step = b.addTest("src/tests.zig"); const internal_test_step = b.addTest("src/tests.zig");
internal_test_step.setBuildMode(buildMode); internal_test_step.setBuildMode(build_mode);
// public api tests // public api tests
const test_step = b.addTest("tests/tests.zig"); const test_step = b.addTest("tests/tests.zig");
test_step.addPackagePath("ecs", "src/ecs.zig"); test_step.addPackagePath("ecs", "src/ecs.zig");
test_step.setBuildMode(buildMode); test_step.setBuildMode(build_mode);
const test_cmd = b.step("test", "Run the tests"); const test_cmd = b.step("test", "Run the tests");
test_cmd.dependOn(&internal_test_step.step); test_cmd.dependOn(&internal_test_step.step);
@ -51,19 +55,27 @@ pub const LibType = enum(i32) {
exe_compiled, exe_compiled,
}; };
/// rel_path is used to add package paths. It should be the the same path used to include this build file pub fn getPackage(comptime prefix_path: []const u8) std.build.Pkg {
pub fn linkArtifact(b: *Builder, artifact: *std.build.LibExeObjStep, target: std.build.Target, lib_type: LibType, rel_path: []const u8) void { return .{
.name = "ecs",
.path = prefix_path ++ "src/ecs.zig",
};
}
/// prefix_path is used to add package paths. It should be the the same path used to include this build file
pub fn linkArtifact(b: *Builder, artifact: *std.build.LibExeObjStep, target: std.build.Target, lib_type: LibType, comptime prefix_path: []const u8) void {
const build_mode = b.standardReleaseOptions();
switch (lib_type) { switch (lib_type) {
.static => { .static => {
const lib = b.addStaticLibrary("ecs", "ecs.zig"); const lib = b.addStaticLibrary("ecs", "ecs.zig");
lib.setBuildMode(buildMode); lib.setBuildMode(build_mode);
lib.install(); lib.install();
artifact.linkLibrary(lib); artifact.linkLibrary(lib);
}, },
.dynamic => { .dynamic => {
const lib = b.addSharedLibrary("ecs", "ecs.zig", null); const lib = b.addSharedLibrary("ecs", "ecs.zig", .unversioned);
lib.setBuildMode(buildMode); lib.setBuildMode(build_mode);
lib.install(); lib.install();
artifact.linkLibrary(lib); artifact.linkLibrary(lib);
@ -71,5 +83,5 @@ pub fn linkArtifact(b: *Builder, artifact: *std.build.LibExeObjStep, target: std
else => {}, else => {},
} }
artifact.addPackagePath("ecs", std.fs.path.join(b.allocator, &[_][]const u8{ rel_path, "ecs.zig" }) catch unreachable); artifact.addPackage(getPackage(prefix_path));
} }

@ -14,9 +14,9 @@ pub fn EntityTraitsType(comptime size: EntityTraitsSize) type {
} }
fn EntityTraitsDefinition(comptime EntityType: type, comptime IndexType: type, comptime VersionType: type) type { fn EntityTraitsDefinition(comptime EntityType: type, comptime IndexType: type, comptime VersionType: type) type {
std.debug.assert(@typeInfo(EntityType) == .Int and !EntityType.is_signed); std.debug.assert(@typeInfo(EntityType) == .Int and std.meta.Int(.unsigned, @bitSizeOf(EntityType)) == EntityType);
std.debug.assert(@typeInfo(IndexType) == .Int and !IndexType.is_signed); std.debug.assert(@typeInfo(IndexType) == .Int and std.meta.Int(.unsigned, @bitSizeOf(IndexType)) == IndexType);
std.debug.assert(@typeInfo(VersionType) == .Int and !VersionType.is_signed); std.debug.assert(@typeInfo(VersionType) == .Int and std.meta.Int(.unsigned, @bitSizeOf(VersionType)) == VersionType);
if (@bitSizeOf(IndexType) + @bitSizeOf(VersionType) != @bitSizeOf(EntityType)) if (@bitSizeOf(IndexType) + @bitSizeOf(VersionType) != @bitSizeOf(EntityType))
@compileError("IndexType and VersionType must sum to EntityType's bit count"); @compileError("IndexType and VersionType must sum to EntityType's bit count");

@ -85,7 +85,7 @@ pub const OwningGroup = struct {
var component_ptrs: [component_info.fields.len][*]u8 = undefined; var component_ptrs: [component_info.fields.len][*]u8 = undefined;
inline for (component_info.fields) |field, i| { inline for (component_info.fields) |field, i| {
const storage = group.registry.assure(field.field_type.Child); const storage = group.registry.assure(@typeInfo(field.field_type).Pointer.child);
component_ptrs[i] = @ptrCast([*]u8, storage.instances.items.ptr); component_ptrs[i] = @ptrCast([*]u8, storage.instances.items.ptr);
} }
@ -104,7 +104,7 @@ pub const OwningGroup = struct {
// fill and return the struct // fill and return the struct
var comps: Components = undefined; var comps: Components = undefined;
inline for (@typeInfo(Components).Struct.fields) |field, i| { inline for (@typeInfo(Components).Struct.fields) |field, i| {
const typed_ptr = @ptrCast([*]field.field_type.Child, @alignCast(@alignOf(field.field_type.Child), it.component_ptrs[i])); const typed_ptr = @ptrCast([*]@typeInfo(field.field_type).Pointer.child, @alignCast(@alignOf(@typeInfo(field.field_type).Pointer.child), it.component_ptrs[i]));
@field(comps, field.name) = &typed_ptr[it.index]; @field(comps, field.name) = &typed_ptr[it.index];
} }
return comps; return comps;
@ -173,7 +173,7 @@ pub const OwningGroup = struct {
var component_ptrs: [component_info.fields.len][*]u8 = undefined; var component_ptrs: [component_info.fields.len][*]u8 = undefined;
inline for (component_info.fields) |field, i| { inline for (component_info.fields) |field, i| {
const storage = self.registry.assure(field.field_type.Child); const storage = self.registry.assure(std.meta.Child(field.field_type));
component_ptrs[i] = @ptrCast([*]u8, storage.instances.items.ptr); component_ptrs[i] = @ptrCast([*]u8, storage.instances.items.ptr);
} }
@ -181,7 +181,7 @@ pub const OwningGroup = struct {
const index = self.firstOwnedStorage().set.index(entity); const index = self.firstOwnedStorage().set.index(entity);
var comps: Components = undefined; var comps: Components = undefined;
inline for (component_info.fields) |field, i| { inline for (component_info.fields) |field, i| {
const typed_ptr = @ptrCast([*]field.field_type.Child, @alignCast(@alignOf(field.field_type.Child), component_ptrs[i])); const typed_ptr = @ptrCast([*]std.meta.Child(field.field_type), @alignCast(@alignOf(std.meta.Child(field.field_type)), component_ptrs[i]));
@field(comps, field.name) = &typed_ptr[index]; @field(comps, field.name) = &typed_ptr[index];
} }

@ -4,9 +4,9 @@ const std = @import("std");
/// you choose the type of the handle (aka its size) and how much of that goes to the index and the version. /// you choose the type of the handle (aka its size) and how much of that goes to the index and the version.
/// the bitsize of version + id must equal the handle size. /// the bitsize of version + id must equal the handle size.
pub fn Handles(comptime HandleType: type, comptime IndexType: type, comptime VersionType: type) type { pub fn Handles(comptime HandleType: type, comptime IndexType: type, comptime VersionType: type) type {
std.debug.assert(@typeInfo(HandleType) == .Int and !HandleType.is_signed); std.debug.assert(@typeInfo(HandleType) == .Int and std.meta.Int(.unsigned, @bitSizeOf(HandleType)) == HandleType);
std.debug.assert(@typeInfo(IndexType) == .Int and !IndexType.is_signed); std.debug.assert(@typeInfo(IndexType) == .Int and std.meta.Int(.unsigned, @bitSizeOf(IndexType)) == IndexType);
std.debug.assert(@typeInfo(VersionType) == .Int and !VersionType.is_signed); std.debug.assert(@typeInfo(VersionType) == .Int and std.meta.Int(.unsigned, @bitSizeOf(VersionType)) == VersionType);
if (@bitSizeOf(IndexType) + @bitSizeOf(VersionType) != @bitSizeOf(HandleType)) if (@bitSizeOf(IndexType) + @bitSizeOf(VersionType) != @bitSizeOf(HandleType))
@compileError("IndexType and VersionType must sum to HandleType's bit count"); @compileError("IndexType and VersionType must sum to HandleType's bit count");

@ -195,7 +195,8 @@ pub const Registry = struct {
} }
pub fn deinit(self: *Registry) void { pub fn deinit(self: *Registry) void {
for (self.components.items()) |ptr| { var iter = self.components.iterator();
while (iter.next()) |ptr| {
// HACK: we dont know the Type here but we need to call deinit // HACK: we dont know the Type here but we need to call deinit
var storage = @intToPtr(*Storage(u1), ptr.value); var storage = @intToPtr(*Storage(u1), ptr.value);
storage.deinit(); storage.deinit();
@ -342,7 +343,8 @@ pub const Registry = struct {
pub fn removeAll(self: *Registry, entity: Entity) void { pub fn removeAll(self: *Registry, entity: Entity) void {
assert(self.valid(entity)); assert(self.valid(entity));
for (self.components.items()) |ptr| { var iter = self.components.iterator();
while (iter.next()) |ptr| {
// HACK: we dont know the Type here but we need to be able to call methods on the Storage(T) // HACK: we dont know the Type here but we need to be able to call methods on the Storage(T)
var store = @intToPtr(*Storage(u1), ptr.value); var store = @intToPtr(*Storage(u1), ptr.value);
store.removeIfContains(entity); store.removeIfContains(entity);

@ -14,7 +14,8 @@ pub const TypeStore = struct {
} }
pub fn deinit(self: *TypeStore) void { pub fn deinit(self: *TypeStore) void {
for (self.map.items()) |kv| { var iter = self.map.iterator();
while (iter.next()) |kv| {
self.allocator.free(kv.value); self.allocator.free(kv.value);
} }
self.map.deinit(); self.map.deinit();

@ -14,7 +14,8 @@ pub const Assets = struct {
} }
pub fn deinit(self: *Assets) void { pub fn deinit(self: *Assets) void {
for (self.caches.items()) |ptr| { var iter = self.caches.iterator();
while (iter.next()) |ptr| {
// HACK: we dont know the Type here but we need to call deinit // HACK: we dont know the Type here but we need to call deinit
@intToPtr(*Cache(u1), ptr.value).deinit(); @intToPtr(*Cache(u1), ptr.value).deinit();
} }
@ -39,7 +40,7 @@ pub const Assets = struct {
fn ReturnType(comptime loader: anytype, strip_ptr: bool) type { fn ReturnType(comptime loader: anytype, strip_ptr: bool) type {
var ret = @typeInfo(@TypeOf(@field(loader, "load"))).BoundFn.return_type.?; var ret = @typeInfo(@TypeOf(@field(loader, "load"))).BoundFn.return_type.?;
if (strip_ptr) { if (strip_ptr) {
return ret.Child; return std.meta.Child(ret);
} }
return ret; return ret;
} }

@ -67,7 +67,8 @@ pub fn Cache(comptime T: type) type {
pub fn clear(self: *@This()) void { pub fn clear(self: *@This()) void {
// optionally deinit any resources that have a deinit method // optionally deinit any resources that have a deinit method
if (@hasDecl(T, "deinit")) { if (@hasDecl(T, "deinit")) {
for (self.resources.items()) |kv| { var iter = self.resources.iterator();
while (iter.next()) |kv| {
@call(.{ .modifier = .always_inline }, @field(kv.value, "deinit"), .{}); @call(.{ .modifier = .always_inline }, @field(kv.value, "deinit"), .{});
} }
} }
@ -75,7 +76,7 @@ pub fn Cache(comptime T: type) type {
} }
pub fn size(self: @This()) usize { pub fn size(self: @This()) usize {
return self.resources.items().len; return self.resources.count();
} }
}; };
} }

@ -15,7 +15,8 @@ pub const Dispatcher = struct {
} }
pub fn deinit(self: *Dispatcher) void { pub fn deinit(self: *Dispatcher) void {
for (self.signals.items()) |ptr| { var iter = self.signals.iterator();
while (iter.next()) |ptr| {
// HACK: we dont know the Type here but we need to call deinit // HACK: we dont know the Type here but we need to call deinit
var signal = @intToPtr(*Signal(void), ptr.value); var signal = @intToPtr(*Signal(void), ptr.value);
signal.deinit(); signal.deinit();

Loading…
Cancel
Save