Update: Reimplement Systems in particle example

This commit is contained in:
Rodolfo Barcelli Jo 2026-01-23 09:05:46 +08:00
parent 57c7231dc1
commit c88484a794
2 changed files with 76 additions and 37 deletions

View file

@ -7,7 +7,7 @@ fi
if [[ $1 == "--setup" ]]; then if [[ $1 == "--setup" ]]; then
git submodule update --init git submodule update --init
pushd "./external/raylib/" pushd "./external/raylib/"
cmake -S . -B build cmake -S . -B build -DBUILD_EXAMPLES=Off
cmake --build build cmake --build build
popd popd
fi fi

View file

@ -46,6 +46,41 @@ void SpawnParticle(BECS_ECS *ecs, BECS_ComponentID posID, BECS_ComponentID velID
data->lifetime = 2.0f; data->lifetime = 2.0f;
} }
void LifetimeSystem(BECS_ECS *ecs, float dt) {
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++) {
data[i].lifetime -= dt;
if (data[i].lifetime <= 0.0f) {
BECS_EntityDestroy(ecs, entity[i]);
}
}
}
void PhysicsSystem(BECS_ECS *ecs, float dt) {
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++)
{
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 = ((Position *)ecs->componentPools[0].denseArray);
ParticleData *data = ((ParticleData *)ecs->componentPools[3].denseArray);
for (uint32_t i = 0; i < ecs->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);
}
}
int main(void) { int main(void) {
// Initialize ECS // Initialize ECS
size_t componentSizes[4] = {sizeof(Position), sizeof(Velocity), sizeof(Acceleration), sizeof(ParticleData)}; size_t componentSizes[4] = {sizeof(Position), sizeof(Velocity), sizeof(Acceleration), sizeof(ParticleData)};
@ -66,57 +101,61 @@ int main(void) {
float dt = GetFrameTime(); float dt = GetFrameTime();
// Update lifetimes and despawn // Update lifetimes and despawn
for (BECS_Entity entity = 0; entity < BECS_MAX_ENTITIES; entity++) { // for (BECS_Entity entity = 0; entity < BECS_MAX_ENTITIES; entity++) {
if (!BECS_IsEntityAlive(&ecs, entity)) continue; // if (!BECS_IsEntityAlive(&ecs, entity)) continue;
if (BECS_ComponentHas(&ecs, entity, dataID)) { // if (BECS_ComponentHas(&ecs, entity, dataID)) {
ParticleData *data = (ParticleData *)BECS_ComponentGet(&ecs, entity, dataID); // ParticleData *data = (ParticleData *)BECS_ComponentGet(&ecs, entity, dataID);
data->lifetime -= dt; // data->lifetime -= dt;
if (data->lifetime <= 0.0f) { // if (data->lifetime <= 0.0f) {
BECS_EntityDestroy(&ecs, entity); // BECS_EntityDestroy(&ecs, entity);
} // }
} // }
} // }
LifetimeSystem(&ecs, dt);
// Spawn particle on mouse click // Spawn particle on mouse click
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) { if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) {
Vector2 mousePos = GetMousePosition(); Vector2 mousePos = GetMousePosition();
for (uint32_t i = 0; i < 10; i++) for (uint32_t i = 0; i < 10000; i++) {
{
SpawnParticle(&ecs, posID, velID, accID, dataID, mousePos.x, mousePos.y); SpawnParticle(&ecs, posID, velID, accID, dataID, mousePos.x, mousePos.y);
} }
} }
// Physics system: update position and velocity // Physics system: update position and velocity
for (BECS_Entity entity = 0; entity < BECS_MAX_ENTITIES; entity++) { // for (BECS_Entity entity = 0; entity < BECS_MAX_ENTITIES; entity++) {
if (!BECS_IsEntityAlive(&ecs, entity)) continue; // if (!BECS_IsEntityAlive(&ecs, entity)) continue;
if (BECS_ComponentHas(&ecs, entity, posID) && // if (BECS_ComponentHas(&ecs, entity, posID) &&
BECS_ComponentHas(&ecs, entity, velID) && // BECS_ComponentHas(&ecs, entity, velID) &&
BECS_ComponentHas(&ecs, entity, accID)) { // BECS_ComponentHas(&ecs, entity, accID)) {
Position *pos = (Position *)BECS_ComponentGet(&ecs, entity, posID); // Position *pos = (Position *)BECS_ComponentGet(&ecs, entity, posID);
Velocity *vel = (Velocity *)BECS_ComponentGet(&ecs, entity, velID); // Velocity *vel = (Velocity *)BECS_ComponentGet(&ecs, entity, velID);
Acceleration *acc = (Acceleration *)BECS_ComponentGet(&ecs, entity, accID); // Acceleration *acc = (Acceleration *)BECS_ComponentGet(&ecs, entity, accID);
//
// vel->vx += acc->ax * dt;
// vel->vy += acc->ay * dt;
// pos->x += vel->vx * dt;
// pos->y += vel->vy * dt;
// }
// }
vel->vx += acc->ax * dt; PhysicsSystem(&ecs, dt);
vel->vy += acc->ay * dt;
pos->x += vel->vx * dt;
pos->y += vel->vy * dt;
}
}
BeginDrawing(); BeginDrawing();
ClearBackground(BLACK); ClearBackground(BLACK);
// Render system: draw particles // Render system: draw particles
for (BECS_Entity entity = 0; entity < BECS_MAX_ENTITIES; entity++) { // for (BECS_Entity entity = 0; entity < BECS_MAX_ENTITIES; entity++) {
if (!BECS_IsEntityAlive(&ecs, entity)) continue; // if (!BECS_IsEntityAlive(&ecs, entity)) continue;
if (BECS_ComponentHas(&ecs, entity, posID) && BECS_ComponentHas(&ecs, entity, dataID)) { // if (BECS_ComponentHas(&ecs, entity, posID) && BECS_ComponentHas(&ecs, entity, dataID)) {
Position *pos = (Position *)BECS_ComponentGet(&ecs, entity, posID); // Position *pos = (Position *)BECS_ComponentGet(&ecs, entity, posID);
ParticleData *data = (ParticleData *)BECS_ComponentGet(&ecs, entity, dataID); // ParticleData *data = (ParticleData *)BECS_ComponentGet(&ecs, entity, dataID);
float alpha = data->lifetime / 2.0f; // float alpha = data->lifetime / 2.0f;
Color color = {255, 255, 255, (unsigned char)(alpha * 255)}; // Color color = {255, 255, 255, (unsigned char)(alpha * 255)};
DrawCircle((int)pos->x, (int)pos->y, data->radius, color); // DrawCircle((int)pos->x, (int)pos->y, data->radius, color);
} // }
} // }
RenderSystem(&ecs, dt);
DrawText(TextFormat("Particles: %u", ecs.entityCount), 10, 10, 20, WHITE); DrawText(TextFormat("Particles: %u", ecs.entityCount), 10, 10, 20, WHITE);
EndDrawing(); EndDrawing();