Skip to content

Commit

Permalink
standard entity related utilities
Browse files Browse the repository at this point in the history
  • Loading branch information
LucAlexander committed Jul 20, 2022
1 parent d1b3c20 commit 224e095
Show file tree
Hide file tree
Showing 2 changed files with 177 additions and 7 deletions.
154 changes: 153 additions & 1 deletion entities.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@

#include "entities.h"
#include "cflags.h"
#include "mathutils.h"

#include "xi_components.h"
#include "systems.h"

VECTOR_SOURCE(su32_t, uint32_t)
HASHMAP_SOURCE(mu32u32_t, uint32_t, uint32_t, hashI)

void ecs_init(entity_data* d, uint32_t n, ...){
d->entities = 0;
Expand Down Expand Up @@ -69,7 +74,7 @@ uint16_t entity_max_layer(entity_data* d){
return m;
}

uint8_t entity_exists(entity_data* d, uint32_t eid){
uint8_t entity_active(entity_data* d, uint32_t eid){
return !bit_check(d->flags[eid], ENTITY_DEACTIVATED);
}

Expand Down Expand Up @@ -99,3 +104,150 @@ void ecs_deinit(entity_data* d){
d->layers = NULL;
}

uint8_t entity_exact_mask_logic(entity_data* d, uint32_t eid, uint8_t exact, uint64_t reference, uint64_t candidate){
return entity_active(d, eid) && ((exact && (candidate==reference)) || (!(exact) && system_mask_compare(reference, candidate)));
}

uint8_t entity_exists_mask(entity_data* d, uint8_t exact, uint64_t mask){
uint32_t i;
for (i=0;i<d->entities;++i){
uint64_t m = d->masks[i];
if (entity_exact_mask_logic(d, i, exact, mask, m)){
return 1;
}
}
return 0;
}

uint8_t entity_exists(entity_data* d, uint8_t exact, uint32_t n, ...){
uint64_t mask;
va_list v;
va_start(v, n);
uint32_t i;
for (i = 0;i<n;++i){
mask = bit_on(mask, va_arg(v, uint32_t));
}
va_end(v);
return entity_exists_mask(d, exact, mask);
}

uint32_t entity_nearest_mask(entity_data* d, v2 pos, uint8_t exact, uint64_t mask){
int32_t distance = -1;
uint32_t i, eid = 0;
for (i=0;i<d->entities;++i){
uint64_t m = d->masks[i];
if (entity_exact_mask_logic(d, i, exact, mask, m)){
v2* point = component_get(d, i, POSITION_C);
uint32_t refdist = distancePointV2(pos, *point);
if (distance == -1 || refdist < distance){
eid = i;
distance = refdist;
}
}
}
return eid;
}

uint32_t entity_nearest(entity_data* d, v2 pos, uint8_t exact, uint32_t n, ...){
uint64_t mask;
va_list v;
va_start(v, n);
uint32_t i;
for (i = 0;i<n;++i){
mask = bit_on(mask, va_arg(v, uint32_t));
}
va_end(v);
return entity_nearest_mask(d, pos, exact, mask);
}

uint32_t entity_nearest_mask_n(entity_data* d, v2 pos, uint32_t n, uint8_t exact, uint64_t mask){
mu32u32_t map = mu32u32_tInit();
uint32_t i;
for (i=0;i<d->entities;++i){
uint64_t m = d->masks[i];
if (entity_exact_mask_logic(d, i, exact, mask, m)){
v2* point = component_get(d, i, POSITION_C);
uint32_t refdist = distancePointV2(pos, *point);
mu32u32_tPush(&map, refdist, i);
}
}
uint32_t* keys = mu32u32_tGetKeySet(&map);
uint32_t eid = mu32u32_tGet(&map, keys[n]).val;
free(keys);
keys = NULL;
mu32u32_tFree(&map);
return eid;
}

uint32_t entity_nearest_n(entity_data* d, v2 pos, uint8_t exact, uint32_t n, uint32_t m, ...){
uint64_t mask;
va_list v;
va_start(v, m);
uint32_t i;
for (i = 0;i<m;++i){
mask = bit_on(mask, va_arg(v, uint32_t));
}
va_end(v);
return entity_nearest_mask_n(d, pos, n, exact, mask);
}

uint32_t entity_furthest_mask(entity_data* d, v2 pos, uint8_t exact, uint64_t mask){
int32_t distance = -1;
uint32_t i, eid = 0;
for (i=0;i<d->entities;++i){
uint64_t m = d->masks[i];
if (entity_exact_mask_logic(d, i, exact, mask, m)){
v2* point = component_get(d, i, POSITION_C);
uint32_t refdist = distancePointV2(pos, *point);
if (distance == -1 || refdist > distance){
eid = i;
distance = refdist;
}
}
}
return eid;
}

uint32_t entity_furthest(entity_data* d, v2 pos, uint8_t exact, uint32_t n, ...){
uint64_t mask;
va_list v;
va_start(v, n);
uint32_t i;
for (i = 0;i<n;++i){
mask = bit_on(mask, va_arg(v, uint32_t));
}
va_end(v);
return entity_furthest_mask(d, pos, exact, mask);
}

uint32_t entity_furthest_mask_n(entity_data* d, v2 pos, uint32_t n, uint8_t exact, uint64_t mask){
mu32u32_t map = mu32u32_tInit();
uint32_t i;
for (i=0;i<d->entities;++i){
uint64_t m = d->masks[i];
if (entity_exact_mask_logic(d, i, exact, mask, m)){
v2* point = component_get(d, i, POSITION_C);
uint32_t refdist = distancePointV2(pos, *point);
mu32u32_tPush(&map, refdist, i);
}
}
uint32_t* keys = mu32u32_tGetKeySet(&map);
uint32_t eid = mu32u32_tGet(&map, keys[map.size-n]).val;
free(keys);
keys = NULL;
mu32u32_tFree(&map);
return eid;
}

uint32_t entity_furthest_n(entity_data* d, v2 pos, uint8_t exact, uint32_t n, uint32_t m, ...){
uint64_t mask;
va_list v;
va_start(v, m);
uint32_t i;
for (i = 0;i<m;++i){
mask = bit_on(mask, va_arg(v, uint32_t));
}
va_end(v);
return entity_furthest_mask_n(d, pos, exact, n, mask);
}

30 changes: 24 additions & 6 deletions entities.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@
#define ENTITY_H

#include "vector.h"
#include "hashMap.h"

#define ENTITY_LIMIT 65536
#define COMPONENT_LIMIT 64

VECTOR(su32_t, uint32_t)
HASHMAP(mu32u32_t, uint32_t, uint32_t)

struct v2;

typedef enum FLAGS{
ENTITY_DEACTIVATED=1
Expand All @@ -25,16 +29,30 @@ typedef struct entity_data{
}entity_data;

void ecs_init(entity_data* d, uint32_t n, ...);
void ecs_clear(entity_data* d);
void ecs_deinit(entity_data* d);

void* component_get(entity_data* d, uint32_t eid, uint32_t cid);
void component_add(entity_data* d, uint32_t eid, uint32_t cid, void* data);
void component_remove(entity_data* d, uint32_t eid, uint32_t cid);
uint32_t entity_create(entity_data* d);
void entity_destroy(entity_data* d, uint32_t eid);
void entity_set_layer(entity_data* d, uint32_t eid, uint16_t layer);

uint8_t entity_active(entity_data* d, uint32_t eid);
uint8_t entity_exists_mask(entity_data* d, uint8_t exact, uint64_t mask);
uint8_t entity_exists(entity_data* d, uint8_t exact, uint32_t n, ...);
uint16_t entity_max_layer(entity_data* d);
uint16_t entity_get_layer(entity_data* d, uint32_t eid);
uint8_t entity_exists(entity_data* d, uint32_t eid);
void ecs_clear(entity_data* d);
void ecs_deinit(entity_data* d);
void entity_set_layer(entity_data* d, uint32_t eid, uint16_t layer);
uint32_t entity_nearest_mask(entity_data* d, struct v2 pos, uint8_t exact, uint64_t mask);
uint32_t entity_nearest(entity_data* d, struct v2 pos, uint8_t exact, uint32_t n, ...);
uint32_t entity_nearest_mask_n(entity_data* d, struct v2 pos, uint32_t n, uint8_t exact, uint64_t mask);
uint32_t entity_nearest_n(entity_data* d, struct v2 pos, uint8_t exact, uint32_t n, uint32_t m, ...);
uint32_t entity_furthest_mask(entity_data* d, struct v2 pos, uint8_t exact, uint64_t mask);
uint32_t entity_furthest(entity_data* d, struct v2 pos, uint8_t exact, uint32_t n, ...);
uint32_t entity_furthest_mask_n(entity_data* d, struct v2 pos, uint32_t n, uint8_t exact, uint64_t mask);
uint32_t entity_furthest_n(entity_data* d, struct v2 pos, uint8_t exact, uint32_t n, uint32_t m, ...);
uint32_t entity_create(entity_data* d);
void entity_destroy(entity_data* d, uint32_t eid);

uint8_t entity_exact_mask_logic(entity_data* d, uint32_t eid, uint8_t exact, uint64_t reference, uint64_t candidate);

#endif

0 comments on commit 224e095

Please sign in to comment.