diff --git a/CMakeLists.txt b/CMakeLists.txt index 3add2b9..05b2504 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -238,7 +238,14 @@ set(VMIX_RSC_FILES ./rsc/fonts/Roboto-Italic.ttf ./rsc/fonts/fa-regular-400.ttf ./rsc/fonts/fa-solid-900.ttf - ./rsc/images/mask_vignette.png + ./rsc/images/mask_vignette.dds + ./rsc/images/mask_halo.dds + ./rsc/images/mask_circle.dds + ./rsc/images/mask_roundcorner.dds + ./rsc/images/mask_linear_top.dds + ./rsc/images/mask_linear_bottom.dds + ./rsc/images/mask_linear_left.dds + ./rsc/images/mask_linear_right.dds ./rsc/images/v-mix_256x256.png ./rsc/images/rgb.png ./rsc/images/busy.png diff --git a/ImGuiVisitor.cpp b/ImGuiVisitor.cpp index 65d4505..07f7ddc 100644 --- a/ImGuiVisitor.cpp +++ b/ImGuiVisitor.cpp @@ -1,5 +1,8 @@ #include "ImGuiVisitor.h" +#include +#include + #include #include #include @@ -133,7 +136,25 @@ void ImGuiVisitor::visit(Shader &n) void ImGuiVisitor::visit(ImageShader &n) { + ImGui::PushID(n.id()); + // get index of the mask used in this ImageShader + int item_current = 9; // default to Custom mask (i.e. not in the list) + auto it{ find(ImageShader::mask_presets.begin(), ImageShader::mask_presets.end(), n.mask) }; + if ( it != std::end(ImageShader::mask_presets)) { + item_current = std::distance(ImageShader::mask_presets.begin(), it); + } + + if (ImGuiToolkit::ButtonIcon(10, 3)) n.mask = ImageShader::mask_presets[0];; + ImGui::SameLine(0, 10); + ImGui::SetNextItemWidth(RIGHT_ALIGN); + // combo list of masks + if ( ImGui::Combo("Mask", &item_current, ImageShader::mask_names, ImageShader::mask_presets.size()) ) + { + n.mask = ImageShader::mask_presets[item_current]; + } + + ImGui::PopID(); } void ImGuiVisitor::visit(ImageProcessingShader &n) diff --git a/ImageShader.cpp b/ImageShader.cpp index f454ce5..98b04e8 100644 --- a/ImageShader.cpp +++ b/ImageShader.cpp @@ -7,9 +7,26 @@ ShadingProgram imageShadingProgram("shaders/image.vs", "shaders/image.fs"); +const char* ImageShader::mask_names[10] = { "None", "Vignette", "Halo", "Circle", "Round", "Top", "Botton", "Left", "Right", "Custom" }; +std::vector< uint > ImageShader::mask_presets; + ImageShader::ImageShader() { + // first initialization + if ( mask_presets.empty() ) { + mask_presets.push_back(Resource::getTextureWhite()); + mask_presets.push_back(Resource::getTextureDDS("images/mask_vignette.dds")); + mask_presets.push_back(Resource::getTextureDDS("images/mask_halo.dds")); + mask_presets.push_back(Resource::getTextureDDS("images/mask_circle.dds")); + mask_presets.push_back(Resource::getTextureDDS("images/mask_roundcorner.dds")); + mask_presets.push_back(Resource::getTextureDDS("images/mask_linear_top.dds")); + mask_presets.push_back(Resource::getTextureDDS("images/mask_linear_bottom.dds")); + mask_presets.push_back(Resource::getTextureDDS("images/mask_linear_left.dds")); + mask_presets.push_back(Resource::getTextureDDS("images/mask_linear_right.dds")); + } + // static program shader program_ = &imageShadingProgram; + // reset instance reset(); } @@ -37,7 +54,7 @@ void ImageShader::reset() program_->enduse(); // default mask (channel1) - mask = Resource::getTextureWhite(); + mask = mask_presets[0]; // no stippling stipple = 0.f; diff --git a/ImageShader.h b/ImageShader.h index a9df308..e1ad2a4 100644 --- a/ImageShader.h +++ b/ImageShader.h @@ -1,6 +1,9 @@ #ifndef IMAGESHADER_H #define IMAGESHADER_H +#include +#include + #include "Shader.h" class ImageShader : public Shader @@ -14,8 +17,12 @@ public: void reset() override; void accept(Visitor& v) override; + uint mask; float stipple; + + static const char* mask_names[]; + static std::vector< uint > mask_presets; }; #endif // IMAGESHADER_H diff --git a/Source.cpp b/Source.cpp index d5426e6..7e73dd2 100644 --- a/Source.cpp +++ b/Source.cpp @@ -206,7 +206,7 @@ void MediaSource::init() (*node)->scale_.x = mediaplayer_->aspectRatio(); } -// mixingshader_->mask = Resource::getTextureImage("images/mask_vignette.png"); +// mixingshader_->mask = ImageShader::mask_presets["Halo"]; // done init once and for all initialized_ = true; diff --git a/rsc/images/mask_circle.dds b/rsc/images/mask_circle.dds new file mode 100644 index 0000000..1965d04 Binary files /dev/null and b/rsc/images/mask_circle.dds differ diff --git a/rsc/images/mask_halo.dds b/rsc/images/mask_halo.dds new file mode 100644 index 0000000..8c42ca9 Binary files /dev/null and b/rsc/images/mask_halo.dds differ diff --git a/rsc/images/mask_linear_bottom.dds b/rsc/images/mask_linear_bottom.dds new file mode 100644 index 0000000..9c6d42e Binary files /dev/null and b/rsc/images/mask_linear_bottom.dds differ diff --git a/rsc/images/mask_linear_left.dds b/rsc/images/mask_linear_left.dds new file mode 100644 index 0000000..463e276 Binary files /dev/null and b/rsc/images/mask_linear_left.dds differ diff --git a/rsc/images/mask_linear_right.dds b/rsc/images/mask_linear_right.dds new file mode 100644 index 0000000..ed3ecdc Binary files /dev/null and b/rsc/images/mask_linear_right.dds differ diff --git a/rsc/images/mask_linear_top.dds b/rsc/images/mask_linear_top.dds new file mode 100644 index 0000000..53e6490 Binary files /dev/null and b/rsc/images/mask_linear_top.dds differ diff --git a/rsc/images/mask_roundcorner.dds b/rsc/images/mask_roundcorner.dds new file mode 100644 index 0000000..b90f3dd Binary files /dev/null and b/rsc/images/mask_roundcorner.dds differ diff --git a/rsc/images/mask_vignette.dds b/rsc/images/mask_vignette.dds new file mode 100644 index 0000000..50d2f19 Binary files /dev/null and b/rsc/images/mask_vignette.dds differ