From 34f484b8bfeb4572a224def19d1484ae058645e0 Mon Sep 17 00:00:00 2001 From: quou Date: Wed, 26 Mar 2025 20:23:36 +1100 Subject: stretchy component pools --- world.hpp | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'world.hpp') diff --git a/world.hpp b/world.hpp index 267b58a..a45cf9c 100644 --- a/world.hpp +++ b/world.hpp @@ -12,19 +12,35 @@ using Component_Mask = uint64_t; using Entity_Id = uint32_t; #define max_entities 1024 -#define pool_cap 128 +#define slinky_size 128 #define max_components 64 +#define max_slinkies (max_entities / slinky_size) + +struct Slinky { + Entity_Id* entities; + void* data; + int count; + + void init(Arena* a, int size); + void* add(Entity_Id eid, int size, int& mapping); + void* get(Entity_Id eid, int mapping, int size); + void remove(Entity_Id eid, int mapping, int size); +}; struct Pool { + struct Mapping { + int slinky; + int mapping; + }; + Component_Mask mask; - Pool* next; - void* data; - Entity_Id entities[pool_cap]; - int mapping[max_entities]; + Slinky slinkies[max_slinkies]; + Mapping mapping[max_entities]; int offsets[max_components]; - int size, count; + int size, count, slinky_count; void init(Arena* a, Component_Mask m); + Slinky& get_slinky(Arena* a); void* add(Arena* a, Entity_Id eid); void* get(Entity_Id eid, int cid); void* get(Entity_Id eid); @@ -126,8 +142,11 @@ struct World { template C& get() { Pool* p = v->pools[ind]; + Slinky& s = p->slinkies[ptr / slinky_size]; + int si = &s - p->slinkies; + int off = ptr - (si * slinky_size); return *(C*)( - (char*)p->data + ptr * p->size + + (char*)s.data + off * p->size + p->offsets[v->w->get_component_id()] ); } @@ -138,7 +157,10 @@ struct World { Entity_Id entity() { Pool* p = v->pools[ind]; - return p->entities[ptr]; + Slinky& s = p->slinkies[ptr / slinky_size]; + int si = &s - p->slinkies; + int off = ptr - (si * slinky_size); + return s.entities[off]; } }; -- cgit v1.2.3-54-g00ecf