From 6c48cf2e83d03af0208a9e385d4379f365378520 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sat, 8 Feb 2020 23:50:09 +0100 Subject: [PATCH] Add LumaOpacity, StackRepeat filters, fix LumaMap, add bicubic filtering --- orx-fx/src/main/kotlin/color/LumaOpacity.kt | 32 +++++++++++++ orx-fx/src/main/kotlin/distort/BlockRepeat.kt | 2 +- orx-fx/src/main/kotlin/distort/StackRepeat.kt | 48 +++++++++++++++++++ orx-fx/src/main/kotlin/distort/Wave.kt | 20 +++++++- .../openrndr/extra/fx/gl3/color/luma-map.frag | 3 +- .../extra/fx/gl3/color/luma-opacity.frag | 17 +++++++ .../extra/fx/gl3/distort/stack-repeat.frag | 42 ++++++++++++++++ 7 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 orx-fx/src/main/kotlin/color/LumaOpacity.kt create mode 100644 orx-fx/src/main/kotlin/distort/StackRepeat.kt create mode 100644 orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-opacity.frag create mode 100644 orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/stack-repeat.frag diff --git a/orx-fx/src/main/kotlin/color/LumaOpacity.kt b/orx-fx/src/main/kotlin/color/LumaOpacity.kt new file mode 100644 index 00000000..18ce0191 --- /dev/null +++ b/orx-fx/src/main/kotlin/color/LumaOpacity.kt @@ -0,0 +1,32 @@ +package org.openrndr.extra.fx.color + +import org.openrndr.color.ColorRGBa +import org.openrndr.draw.Filter +import org.openrndr.draw.Shader +import org.openrndr.extra.fx.filterFragmentCode +import org.openrndr.extra.parameters.BooleanParameter +import org.openrndr.extra.parameters.ColorParameter +import org.openrndr.extra.parameters.Description +import org.openrndr.extra.parameters.DoubleParameter + +@Description("Luma map ") +class LumaOpacity : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-opacity.frag"))) { + @DoubleParameter("foreground luma",0.0, 1.0) + var foregroundLuma: Double by parameters + + @DoubleParameter("background luma", 0.0,1.0) + var backgroundLuma: Double by parameters + + @DoubleParameter("background opacity", 0.0, 1.0, order = 0) + var backgroundOpacity: Double by parameters + + @DoubleParameter("foreground opacity", 0.0, 1.0, order = 1) + var foregroundOpacity: Double by parameters + + init { + foregroundLuma = 1.0 + backgroundLuma = 0.0 + foregroundOpacity = 1.0 + backgroundOpacity = 0.0 + } +} \ No newline at end of file diff --git a/orx-fx/src/main/kotlin/distort/BlockRepeat.kt b/orx-fx/src/main/kotlin/distort/BlockRepeat.kt index 854ff909..b4979008 100644 --- a/orx-fx/src/main/kotlin/distort/BlockRepeat.kt +++ b/orx-fx/src/main/kotlin/distort/BlockRepeat.kt @@ -6,7 +6,7 @@ import org.openrndr.extra.fx.filterFragmentCode import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.DoubleParameter -@Description("Horizontal wave") +@Description("Block repeat") class BlockRepeat : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("distort/block-repeat.frag"))) { @DoubleParameter("block width", 0.0, 1.0, order = 0) var blockWidth: Double by parameters diff --git a/orx-fx/src/main/kotlin/distort/StackRepeat.kt b/orx-fx/src/main/kotlin/distort/StackRepeat.kt new file mode 100644 index 00000000..ba71695d --- /dev/null +++ b/orx-fx/src/main/kotlin/distort/StackRepeat.kt @@ -0,0 +1,48 @@ +package org.openrndr.extra.fx.distort + +import org.openrndr.draw.* +import org.openrndr.extra.fx.filterFragmentCode +import org.openrndr.extra.parameters.Description +import org.openrndr.extra.parameters.DoubleParameter +import org.openrndr.extra.parameters.IntParameter + +@Description("Stack repeat") +class StackRepeat : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("distort/stack-repeat.frag"))) { + @DoubleParameter("zoom", -1.0, 1.0, order = 0) + var zoom: Double by parameters + + @DoubleParameter("x-origin", -1.0, 1.0, order = 1) + var xOrigin: Double by parameters + @DoubleParameter("y-origin", -1.0, 1.0, order = 2) + var yOrigin: Double by parameters + + @DoubleParameter("x-offset", -1.0, 1.0, order = 3) + var xOffset: Double by parameters + @DoubleParameter("y-offset", -1.0, 1.0, order = 4) + var yOffset: Double by parameters + + @DoubleParameter("rotation", -180.0, 180.0, order = 5) + var rotation: Double by parameters + + @IntParameter("repeats", 0, 16, order = 6) + var repeats: Int by parameters + + init { + zoom = 0.0 + repeats = 2 + xOffset = 0.0 + yOffset = 0.0 + xOrigin = 0.0 + yOrigin = 0.0 + rotation = 0.0 + } + var bicubicFiltering = true + override fun apply(source: Array, target: Array) { + if (bicubicFiltering && source.isNotEmpty()) { + source[0].generateMipmaps() + source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) + } + super.apply(source, target) + } + +} diff --git a/orx-fx/src/main/kotlin/distort/Wave.kt b/orx-fx/src/main/kotlin/distort/Wave.kt index e48dbb16..069151e9 100644 --- a/orx-fx/src/main/kotlin/distort/Wave.kt +++ b/orx-fx/src/main/kotlin/distort/Wave.kt @@ -1,7 +1,6 @@ package org.openrndr.extra.fx.distort -import org.openrndr.draw.Filter -import org.openrndr.draw.Shader +import org.openrndr.draw.* import org.openrndr.extra.fx.filterFragmentCode import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.DoubleParameter @@ -22,6 +21,15 @@ class HorizontalWave : Filter(Shader.createFromCode(filterVertexCode, filterFrag amplitude = 0.1 phase = 0.0 } + + var bicubicFiltering = true + override fun apply(source: Array, target: Array) { + if (bicubicFiltering && source.isNotEmpty()) { + source[0].generateMipmaps() + source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) + } + super.apply(source, target) + } } @Description("Vertical wave") @@ -40,5 +48,13 @@ class VerticalWave : Filter(Shader.createFromCode(filterVertexCode, filterFragme amplitude = 0.1 phase = 0.0 } + var bicubicFiltering = true + override fun apply(source: Array, target: Array) { + if (bicubicFiltering && source.isNotEmpty()) { + source[0].generateMipmaps() + source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR) + } + super.apply(source, target) + } } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-map.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-map.frag index a077658e..fdc5174d 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-map.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-map.frag @@ -6,7 +6,6 @@ uniform vec4 foreground; uniform vec4 background; uniform float foregroundOpacity; uniform float backgroundOpacity; -uniform float threshold; out vec4 o_color; void main() { @@ -14,5 +13,5 @@ void main() { vec4 fgc = foreground * foregroundOpacity; vec4 bgc = background * backgroundOpacity; float luma = dot( (c.a> 0.0? c.rgb/c.a : vec3(0.0)), vec3(1.0/3.0)); - o_color = mix(bgc, fgc, step(threshold, luma )) * c.a; + o_color = mix(bgc, fgc, luma) * c.a; } diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-opacity.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-opacity.frag new file mode 100644 index 00000000..a3b9d9d9 --- /dev/null +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-opacity.frag @@ -0,0 +1,17 @@ +#version 330 core + +in vec2 v_texCoord0; +uniform sampler2D tex0; // input +uniform float foregroundLuma; +uniform float backgroundLuma; +uniform float foregroundOpacity; +uniform float backgroundOpacity; + +out vec4 o_color; +void main() { + vec4 c = texture(tex0, v_texCoord0); + float l = dot( (c.a> 0.0? c.rgb/c.a : vec3(0.0)), vec3(1.0/3.0)); + float mf = smoothstep(backgroundLuma, foregroundLuma, l); + float o = mix(backgroundOpacity, foregroundOpacity, mf); + o_color = c * o; +} diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/stack-repeat.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/stack-repeat.frag new file mode 100644 index 00000000..b851fad0 --- /dev/null +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/stack-repeat.frag @@ -0,0 +1,42 @@ +#version 330 core + +in vec2 v_texCoord0; +uniform sampler2D tex0;// input +uniform int repeats; +uniform float zoom; +uniform float xOrigin; +uniform float yOrigin; +uniform float xOffset; +uniform float yOffset; +uniform float rotation; + +out vec4 o_color; +void main() { + vec2 origin = vec2((xOrigin+1.0)/2.0, (yOrigin+1.0)/2.0); + vec2 ts = textureSize(tex0, 0); + float r = ts.x/ts.y; + vec2 offset = vec2(1.0, r) * vec2(xOffset, yOffset); + vec2 uv = v_texCoord0 - vec2(origin); + float rad = (rotation/180) * 3.1415926535; + vec2 cs0 = vec2(cos(rad), -sin(rad)); + vec2 cs1 = vec2(sin(rad), cos(rad)); + mat2 rotStep = mat2(cs0, cs1); + + mat2 rot = rotStep; + vec4 c = texture(tex0, v_texCoord0); + for (int i = 1; i <= repeats; ++i) { + //vec2 s = (uv * (1.0 + zoom) * i) + vec2(0.5); + vec2 s = (rot * uv * pow(1.0 + zoom,i*1.0) )+ vec2(origin) + vec2(offset) * i; + float f = s.x >= 0.0 && s.y > 0.0 && s.x < 1.0 && s.y < 1.0? 1.0 : 0.0; + vec4 sc = texture(tex0, s) * f; + + c = c * (1.0-sc.a) + sc; + if (c.a > 1.0) { + c.a = 1.0; + } + rot *= rotStep; + } + + + o_color = c; +}