diff --git a/orx-fx/src/commonMain/kotlin/distort/Lenses.kt b/orx-fx/src/commonMain/kotlin/distort/Lenses.kt index 3b3f9be7..bfb81c2d 100644 --- a/orx-fx/src/commonMain/kotlin/distort/Lenses.kt +++ b/orx-fx/src/commonMain/kotlin/distort/Lenses.kt @@ -9,15 +9,15 @@ import org.openrndr.extra.fx.mppFilterShader import org.openrndr.extra.parameters.BooleanParameter import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.DoubleParameter +import org.openrndr.extra.parameters.IntParameter @Description("Lenses") class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) { - @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 + @IntParameter("rows", 1, 64, order = 0) + var rows: Int by parameters + @IntParameter("columns", 1, 64, order = 1) + var columns: Int by parameters @DoubleParameter("scale", 0.5, 1.5, order = 2) var scale: Double by parameters @@ -25,6 +25,9 @@ class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) { @DoubleParameter("rotation", -180.0, 180.0, order = 3) var rotation: Double by parameters + @DoubleParameter("distort", -1.0, 1.0, order = 4) + var distort: Double by parameters + @BooleanParameter("bicubic filtering") var bicubicFiltering: Boolean by parameters @@ -37,8 +40,9 @@ class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) { } init { - blockWidth = 0.25 - blockHeight = 0.25 + rows = 6 + columns = 8 + distort = 0.0 bicubicFiltering = true } diff --git a/orx-fx/src/demo/kotlin/DemoDistortLenses01.kt b/orx-fx/src/demo/kotlin/DemoDistortLenses01.kt index 95fb6da4..0d39a026 100644 --- a/orx-fx/src/demo/kotlin/DemoDistortLenses01.kt +++ b/orx-fx/src/demo/kotlin/DemoDistortLenses01.kt @@ -2,7 +2,6 @@ import org.openrndr.application import org.openrndr.draw.createEquivalent import org.openrndr.draw.loadImage import org.openrndr.extra.fx.distort.Lenses -import kotlin.math.cos fun main() = application { configure { @@ -16,7 +15,8 @@ fun main() = application { val edges = image.createEquivalent() extend { lenses.rotation = 0.0 - lenses.scale = 1.4 + lenses.scale = 1.5 + lenses.apply(image, edges) drawer.image(edges) } diff --git a/orx-fx/src/shaders/glsl/distort/lenses.frag b/orx-fx/src/shaders/glsl/distort/lenses.frag index d9e1d69e..8c5aea0e 100644 --- a/orx-fx/src/shaders/glsl/distort/lenses.frag +++ b/orx-fx/src/shaders/glsl/distort/lenses.frag @@ -2,25 +2,29 @@ in vec2 v_texCoord0; uniform sampler2D tex0;// input uniform float scale; uniform float rotation; +uniform int rows; +uniform int columns; +uniform float distort; out vec4 o_color; void main() { vec2 uv = v_texCoord0; - vec2 blockSize = vec2(1.0/8.0, 1.0/6.0); - + vec2 blockSize = vec2(1.0/columns, 1.0/rows); vec2 blockIndex = floor(uv / blockSize); + vec2 blockUV = mod(uv/blockSize, vec2(1.0)); + vec2 blockUVC1 = (blockUV - vec2(0.5)) * 2.0; vec2 blockCenter = (blockIndex+0.5) * blockSize; float ca = cos(radians(rotation)); float sa = sin(radians(rotation)); vec2 ts = textureSize(tex0, 0); - - mat2 rm =mat2(1.0, 0.0, 0.0, ts.x/ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y/ts.x); - vec2 cuv = (rm * (uv - blockCenter) - * scale + blockCenter); - - + mat2 rm = mat2(1.0, 0.0, 0.0, ts.x/ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y/ts.x); + vec2 ruv = (uv - blockCenter); + vec2 luv; + luv.x = (1.0 - blockUVC1.y * blockUVC1.y * distort) * ruv.x; + luv.y = (1.0 - blockUVC1.x * blockUVC1.x * distort) * ruv.y; + vec2 cuv = (rm * luv * scale + blockCenter); float sx = step(0.0, cuv.x) * (1.0 - step(1.0, cuv.x)); float sy = step(0.0, cuv.y) * (1.0 - step(1.0, cuv.y));