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:
Bruno Herbelin
2022-06-10 00:04:56 +02:00
parent 1f0b145740
commit d87f6b74f3
9 changed files with 85 additions and 61 deletions

View File

@@ -63,42 +63,28 @@ std::string fragmentFooter = "void main() {\n"
" mainImage( FragColor, texcoord.xy * iResolution.xy );\n" " mainImage( FragColor, texcoord.xy * iResolution.xy );\n"
"}\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 = { std::list< FilteringProgram > FilteringProgram::presets = {
FilteringProgram(), FilteringProgram(),
FilteringProgram("Bilateral","shaders/filters/bilinear.glsl", "", { }), FilteringProgram("Bilateral","shaders/filters/bilinear.glsl", "", { }),
FilteringProgram("Pixelate", "shaders/filters/pixelate.glsl", "", { { "Size", 0.5}, { "Sharpen", 0.5} }), FilteringProgram("Pixelate", "shaders/filters/pixelate.glsl", "", { }),
FilteringProgram("Bloom", "shaders/filters/bloom.glsl", "", { { "Intensity", 0.5} }), FilteringProgram("Bloom", "shaders/filters/bloom.glsl", "", { }),
FilteringProgram("Bokeh", "shaders/filters/bokeh.glsl", "", { { "Radius", 1.0} }), FilteringProgram("Bokeh", "shaders/filters/bokeh.glsl", "", { }),
FilteringProgram("Chalk", "shaders/filters/talk.glsl", "", { { "Factor", 1.0} }), FilteringProgram("Talk", "shaders/filters/talk.glsl", "", { }),
FilteringProgram("Stippling","shaders/filters/stippling.glsl", "", { { "Factor", 0.5} }), FilteringProgram("Stippling","shaders/filters/stippling.glsl", "", { }),
FilteringProgram("Dithering","shaders/filters/dithering.glsl", "", { { "Factor", 0.5} }), FilteringProgram("Dithering","shaders/filters/dithering.glsl", "", { }),
FilteringProgram("Fisheye", "shaders/filters/fisheye.glsl", "", { { "Factor", 0.35} }), FilteringProgram("Fisheye", "shaders/filters/fisheye.glsl", "", { })
}; };
std::string FilteringProgram::getFilterCodeInputs() std::string FilteringProgram::getFilterCodeInputs()
{ {
static std::string filterHeaderHelp = "vec3 iResolution; // viewport resolution (in pixels)\n" static std::string filterHeaderHelp = "vec3 iResolution; // viewport resolution (in pixels)\n"
"float iTime; // shader playback time (in seconds)\n" "float iTime; // shader playback time (in seconds)\n"
"float iTimeDelta; // render time (in seconds)\n" "float iTimeDelta; // render time (in seconds)\n"
"int iFrame; // shader playback frame\n" "int iFrame; // shader playback frame\n"
"vec3 iChannelResolution[2]; // input channel resolution (in pixels)\n" "vec3 iChannelResolution[2]; // input channels resolution (in pixels)\n"
"sampler2D iChannel0; // input channel (texture).\n" "sampler2D iChannel0; // input channel 0 (texture).\n"
"sampler2D iChannel1; // input channel (mask).\n" "sampler2D iChannel1; // input channel 1 (texture).\n"
"vec4 iDate; // (year, month, day, time in seconds)"; "vec4 iDate; // (year, month, day, time in seconds)";
return filterHeaderHelp; 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)
{ {
} }

View File

@@ -5329,6 +5329,7 @@ void ShaderEditor::refresh(CloneSource *cs)
filters_.erase(current_); filters_.erase(current_);
current_ = nullptr; current_ = nullptr;
} }
} }
void ShaderEditor::Render() void ShaderEditor::Render()
@@ -5353,35 +5354,49 @@ void ShaderEditor::Render()
Settings::application.widget.shader_editor = false; Settings::application.widget.shader_editor = false;
if (ImGui::BeginMenu(IMGUI_TITLE_SHADEREDITOR)) 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 ) if ( current_ != nullptr )
filters_.erase(current_); filters_.erase(current_);
// force reload
current_ = nullptr; 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 // Enable/Disable editor options
ImGui::Separator(); ImGui::Separator();
ImGui::MenuItem( ICON_FA_UNDERLINE " Show Shader Inputs", nullptr, &show_shader_inputs_); 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)) if (ImGui::MenuItem( ICON_FA_LONG_ARROW_ALT_RIGHT " Show whitespace", nullptr, &ws))
_editor.SetShowWhitespaces(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 // output manager menu
ImGui::Separator(); ImGui::Separator();
bool pinned = Settings::application.widget.shader_editor_view == Settings::application.current_view; bool pinned = Settings::application.widget.shader_editor_view == Settings::application.current_view;
@@ -5398,6 +5413,28 @@ void ShaderEditor::Render()
ImGui::EndMenu(); 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 )) { if (ImGui::MenuItem( ICON_FA_HAMMER " Build", nullptr, nullptr, current_ != nullptr )) {
// the UI has ref to code for this clone // the UI has ref to code for this clone
@@ -5488,11 +5525,13 @@ void ShaderEditor::Render()
filters_[c] = i->program(); filters_[c] = i->program();
} }
} }
else else {
status_ = "No shader"; status_ = "-";
c = nullptr;
}
} }
else else
status_ = "No shader"; status_ = "-";
} }
else else
status_ = "-"; status_ = "-";

View File

@@ -1,5 +1,5 @@
// from https://www.shadertoy.com/view/Ms2Xz3 // 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) vec4 BlurColor (in vec2 Coord, in sampler2D Tex, in float MipBias)
{ {

View File

@@ -6,7 +6,7 @@
#define GOLDEN_ANGLE 2.39996323 #define GOLDEN_ANGLE 2.39996323
#define ITERATIONS 60 #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)); mat2 rot = mat2(cos(GOLDEN_ANGLE), sin(GOLDEN_ANGLE), -sin(GOLDEN_ANGLE), cos(GOLDEN_ANGLE));

View File

@@ -1,4 +1,4 @@
uniform float Factor; float Factor = 0.5;
const float mult = 1.0 / 17.0; const float mult = 1.0 / 17.0;
const mat4 adjustments = (mat4( const mat4 adjustments = (mat4(
@@ -34,8 +34,8 @@ float adjustFrag( float val, vec2 coord ) {
void mainImage( out vec4 fragColor, in vec2 fragCoord ) void mainImage( out vec4 fragColor, in vec2 fragCoord )
{ {
vec2 uv = fragCoord.xy / iResolution.xy; vec2 uv = fragCoord.xy / iResolution.xy;
vec4 videoColor = texture(iChannel0, uv); vec4 videoColor = texture(iChannel0, uv);
float vidLum = getLuminance(videoColor); float vidLum = getLuminance(videoColor);
vidLum = adjustFrag(vidLum, fragCoord.xy); vidLum = adjustFrag(vidLum, fragCoord.xy);

View File

@@ -1,6 +1,6 @@
// from https://www.shadertoy.com/view/4s2GRR // from https://www.shadertoy.com/view/4s2GRR
// Inspired by http://stackoverflow.com/questions/6030814/add-fisheye-effect-to-images-at-runtime-using-opengl-es // 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 ) 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 else uv = p;//no effect for power = 1.0
// Second part of cheat for round effect, not elliptical // Second part of cheat for round effect, not elliptical
vec3 col = texture(iChannel0, vec2(uv.x, uv.y * prop)).xyz; fragColor = texture(iChannel0, vec2(uv.x, uv.y * prop));
fragColor = vec4(col, 1.0);
} }

View File

@@ -1,5 +1,5 @@
uniform float Size; float Size = 0.5;
uniform float Sharpen; 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); const mat3 G = mat3( 0.0625, 0.125, 0.0625, 0.125, 0.25, 0.125, 0.0625, 0.125, 0.0625);

View File

@@ -1,4 +1,4 @@
uniform float Factor; float Factor = 0.3;
#define SEED1 -0.5775604999999985 #define SEED1 -0.5775604999999985
#define SEED2 6.440483302499992 #define SEED2 6.440483302499992
@@ -49,5 +49,5 @@ void mainImage( out vec4 fragColor, in vec2 fragCoord )
float c = mask(uv); float c = mask(uv);
c = float( f > mix( 0.6 * c, 1.4 * c, Factor) ); 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 );
} }

View File

@@ -1,7 +1,7 @@
// From https://www.shadertoy.com/view/XdfcWN // From https://www.shadertoy.com/view/XdfcWN
// Created by inigo quilez - iq/2014 // Created by inigo quilez - iq/2014
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
uniform float Factor; float Factor = 0.5;
vec2 hash( vec2 p ) { vec2 hash( vec2 p ) {
p = 2.0 * vec2(dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3))); p = 2.0 * vec2(dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3)));