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"
"}\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)
{
}

View File

@@ -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_ = "-";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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