Properly link flecs library
This commit is contained in:
5
engine/libs/flecs/examples/cpp/queries/change_tracking/.gitignore
vendored
Normal file
5
engine/libs/flecs/examples/cpp/queries/change_tracking/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.bake_cache
|
||||
.DS_Store
|
||||
.vscode
|
||||
gcov
|
||||
bin
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef CHANGE_TRACKING_H
|
||||
#define CHANGE_TRACKING_H
|
||||
|
||||
/* This generated file contains includes for project dependencies */
|
||||
#include "change_tracking/bake_config.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -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 CHANGE_TRACKING_BAKE_CONFIG_H
|
||||
#define CHANGE_TRACKING_BAKE_CONFIG_H
|
||||
|
||||
/* Headers of public dependencies */
|
||||
#include <flecs.h>
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "change_tracking",
|
||||
"type": "application",
|
||||
"value": {
|
||||
"use": [
|
||||
"flecs"
|
||||
],
|
||||
"language": "c++"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
#include <change_tracking.h>
|
||||
#include <iostream>
|
||||
|
||||
// Queries have a builtin mechanism for tracking changes per matched table. This
|
||||
// is a cheap way of eliminating redundant work, as many entities can be skipped
|
||||
// with a single check.
|
||||
//
|
||||
// This example shows how to use change tracking in combination with a few other
|
||||
// techniques, like using prefabs to store a single dirty state for multiple
|
||||
// entities and instanced queries.
|
||||
|
||||
struct Dirty {
|
||||
bool value;
|
||||
};
|
||||
|
||||
struct Position {
|
||||
double x, y;
|
||||
};
|
||||
|
||||
int main(int, char *[]) {
|
||||
flecs::world ecs;
|
||||
|
||||
// Create a query that just reads a component. We'll use this query for
|
||||
// change tracking. Change tracking for a query is automatically enabled
|
||||
// when query::changed() is called.
|
||||
// Each query has its own private dirty state which is reset only when the
|
||||
// query is iterated.
|
||||
flecs::query<const Position> q_read = ecs.query<const Position>();
|
||||
|
||||
// Create a query that writes the component based on a Dirty state.
|
||||
flecs::query<const Dirty, Position> q_write =
|
||||
ecs.query_builder<const Dirty, Position>()
|
||||
.term_at(1).up() // Only match Dirty from prefab
|
||||
.instanced() // Instanced iteration is faster (see example)
|
||||
.build();
|
||||
|
||||
// Create two prefabs with a Dirty component. We can use this to share a
|
||||
// single Dirty value for all entities in a table.
|
||||
flecs::entity p1 = ecs.prefab("p1").set<Dirty>({false});
|
||||
flecs::entity p2 = ecs.prefab("p2").set<Dirty>({true});
|
||||
|
||||
// Create instances of p1 and p2. Because the entities have different
|
||||
// prefabs, they end up in different tables.
|
||||
ecs.entity("e1").is_a(p1)
|
||||
.set<Position>({10, 20});
|
||||
|
||||
ecs.entity("e2").is_a(p1)
|
||||
.set<Position>({30, 40});
|
||||
|
||||
ecs.entity("e3").is_a(p2)
|
||||
.set<Position>({40, 50});
|
||||
|
||||
ecs.entity("e4").is_a(p2)
|
||||
.set<Position>({60, 70});
|
||||
|
||||
// We can use the changed() function on the query to check if any of the
|
||||
// tables it is matched with has changed. Since this is the first time that
|
||||
// we check this and the query is matched with the tables we just created,
|
||||
// the function will return true.
|
||||
std::cout << "q_read.changed(): " << q_read.changed() << "\n";
|
||||
|
||||
// The changed state will remain true until we have iterated each table.
|
||||
q_read.iter([](flecs::iter& it) {
|
||||
// With the it.changed() function we can check if the table we're
|
||||
// currently iterating has changed since last iteration.
|
||||
// Because this is the first time the query is iterated, all tables
|
||||
// will show up as changed.
|
||||
std::cout << "it.changed() for table [" << it.type().str() << "]: "
|
||||
<< it.changed() << "\n";
|
||||
});
|
||||
|
||||
// Now that we have iterated all tables, the dirty state is reset.
|
||||
std::cout << "q_read.changed(): " << q_read.changed() << "\n\n";
|
||||
|
||||
// Iterate the write query. Because the Position term is InOut (default)
|
||||
// iterating the query will write to the dirty state of iterated tables.
|
||||
q_write.iter([](flecs::iter& it, const Dirty *dirty, Position *p) {
|
||||
std::cout << "iterate table [" << it.type().str() << "]\n";
|
||||
|
||||
// Because we enforced that Dirty is a shared component, we can check
|
||||
// a single value for the entire table.
|
||||
if (!dirty->value) {
|
||||
// If the dirty flag is false, skip the table. This way the table's
|
||||
// dirty state is not updated by the query.
|
||||
it.skip();
|
||||
std::cout << "it.skip() for table [" << it.type().str() << "]\n";
|
||||
return;
|
||||
}
|
||||
|
||||
// For all other tables the dirty state will be set.
|
||||
for (auto i : it) {
|
||||
p[i].x ++;
|
||||
p[i].y ++;
|
||||
}
|
||||
});
|
||||
|
||||
// One of the tables has changed, so q_read.changed() will return true
|
||||
std::cout << "\nq_read.changed(): " << q_read.changed() << "\n";
|
||||
|
||||
// When we iterate the read query, we'll see that one table has changed.
|
||||
q_read.iter([](flecs::iter& it) {
|
||||
std::cout << "it.changed() for table [" << it.type().str() << "]: "
|
||||
<< it.changed() << "\n";
|
||||
});
|
||||
|
||||
// Output:
|
||||
// q_read.changed(): 1
|
||||
// it.changed() for table [Position, (Identifier,Name), (IsA,p1)]: 1
|
||||
// it.changed() for table [Position, (Identifier,Name), (IsA,p2)]: 1
|
||||
// q_read.changed(): 0
|
||||
//
|
||||
// iterate table [Position, (Identifier,Name), (IsA,p1)]
|
||||
// it.skip() for table [Position, (Identifier,Name), (IsA,p1)]
|
||||
// iterate table [Position, (Identifier,Name), (IsA,p2)]
|
||||
//
|
||||
// q_read.changed(): 1
|
||||
// it.changed() for table [Position, (Identifier,Name), (IsA,p1)]: 0
|
||||
// it.changed() for table [Position, (Identifier,Name), (IsA,p2)]: 1
|
||||
}
|
||||
Reference in New Issue
Block a user