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"
|
" 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)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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_ = "-";
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)));
|
||||||
|
|||||||
Reference in New Issue
Block a user