From 9b757720395f9b081ba66c4cb966fa9b763aff2d Mon Sep 17 00:00:00 2001 From: Mergul Date: Thu, 10 Apr 2025 13:59:21 +0200 Subject: [PATCH 1/3] Add missing export visibility attributes --- source/bubel/ecs/entity.d | 12 ++++++------ source/bubel/ecs/hash_map.d | 2 +- source/bubel/ecs/manager.d | 10 ++++++++++ source/bubel/ecs/system.d | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/source/bubel/ecs/entity.d b/source/bubel/ecs/entity.d index 9b42c31..76a8a2f 100644 --- a/source/bubel/ecs/entity.d +++ b/source/bubel/ecs/entity.d @@ -44,7 +44,7 @@ struct Entity return cast(T*)getComponent(becsID!T); } - void* getComponent(ushort component_id) const + export void* getComponent(ushort component_id) const { EntityManager.EntitiesBlock* block = gEntityManager.getMetaData(&this); EntityManager.EntityInfo* info = block.type_info; @@ -54,7 +54,7 @@ struct Entity return (cast(void*)block + info.deltas[component_id] + block.entityIndex(&this) * gEntityManager.components[component_id].size); } - bool hasComponent(ushort component_id) const + export bool hasComponent(ushort component_id) const { EntityManager.EntitiesBlock* block = gEntityManager.getMetaData(&this); EntityManager.EntityInfo* info = block.type_info; @@ -62,7 +62,7 @@ struct Entity return true; } - EntityMeta getMeta() const + export EntityMeta getMeta() const { EntityMeta meta; meta.block = gEntityManager.getMetaData(&this); @@ -85,7 +85,7 @@ struct EntityMeta return cast(T*)getComponent(becsID!T); } - void* getComponent(ushort component_id) const + export void* getComponent(ushort component_id) const { const (EntityManager.EntityInfo)* info = block.type_info; @@ -95,7 +95,7 @@ struct EntityMeta return (cast(void*)block + info.deltas[component_id] + index * gEntityManager.components[component_id].size); } - bool hasComponent(ushort component_id) const + export bool hasComponent(ushort component_id) const { const EntityManager.EntityInfo* info = block.type_info; if (component_id >= info.deltas.length || info.deltas[component_id] == 0)return false; @@ -133,7 +133,7 @@ export struct EntityTemplate /************************************************************************************************************************ Get specified component. If component doesn't exist function return null. Returned pointer is valid during EntityTemplate lifetime. */ - void* getComponent(ushort component_id) const nothrow @nogc + export void* getComponent(ushort component_id) const nothrow @nogc { if(component_id >= info.tmpl_deltas.length || info.tmpl_deltas[component_id] == ushort.max)return null; return cast(void*)(entity_data.ptr + info.tmpl_deltas[component_id]); diff --git a/source/bubel/ecs/hash_map.d b/source/bubel/ecs/hash_map.d index 66a0756..7ba6137 100755 --- a/source/bubel/ecs/hash_map.d +++ b/source/bubel/ecs/hash_map.d @@ -28,7 +28,7 @@ export ulong defaultHashFunc(T)(auto ref T t) nothrow @nogc } } -ulong hash(byte[] array) nothrow @nogc +export ulong hash(byte[] array) nothrow @nogc { ulong hash = 0; diff --git a/source/bubel/ecs/manager.d b/source/bubel/ecs/manager.d index d6fae94..0977786 100644 --- a/source/bubel/ecs/manager.d +++ b/source/bubel/ecs/manager.d @@ -3355,6 +3355,16 @@ export struct EntityManager export ~this() nothrow @nogc { } + + export void opAssign(ComponentInfo c) + { + size = c.size; + alignment = c.alignment; + init_data = c.init_data; + destroy_callback = c.destroy_callback; + create_callback = c.create_callback; + } + ///Component size ushort size; ///Component data alignment diff --git a/source/bubel/ecs/system.d b/source/bubel/ecs/system.d index 24098c0..e6defd9 100644 --- a/source/bubel/ecs/system.d +++ b/source/bubel/ecs/system.d @@ -108,7 +108,7 @@ struct System package: ///destory system. Dispose all data - void destroy() nothrow @nogc + export void destroy() nothrow @nogc { import bubel.ecs.std : Mallocator; From 76a23aa4edffec3db1f233b95a6a52b13567b87f Mon Sep 17 00:00:00 2001 From: Mergul Date: Thu, 10 Apr 2025 14:00:20 +0200 Subject: [PATCH 2/3] Fix typo --- source/bubel/ecs/system.d | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/bubel/ecs/system.d b/source/bubel/ecs/system.d index e6defd9..310b53a 100644 --- a/source/bubel/ecs/system.d +++ b/source/bubel/ecs/system.d @@ -13,14 +13,14 @@ import bubel.ecs.manager; System contain data required to proper glue EntityManager with Systems. System callbacks: $(LIST - * void onUpdate(EntitesData); + * void onUpdate(EntitiesData); * void onEnable() - called inside system.enable() function * void onDisable() - called inside system.disable() function * bool onBegin() - called inside manager.begin() * void onEnd() - called inside manager.end() * void onCreate() - called after registration inside registerSystem function * void onDestroy() - called during re-registration and inside manager destructor - * void onAddEntity(EntitesData) - called for every entity which are assigned to system (by adding new entity or changing its components) + * void onAddEntity(EntitiesData) - called for every entity which are assigned to system (by adding new entity or changing its components) * void onRemoveEntity(EntitiesData) - called for every entity removed from system update process * void onChangeEntity(EntitiesData) - called for every entity which components are changed but it was previously assigned to system * void handleEvent(Entity*, Event) - called for every event supported by system From d77317c8163faa6e95f357542f2b771ca32df15a Mon Sep 17 00:00:00 2001 From: Mergul Date: Thu, 10 Apr 2025 14:00:55 +0200 Subject: [PATCH 3/3] Make it possible to use custom runtime (such as numem) --- source/bubel/ecs/manager.d | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/source/bubel/ecs/manager.d b/source/bubel/ecs/manager.d index 0977786..b5220f4 100644 --- a/source/bubel/ecs/manager.d +++ b/source/bubel/ecs/manager.d @@ -27,6 +27,8 @@ alias SerializeVector = bubel.ecs.vector.Vector!ubyte; ///Global EntityManager used for everything. export __gshared EntityManager* gEntityManager = null; +version(D_BetterC) version = NoDRuntime; + /************************************************************************************************************************ Entity manager is responsible for everything. @@ -359,7 +361,7 @@ export struct EntityManager void registerSystem(Sys)(int priority, const(char)[] pass_name) { ushort pass = passes_map.get(pass_name, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(pass != ushort.max, "Update pass doesn't exist."); else assert(pass != ushort.max, "Update pass (Name " ~ pass_name ~ ") doesn't exist."); @@ -381,7 +383,7 @@ export struct EntityManager assert(register_state, "registerSystem must be called between beginRegister() and endRegister()."); - version (D_BetterC) + version (NoDRuntime) assert(pass < passes.length, "Update pass doesn't exist."); else assert(pass < passes.length, "Update pass (ID " ~ pass.to!string ~ ") doesn't exist."); @@ -390,7 +392,7 @@ export struct EntityManager enum SystemName = fullName!Sys; //enum SystemName = Sys.stringof; - System system; + System system = System(); system.m_pass = pass; // static if (!(hasMember!(Sys, "system_id")) || !is(typeof(Sys.system_id) == ushort)) @@ -840,7 +842,7 @@ export struct EntityManager foreach (iii, comp_info; components_info.req) { ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(comp != ushort.max, "Can't register system \"" ~ SystemName ~ "\" due to non existing component."); @@ -852,7 +854,7 @@ export struct EntityManager foreach (iii, comp_info; components_info.excluded) { ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(comp != ushort.max, "Can't register system \"" ~ SystemName ~ "\" due to non existing component."); @@ -864,7 +866,7 @@ export struct EntityManager foreach (iii, comp_info; components_info.optional) { ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(comp != ushort.max, "Can't register system \"" ~ SystemName ~ "\" due to non existing component."); @@ -876,7 +878,7 @@ export struct EntityManager foreach (iii, comp_info; components_info.readonly) { ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(comp != ushort.max, "Can't register system \"" ~ SystemName ~ "\" due to non existing component."); @@ -888,7 +890,7 @@ export struct EntityManager foreach (iii, comp_info; components_info.mutable) { ushort comp = components_map.get(cast(char[]) comp_info.type, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(comp != ushort.max, "Can't register system \"" ~ SystemName ~ "\" due to non existing component."); @@ -1198,7 +1200,7 @@ export struct EntityManager { ushort comp = external_dependencies_map.get(cast(const(char)[]) comp_info.type, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(comp != ushort.max, "Can't register system \"" ~ SystemName ~ "\" due to non existing dependency."); @@ -1211,7 +1213,7 @@ export struct EntityManager foreach (iii, comp_info; components_info.writableDeps) { ushort comp = external_dependencies_map.get(cast(char[]) comp_info.type, ushort.max); - version (D_BetterC) + version (NoDRuntime) assert(comp != ushort.max, "Can't register system \"" ~ SystemName ~ "\" due to non existing dependency.");