fe_discover_apps в CMakeLists.txt сама находит любой main.cpp под demo/ и tests/, руками ничего не регистрируется. Имя таргета — из пути:
demo/life/full/main.cpp → Demo_life_full tests/capture/main.cpp → Test_capture
Соседние .cpp в той же папке подхватываются как часть таргета.
#include "engine/core/DefaultApplication.h"
#include "engine/core/TaskScheduler.h"
#include "demo/life/full/LifeMap.h"
int main() {
TaskScheduler::instance().initialize();
auto factory = []() -> std::unique_ptr<ChunkedTileMap> {
auto map = std::make_unique<LifeMap>(0x400, 0x400, 2.0f, 64);
map->randomize(0.3f);
map->commitInitialState(); // без этого первый кадр пустой
return map;
};
DefaultApplication app(factory, std::chrono::milliseconds(0),
1920, 1080, "название", true);
app.run();
TaskScheduler::instance().shutdown();
}
commitInitialState() переносит simBuffer → renderBuffer и грузит в GL. Забыл — чёрный экран, движок при этом молчит.
Наследник LifeLikeAutomaton, конструктор — (w, h, chunkSize, tileSize, rule):
class MyRuleMap : public LifeLikeAutomaton {
public:
MyRuleMap(int w, int h, float ts, int chunkSize = 64)
: LifeLikeAutomaton(w, h, chunkSize, ts, makeRule()) {}
private:
static LifeRule makeRule() {
LifeRule r{};
r.table[0][3] = 255; // рождение при 3
r.table[1][2] = 255; // выживание при 2
r.table[1][3] = 255; // выживание при 3
return r;
}
};
Наследник DefaultApplication, переопределить onUpdate/onImGuiExtra. onUpdate — update-поток, GL там нет. Не забыть DefaultApplication::onUpdate(dt) внутри override — там пауза/шаг/симуляция.
.rle — в demo/life/patterns/, копируются в ${CMAKE_BINARY_DIR}/patterns один раз для всех таргетов. В коде — относительный путь: RleLoader::load("patterns/имя.rle").
simulateAndWait() вместо цикла DefaultApplication — синхронный шаг, блокируется до конца поколения. См. tests/capture, tests/correctness.