From b9f90793c8c0468d5f35d7af976a6e3bcd206aad Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Fri, 1 Sep 2023 10:10:51 -0400 Subject: add first graphics binding component --- src/ecs.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/ecs.cpp') diff --git a/src/ecs.cpp b/src/ecs.cpp index aa85873..33fec2b 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -7,6 +7,9 @@ const uint64_t bucketItemCount = 256; struct EntityBucket{ Entity entities[bucketItemCount]; }; +struct GrBindsBucket{ + CompGrBinds compGrBinds[bucketItemCount]; +}; uint64_t entityBucketIncrementer = 2; EntityHandle_T entityBucketCounter{0}; @@ -15,8 +18,17 @@ EntityBucket *entityBuckets = nullptr; DynArray entitiesMarkedForRemoval{16}; DynArray EntitiesToBeRemoved{16}; +BucketContainer Comp_GrBinds_BucketContainer{}; + +void ECS_GetEntity_Inner(EntityHandle entHandle, Entity*& ent) { + EntityHandle_T entHandle_t{static_cast(entHandle)}; + assert(entHandle_t == ECS_UNSET_VAL && "Unknown entity handle"); + ent = &entityBuckets[Buckets_GetBucketIndex(entHandle_t)].entities[Buckets_GetItemIndex(entHandle_t)]; +} + void ECS_Init() { entityBuckets = Pke_New(entityBucketIncrementer); + Buckets_Init(Comp_GrBinds_BucketContainer); } EntityHandle ECS_CreateEntity_Inner(EntityHandle parentEntityHandle) { @@ -69,3 +81,32 @@ void ECS_Tick(double delta) { } entitiesMarkedForRemoval.Resize(0); } + +CompGrBinds &ECS_CreateGrBinds(EntityHandle handle) { + Entity *ent = nullptr; + ECS_GetEntity_Inner(handle, ent); + GrBindsHandle_T newHandle{Buckets_NewHandle(bucketItemCount, Comp_GrBinds_BucketContainer)}; + ent->grBindsHandle = GrBindsHandle{newHandle}; + return Comp_GrBinds_BucketContainer.buckets[Buckets_GetBucketIndex(newHandle)].compGrBinds[Buckets_GetItemIndex(newHandle)]; +} + +CompGrBinds *ECS_GetGrBinds(EntityHandle entHandle) { + Entity *ent = nullptr; + ECS_GetEntity_Inner(entHandle, ent); + GrBindsHandle_T grBindsHandle_t{static_cast(ent->grBindsHandle)}; + if (grBindsHandle_t == ECS_UNSET_VAL) return nullptr; + return &Comp_GrBinds_BucketContainer.buckets[Buckets_GetBucketIndex(grBindsHandle_t)].compGrBinds[Buckets_GetItemIndex(grBindsHandle_t)]; +} + +uint64_t ECS_GetGrBinds_BucketCount() { + return Comp_GrBinds_BucketContainer.bucketCounter; +} + +CompGrBinds *ECS_GetGrBinds(uint64_t bucketIndex, uint64_t &itemCount) { + if (bucketIndex == Comp_GrBinds_BucketContainer.bucketCounter) { + itemCount = Comp_GrBinds_BucketContainer.itemCounter; + } else { + itemCount = bucketItemCount; + } + return Comp_GrBinds_BucketContainer.buckets[bucketIndex].compGrBinds; +} -- cgit v1.2.3