Implementation of 2 corner masks

This commit is contained in:
Bruno
2020-12-31 18:27:33 +01:00
parent 4313e51530
commit e0cd560dfb
6 changed files with 96 additions and 5 deletions

View File

@@ -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

View File

@@ -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();

View File

@@ -1,4 +1,4 @@
#ifndef IMAGESHADER_H
#ifndef IMAGESHADER_H
#define IMAGESHADER_H
#include <string>
@@ -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;
};

View File

@@ -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;
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;
}

View File

@@ -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 );
}

View File

@@ -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 );
}