summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ecs.cpp56
-rw-r--r--src/ecs.hpp2
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 &comp;
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 */