#define BECS_MAX_ENTITIES 100000ULL #define BECS_MAX_COMPONENTS 4ULL #define BECS_IMPLEMENTATION #include "../../becs.h" #include #include #include "external/raylib/src/raylib.h" #include "external/raylib/src/rlgl.h" #include "external/raylib/src/raymath.h" // Component structs typedef struct { float x, y; } Position; typedef struct { float vx, vy; } Velocity; typedef struct { float ax, ay; } Acceleration; typedef struct { float radius; float lifetime; } ParticleData; // Function to spawn a particle void SpawnParticle(BECS_ECS *ecs, BECS_ComponentID posID, BECS_ComponentID velID, BECS_ComponentID accID, BECS_ComponentID dataID, float x, float y) { BECS_Entity entity = BECS_EntityCreate(ecs); if (entity == BECS_NULL_ENTITY) return; Position *pos = (Position *)BECS_ComponentAdd(ecs, entity, posID); pos->x = x; pos->y = y; Velocity *vel = (Velocity *)BECS_ComponentAdd(ecs, entity, velID); vel->vx = GetRandomValue(-100, 100); vel->vy = GetRandomValue(-200, -50); Acceleration *acc = (Acceleration *)BECS_ComponentAdd(ecs, entity, accID); acc->ax = 0.0f; acc->ay = 100.0f; // Gravity ParticleData *data = (ParticleData *)BECS_ComponentAdd(ecs, entity, dataID); data->radius = 5.0f; data->lifetime = 2.0f; } void LifetimeSystem(BECS_ECS *ecs, float dt, ParticleData *data, BECS_Entity *entity) { // ParticleData *data = (ParticleData *)ecs->componentPools[3].denseArray; // BECS_Entity *entity = (BECS_Entity *)ecs->componentPools[3].denseEntityMapping; // for (uint32_t i = 0; i < ecs->entityCount; i++) { uint32_t entityCount = ecs->entityCount; for (uint32_t i = 0; i < entityCount; i++) { data[i].lifetime -= dt; if (data[i].lifetime <= 0.0f) { BECS_EntityDestroy(ecs, entity[i]); } } } void PhysicsSystem(BECS_ECS *ecs, float dt, Position *pos, Velocity *vel, Acceleration *acc) { //Position *pos = ((Position *)ecs->componentPools[0].denseArray); //Velocity *vel = ((Velocity *)ecs->componentPools[1].denseArray); // Acceleration *acc = ((Acceleration *)ecs->componentPools[2].denseArray); // for (uint32_t i = 0; i < ecs->entityCount; i++) { uint32_t entityCount = ecs->entityCount; for (uint32_t i = 0; i < entityCount; i++) { vel[i].vy += acc[i].ay * dt; vel[i].vx += acc[i].ax * dt; pos[i].y += vel[i].vy * dt; pos[i].x += vel[i].vx * dt; } } void RenderSystem(BECS_ECS *ecs, float dt, Position *pos, ParticleData *data) { // Position *pos = ((Position *)ecs->componentPools[0].denseArray); // ParticleData *data = ((ParticleData *)ecs->componentPools[3].denseArray); // for (uint32_t i = 0; i < ecs->entityCount; i++) { uint32_t entityCount = ecs->entityCount; for (uint32_t i = 0; i < entityCount; i++) { float alpha = data[i].lifetime / 2.0; Color color = {255, 255, 255, (unsigned char)(alpha * 255)}; DrawCircle(pos[i].x, pos[i].y, data[i].radius, color); } } // NOTE: This didn't actually improve it as much as I wanted. Gotta look for a better way to render. void DrawCircleBatched(Vector2 *positions, float *radii, Color *colors, uint32_t count, uint32_t segments) { rlBegin(RL_TRIANGLES); for(uint32_t i=0 ;icomponentPools[0].count;//Use correct count for(uint32_t i=0; i