diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-05 12:10:04 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-06 17:24:27 -0400 |
| commit | 3c55528b3e0e6e52e416535d9884254a0f21d07e (patch) | |
| tree | 4457601a42c2ee7ac4c40818061648bc5c350705 /src/ecs.cpp | |
| parent | 08ff9cd0e2b754caf60aaceedf670b9e6b61d664 (diff) | |
instancing checkpoint
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 79 |
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 ∁ +} |
