diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-26 16:02:07 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-26 16:02:07 -0400 |
| commit | 211c14d7094a550fd1886123dbd52f718163d116 (patch) | |
| tree | 0681c39d292dbde52da6b81a2d444f8b0a621762 | |
| parent | 35759fe54afef2015685e004dfe76ff79c27e32e (diff) | |
use placement new operator in ECS and better asserts
| -rw-r--r-- | src/ecs.cpp | 56 | ||||
| -rw-r--r-- | src/ecs.hpp | 2 |
2 files changed, 39 insertions, 19 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp index f5c5e72..360370f 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -1,6 +1,8 @@ #include "ecs.hpp" +#include <new> + TypeSafeInt_B(EntityHandle); const uint64_t maxBucketItemCount = 256; @@ -51,7 +53,7 @@ EntityHandle ECS_CreateEntity_Inner(EntityHandle parentEntHandle) { auto b = Buckets_GetBucketIndex(static_cast<EntityHandle_T>(entityHandle)); auto e = Buckets_GetItemIndex(static_cast<EntityHandle_T>(entityHandle)); Entity *entity = &Entities_BucketContainer.buckets[b].entities[e]; - + entity = new (entity) Entity{}; entity->handle = entityHandle; entity->parentHandle = parentEntHandle; @@ -150,16 +152,22 @@ void ECS_Tick(double delta) { } CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) { + assert(entHandle != EntityHandle_MAX); + Entity *ent = nullptr; ECS_GetEntity_Inner(entHandle, ent); + + assert(ent->grBindsHandle == GrBindsHandle_MAX); + GrBindsHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_GrBinds_BucketContainer)}; ent->grBindsHandle = GrBindsHandle{newHandle}; auto b = Buckets_GetBucketIndex(newHandle); auto i = Buckets_GetItemIndex(newHandle); - auto &comp = Comp_GrBinds_BucketContainer.buckets[b].compGrBinds[i]; - comp.entHandle = entHandle; - comp.grBindsHandle = ent->grBindsHandle; - return comp; + auto *comp = &Comp_GrBinds_BucketContainer.buckets[b].compGrBinds[i]; + comp = new (comp) CompGrBinds{}; + comp->entHandle = entHandle; + comp->grBindsHandle = ent->grBindsHandle; + return *comp; } CompGrBinds *ECS_GetGrBinds(EntityHandle entHandle) { @@ -185,28 +193,40 @@ CompGrBinds *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount) { return Comp_GrBinds_BucketContainer.buckets[bucketIndex].compGrBinds; } -CompInstance &ECS_CreateInstance(EntityHandle entHandle) { +CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityTypeEntityHandle) { + assert(entHandle != EntityHandle_MAX); + assert(entityTypeEntityHandle != EntityHandle_MAX); + Entity *ent = nullptr; + Entity *entTypeEnt = nullptr; ECS_GetEntity_Inner(entHandle, ent); + ECS_GetEntity_Inner(entityTypeEntityHandle, entTypeEnt); + + assert(ent->grBindsHandle == GrBindsHandle_MAX); + assert(entTypeEnt->grBindsHandle != GrBindsHandle_MAX); + InstanceHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_Instance_BucketContainer)}; ent->instanceHandle = InstanceHandle{newHandle}; - assert(ent->grBindsHandle != GrBindsHandle_MAX); - GrBindsHandle_T grBindsHandle_t{static_cast<GrBindsHandle_T>(ent->grBindsHandle)}; + GrBindsHandle_T grBindsHandle_t{static_cast<GrBindsHandle_T>(entTypeEnt->grBindsHandle)}; auto b2 = Buckets_GetBucketIndex(grBindsHandle_t); auto i2 = Buckets_GetItemIndex(grBindsHandle_t); auto &grBinds = Comp_GrBinds_BucketContainer.buckets[b2].compGrBinds[i2]; auto b = Buckets_GetBucketIndex(newHandle); auto i = Buckets_GetItemIndex(newHandle); - auto &comp = Comp_Instance_BucketContainer.buckets[b].instances[i]; - - comp.entHandle = entHandle; - comp.grBindsHandle = ent->grBindsHandle; - comp.instanceHandle = ent->instanceHandle; - comp.index = grBinds.instances.Count(); - grBinds.instances.Push({}); - comp.ptr = &grBinds.instances[comp.index]; - return comp; + auto *comp = &Comp_Instance_BucketContainer.buckets[b].instances[i]; + comp = new (comp) CompInstance{}; + comp->entHandle = entHandle; + comp->grBindsHandle = ent->grBindsHandle; + comp->instanceHandle = ent->instanceHandle; + comp->index = grBinds.instances.Count(); + grBinds.instances.Push({ + .pos = glm::vec3(0), + .rot = glm::vec3(1), + .scale = glm::vec3(1), + }); + comp->ptr = &grBinds.instances[comp->index]; + return *comp; } CompInstance *ECS_GetInstance(EntityHandle entHandle) { @@ -224,7 +244,7 @@ CompInstance *ECS_GetInstance(EntityHandle entHandle) { auto i = Buckets_GetItemIndex(instanceHandle_t); auto &comp = Comp_Instance_BucketContainer.buckets[b].instances[i]; - if (comp.index >= grBinds.instances.Count()) + if (comp.index == ECS_UNSET_VAL) return nullptr; comp.ptr = &grBinds.instances[comp.index]; return ∁ diff --git a/src/ecs.hpp b/src/ecs.hpp index 1dd8d57..38ebc91 100644 --- a/src/ecs.hpp +++ b/src/ecs.hpp @@ -27,7 +27,7 @@ CompGrBinds *ECS_GetGrBinds(EntityHandle entHandle); uint64_t ECS_GetGrBinds_BucketCount(); CompGrBinds *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount); -CompInstance &ECS_CreateInstance(EntityHandle entHandle); +CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityTypeEntityHandle); CompInstance *ECS_GetInstance(EntityHandle entHandle); #endif /* PKE_ECS_HPP */ |
