From ff39f8c458df4f9733ca6641829442a4fbdb38c8 Mon Sep 17 00:00:00 2001 From: Bruno Herbelin Date: Fri, 22 Nov 2024 15:08:28 +0100 Subject: [PATCH] Improve OSC with corner manipulation Answering to issue #156 --- src/ControlManager.cpp | 31 +++++++++++++++++++++++++++++++ src/ControlManager.h | 1 + src/SourceCallback.cpp | 4 ++++ 3 files changed, 36 insertions(+) diff --git a/src/ControlManager.cpp b/src/ControlManager.cpp index 15e29e6..99cb9fe 100644 --- a/src/ControlManager.cpp +++ b/src/ControlManager.cpp @@ -749,6 +749,37 @@ bool Control::receiveSourceAttribute(Source *target, const std::string &attribut arguments >> t >> osc::EndMessage; target->call( new SetGeometry( &transform, t), true ); } + /// e.g. '/vimix/current/corner ffffffff 0 0 0 0 0 0 0 0' + else if (attribute.compare(OSC_SOURCE_CORNER) == 0) { + // read 8 float values + float corners[8] = {0.f}; + for (size_t i = 0; i < 8; ++i) { + try { + float val = 0.f; + arguments >> val; + corners[i] = val; + } catch (osc::WrongArgumentTypeException &) { + } + } + // convert to data_ matrix format + Group transform; + transform.copyTransform(target->group(View::GEOMETRY)); + transform.data_[0].x = corners[0]; + transform.data_[0].y = corners[1]; + transform.data_[1].x = corners[2]; + transform.data_[1].y = corners[3]; + transform.data_[2].x = corners[4]; + transform.data_[2].y = corners[5]; + transform.data_[3].x = corners[6]; + transform.data_[3].y = corners[7]; + // duration argument + float t = 0.f; + if (arguments.Eos()) + arguments >> osc::EndMessage; + else + arguments >> t >> osc::EndMessage; + target->call( new SetGeometry( &transform, t), true ); + } /// e.g. '/vimix/current/resize ff 10.0 2.2' else if ( attribute.compare(OSC_SOURCE_RESIZE) == 0) { float x = 0.f, y = 0.f, t = 0.f; diff --git a/src/ControlManager.h b/src/ControlManager.h index 9d2d94c..de4ced3 100644 --- a/src/ControlManager.h +++ b/src/ControlManager.h @@ -52,6 +52,7 @@ #define OSC_SOURCE_TURN "/turn" #define OSC_SOURCE_RESET "/reset" #define OSC_SOURCE_POSITION "/position" +#define OSC_SOURCE_CORNER "/corner" #define OSC_SOURCE_SIZE "/size" #define OSC_SOURCE_ANGLE "/angle" #define OSC_SOURCE_SEEK "/seek" diff --git a/src/SourceCallback.cpp b/src/SourceCallback.cpp index 76df6d5..d863bbc 100644 --- a/src/SourceCallback.cpp +++ b/src/SourceCallback.cpp @@ -762,6 +762,10 @@ void SetGeometry::update(Source *s, float dt) intermediate.translation_ = glm::mix(start_.translation_, target_.translation_, progress/duration_); intermediate.scale_ = glm::mix(start_.scale_, target_.scale_, progress/duration_); intermediate.rotation_ = glm::mix(start_.rotation_, target_.rotation_, progress/duration_); + intermediate.data_[0] = glm::mix(start_.data_[0], target_.data_[0], progress/duration_); + intermediate.data_[1] = glm::mix(start_.data_[1], target_.data_[1], progress/duration_); + intermediate.data_[2] = glm::mix(start_.data_[2], target_.data_[2], progress/duration_); + intermediate.data_[3] = glm::mix(start_.data_[3], target_.data_[3], progress/duration_); // apply geometry s->group(View::GEOMETRY)->copyTransform(&intermediate); s->touch();