summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c111
1 files changed, 99 insertions, 12 deletions
diff --git a/src/main.c b/src/main.c
index e09cd18..b82308e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,6 +5,12 @@
#include "storage.h"
#include "bitset.h"
+enum component_t
+{
+ C_TRANSFORM = (int) 0,
+ C_COLLIDER,
+};
+
typedef struct
{
int x;
@@ -25,6 +31,28 @@ typedef struct
} collider_t;
void
+sys_collide(storage_t *storage, entity_t eid)
+{
+ printf("Inside collide, id = %i\n", eid);
+ transform_t *transform = GET_COMPONENT(storage, transform_t, eid);
+ collider_t *collider = GET_COMPONENT(storage, collider_t, eid);
+ printTransform(transform);
+ printf("\n");
+}
+
+void
+sys_move(storage_t *storage, entity_t eid)
+{
+ printf("Inside move, id = %i\n", eid);
+ transform_t *transform = GET_COMPONENT(storage, transform_t, eid);
+ printTransform(transform);
+ printf("\n");
+}
+
+
+// Engine functions
+
+void
initStorage(storage_t *storage)
{
storage->componentsStored = 0;
@@ -32,6 +60,10 @@ initStorage(storage_t *storage)
storage->objects = (component_pair_t *) malloc(MAX_COMPONENTS * sizeof(component_pair_t));
bitarena_init(&storage->objectSignatures, MAX_OBJECTS);
+ storage->systemsStored = 0;
+ storage->systems = (system_t *) malloc(4096 * sizeof(system_t));
+ bitarena_init(&storage->systemSignatures, 4096);
+
REGISTER_COMPONENT(storage, transform_t);
REGISTER_COMPONENT(storage, collider_t);
}
@@ -39,30 +71,83 @@ initStorage(storage_t *storage)
void
loadScene(storage_t *storage)
{
- bitset_t s1 = bitarena_at(&storage->objectSignatures, 0);
- bitset_t s2 = bitarena_at(&storage->objectSignatures, 1);
+ // bitset_t s1 = bitarena_at(&storage->objectSignatures, 0);
+ // bitset_t s2 = bitarena_at(&storage->objectSignatures, 1);
- bitset_set(s1, 9);
- bitset_set(s2, 9);
+ // bitset_set(s1, 9);
+ // bitset_set(s2, 9);
- bitset_print(s1);
- bitset_print(s2);
+ // bitset_print(s1);
+ // bitset_print(s2);
+
+ // bitset_t sAnd = bitset_and(s1, s2);
+ // printf("Bitset is zero: %i\n", bitset_isZero(sAnd));
+ // printf("Bitset is equals: %i\n", bitset_equals(s1, s2));
- bitset_t sAnd = bitset_and(s1, s2);
- printf("Bitset is zero: %i\n", bitset_isZero(sAnd));
- printf("Bitset is equals: %i\n", bitset_equals(s1, s2));
-
entity_t e1 = createEntity(storage);
+ ADD_COMPONENT(storage, e1, transform_t);
+ ADD_COMPONENT(storage, e1, collider_t);
+
transform_t *t1 = GET_COMPONENT(storage, transform_t, e1);
t1->x = 13;
t1->y = 37;
- printTransform(t1);
+ // printTransform(t1);
+
+ collider_t *c1 = GET_COMPONENT(storage, collider_t, e1);
+ c1->height = 50;
+ c1->width = 50;
+ c1->collisionsCount = 5;
entity_t e2 = createEntity(storage);
+ ADD_COMPONENT(storage, e2, transform_t);
+
transform_t *t2 = GET_COMPONENT(storage, transform_t, e2);
t2->x = 14;
t2->y = 88;
- printTransform(t2);
+ // printTransform(t2);
+
+ entity_t e3 = createEntity(storage);
+ ADD_COMPONENT(storage, e3, transform_t);
+
+ transform_t *t3 = GET_COMPONENT(storage, transform_t, e3);
+ t3->x = 228;
+ t3->y = 123;
+ // printTransform(t3);
+
+ {
+ char *components[] = {"transform_t", "collider_t", NULL};
+ bitset_t bitset = createSignature(storage, components);
+ // printf("Collide bitset: ");
+ // bitset_print(bitset);
+ registerSystem(storage, sys_collide, bitset);
+ }
+
+ {
+ char *components[] = {"transform_t", NULL};
+ bitset_t bitset = createSignature(storage, components);
+ // printf("Move bitset: ");
+ // bitset_print(bitset);
+ registerSystem(storage, sys_move, bitset);
+ }
+}
+
+void
+update(storage_t *storage)
+{
+ for (entity_t i = 0; i < storage->objectsStored; ++i)
+ {
+ for (int j = 0; j < storage->systemsStored; ++j)
+ {
+ bitset_t objBitset = bitarena_at(&storage->objectSignatures, i);
+ bitset_t sysBitset = bitarena_at(&storage->systemSignatures, j);
+ bitset_t bitAnd = bitset_and(objBitset, sysBitset);
+
+ if (bitset_equals(bitAnd, sysBitset))
+ {
+ storage->systems[j](storage, i);
+ }
+ }
+ }
}
int
@@ -71,5 +156,7 @@ main()
storage_t storage;
initStorage(&storage);
loadScene(&storage);
+ update(&storage);
+
return 0;
}