From dce423fe88bf56e85d9e6be8a2a627ae40869f15 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Wed, 5 Feb 2020 17:44:38 +0100 Subject: [PATCH] Add LumaMap, LumaThreshold, BlockRepeat, alpha dithered ADither to orx-fx --- orx-fx/src/main/kotlin/color/LumaMap.kt | 32 ++++++++++++++ orx-fx/src/main/kotlin/color/LumaThreshold.kt | 4 +- orx-fx/src/main/kotlin/distort/BlockRepeat.kt | 44 +++++++++++++++++++ .../openrndr/extra/fx/gl3/color/luma-map.frag | 18 ++++++++ .../extra/fx/gl3/distort/block-repeat.frag | 41 +++++++++++++++++ .../extra/fx/gl3/dither/a-dither.frag | 24 +++++----- 6 files changed, 146 insertions(+), 17 deletions(-) create mode 100644 orx-fx/src/main/kotlin/color/LumaMap.kt create mode 100644 orx-fx/src/main/kotlin/distort/BlockRepeat.kt create mode 100644 orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-map.frag create mode 100644 orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/block-repeat.frag diff --git a/orx-fx/src/main/kotlin/color/LumaMap.kt b/orx-fx/src/main/kotlin/color/LumaMap.kt new file mode 100644 index 00000000..1eac3a79 --- /dev/null +++ b/orx-fx/src/main/kotlin/color/LumaMap.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 LumaMap : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-map.frag"))) { + @ColorParameter("foreground color") + var foreground: ColorRGBa by parameters + + @ColorParameter("background color") + var background: ColorRGBa by parameters + + @DoubleParameter("background opacity", 0.0, 1.0) + var backgroundOpacity: Double by parameters + + @DoubleParameter("foreground opacity", 0.0, 1.0) + var foregroundOpacity: Double by parameters + + init { + foreground = ColorRGBa.WHITE + background = ColorRGBa.BLACK + foregroundOpacity = 1.0 + backgroundOpacity = 1.0 + } +} \ No newline at end of file diff --git a/orx-fx/src/main/kotlin/color/LumaThreshold.kt b/orx-fx/src/main/kotlin/color/LumaThreshold.kt index 825923a0..b44ddaae 100644 --- a/orx-fx/src/main/kotlin/color/LumaThreshold.kt +++ b/orx-fx/src/main/kotlin/color/LumaThreshold.kt @@ -10,8 +10,7 @@ import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.DoubleParameter @Description("Luma threshold ") -class Threshold : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-threshold.frag"))) { - +class LumaThreshold : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-threshold.frag"))) { @DoubleParameter("threshold value", 0.0, 1.0) var threshold: Double by parameters @@ -34,5 +33,4 @@ class Threshold : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFr foregroundOpacity = 1.0 backgroundOpacity = 1.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 new file mode 100644 index 00000000..854ff909 --- /dev/null +++ b/orx-fx/src/main/kotlin/distort/BlockRepeat.kt @@ -0,0 +1,44 @@ +package org.openrndr.extra.fx.distort + +import org.openrndr.draw.Filter +import org.openrndr.draw.Shader +import org.openrndr.extra.fx.filterFragmentCode +import org.openrndr.extra.parameters.Description +import org.openrndr.extra.parameters.DoubleParameter + +@Description("Horizontal wave") +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 + + @DoubleParameter("block height", 0.0, 1.0, order = 1) + var blockHeight: Double by parameters + + @DoubleParameter("block x-offset", -0.5, 0.5, order = 2) + var blockOffsetX: Double by parameters + + @DoubleParameter("block y-offset", -0.5, 0.5, order = 3) + var blockOffsetY: Double by parameters + + /** + * Source scale, 0.0 is a 1:1 mapping, 1.0 fits entire source image in block + */ + @DoubleParameter("source scale", 0.0, 1.0, order = 4) + var sourceScale: Double by parameters + + @DoubleParameter("source x-offset", -0.5, 0.5, order = 5) + var sourceOffsetX: Double by parameters + + @DoubleParameter("source y-offset", -.5, .5, order = 6) + var sourceOffsetY: Double by parameters + + init { + blockWidth = 0.25 + blockHeight = 0.25 + blockOffsetX = 0.0 + blockOffsetY = 0.0 + sourceOffsetX = 0.0 + sourceOffsetY = 0.0 + sourceScale = 0.0 + } +} 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 new file mode 100644 index 00000000..a077658e --- /dev/null +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/luma-map.frag @@ -0,0 +1,18 @@ +#version 330 core + +in vec2 v_texCoord0; +uniform sampler2D tex0; // input +uniform vec4 foreground; +uniform vec4 background; +uniform float foregroundOpacity; +uniform float backgroundOpacity; +uniform float threshold; + +out vec4 o_color; +void main() { + vec4 c = texture(tex0, v_texCoord0); + 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; +} diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/block-repeat.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/block-repeat.frag new file mode 100644 index 00000000..14a9055d --- /dev/null +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/distort/block-repeat.frag @@ -0,0 +1,41 @@ +#version 330 core + +in vec2 v_texCoord0; +uniform sampler2D tex0;// input +uniform float blockWidth; +uniform float blockHeight; +uniform float blockOffsetX; +uniform float blockOffsetY; +uniform float sourceOffsetX; +uniform float sourceOffsetY; +uniform float sourceScale; + +out vec4 o_color; +void main() { + vec2 uv = v_texCoord0; + vec2 blockSize = vec2(blockWidth, blockHeight); + vec2 blockOffset = vec2(blockOffsetX, blockOffsetY); + vec2 blockCoord = uv / blockSize + blockOffset; + + ivec2 blockIndex = ivec2(blockCoord); + vec2 blockUV = mod(blockCoord - blockIndex, vec2(1.0)); + vec2 blockAspect = vec2(1.0); + + + if (blockWidth < blockHeight) { + blockAspect = vec2(blockWidth / blockHeight, 1.0); + } + + if (blockHeight < blockWidth) { + blockAspect = vec2(1.0, blockHeight/blockWidth); + } + + vec2 tUV = mix(blockUV * blockSize, blockUV * blockAspect, sourceScale); + +// vec2 fw = fwidth(blockCoord); +// float f = smoothstep(0.0, 0.01, blockUV.x) * smoothstep(0.0, 0.01, blockUV.y); + + vec2 sourceOffset = vec2(sourceOffsetX, sourceOffsetY); + vec4 c = texture(tex0, mod(tUV + sourceOffset, vec2(1.0))); + o_color = c; +} diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/dither/a-dither.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/dither/a-dither.frag index 71b46108..d7851cbe 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/dither/a-dither.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/dither/a-dither.frag @@ -27,29 +27,25 @@ float mask4(int levels, float l, int x, int y, int c) { return floor(levels * l + mask)/levels; } - - - - out vec4 o_color; void main() { vec4 c = texture(tex0, v_texCoord0); - + if (c.a > 0.0) { + c.rgb/=c.a; + } ivec2 ic = ivec2(v_texCoord0 * textureSize(tex0, 0)); - vec3 rgb = vec3(1.0, 0.0, 1.0); + vec4 rgba = vec4(0.0); if (pattern == 0) { - rgb = vec3(mask1(levels, c.r, ic.x, ic.y, 0), mask1(levels, c.g, ic.x, ic.y, 1), mask1(levels, c.b, ic.x, ic.y, 2)); + rgba = vec4(mask1(levels, c.r, ic.x, ic.y, 0), mask1(levels, c.g, ic.x, ic.y, 1), mask1(levels, c.b, ic.x, ic.y, 2), mask1(levels, c.a, ic.x, ic.y, 3)); } else if (pattern == 1) { - rgb = vec3(mask2(levels, c.r, ic.x, ic.y, 0), mask2(levels, c.g, ic.x, ic.y, 1), mask2(levels, c.b, ic.x, ic.y, 2)); + rgba = vec4(mask2(levels, c.r, ic.x, ic.y, 0), mask2(levels, c.g, ic.x, ic.y, 1), mask2(levels, c.b, ic.x, ic.y, 2), mask2(levels, c.a, ic.x, ic.y, 3)); } else if (pattern == 2) { - rgb = vec3(mask3(levels, c.r, ic.x, ic.y, 0), mask3(levels, c.g, ic.x, ic.y, 1), mask3(levels, c.b, ic.x, ic.y, 2)); + rgba = vec4(mask3(levels, c.r, ic.x, ic.y, 0), mask3(levels, c.g, ic.x, ic.y, 1), mask3(levels, c.b, ic.x, ic.y, 2), mask3(levels, c.a, ic.x, ic.y, 3)); } else { - rgb = vec3(mask4(levels, c.r, ic.x, ic.y, 0), mask4(levels, c.g, ic.x, ic.y, 1), mask4(levels, c.b, ic.x, ic.y, 2)); + rgba = vec4(mask4(levels, c.r, ic.x, ic.y, 0), mask4(levels, c.g, ic.x, ic.y, 1), mask4(levels, c.b, ic.x, ic.y, 2), mask4(levels, c.a, ic.x, ic.y, 3)); } - - - o_color.rgb = rgb; - o_color.a = 1.0; + rgba.rgb *= rgba.a; + o_color = rgba; }