diff --git a/CMakeLists.txt b/CMakeLists.txt index 92d30e0..f190c75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -293,6 +293,8 @@ set(VMIX_RSC_FILES ./rsc/shaders/mask_elipse.fs ./rsc/shaders/mask_box.fs ./rsc/shaders/mask_round.fs + ./rsc/shaders/mask_lowleftcorner.fs + ./rsc/shaders/mask_uprightcorner.fs ./rsc/shaders/image.vs ./rsc/shaders/imageprocessing.fs ./rsc/fonts/Hack-Regular.ttf diff --git a/ImageShader.cpp b/ImageShader.cpp index 2539894..5443ab0 100644 --- a/ImageShader.cpp +++ b/ImageShader.cpp @@ -9,7 +9,12 @@ static ShadingProgram imageShadingProgram("shaders/image.vs", "shaders/image.fs"); -const char* MaskShader::mask_names[4] = { ICON_FA_EXPAND, ICON_FA_CIRCLE, ICON_FA_MINUS_CIRCLE, ICON_FA_SQUARE }; +const char* MaskShader::mask_names[6] = { ICON_FA_EXPAND, + ICON_FA_CIRCLE, + ICON_FA_MINUS_CIRCLE, + ICON_FA_SQUARE, + ICON_FA_CARET_SQUARE_RIGHT, + ICON_FA_CARET_SQUARE_LEFT }; std::vector< ShadingProgram* > MaskShader::mask_programs; ImageShader::ImageShader(): Shader(), stipple(0.0) @@ -70,6 +75,8 @@ MaskShader::MaskShader(): Shader(), mode(0) mask_programs.push_back(new ShadingProgram("shaders/simple.vs", "shaders/mask_elipse.fs")); mask_programs.push_back(new ShadingProgram("shaders/simple.vs", "shaders/mask_round.fs")); mask_programs.push_back(new ShadingProgram("shaders/simple.vs", "shaders/mask_box.fs")); + mask_programs.push_back(new ShadingProgram("shaders/simple.vs", "shaders/mask_lowleftcorner.fs")); + mask_programs.push_back(new ShadingProgram("shaders/simple.vs", "shaders/mask_uprightcorner.fs")); } // reset instance reset(); diff --git a/ImageShader.h b/ImageShader.h index 795cc05..5aead30 100644 --- a/ImageShader.h +++ b/ImageShader.h @@ -1,4 +1,4 @@ -#ifndef IMAGESHADER_H +#ifndef IMAGESHADER_H #define IMAGESHADER_H #include @@ -47,7 +47,7 @@ public: float blur; glm::vec2 size; - static const char* mask_names[4]; + static const char* mask_names[6]; static std::vector< ShadingProgram* > mask_programs; }; diff --git a/View.cpp b/View.cpp index 32c2435..24e088f 100644 --- a/View.cpp +++ b/View.cpp @@ -1881,8 +1881,9 @@ AppearanceView::AppearanceView() : View(APPEARANCE), edit_source_(nullptr), need // marks on the frame to show scale show_scale_ = false; horizontal_mark_ = new Mesh("mesh/h_mark.ply"); - horizontal_mark_->translation_ = glm::vec3(0.f, 1.f, 0.0f); + horizontal_mark_->translation_ = glm::vec3(0.f, -1.f, 0.0f); horizontal_mark_->scale_ = glm::vec3(2.5f, -2.5f, 0.0f); + horizontal_mark_->rotation_.z = M_PI; horizontal_mark_->shader()->color = glm::vec4( COLOR_TRANSITION_LINES, 0.9f ); scene.bg()->attach(horizontal_mark_); vertical_mark_ = new Mesh("mesh/h_mark.ply"); @@ -2146,7 +2147,14 @@ void AppearanceView::adjustBackground() mask_node_->visible_ = edit_source_->maskShader()->mode > 0; mask_circle_->visible_ = edit_source_->maskShader()->mode == 1; mask_square_->visible_ = edit_source_->maskShader()->mode >= 2; - mask_node_->scale_ = scale * glm::vec3(edit_source_->maskShader()->size, 1.f); + if (edit_source_->maskShader()->mode >= 4) { + mask_node_->scale_ = scale; + mask_node_->translation_ = scale - glm::vec3(edit_source_->maskShader()->size, 0.f) * scale ; + mask_node_->translation_.z = 0.f; + } else { + mask_node_->scale_ = scale * glm::vec3(edit_source_->maskShader()->size, 1.f); + mask_node_->translation_ = glm::vec3(0.f); + } mask_corner_->scale_.y = mask_corner_->scale_.x * mask_node_->scale_.x / mask_node_->scale_.y; } diff --git a/rsc/shaders/mask_lowleftcorner.fs b/rsc/shaders/mask_lowleftcorner.fs new file mode 100644 index 0000000..ea17752 --- /dev/null +++ b/rsc/shaders/mask_lowleftcorner.fs @@ -0,0 +1,36 @@ +#version 330 core + +out vec4 FragColor; + +in vec4 vertexColor; +in vec2 vertexUV; + +// from General Shader +uniform vec3 iResolution; // viewport resolution (in pixels) +uniform mat4 iTransform; // image transformation +uniform vec4 color; // drawing color +uniform vec4 uv; + +// Mask Shader +uniform vec2 size; +uniform float blur; + +float sdRoundSide( in vec2 p, in vec2 b, in float r ) +{ + vec2 q = vec2(-1.0, 1.0) * p - b + r; + return min(max(q.x,q.y),0.0) + length(max(q,0.0)) - r; +} + +void main() +{ + vec2 uv = -1.0 + 2.0 * gl_FragCoord.xy / iResolution.xy; + uv.x *= iResolution.x / iResolution.y; + + float d = sdRoundSide( uv, vec2(size.x * iResolution.x/iResolution.y, size.y), blur ); + + vec3 col = vec3(1.0 - sign(d)); + float delta = 0.5 * length(min(size,1.0)); + col *= 1.0 - exp( -30.0/ (blur * 100.0 * delta + 1.0) * abs(d)); + + FragColor = vec4( col, 1.0 ); +} diff --git a/rsc/shaders/mask_uprightcorner.fs b/rsc/shaders/mask_uprightcorner.fs new file mode 100644 index 0000000..72a7081 --- /dev/null +++ b/rsc/shaders/mask_uprightcorner.fs @@ -0,0 +1,38 @@ +#version 330 core + +out vec4 FragColor; + +in vec4 vertexColor; +in vec2 vertexUV; + +// from General Shader +uniform vec3 iResolution; // viewport resolution (in pixels) +uniform mat4 iTransform; // image transformation +uniform vec4 color; // drawing color +uniform vec4 uv; + +// Mask Shader +uniform vec2 size; +uniform float blur; + + +float sdRoundSide( in vec2 p, in vec2 b, in float r ) +{ + vec2 q = vec2(1.0, -1.0) * p - b + r; + return min(max(q.x,q.y),0.0) + length(max(q,0.0)) - r; +} + +void main() +{ + vec2 uv = -1.0 + 2.0 * gl_FragCoord.xy / iResolution.xy; + uv.x *= iResolution.x / iResolution.y; + + vec2 s = 2.0 - size; + float d = sdRoundSide( uv, vec2(s.x * iResolution.x/iResolution.y, s.y), blur ); + + vec3 col = vec3(1.0 - sign(d)); + float delta = 0.5 * length(min(size,1.0)); + col *= 1.0 - exp( -20.0/ (blur * 100.0 * delta + 1.0) * abs(d) ); + + FragColor = vec4( col, 1.0 ); +}