From d3269e8aaaf55df5241477ef1d5120d809ef1370 Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Wed, 13 Jan 2021 18:38:08 +0100 Subject: [PATCH] Merge commit --- UserInterfaceManager.cpp | 9 +++++ View.cpp | 80 ++++++++++++++++++++++++++++++++++++++-- View.h | 6 +++ defines.h | 7 ++++ 4 files changed, 99 insertions(+), 3 deletions(-) diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index 526e398..186b3a8 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -388,6 +388,15 @@ void UserInterface::handleKeyboard() else Mixer::manager().setCurrentNext(); } + // arrow keys to act on current view + else if (ImGui::IsKeyPressed( GLFW_KEY_LEFT )) + Mixer::manager().view()->arrow( glm::vec2(-1.f, 0.f) ); + else if (ImGui::IsKeyPressed( GLFW_KEY_RIGHT )) + Mixer::manager().view()->arrow( glm::vec2(+1.f, 0.f) ); + else if (ImGui::IsKeyPressed( GLFW_KEY_UP )) + Mixer::manager().view()->arrow( glm::vec2(0.f, -1.f) ); + else if (ImGui::IsKeyPressed( GLFW_KEY_DOWN )) + Mixer::manager().view()->arrow( glm::vec2(0.f, 1.f) ); } } diff --git a/View.cpp b/View.cpp index dc98e2f..0689959 100644 --- a/View.cpp +++ b/View.cpp @@ -523,6 +523,25 @@ View::Cursor MixingView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::pai return Cursor(Cursor_ResizeAll, info.str() ); } +void MixingView::arrow (glm::vec2 movement) +{ + Source *s = Mixer::manager().currentSource(); + if (s) { + + glm::vec3 gl_Position_from = Rendering::manager().unProject(glm::vec2(0.f), scene.root()->transform_); + glm::vec3 gl_Position_to = Rendering::manager().unProject(movement, scene.root()->transform_); + glm::vec3 gl_delta = gl_Position_to - gl_Position_from; + + if (UserInterface::manager().shiftModifier()) + gl_delta *= 10.f; + + s->group(mode_)->translation_ += gl_delta * ARROWS_MOVEMENT_FACTOR; + + // request update + s->touch(); + } +} + void MixingView::setAlpha(Source *s) { if (!s) @@ -1357,6 +1376,25 @@ void GeometryView::terminate() } +void GeometryView::arrow (glm::vec2 movement) +{ + Source *s = Mixer::manager().currentSource(); + if (s) { + + glm::vec3 gl_Position_from = Rendering::manager().unProject(glm::vec2(0.f), scene.root()->transform_); + glm::vec3 gl_Position_to = Rendering::manager().unProject(movement, scene.root()->transform_); + glm::vec3 gl_delta = gl_Position_to - gl_Position_from; + + if (UserInterface::manager().shiftModifier()) + gl_delta *= 10.f; + + s->group(mode_)->translation_ += gl_delta * ARROWS_MOVEMENT_FACTOR; + + // request update + s->touch(); + } +} + LayerView::LayerView() : View(LAYER), aspect_ratio(1.f) { // read default settings @@ -2086,7 +2124,8 @@ View::Cursor AppearanceView::over (glm::vec2 pos) // show paint brush cursor if (edit_source_->maskShader()->mode == MaskShader::PAINT) { if (mask_cursor_paint_ > 0) { - if ( ABS(P.x) < S.x && ABS(P.y) < S.y ) { + S += glm::vec2(edit_source_->maskShader()->brush.x); + if ( ABS(P.x) < S.x && ABS(P.y) < S.y ) { mask_cursor_circle_->visible_ = edit_source_->maskShader()->brush.z < 1.0; mask_cursor_square_->visible_ = edit_source_->maskShader()->brush.z > 0.0; edit_source_->maskShader()->option = mask_cursor_paint_; @@ -2396,7 +2435,7 @@ void AppearanceView::draw() ImGuiToolkit::PushFont(ImGuiToolkit::FONT_DEFAULT); ImGuiToolkit::Icon(16,1); if (ImGui::VSliderInt("##BrushSize", ImVec2(30,260), &pixel_size, pixel_size_min, pixel_size_max, "") ){ - edit_source_->maskShader()->brush.x = CLAMP(float(pixel_size) / edit_source_->frame()->height(), 0.05, 2.0); + edit_source_->maskShader()->brush.x = CLAMP(float(pixel_size) / edit_source_->frame()->height(), BRUSH_MIN_SIZE, BRUSH_MAX_SIZE); } if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); @@ -2419,7 +2458,7 @@ void AppearanceView::draw() { ImGuiToolkit::PushFont(ImGuiToolkit::FONT_DEFAULT); ImGui::Text(ICON_FA_FEATHER_ALT); - ImGui::VSliderFloat("##BrushPressure", ImVec2(30,260), &edit_source_->maskShader()->brush.y, 1.0, 0.01, "", 0.3f); + ImGui::VSliderFloat("##BrushPressure", ImVec2(30,260), &edit_source_->maskShader()->brush.y, BRUSH_MAX_PRESS, BRUSH_MIN_PRESS, "", 0.3f); if (ImGui::IsItemHovered()) { ImGui::BeginTooltip(); ImGui::Text("Pressure %.1f%%", edit_source_->maskShader()->brush.y * 100.0); @@ -3029,3 +3068,38 @@ void AppearanceView::terminate() } } + +void AppearanceView::arrow (glm::vec2 movement) +{ + Source *s = Mixer::manager().currentSource(); + if (s) { + + glm::vec3 gl_Position_from = Rendering::manager().unProject(glm::vec2(0.f), scene.root()->transform_); + glm::vec3 gl_Position_to = Rendering::manager().unProject(movement, scene.root()->transform_); + glm::vec3 gl_delta = gl_Position_to - gl_Position_from; + + if (UserInterface::manager().shiftModifier()) + gl_delta *= 10.f; + + s->group(mode_)->translation_ += gl_delta * ARROWS_MOVEMENT_FACTOR; + + // request update + s->touch(); + } + else if (edit_source_) { + if (edit_source_->maskShader()->mode == MaskShader::PAINT) { + if (mask_cursor_paint_ > 0) { + glm::vec2 b = 0.05f * movement; + edit_source_->maskShader()->brush.x = CLAMP(edit_source_->maskShader()->brush.x+b.x, BRUSH_MIN_SIZE, BRUSH_MAX_SIZE); + edit_source_->maskShader()->brush.y = CLAMP(edit_source_->maskShader()->brush.y+b.y, BRUSH_MIN_PRESS, BRUSH_MAX_PRESS); + } + } + else if (edit_source_->maskShader()->mode == MaskShader::SHAPE) { + if (mask_cursor_shape_ > 0) { + float b = -0.05 * movement.y; + edit_source_->maskShader()->blur = CLAMP(edit_source_->maskShader()->blur+b, SHAPE_MIN_BLUR, SHAPE_MAX_BLUR); + edit_source_->touch(); + } + } + } +} diff --git a/View.h b/View.h index 901b857..7f0317e 100644 --- a/View.h +++ b/View.h @@ -76,6 +76,9 @@ public: return Cursor(); } + // left-right [-1 1] and up-down [1 -1] action from arrow keys + virtual void arrow (glm::vec2) {} + // accessible scene Scene scene; @@ -107,6 +110,7 @@ public: std::pair pick(glm::vec2) override; Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair) override; + void arrow (glm::vec2) override; void setAlpha (Source *s); inline float limboScale() { return limbo_scale_; } @@ -157,6 +161,7 @@ public: std::pair pick(glm::vec2 P) override; Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair pick) override; void terminate() override; + void arrow (glm::vec2) override; private: Node *overlay_position_; @@ -232,6 +237,7 @@ public: std::pair pick(glm::vec2 P) override; Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair pick) override; Cursor over (glm::vec2) override; + void arrow (glm::vec2) override; void initiate() override; void terminate() override; diff --git a/defines.h b/defines.h index 5504080..7d03eb0 100644 --- a/defines.h +++ b/defines.h @@ -42,9 +42,16 @@ #define APPEARANCE_DEFAULT_SCALE 2.f #define APPEARANCE_MIN_SCALE 0.4f #define APPEARANCE_MAX_SCALE 7.0f +#define BRUSH_MIN_SIZE 0.05f +#define BRUSH_MAX_SIZE 2.f +#define BRUSH_MIN_PRESS 0.005f +#define BRUSH_MAX_PRESS 1.f +#define SHAPE_MIN_BLUR 0.f +#define SHAPE_MAX_BLUR 1.f #define TRANSITION_DEFAULT_SCALE 5.0f #define TRANSITION_MIN_DURATION 0.2f #define TRANSITION_MAX_DURATION 10.f +#define ARROWS_MOVEMENT_FACTOR 5.f #define IMGUI_TITLE_MAINWINDOW ICON_FA_CIRCLE_NOTCH " vimix" #define IMGUI_TITLE_MEDIAPLAYER ICON_FA_FILM " Player"