[orx-fx] Add fisheye distortion to Lenses Filter
This commit is contained in:
@@ -9,15 +9,15 @@ import org.openrndr.extra.fx.mppFilterShader
|
|||||||
import org.openrndr.extra.parameters.BooleanParameter
|
import org.openrndr.extra.parameters.BooleanParameter
|
||||||
import org.openrndr.extra.parameters.Description
|
import org.openrndr.extra.parameters.Description
|
||||||
import org.openrndr.extra.parameters.DoubleParameter
|
import org.openrndr.extra.parameters.DoubleParameter
|
||||||
|
import org.openrndr.extra.parameters.IntParameter
|
||||||
|
|
||||||
@Description("Lenses")
|
@Description("Lenses")
|
||||||
class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) {
|
class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) {
|
||||||
@DoubleParameter("block width", 0.0, 1.0, order = 0)
|
@IntParameter("rows", 1, 64, order = 0)
|
||||||
var blockWidth: Double by parameters
|
var rows: Int by parameters
|
||||||
|
|
||||||
@DoubleParameter("block height", 0.0, 1.0, order = 1)
|
|
||||||
var blockHeight: Double by parameters
|
|
||||||
|
|
||||||
|
@IntParameter("columns", 1, 64, order = 1)
|
||||||
|
var columns: Int by parameters
|
||||||
|
|
||||||
@DoubleParameter("scale", 0.5, 1.5, order = 2)
|
@DoubleParameter("scale", 0.5, 1.5, order = 2)
|
||||||
var scale: Double by parameters
|
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)
|
@DoubleParameter("rotation", -180.0, 180.0, order = 3)
|
||||||
var rotation: Double by parameters
|
var rotation: Double by parameters
|
||||||
|
|
||||||
|
@DoubleParameter("distort", -1.0, 1.0, order = 4)
|
||||||
|
var distort: Double by parameters
|
||||||
|
|
||||||
@BooleanParameter("bicubic filtering")
|
@BooleanParameter("bicubic filtering")
|
||||||
var bicubicFiltering: Boolean by parameters
|
var bicubicFiltering: Boolean by parameters
|
||||||
|
|
||||||
@@ -37,8 +40,9 @@ class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
blockWidth = 0.25
|
rows = 6
|
||||||
blockHeight = 0.25
|
columns = 8
|
||||||
|
distort = 0.0
|
||||||
|
|
||||||
bicubicFiltering = true
|
bicubicFiltering = true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import org.openrndr.application
|
|||||||
import org.openrndr.draw.createEquivalent
|
import org.openrndr.draw.createEquivalent
|
||||||
import org.openrndr.draw.loadImage
|
import org.openrndr.draw.loadImage
|
||||||
import org.openrndr.extra.fx.distort.Lenses
|
import org.openrndr.extra.fx.distort.Lenses
|
||||||
import kotlin.math.cos
|
|
||||||
|
|
||||||
fun main() = application {
|
fun main() = application {
|
||||||
configure {
|
configure {
|
||||||
@@ -16,7 +15,8 @@ fun main() = application {
|
|||||||
val edges = image.createEquivalent()
|
val edges = image.createEquivalent()
|
||||||
extend {
|
extend {
|
||||||
lenses.rotation = 0.0
|
lenses.rotation = 0.0
|
||||||
lenses.scale = 1.4
|
lenses.scale = 1.5
|
||||||
|
|
||||||
lenses.apply(image, edges)
|
lenses.apply(image, edges)
|
||||||
drawer.image(edges)
|
drawer.image(edges)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,25 +2,29 @@ in vec2 v_texCoord0;
|
|||||||
uniform sampler2D tex0;// input
|
uniform sampler2D tex0;// input
|
||||||
uniform float scale;
|
uniform float scale;
|
||||||
uniform float rotation;
|
uniform float rotation;
|
||||||
|
uniform int rows;
|
||||||
|
uniform int columns;
|
||||||
|
uniform float distort;
|
||||||
|
|
||||||
out vec4 o_color;
|
out vec4 o_color;
|
||||||
void main() {
|
void main() {
|
||||||
vec2 uv = v_texCoord0;
|
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 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;
|
vec2 blockCenter = (blockIndex+0.5) * blockSize;
|
||||||
|
|
||||||
float ca = cos(radians(rotation));
|
float ca = cos(radians(rotation));
|
||||||
float sa = sin(radians(rotation));
|
float sa = sin(radians(rotation));
|
||||||
|
|
||||||
vec2 ts = textureSize(tex0, 0);
|
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);
|
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)
|
vec2 ruv = (uv - blockCenter);
|
||||||
* scale + 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 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));
|
float sy = step(0.0, cuv.y) * (1.0 - step(1.0, cuv.y));
|
||||||
|
|||||||
Reference in New Issue
Block a user