diff --git a/CMakeLists.txt b/CMakeLists.txt index b5c62a6..8b4b41a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,8 +7,6 @@ set(CMAKE_C_STANDARD 99) set(RAYLIB_DIR $ENV{HOME}/Documents/Coding/raylib/out/) - - add_subdirectory(sc) add_executable(${PROJECT_NAME} main.c diff --git a/components.h b/components.h index 2f60f2f..3f6fc8c 100644 --- a/components.h +++ b/components.h @@ -1,20 +1,25 @@ #ifndef __COMPONENTS_H #define __COMPONENTS_H - +#include "raylib.h" // TODO: Look at sc to use macros to auto generate functions -#define N_COMPONENTS 1 +#define N_COMPONENTS 2 enum ComponentEnum { CBBOX_COMP_T, + CTRANSFORM_COMP_T, }; typedef enum ComponentEnum ComponentEnum_t; typedef struct _CBBox_t { - int x; - int y; - int width; - int height; + Vector2 size; }CBBox_t; + +typedef struct _CTransform_t +{ + Vector2 position; + Vector2 velocity; + Vector2 accel; +}CTransform_t; #endif // __COMPONENTS_H diff --git a/entManager_test.c b/entManager_test.c index 2002692..7027e85 100644 --- a/entManager_test.c +++ b/entManager_test.c @@ -13,10 +13,10 @@ int main(void) puts("Creating two entities"); Entity_t *p_ent = add_entity(&manager, PLAYER_ENT_TAG); CBBox_t * p_bbox = (CBBox_t *)add_component(&manager, p_ent, CBBOX_COMP_T); - p_bbox->x = 15; + p_bbox->size.x = 15; p_ent = add_entity(&manager, ENEMY_ENT_TAG); p_bbox = (CBBox_t *)add_component(&manager, p_ent, CBBOX_COMP_T); - p_bbox->x = 40; + p_bbox->size.y = 40; update_entity_manager(&manager); puts("Print and remove the entities"); @@ -24,7 +24,7 @@ int main(void) sc_map_foreach(&manager.entities, idx, p_ent) { p_bbox = (CBBox_t *)get_component(&manager, p_ent, CBBOX_COMP_T); - printf("BBOX x: %d\n", p_bbox->x); + printf("BBOX: %f,%f\n", p_bbox->size.x, p_bbox->size.y); remove_entity(&manager, idx); } puts(""); @@ -34,7 +34,7 @@ int main(void) sc_map_foreach(&manager.entities, idx, p_ent) { p_bbox = (CBBox_t *)get_component(&manager, p_ent, CBBOX_COMP_T); - printf("BBOX x: %d\n", p_bbox->x); + printf("BBOX: %f,%f\n", p_bbox->size.x, p_bbox->size.y); remove_entity(&manager, idx); } puts(""); diff --git a/lsan_supp.txt b/lsan_supp.txt new file mode 100644 index 0000000..5faef33 --- /dev/null +++ b/lsan_supp.txt @@ -0,0 +1 @@ +leak:X11 diff --git a/mempool.c b/mempool.c index a9ca171..083ebcf 100644 --- a/mempool.c +++ b/mempool.c @@ -2,6 +2,8 @@ #include "sc/queue/sc_queue.h" #include "sc/map/sc_map.h" +// BIG TODO: REWORK THE MEMPOOL FOR COMPONENT AS IT IS NOT SCALABLE + // Use hashmap as a Set // Use list will be used to check if an object exist // The alternative method to check the free list if idx is not there @@ -22,18 +24,32 @@ static struct BBoxMemPool struct sc_queue_uint free_list; }bbox_mem_pool; +static struct CTransformMemPool +{ + CBBox_t ctransform_buffer[MAX_COMP_POOL_SIZE]; + struct sc_map_64 use_list; + struct sc_queue_uint free_list; +}ctransform_mem_pool; + static bool pool_inited = false; void init_memory_pools(void) { if (!pool_inited) { memset(bbox_mem_pool.bbox_buffer, 0, sizeof(bbox_mem_pool.bbox_buffer)); + memset(ctransform_mem_pool.ctransform_buffer, 0, sizeof(ctransform_mem_pool.ctransform_buffer)); memset(entity_mem_pool.entity_buffer, 0, sizeof(entity_mem_pool.entity_buffer)); + sc_queue_init(&bbox_mem_pool.free_list); for (int i=0;i static void level_scene_render_func(Scene_t* scene) { + Entity_t *p_ent; + sc_map_foreach_value(&scene->ent_manager.entities, p_ent) + { + CTransform_t* p_ct = get_component(&scene->ent_manager, p_ent, CTRANSFORM_COMP_T); + CBBox_t* p_bbox = get_component(&scene->ent_manager, p_ent, CBBOX_COMP_T); + DrawRectangle(p_ct->position.x, p_ct->position.y, p_bbox->size.x, p_bbox->size.y, RED); + } return; } static void movement_update_system(Scene_t* scene) { - return; + puts("Updating movement"); + float delta_time = GetFrameTime(); + CTransform_t * p_ctransform; + sc_map_foreach_value(&scene->ent_manager.component_map[CTRANSFORM_COMP_T], p_ctransform) + { + p_ctransform->velocity = Vector2Add( + p_ctransform->velocity, + Vector2Scale(p_ctransform->accel, delta_time) + ); + p_ctransform->position = Vector2Add( + p_ctransform->position, + Vector2Scale(p_ctransform->velocity, delta_time) + ); + + } } void init_level_scene(LevelScene_t *scene) { diff --git a/scene_test.c b/scene_test.c index a035cf5..d7e07b0 100644 --- a/scene_test.c +++ b/scene_test.c @@ -1,11 +1,38 @@ #include "mempool.h" #include "scene_impl.h" #include +#include int main(void) { + InitWindow(320, 240, "raylib"); + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + init_memory_pools(); LevelScene_t scene; init_level_scene(&scene); - update_scene(&scene.scene); + Entity_t *p_ent = add_entity(&scene.scene.ent_manager, PLAYER_ENT_TAG); + CBBox_t *p_bbox = add_component(&scene.scene.ent_manager, p_ent, CBBOX_COMP_T); + p_bbox->size.x = 30; + p_bbox->size.y = 30; + CTransform_t * p_ctran = (CTransform_t *)add_component(&scene.scene.ent_manager, p_ent, CTRANSFORM_COMP_T); + p_ctran->accel.x = 20; + p_ctran->accel.y = 10; + update_entity_manager(&scene.scene.ent_manager); + for (size_t step = 0; step < 120; step++) + { + puts("======"); + printf("Step %lu\n", step); + update_scene(&scene.scene); + printf("Position: %f,%f\n", p_ctran->position.x, p_ctran->position.y); + printf("Velocity: %f,%f\n", p_ctran->velocity.x, p_ctran->velocity.y); + printf("Accel: %f,%f\n", p_ctran->accel.x, p_ctran->accel.y); + // This is needed to advance time delta + BeginDrawing(); + // TODO: Call the current scene Render function + render_scene(&scene.scene); + ClearBackground(RAYWHITE); + EndDrawing(); + } + CloseWindow(); free_level_scene(&scene); }