summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ecs/components.zig110
-rw-r--r--src/main.zig10
-rw-r--r--src/mods/parse.zig (renamed from src/vm/parse.zig)0
-rw-r--r--src/mods/vm.zig (renamed from src/vm/vm.zig)0
-rw-r--r--src/mods/wasm.zig (renamed from src/vm/wasm.zig)0
-rw-r--r--src/rendering/mesh.zig (renamed from src/render/mesh.zig)0
-rw-r--r--src/rendering/renderer_vulkan.zig (renamed from src/render/renderer_vulkan.zig)0
-rw-r--r--src/rendering/vulkan.zig (renamed from src/render/vulkan.zig)0
-rw-r--r--src/rendering/window.zig (renamed from src/render/window.zig)0
9 files changed, 114 insertions, 6 deletions
diff --git a/src/ecs/components.zig b/src/ecs/components.zig
index ae379b4..bb333c9 100644
--- a/src/ecs/components.zig
+++ b/src/ecs/components.zig
@@ -1,3 +1,111 @@
const std = @import("std");
+const Allocator = std.mem.Allocator;
-pub const Archetype = struct {};
+pub const Position = struct {
+ x: f32,
+ y: f32,
+ z: f32,
+};
+
+pub const Speed = struct {
+ speed: f32,
+};
+
+pub const Pool = struct {
+ comptime sets_map: std.StringHashMap([]const u8) = std.StringHashMap([]const u8).init(allocator),
+ speed_set: SparseSet(Speed),
+ allocator: Allocator,
+ free_ids: std.ArrayList(usize),
+ entities: usize,
+
+ pub fn init(allocator: Allocator) !Pool {
+ try sets_map.put(@typeName(Speed), "speed_set");
+
+ return Pool{
+ .speed_set = try SparseSet(Speed).init(allocator),
+ .allocator = allocator,
+ .free_ids = try std.ArrayList(usize).initCapacity(allocator, 100),
+ .entities = 0,
+ };
+ }
+
+ pub fn deinit(self: *Pool) void {
+ self.sets_map.deinit();
+ self.speed_set.deinit();
+ }
+
+ pub fn addComponent(self: *Pool, comptime T: type, id: usize, component: T) void {
+ var set = @field(self, try self.sets_map.get(@typeName(T)));
+
+ set.insert(id, component);
+ }
+
+ pub fn insert(self: *Pool) !usize {
+ const id = self.free_ids.pop() orelse self.entities;
+
+ self.entities += 1;
+ return id;
+ }
+
+ pub fn remove(self: *Pool, id: usize) !usize {
+ if (self.speed_set.hasComponent(id)) {
+ self.speed_set.remove(id);
+ }
+
+ self.entities -= 1;
+ self.free_ids.append(id);
+ }
+};
+
+pub fn SparseSet(comptime T: type) type {
+ return struct {
+ sparse: std.ArrayList(usize),
+ dense: std.ArrayList(usize),
+ components: std.ArrayList(T),
+
+ pub fn init(allocator: Allocator) !@This() {
+ return @This(){
+ .sparse = try std.ArrayList(usize).initCapacity(allocator, 10),
+ .dense = try std.ArrayList(usize).initCapacity(allocator, 10),
+ .components = try std.ArrayList(T).initCapacity(allocator, 10),
+ };
+ }
+
+ pub fn deinit(self: *@This()) void {
+ self.sparse.deinit();
+ self.dense.deinit();
+ self.components.deinit();
+ }
+
+ pub fn hasComponent(self: *@This(), id: usize) bool {
+ return self.dense.items[self.sparse.items[id]] == id;
+ }
+
+ pub fn insert(self: *@This(), id: usize, component: T) !void {
+ const dense_index = self.dense.items.len;
+ try self.dense.append(id);
+ try self.components.append(component);
+ try self.sparse.append(dense_index);
+ }
+
+ pub fn remove(self: *@This(), id: usize) !void {
+ const index = self.sparse.items[id];
+ const last = self.dense.getLast();
+ self.sparse.items[last] = index;
+ _ = self.dense.swapRemove(index);
+ _ = self.components.swapRemove(index);
+ }
+ };
+}
+
+pub fn test_sparse() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ const allocator = gpa.allocator();
+
+ var pool = try Pool.init(allocator);
+ defer pool.deinit();
+
+ const entity = try pool.insert();
+ std.debug.print("new entity: {d}\n", .{entity});
+ pool.addComponent(Speed, entity, .{ .speed = 5.0 });
+}
diff --git a/src/main.zig b/src/main.zig
index 321f0f0..636dbff 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,13 +1,13 @@
const std = @import("std");
const c = @import("c.zig");
-const window = @import("render/window.zig");
+const window = @import("rendering/window.zig");
const config = @import("config");
-const Renderer = @import("render/renderer_vulkan.zig");
+const Renderer = @import("rendering/renderer_vulkan.zig");
const math = @import("math.zig");
-const Parser = @import("vm/parse.zig");
-const vm = @import("vm/vm.zig");
-const wasm = @import("vm/wasm.zig");
+const Parser = @import("mods/parse.zig");
+const vm = @import("mods/vm.zig");
+const wasm = @import("mods/wasm.zig");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
diff --git a/src/vm/parse.zig b/src/mods/parse.zig
index 7080e66..7080e66 100644
--- a/src/vm/parse.zig
+++ b/src/mods/parse.zig
diff --git a/src/vm/vm.zig b/src/mods/vm.zig
index f8c7db5..f8c7db5 100644
--- a/src/vm/vm.zig
+++ b/src/mods/vm.zig
diff --git a/src/vm/wasm.zig b/src/mods/wasm.zig
index 579309b..579309b 100644
--- a/src/vm/wasm.zig
+++ b/src/mods/wasm.zig
diff --git a/src/render/mesh.zig b/src/rendering/mesh.zig
index 92fa303..92fa303 100644
--- a/src/render/mesh.zig
+++ b/src/rendering/mesh.zig
diff --git a/src/render/renderer_vulkan.zig b/src/rendering/renderer_vulkan.zig
index 0726616..0726616 100644
--- a/src/render/renderer_vulkan.zig
+++ b/src/rendering/renderer_vulkan.zig
diff --git a/src/render/vulkan.zig b/src/rendering/vulkan.zig
index bd0ca29..bd0ca29 100644
--- a/src/render/vulkan.zig
+++ b/src/rendering/vulkan.zig
diff --git a/src/render/window.zig b/src/rendering/window.zig
index 28c22d1..28c22d1 100644
--- a/src/render/window.zig
+++ b/src/rendering/window.zig