diff options
author | ancarola <raffaele.ancarola@epfl.ch> | 2019-01-20 01:19:26 +0100 |
---|---|---|
committer | ancarola <raffaele.ancarola@epfl.ch> | 2019-01-20 01:19:26 +0100 |
commit | 6c0c2f6f10e86986087c71a2964974ebcd939a3f (patch) | |
tree | 0a16aff4380188c6ee222579dbb55392a230dbc0 /engine | |
parent | Ignore swap files (diff) | |
download | flatland-6c0c2f6f10e86986087c71a2964974ebcd939a3f.tar.gz flatland-6c0c2f6f10e86986087c71a2964974ebcd939a3f.zip |
Test 3 partially executed
Diffstat (limited to 'engine')
-rw-r--r-- | engine/flatevolvable.cpp | 6 | ||||
-rw-r--r-- | engine/flatland.cpp | 15 | ||||
-rw-r--r-- | engine/flatserial.cpp | 15 | ||||
-rw-r--r-- | engine/flatsignal.cpp | 17 | ||||
-rw-r--r-- | engine/flattask.cpp | 42 | ||||
-rw-r--r-- | engine/flatwindow.cpp | 2 | ||||
-rw-r--r-- | engine/include/flatevolvable.h | 4 | ||||
-rw-r--r-- | engine/include/flatserial.h | 2 | ||||
-rw-r--r-- | engine/include/flatsignal.h | 5 | ||||
-rw-r--r-- | engine/include/flattask.h | 43 | ||||
-rw-r--r-- | engine/include/flatwindow.h | 2 | ||||
-rw-r--r-- | engine/include/serial/focusable.h | 3 | ||||
-rw-r--r-- | engine/include/serial/keyfocusable.h | 2 |
13 files changed, 119 insertions, 39 deletions
diff --git a/engine/flatevolvable.cpp b/engine/flatevolvable.cpp index 20dd6dd..c9eccf6 100644 --- a/engine/flatevolvable.cpp +++ b/engine/flatevolvable.cpp @@ -15,9 +15,9 @@ FlatEvolvable::~FlatEvolvable() delete task; } -void FlatEvolvable::evolve_task(void *data) +void FlatEvolvable::evolve_task(float *data) { - evolve(*(float*)data); + evolve(*data); } void FlatEvolvable::setEvolving(bool flag) @@ -25,7 +25,7 @@ void FlatEvolvable::setEvolving(bool flag) if (isEvolving() != flag) { if (flag) - task = new FlatTask<FlatEvolvable>(this, &FlatEvolvable::evolve_task, (void*)&flatland_dt); + task = new FlatTask<FlatEvolvable, float*>(this, &FlatEvolvable::evolve_task, &flatland_dt); else { delete task; diff --git a/engine/flatland.cpp b/engine/flatland.cpp index cbb9842..2f1c920 100644 --- a/engine/flatland.cpp +++ b/engine/flatland.cpp @@ -130,6 +130,17 @@ int init_flatland(FlatWindow* w, gameloop loop, const flat_status& s, float _fps try { try { + + /* Execute tasks */ + task_s::executePreProcess(); + + } catch (const exception &e) { + + cerr << "Flatland: exception thrown while executing pre-process tasks" << endl; + cerr << e.what() << endl; + } + + try { /* Execute loop function */ loop_function(flatland_dt); @@ -143,11 +154,11 @@ int init_flatland(FlatWindow* w, gameloop loop, const flat_status& s, float _fps try { /* Execute tasks */ - task_s::executeAll(); + task_s::executePostProcess(); } catch (const exception &e) { - cerr << "Flatland: exception thrown while executing tasks" << endl; + cerr << "Flatland: exception thrown while executing post-process tasks" << endl; cerr << e.what() << endl; } diff --git a/engine/flatserial.cpp b/engine/flatserial.cpp index 25eafbe..9c49787 100644 --- a/engine/flatserial.cpp +++ b/engine/flatserial.cpp @@ -3,12 +3,17 @@ SDL_EventCollector::SDL_EventCollector() { - checker = new FlatTask<SDL_EventCollector>(this, &SDL_EventCollector::collect, 0); + /* Checker task, pre-process, maximum priority */ + checker = new FlatTask<SDL_EventCollector>(this, &SDL_EventCollector::collect, 0, true, 0); + + /* Eraser task, post-process, minimum priority */ + eraser = new FlatTask<SDL_EventCollector>(this, &SDL_EventCollector::erase, 0, false, 0xff); } SDL_EventCollector::~SDL_EventCollector() { delete checker; + delete eraser; } void SDL_EventCollector::collect(void*) @@ -49,6 +54,14 @@ void SDL_EventCollector::collect(void*) } } +void SDL_EventCollector::erase(void*) +{ + keyboard.clear(); + window.clear(); + quit.clear(); + user.clear(); +} + const std::vector<SDL_Event>& SDL_EventCollector::getStack(Uint32 id) const { switch(id) diff --git a/engine/flatsignal.cpp b/engine/flatsignal.cpp index 8d66ae1..cdbc800 100644 --- a/engine/flatsignal.cpp +++ b/engine/flatsignal.cpp @@ -18,8 +18,8 @@ SignalChannel::SignalChannel(const string& id) //TODO throw exception ; - /* Initialize task */ - checker = new FlatTask<SignalChannel>(this, &SignalChannel::post_processing, 0); + /* Initialize task, post-process, fifth priority */ + checker = new FlatTask<SignalChannel>(this, &SignalChannel::post_processing, 0, false, 4); string ID = (id.empty()) ? FlatObject::randomID() : id; @@ -96,9 +96,10 @@ void SignalChannel::post_processing(void*) /* FlatSignal class */ -FlatSignal::FlatSignal(FlatObject *sender, void *data, Uint8 priority) +FlatSignal::FlatSignal(FlatObject *sender, const string& id, void *data, Uint8 priority) : sender(sender), data(data), priority(priority) { + setID(id); } bool FlatSignal::emit(const string& channel) const @@ -134,13 +135,9 @@ bool FlatListener::checkInFilters(const std::string& filter) const void FlatListener::execute(const FlatSignal& sig) { - if (!sig.getID().empty()) - { - if (!checkInFilters(sig.getID())) - return; - } - - callback(sig.sender, sig.data); + if ((!sig.getID().empty() && checkInFilters(sig.getID())) || + (sig.getID().empty() && filters.empty())) + callback(sig.sender, sig.data); } void FlatListener::addFilter(const std::string& f) diff --git a/engine/flattask.cpp b/engine/flattask.cpp index b71f9d7..02e584e 100644 --- a/engine/flattask.cpp +++ b/engine/flattask.cpp @@ -1,23 +1,53 @@ #include "flattask.h" +bool task_prior::operator()(task_s* s, task_s* g) const +{ + return s->getPriority() <= g->getPriority(); +} + /* Static variable definition */ -std::list<task_s*> task_s::tasks; +task_set task_s::pre_process_tasks; +task_set task_s::post_process_tasks; + +task_s::task_s(bool pre_process, Uint8 priority) -task_s::task_s() + : pre_process(pre_process), priority(priority) { /* Push into the public callback list */ - tasks.push_back(this); + if (pre_process) + pre_process_tasks.insert(this); + else + post_process_tasks.insert(this); } task_s::~task_s() { /* Remove from the public callback list */ - tasks.remove(this); + if (pre_process) + pre_process_tasks.erase(this); + else + post_process_tasks.erase(this); +} + +Uint8 task_s::getPriority() const +{ + return priority; +} + +void task_s::setPriority(Uint8 priority) +{ + this->priority = priority; +} + +void task_s::executePreProcess() +{ + for (task_s * task : task_s::pre_process_tasks) + task->exec(); } -void task_s::executeAll() +void task_s::executePostProcess() { - for (task_s * task : task_s::tasks) + for (task_s * task : task_s::post_process_tasks) task->exec(); } diff --git a/engine/flatwindow.cpp b/engine/flatwindow.cpp index cbff905..ff17274 100644 --- a/engine/flatwindow.cpp +++ b/engine/flatwindow.cpp @@ -166,7 +166,7 @@ void FlatWindow::key_cb(const SDL_KeyboardEvent *event) close(); /* Say flatland to quit */ - FlatSignal quit(this, 0, 0xff); + FlatSignal quit(this, "quit", 0, 0xff); quit.emit("core"); } } diff --git a/engine/include/flatevolvable.h b/engine/include/flatevolvable.h index 526599a..71aaf0f 100644 --- a/engine/include/flatevolvable.h +++ b/engine/include/flatevolvable.h @@ -3,7 +3,7 @@ #include "flatobject.h" -struct task_s; +class task_s; class FlatEvolvable : virtual public FlatObject { @@ -17,7 +17,7 @@ public: /* Evolution fields */ - void evolve_task(void*); + void evolve_task(float*); virtual void evolve(float dt) = 0; diff --git a/engine/include/flatserial.h b/engine/include/flatserial.h index 41c6b97..f034690 100644 --- a/engine/include/flatserial.h +++ b/engine/include/flatserial.h @@ -11,6 +11,7 @@ class task_s; struct SDL_EventCollector { task_s * checker; + task_s * eraser; /* Keyboard event */ std::vector<SDL_Event> keyboard; @@ -30,6 +31,7 @@ struct SDL_EventCollector ~SDL_EventCollector(); void collect(void*); + void erase(void*); const std::vector<SDL_Event>& getStack(Uint32 id) const; }; diff --git a/engine/include/flatsignal.h b/engine/include/flatsignal.h index fa403e2..a1d7ec3 100644 --- a/engine/include/flatsignal.h +++ b/engine/include/flatsignal.h @@ -23,7 +23,10 @@ public: void * data; Uint8 priority; - FlatSignal(FlatObject * sender, void *data = 0, Uint8 priority = 5); + FlatSignal( FlatObject * sender, + const std::string& id = "", + void *data = 0, + Uint8 priority = 5); /* Alias to SignalChannel::emit() */ bool emit(const std::string& channel) const; diff --git a/engine/include/flattask.h b/engine/include/flattask.h index b470737..3f5c475 100644 --- a/engine/include/flattask.h +++ b/engine/include/flattask.h @@ -1,41 +1,64 @@ #ifndef __FLAT_TASK_H__ #define __FLAT_TASK_H__ -#include <list> +#include <set> +#include "types.h" + +struct task_prior +{ + bool operator()(task_s* s, task_s* g) const; +}; + +typedef std::set<task_s*, task_prior> task_set; class task_s { + /* Call priority of a task */ + /* 0 = maximum priority */ + /* 5 = default priority */ + Uint8 priority; + bool pre_process; /* Callback list */ - static std::list<task_s*> tasks; + static task_set pre_process_tasks; + static task_set post_process_tasks; public: - task_s(); + task_s(bool pre_process = false, Uint8 priority = 5); virtual ~task_s(); virtual void exec() = 0; - /* Execute all tasks */ - static void executeAll(); + Uint8 getPriority() const; + + void setPriority(Uint8 priority); + + /* Execute tasks */ + static void executePreProcess(); + static void executePostProcess(); }; -template<class T> +template<class T, typename arg_t = void*> class FlatTask : public task_s { - typedef void (T::*callback_t)(void*); + typedef void (T::*callback_t)(arg_t); T * object; callback_t callback; - void * args; + arg_t args; public: - FlatTask(T *object, callback_t callback, void* args) + FlatTask( T *object, + callback_t callback, + arg_t args, + bool pre_process = false, + Uint8 priority = 5) - : task_s(), object(object), callback(callback), args(args) {} + : task_s(pre_process, priority), object(object), callback(callback), args(args) {} virtual void exec() override { diff --git a/engine/include/flatwindow.h b/engine/include/flatwindow.h index eb113c1..11d7134 100644 --- a/engine/include/flatwindow.h +++ b/engine/include/flatwindow.h @@ -34,7 +34,7 @@ class FlatLayer; class SDL_KeyEvent; -class FlatWindow : public FlatObject, virtual public KeyFocusable +class FlatWindow : virtual public FlatObject, public KeyFocusable { std::string title; window_status status; diff --git a/engine/include/serial/focusable.h b/engine/include/serial/focusable.h index 325f84b..6478ed4 100644 --- a/engine/include/serial/focusable.h +++ b/engine/include/serial/focusable.h @@ -1,12 +1,13 @@ #ifndef __FOCUSABLE_H__ #define __FOCUSABLE_H__ +#include "flatobject.h" #include "types.h" class task_s; union SDL_Event; -class Focusable +class Focusable : virtual public FlatObject { bool focused; diff --git a/engine/include/serial/keyfocusable.h b/engine/include/serial/keyfocusable.h index 02b3361..c97c791 100644 --- a/engine/include/serial/keyfocusable.h +++ b/engine/include/serial/keyfocusable.h @@ -5,7 +5,7 @@ struct SDL_KeyboardEvent; -class KeyFocusable : public Focusable +class KeyFocusable : virtual public Focusable { virtual void serial_cb(const SDL_Event*) override; |