summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-05 12:10:04 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-06 17:24:27 -0400
commit3c55528b3e0e6e52e416535d9884254a0f21d07e (patch)
tree4457601a42c2ee7ac4c40818061648bc5c350705 /src/ecs.cpp
parent08ff9cd0e2b754caf60aaceedf670b9e6b61d664 (diff)
instancing checkpoint
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp79
1 files changed, 66 insertions, 13 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp
index d91cd1a..1af539c 100644
--- a/src/ecs.cpp
+++ b/src/ecs.cpp
@@ -4,17 +4,21 @@
TypeSafeInt_B(EntityHandle);
const uint64_t maxBucketItemCount = 256;
-struct EntityBucket{
+struct EntityBucket {
Entity entities[maxBucketItemCount];
};
-struct GrBindsBucket{
- GrBindsComp compGrBinds[maxBucketItemCount];
+struct GrBindsBucket {
+ CompGrBinds compGrBinds[maxBucketItemCount];
+};
+struct InstanceBucket {
+ CompInstance instances[maxBucketItemCount];
};
DynArray<EntityHandle> entitiesMarkedForRemoval{16};
DynArray<EntityHandle> EntitiesToBeRemoved{16};
BucketContainer<EntityBucket, EntityHandle_T> Entities_BucketContainer{};
BucketContainer<GrBindsBucket, GrBindsHandle_T> Comp_GrBinds_BucketContainer{};
+BucketContainer<InstanceBucket, InstanceHandle_T> Comp_Instance_BucketContainer{};
void ECS_GetEntity_Inner(EntityHandle entHandle, Entity*& ent) {
EntityHandle_T entHandle_t{static_cast<EntityHandle_T>(entHandle)};
@@ -27,9 +31,10 @@ void ECS_GetEntity_Inner(EntityHandle entHandle, Entity*& ent) {
void ECS_Init() {
Buckets_Init(Entities_BucketContainer);
Buckets_Init(Comp_GrBinds_BucketContainer);
+ Buckets_Init(Comp_Instance_BucketContainer);
}
-EntityHandle ECS_CreateEntity_Inner(EntityHandle parentEntityHandle) {
+EntityHandle ECS_CreateEntity_Inner(EntityHandle parentEntHandle) {
EntityHandle_T entityHandle_T{Buckets_NewHandle<EntityBucket>(maxBucketItemCount, Entities_BucketContainer)};
EntityHandle entityHandle{entityHandle_T};
@@ -38,13 +43,13 @@ EntityHandle ECS_CreateEntity_Inner(EntityHandle parentEntityHandle) {
Entity *entity = &Entities_BucketContainer.buckets[b].entities[e];
entity->handle = entityHandle;
- entity->parentHandle = parentEntityHandle;
+ entity->parentHandle = parentEntHandle;
return entityHandle;
}
-EntityHandle ECS_CreateEntity(EntityHandle parentEntityHandle) {
- return ECS_CreateEntity_Inner(parentEntityHandle);
+EntityHandle ECS_CreateEntity(EntityHandle parentEntHandle) {
+ return ECS_CreateEntity_Inner(parentEntHandle);
}
void ECS_MarkForRemoval(EntityHandle entityHandle) {
@@ -83,27 +88,33 @@ void ECS_Tick(double delta) {
entitiesMarkedForRemoval.Resize(0);
}
-GrBindsComp &ECS_CreateGrBinds(EntityHandle handle) {
+CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) {
Entity *ent = nullptr;
- ECS_GetEntity_Inner(handle, ent);
+ ECS_GetEntity_Inner(entHandle, ent);
GrBindsHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_GrBinds_BucketContainer)};
ent->grBindsHandle = GrBindsHandle{newHandle};
- return Comp_GrBinds_BucketContainer.buckets[Buckets_GetBucketIndex(newHandle)].compGrBinds[Buckets_GetItemIndex(newHandle)];
+ auto b = Buckets_GetBucketIndex(newHandle);
+ auto i = Buckets_GetItemIndex(newHandle);
+ auto &comp = Comp_GrBinds_BucketContainer.buckets[b].compGrBinds[i];
+ comp.grBindsHandle = ent->grBindsHandle;
+ return comp;
}
-GrBindsComp *ECS_GetGrBinds(EntityHandle entHandle) {
+CompGrBinds *ECS_GetGrBinds(EntityHandle entHandle) {
Entity *ent = nullptr;
ECS_GetEntity_Inner(entHandle, ent);
GrBindsHandle_T grBindsHandle_t{static_cast<GrBindsHandle_T>(ent->grBindsHandle)};
if (grBindsHandle_t == ECS_UNSET_VAL) return nullptr;
- return &Comp_GrBinds_BucketContainer.buckets[Buckets_GetBucketIndex(grBindsHandle_t)].compGrBinds[Buckets_GetItemIndex(grBindsHandle_t)];
+ auto b = Buckets_GetBucketIndex(grBindsHandle_t);
+ auto i = Buckets_GetItemIndex(grBindsHandle_t);
+ return &Comp_GrBinds_BucketContainer.buckets[b].compGrBinds[i];
}
uint64_t ECS_GetGrBinds_BucketCount() {
return Comp_GrBinds_BucketContainer.bucketCounter;
}
-GrBindsComp *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount) {
+CompGrBinds *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount) {
if (bucketIndex == Comp_GrBinds_BucketContainer.bucketCounter) {
itemCount = Comp_GrBinds_BucketContainer.itemCounter;
} else {
@@ -111,3 +122,45 @@ GrBindsComp *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount) {
}
return Comp_GrBinds_BucketContainer.buckets[bucketIndex].compGrBinds;
}
+
+CompInstance &ECS_CreateInstance(EntityHandle entHandle) {
+ Entity *ent = nullptr;
+ ECS_GetEntity_Inner(entHandle, ent);
+ InstanceHandle_T newHandle{Buckets_NewHandle(maxBucketItemCount, Comp_Instance_BucketContainer)};
+ ent->instanceHandle = InstanceHandle{newHandle};
+ GrBindsHandle_T grBindsHandle_t{static_cast<GrBindsHandle_T>(ent->grBindsHandle)};
+ assert(grBindsHandle_t != ECS_UNSET_VAL);
+
+ 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.grBindsHandle = ent->grBindsHandle;
+ comp.instanceHandle = ent->instanceHandle;
+ comp.index = grBinds.instances.Count();
+ grBinds.instances.Push({});
+ comp.ptr = &grBinds.instances[comp.index];
+ return comp;
+}
+
+CompInstance *ECS_GetInstance(EntityHandle entHandle) {
+ Entity *ent = nullptr;
+ ECS_GetEntity_Inner(entHandle, ent);
+ GrBindsHandle_T grBindsHandle_t{static_cast<GrBindsHandle_T>(ent->grBindsHandle)};
+ if (grBindsHandle_t == ECS_UNSET_VAL) return nullptr;
+ InstanceHandle_T instanceHandle_t{static_cast<InstanceHandle_T>(ent->instanceHandle)};
+ if (instanceHandle_t == ECS_UNSET_VAL) return nullptr;
+
+ 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(instanceHandle_t);
+ auto i = Buckets_GetItemIndex(instanceHandle_t);
+ auto &comp = Comp_Instance_BucketContainer.buckets[b].instances[i];
+
+ comp.ptr = &grBinds.instances[comp.index];
+ return &comp;
+}