Properly link flecs library

This commit is contained in:
2023-11-09 11:38:29 +01:00
parent dc585396c3
commit 8edcf9305c
1392 changed files with 390081 additions and 164 deletions

View File

@@ -0,0 +1,16 @@
#ifndef SYSTEM_CTX_H
#define SYSTEM_CTX_H
/* This generated file contains includes for project dependencies */
#include "system_ctx/bake_config.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,24 @@
/*
)
(.)
.|.
| |
_.--| |--._
.-'; ;`-'& ; `&.
\ & ; & &_/
|"""---...---"""|
\ | | | | | | | /
`---.|.|.|.---'
* This file is generated by bake.lang.c for your convenience. Headers of
* dependencies will automatically show up in this file. Include bake_config.h
* in your main project file. Do not edit! */
#ifndef SYSTEM_CTX_BAKE_CONFIG_H
#define SYSTEM_CTX_BAKE_CONFIG_H
/* Headers of public dependencies */
#include <flecs.h>
#endif

View File

@@ -0,0 +1,15 @@
{
"id": "system_ctx",
"type": "application",
"value": {
"use": [
"flecs"
],
"public": false
},
"lang.c": {
"${os linux}": {
"lib": ["m"]
}
}
}

View File

@@ -0,0 +1,106 @@
#include <system_ctx.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// Applications can pass context data to a system. A common use case where this
// comes in handy is when a system needs to iterate more than one query. The
// following example shows how to pass a custom query into a system for a simple
// collision detection example.
typedef struct {
double x, y;
} Position;
typedef struct {
double value;
} Radius;
double sqr(double value) {
return value * value;
}
double distance_sqr(const Position *p1, const Position *p2) {
return sqr(p2->x - p1->x) + sqr(p2->y - p1->y);
}
void Collide(ecs_iter_t *it) {
ecs_query_t *q_collide = it->ctx; // Get query from system context
const Position *p1 = ecs_field(it, Position, 1);
const Radius *r1 = ecs_field(it, Radius, 2);
for (int i = 0; i < it->count; i ++) {
ecs_entity_t e1 = it->entities[i];
// For each matching entity, iterate the query
ecs_iter_t qit = ecs_query_iter(it->world, q_collide);
while (ecs_query_next(&qit)) {
const Position *p2 = ecs_field(&qit, Position, 1);
const Radius *r2 = ecs_field(&qit, Radius, 2);
for (int j = 0; j < qit.count; j ++) {
ecs_entity_t e2 = qit.entities[j];
if (e1 == e2) {
// don't collide with self
continue;
}
if (e2 > e1) {
// Simple trick to prevent collisions from being detected
// twice with the entities reversed.
continue;
}
// Check for collision
double d_sqr = distance_sqr(&p1[i], &p2[j]);
double r_sqr = sqr(r1[i].value + r2[j].value);
if (r_sqr > d_sqr) {
printf("%u and %u collided!\n", (uint32_t)e1, (uint32_t)e2);
}
}
}
}
}
int main(int argc, char *argv[]) {
ecs_world_t *ecs = ecs_init_w_args(argc, argv);
ECS_COMPONENT(ecs, Position);
ECS_COMPONENT(ecs, Radius);
// Create a query for Position that we can use inside the collide system to
// check each entity with each other entity.
ecs_query_t *q_position = ecs_query(ecs, {
.filter.terms = {
{ ecs_id(Position), .inout = EcsIn },
{ ecs_id(Radius), .inout = EcsIn }
}
});
// Create collide system that passes query as context
ecs_entity_t collide = ecs_system(ecs, {
.query.filter.terms = {
{ .id = ecs_id(Position), .inout = EcsIn },
{ ecs_id(Radius), .inout = EcsIn }
},
.callback = Collide,
.ctx = q_position
});
// Create a few test entities
for (int i = 0; i < 10; i ++) {
ecs_entity_t e = ecs_new_id(ecs);
ecs_set(ecs, e, Position, { .x = rand() % 100, .y = rand() % 100 });
ecs_set(ecs, e, Radius, { rand() % 10 + 1 });
}
// Run the system
ecs_run(ecs, collide, 0.0f, NULL);
return ecs_fini(ecs);
// Output
// 508 and 505 collided!
// 510 and 508 collided!
// 513 and 506 collided!
// 514 and 512 collided!
}