mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-12 10:49:59 +01:00
Fixed Shader Editor menu and behavior
Only Clones with ImageFilter of custom type are linked to UI for ShaderEditor. New menu to try presets of shader code. Link to ShaderToy website.
This commit is contained in:
@@ -63,42 +63,28 @@ std::string fragmentFooter = "void main() {\n"
|
||||
" mainImage( FragColor, texcoord.xy * iResolution.xy );\n"
|
||||
"}\n";
|
||||
|
||||
//std::string fragmentFooter = "void main() {\n"
|
||||
// " iChannelResolution[0] = vec3(textureSize(iChannel0, 0), 0.f);\n"
|
||||
// " iChannelResolution[1] = vec3(textureSize(iChannel1, 0), 0.f);\n"
|
||||
// " vec4 texcoord = iTransform * vec4(vertexUV.x, vertexUV.y, 0.0, 1.0);\n"
|
||||
// " vec4 filtered;\n"
|
||||
// " mainImage( filtered, texcoord.xy * iChannelResolution[0].xy );\n"
|
||||
// " vec3 RGB = filtered.rgb * vertexColor.rgb * color.rgb;\n"
|
||||
// " float maskIntensity = dot(texture(iChannel1, vertexUV).rgb, vec3(1.0/3.0));\n"
|
||||
// " float A = clamp(filtered.a * vertexColor.a * color.a * maskIntensity, 0.0, 1.0);\n"
|
||||
// " FragColor = vec4(RGB * A, A);\n"
|
||||
// "} \n";
|
||||
|
||||
|
||||
std::list< FilteringProgram > FilteringProgram::presets = {
|
||||
FilteringProgram(),
|
||||
FilteringProgram("Bilateral","shaders/filters/bilinear.glsl", "", { }),
|
||||
FilteringProgram("Pixelate", "shaders/filters/pixelate.glsl", "", { { "Size", 0.5}, { "Sharpen", 0.5} }),
|
||||
FilteringProgram("Bloom", "shaders/filters/bloom.glsl", "", { { "Intensity", 0.5} }),
|
||||
FilteringProgram("Bokeh", "shaders/filters/bokeh.glsl", "", { { "Radius", 1.0} }),
|
||||
FilteringProgram("Chalk", "shaders/filters/talk.glsl", "", { { "Factor", 1.0} }),
|
||||
FilteringProgram("Stippling","shaders/filters/stippling.glsl", "", { { "Factor", 0.5} }),
|
||||
FilteringProgram("Dithering","shaders/filters/dithering.glsl", "", { { "Factor", 0.5} }),
|
||||
FilteringProgram("Fisheye", "shaders/filters/fisheye.glsl", "", { { "Factor", 0.35} }),
|
||||
FilteringProgram("Pixelate", "shaders/filters/pixelate.glsl", "", { }),
|
||||
FilteringProgram("Bloom", "shaders/filters/bloom.glsl", "", { }),
|
||||
FilteringProgram("Bokeh", "shaders/filters/bokeh.glsl", "", { }),
|
||||
FilteringProgram("Talk", "shaders/filters/talk.glsl", "", { }),
|
||||
FilteringProgram("Stippling","shaders/filters/stippling.glsl", "", { }),
|
||||
FilteringProgram("Dithering","shaders/filters/dithering.glsl", "", { }),
|
||||
FilteringProgram("Fisheye", "shaders/filters/fisheye.glsl", "", { })
|
||||
};
|
||||
|
||||
|
||||
|
||||
std::string FilteringProgram::getFilterCodeInputs()
|
||||
{
|
||||
static std::string filterHeaderHelp = "vec3 iResolution; // viewport resolution (in pixels)\n"
|
||||
"float iTime; // shader playback time (in seconds)\n"
|
||||
"float iTimeDelta; // render time (in seconds)\n"
|
||||
"int iFrame; // shader playback frame\n"
|
||||
"vec3 iChannelResolution[2]; // input channel resolution (in pixels)\n"
|
||||
"sampler2D iChannel0; // input channel (texture).\n"
|
||||
"sampler2D iChannel1; // input channel (mask).\n"
|
||||
"vec3 iChannelResolution[2]; // input channels resolution (in pixels)\n"
|
||||
"sampler2D iChannel0; // input channel 0 (texture).\n"
|
||||
"sampler2D iChannel1; // input channel 1 (texture).\n"
|
||||
"vec4 iDate; // (year, month, day, time in seconds)";
|
||||
return filterHeaderHelp;
|
||||
}
|
||||
@@ -114,7 +100,7 @@ std::string FilteringProgram::getFilterCodeDefault()
|
||||
/// ////
|
||||
////////////////////////////////////////
|
||||
|
||||
FilteringProgram::FilteringProgram() : name_("None"), code_({"shaders/filters/default.glsl",""}), two_pass_filter_(false)
|
||||
FilteringProgram::FilteringProgram() : name_("Default"), code_({"shaders/filters/default.glsl",""}), two_pass_filter_(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -5329,6 +5329,7 @@ void ShaderEditor::refresh(CloneSource *cs)
|
||||
filters_.erase(current_);
|
||||
current_ = nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ShaderEditor::Render()
|
||||
@@ -5353,35 +5354,49 @@ void ShaderEditor::Render()
|
||||
Settings::application.widget.shader_editor = false;
|
||||
if (ImGui::BeginMenu(IMGUI_TITLE_SHADEREDITOR))
|
||||
{
|
||||
if (ImGui::MenuItem( ICON_FA_SYNC " Reload")) {
|
||||
if (ImGui::MenuItem( ICON_FA_SYNC " Reload", nullptr, nullptr, current_ != nullptr)) {
|
||||
if ( current_ != nullptr )
|
||||
filters_.erase(current_);
|
||||
// force reload
|
||||
current_ = nullptr;
|
||||
}
|
||||
|
||||
// Menu section for presets
|
||||
if (ImGui::BeginMenu( ICON_FA_SCROLL " Example code", current_ != nullptr))
|
||||
{
|
||||
for (auto p = FilteringProgram::presets.begin(); p != FilteringProgram::presets.end(); ++p){
|
||||
|
||||
if (ImGui::MenuItem( p->name().c_str() )) {
|
||||
ImageFilter *i = dynamic_cast<ImageFilter *>( current_->filter() );
|
||||
// if we can access the code of inside the image filter
|
||||
if (i) {
|
||||
// change the filter of the current image filter
|
||||
// => this triggers compilation of shader
|
||||
compilation_ = new std::promise<std::string>();
|
||||
i->setProgram( *p, compilation_ );
|
||||
compilation_return_ = compilation_->get_future();
|
||||
// inform status
|
||||
status_ = "Building...";
|
||||
// force reload
|
||||
current_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
|
||||
if (ImGui::MenuItem( ICON_FA_EXTERNAL_LINK_ALT " Browse shadertoy.com")) {
|
||||
SystemToolkit::open("https://www.shadertoy.com/");
|
||||
}
|
||||
|
||||
// Enable/Disable editor options
|
||||
ImGui::Separator();
|
||||
ImGui::MenuItem( ICON_FA_UNDERLINE " Show Shader Inputs", nullptr, &show_shader_inputs_);
|
||||
if (ImGui::MenuItem( ICON_FA_LONG_ARROW_ALT_RIGHT " Show whitespace", nullptr, &ws))
|
||||
ImGui::MenuItem( ICON_FA_UNDERLINE " Show Shader Inputs", nullptr, &show_shader_inputs_);
|
||||
if (ImGui::MenuItem( ICON_FA_LONG_ARROW_ALT_RIGHT " Show whitespace", nullptr, &ws))
|
||||
_editor.SetShowWhitespaces(ws);
|
||||
|
||||
// Edit menu
|
||||
ImGui::Separator();
|
||||
if (ImGui::MenuItem( MENU_UNDO, SHORTCUT_UNDO, nullptr, !ro && _editor.CanUndo()))
|
||||
_editor.Undo();
|
||||
if (ImGui::MenuItem( MENU_REDO, SHORTCUT_REDO, nullptr, !ro && _editor.CanRedo()))
|
||||
_editor.Redo();
|
||||
if (ImGui::MenuItem( MENU_COPY, SHORTCUT_COPY, nullptr, _editor.HasSelection()))
|
||||
_editor.Copy();
|
||||
if (ImGui::MenuItem( MENU_CUT, SHORTCUT_CUT, nullptr, !ro && _editor.HasSelection()))
|
||||
_editor.Cut();
|
||||
if (ImGui::MenuItem( MENU_DELETE, SHORTCUT_DELETE, nullptr, !ro && _editor.HasSelection()))
|
||||
_editor.Delete();
|
||||
if (ImGui::MenuItem( MENU_PASTE, SHORTCUT_PASTE, nullptr, !ro && ImGui::GetClipboardText() != nullptr))
|
||||
_editor.Paste();
|
||||
if (ImGui::MenuItem( MENU_SELECTALL, SHORTCUT_SELECTALL, nullptr, _editor.GetText().size() > 1 ))
|
||||
_editor.SetSelection(TextEditor::Coordinates(), TextEditor::Coordinates(_editor.GetTotalLines(), 0));
|
||||
|
||||
// output manager menu
|
||||
ImGui::Separator();
|
||||
bool pinned = Settings::application.widget.shader_editor_view == Settings::application.current_view;
|
||||
@@ -5398,6 +5413,28 @@ void ShaderEditor::Render()
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
|
||||
// Edit menu
|
||||
if (ImGui::BeginMenu( "Edit", current_ != nullptr ) ) {
|
||||
|
||||
if (ImGui::MenuItem( MENU_UNDO, SHORTCUT_UNDO, nullptr, !ro && _editor.CanUndo()))
|
||||
_editor.Undo();
|
||||
if (ImGui::MenuItem( MENU_REDO, SHORTCUT_REDO, nullptr, !ro && _editor.CanRedo()))
|
||||
_editor.Redo();
|
||||
if (ImGui::MenuItem( MENU_COPY, SHORTCUT_COPY, nullptr, _editor.HasSelection()))
|
||||
_editor.Copy();
|
||||
if (ImGui::MenuItem( MENU_CUT, SHORTCUT_CUT, nullptr, !ro && _editor.HasSelection()))
|
||||
_editor.Cut();
|
||||
if (ImGui::MenuItem( MENU_DELETE, SHORTCUT_DELETE, nullptr, !ro && _editor.HasSelection()))
|
||||
_editor.Delete();
|
||||
if (ImGui::MenuItem( MENU_PASTE, SHORTCUT_PASTE, nullptr, !ro && ImGui::GetClipboardText() != nullptr))
|
||||
_editor.Paste();
|
||||
if (ImGui::MenuItem( MENU_SELECTALL, SHORTCUT_SELECTALL, nullptr, _editor.GetText().size() > 1 ))
|
||||
_editor.SetSelection(TextEditor::Coordinates(), TextEditor::Coordinates(_editor.GetTotalLines(), 0));
|
||||
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
|
||||
// Build action menu
|
||||
if (ImGui::MenuItem( ICON_FA_HAMMER " Build", nullptr, nullptr, current_ != nullptr )) {
|
||||
|
||||
// the UI has ref to code for this clone
|
||||
@@ -5488,11 +5525,13 @@ void ShaderEditor::Render()
|
||||
filters_[c] = i->program();
|
||||
}
|
||||
}
|
||||
else
|
||||
status_ = "No shader";
|
||||
else {
|
||||
status_ = "-";
|
||||
c = nullptr;
|
||||
}
|
||||
}
|
||||
else
|
||||
status_ = "No shader";
|
||||
status_ = "-";
|
||||
}
|
||||
else
|
||||
status_ = "-";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// from https://www.shadertoy.com/view/Ms2Xz3
|
||||
uniform float Intensity;
|
||||
float Intensity = 0.6;
|
||||
|
||||
vec4 BlurColor (in vec2 Coord, in sampler2D Tex, in float MipBias)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#define GOLDEN_ANGLE 2.39996323
|
||||
#define ITERATIONS 60
|
||||
|
||||
uniform float Radius;
|
||||
float Radius = 0.3;
|
||||
|
||||
mat2 rot = mat2(cos(GOLDEN_ANGLE), sin(GOLDEN_ANGLE), -sin(GOLDEN_ANGLE), cos(GOLDEN_ANGLE));
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
uniform float Factor;
|
||||
float Factor = 0.5;
|
||||
|
||||
const float mult = 1.0 / 17.0;
|
||||
const mat4 adjustments = (mat4(
|
||||
@@ -34,8 +34,8 @@ float adjustFrag( float val, vec2 coord ) {
|
||||
|
||||
void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
||||
{
|
||||
vec2 uv = fragCoord.xy / iResolution.xy;
|
||||
vec4 videoColor = texture(iChannel0, uv);
|
||||
vec2 uv = fragCoord.xy / iResolution.xy;
|
||||
vec4 videoColor = texture(iChannel0, uv);
|
||||
|
||||
float vidLum = getLuminance(videoColor);
|
||||
vidLum = adjustFrag(vidLum, fragCoord.xy);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// from https://www.shadertoy.com/view/4s2GRR
|
||||
// Inspired by http://stackoverflow.com/questions/6030814/add-fisheye-effect-to-images-at-runtime-using-opengl-es
|
||||
uniform float Factor;
|
||||
float Factor = 0.4;
|
||||
|
||||
void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
||||
{
|
||||
@@ -26,6 +26,5 @@ void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
||||
else uv = p;//no effect for power = 1.0
|
||||
|
||||
// Second part of cheat for round effect, not elliptical
|
||||
vec3 col = texture(iChannel0, vec2(uv.x, uv.y * prop)).xyz;
|
||||
fragColor = vec4(col, 1.0);
|
||||
fragColor = texture(iChannel0, vec2(uv.x, uv.y * prop));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
uniform float Size;
|
||||
uniform float Sharpen;
|
||||
float Size = 0.5;
|
||||
float Sharpen = 0.5;
|
||||
|
||||
const mat3 G = mat3( 0.0625, 0.125, 0.0625, 0.125, 0.25, 0.125, 0.0625, 0.125, 0.0625);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
uniform float Factor;
|
||||
float Factor = 0.3;
|
||||
|
||||
#define SEED1 -0.5775604999999985
|
||||
#define SEED2 6.440483302499992
|
||||
@@ -49,5 +49,5 @@ void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
||||
float c = mask(uv);
|
||||
c = float( f > mix( 0.6 * c, 1.4 * c, Factor) );
|
||||
|
||||
fragColor = vec4(c, c, c, 1.0);
|
||||
fragColor = vec4(c, c, c, texture(iChannel0, fragCoord.xy / iResolution.xy).a );
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// From https://www.shadertoy.com/view/XdfcWN
|
||||
// Created by inigo quilez - iq/2014
|
||||
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
|
||||
uniform float Factor;
|
||||
float Factor = 0.5;
|
||||
|
||||
vec2 hash( vec2 p ) {
|
||||
p = 2.0 * vec2(dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3)));
|
||||
|
||||
Reference in New Issue
Block a user