From 741afaea1809c0b3d4a62bfa4e5d88df083f96a4 Mon Sep 17 00:00:00 2001 From: Bruno Herbelin Date: Mon, 7 Feb 2022 17:45:34 +0100 Subject: [PATCH] Improved Source Callback for multi-callbacks compatibility --- Source.cpp | 23 ++++++++++--------- SourceCallback.cpp | 44 ++++++++++++++++++++++++++++++++++++- SourceCallback.h | 31 +++++++++++++------------- rsc/osc/vimix.mk1.touchosc | Bin 2131 -> 2220 bytes 4 files changed, 69 insertions(+), 29 deletions(-) diff --git a/Source.cpp b/Source.cpp index 1c21846..49e92a6 100644 --- a/Source.cpp +++ b/Source.cpp @@ -644,31 +644,31 @@ void Source::call(SourceCallback *callback, bool override) // look for callbacks of same type for (auto iter=update_callbacks_.begin(); iter != update_callbacks_.end(); ) { - // there can be only one callback of same type in a source + // Test if the new callback would overlap an existing one SourceCallback *c = *iter; - if (callback->type() == c->type() ) { + if ( SourceCallback::overlap( callback, c) ) { if (override) { - // either remove and delete all callbacks of same type if override + // either remove and delete all overlapping callbacks if override... iter = update_callbacks_.erase(iter); delete c; } else { - // or cancel adding callbacks of same type if not override + // ...or cancel adding overlapping callbacks if not override add = false; break; } } - // iterate over other types + // iterate else ++iter; } - // we can add the callback as there is none of that type or we override + // we can add the callback : its either not overlapping or we override it if (add) { // add callback to callbacks list update_callbacks_.push_back(callback); } - // or delete it if couln't be added (not override) + // or delete it if couln't be added (overlapping but not override) else delete callback; @@ -772,11 +772,10 @@ void Source::updateCallbacks(float dt) for (auto iter=update_callbacks_.begin(); iter != update_callbacks_.end(); ) { SourceCallback *callback = *iter; - // call update for active callbacks - if (callback->active()) { - callback->update(this, dt); - need_update_ = true; - } + + // call update on callbacks + callback->update(this, dt); + need_update_ = true; // remove and delete finished callbacks if (callback->finished()) { diff --git a/SourceCallback.cpp b/SourceCallback.cpp index 05315fc..6c22e67 100644 --- a/SourceCallback.cpp +++ b/SourceCallback.cpp @@ -67,7 +67,49 @@ SourceCallback *SourceCallback::create(CallbackType type) return loadedcallback; } -SourceCallback::SourceCallback(): active_(true), finished_(false), initialized_(false) + +bool SourceCallback::overlap( SourceCallback *a, SourceCallback *b) +{ + bool ret = false; + + if (a->type() == b->type()) { + + // same type means overlap + ret = true; + + // but there are some exceptions.. + switch (a->type()) { + case SourceCallback::CALLBACK_GRAB: + { + const Grab *_a = static_cast(a); + const Grab *_b = static_cast(b); + // there is no overlap if the X or Y of a vector is zero + if ( ABS(_a->value().x) < EPSILON || ABS(_b->value().x) < EPSILON ) + ret = false; + else if ( ABS(_a->value().y) < EPSILON || ABS(_b->value().y) < EPSILON ) + ret = false; + } + break; + case SourceCallback::CALLBACK_RESIZE: + { + const Resize *_a = static_cast(a); + const Resize *_b = static_cast(b); + if ( ABS(_a->value().x) < EPSILON || ABS(_b->value().x) < EPSILON ) + ret = false; + else if ( ABS(_a->value().y) < EPSILON || ABS(_b->value().y) < EPSILON ) + ret = false; + } + break; + default: + break; + } + + } + + return ret; +} + +SourceCallback::SourceCallback(): finished_(false), initialized_(false) { } diff --git a/SourceCallback.h b/SourceCallback.h index 0fd621d..2c5b4f4 100644 --- a/SourceCallback.h +++ b/SourceCallback.h @@ -25,6 +25,7 @@ public: } CallbackType; static SourceCallback *create(CallbackType type); + static bool overlap(SourceCallback *a, SourceCallback *b); SourceCallback(); virtual ~SourceCallback() {} @@ -33,15 +34,13 @@ public: virtual void multiply (float) {}; virtual SourceCallback *clone () const = 0; virtual SourceCallback *reverse (Source *) const { return nullptr; } - virtual CallbackType type () { return CALLBACK_GENERIC; } + virtual CallbackType type () const { return CALLBACK_GENERIC; } virtual void accept (Visitor& v); inline bool finished () const { return finished_; } - inline bool active () const { return active_; } inline void reset () { initialized_ = false; } protected: - bool active_; bool finished_; bool initialized_; }; @@ -52,7 +51,7 @@ public: ResetGeometry () : SourceCallback() {} void update (Source *s, float) override; SourceCallback *clone () const override; - CallbackType type () override { return CALLBACK_RESETGEO; } + CallbackType type () const override { return CALLBACK_RESETGEO; } }; class SetAlpha : public SourceCallback @@ -72,7 +71,7 @@ public: void multiply (float factor) override; SourceCallback *clone () const override; SourceCallback *reverse(Source *s) const override; - CallbackType type () override { return CALLBACK_ALPHA; } + CallbackType type () const override { return CALLBACK_ALPHA; } void accept (Visitor& v) override; }; @@ -96,7 +95,7 @@ public: void update (Source *s, float) override; void multiply (float factor) override; SourceCallback *clone() const override; - CallbackType type () override { return CALLBACK_LOOM; } + CallbackType type () const override { return CALLBACK_LOOM; } void accept (Visitor& v) override; }; @@ -113,7 +112,7 @@ public: void update (Source *s, float) override; SourceCallback *clone() const override; - CallbackType type () override { return CALLBACK_LOCK; } + CallbackType type () const override { return CALLBACK_LOCK; } }; class SetDepth : public SourceCallback @@ -136,7 +135,7 @@ public: void multiply (float factor) override; SourceCallback *clone () const override; SourceCallback *reverse(Source *s) const override; - CallbackType type () override { return CALLBACK_DEPTH; } + CallbackType type () const override { return CALLBACK_DEPTH; } void accept (Visitor& v) override; }; @@ -154,7 +153,7 @@ public: void update (Source *s, float) override; SourceCallback *clone() const override; SourceCallback *reverse(Source *s) const override; - CallbackType type () override { return CALLBACK_PLAY; } + CallbackType type () const override { return CALLBACK_PLAY; } }; class RePlay : public SourceCallback @@ -164,7 +163,7 @@ public: void update(Source *s, float) override; SourceCallback *clone() const override; - CallbackType type () override { return CALLBACK_REPLAY; } + CallbackType type () const override { return CALLBACK_REPLAY; } }; class Grab : public SourceCallback @@ -178,7 +177,7 @@ public: Grab(); Grab(float dx, float dy, float duration = 0.f); - glm::vec2 value () { return speed_;} + glm::vec2 value () const { return speed_;} void setValue (glm::vec2 d) { speed_ = d; } float duration () const { return duration_;} void setDuration (float d) { duration_ = d; } @@ -186,7 +185,7 @@ public: void update (Source *s, float) override; void multiply (float factor) override; SourceCallback *clone () const override; - CallbackType type () override { return CALLBACK_GRAB; } + CallbackType type () const override { return CALLBACK_GRAB; } void accept (Visitor& v) override; }; @@ -201,7 +200,7 @@ public: Resize(); Resize(float dx, float dy, float duration = 0.f); - glm::vec2 value () { return speed_;} + glm::vec2 value () const { return speed_;} void setValue (glm::vec2 d) { speed_ = d; } float duration () const { return duration_;} void setDuration (float d) { duration_ = d; } @@ -209,7 +208,7 @@ public: void update (Source *s, float) override; void multiply (float factor) override; SourceCallback *clone () const override; - CallbackType type () override { return CALLBACK_RESIZE; } + CallbackType type () const override { return CALLBACK_RESIZE; } void accept (Visitor& v) override; }; @@ -224,7 +223,7 @@ public: Turn(); Turn(float da, float duration = 0.f); - float value () { return speed_;} + float value () const { return speed_;} void setValue (float d) { speed_ = d; } float duration () const { return duration_;} void setDuration (float d) { duration_ = d; } @@ -232,7 +231,7 @@ public: void update (Source *s, float) override; void multiply (float factor) override; SourceCallback *clone () const override; - CallbackType type () override { return CALLBACK_TURN; } + CallbackType type () const override { return CALLBACK_TURN; } void accept (Visitor& v) override; }; diff --git a/rsc/osc/vimix.mk1.touchosc b/rsc/osc/vimix.mk1.touchosc index b285961b8cd270d8e41c32c4037646890b7c1050..0027dda63fff168767a8413498e9ca1c2a1cd2a0 100644 GIT binary patch delta 2178 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