From 50446eeb1b9c6ac8937b512ab90c1de4f451d316 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Thu, 28 Nov 2019 22:12:58 +0100 Subject: [PATCH] Fix support for NPOT inputs in orx-jumpflood --- orx-jumpflood/src/main/kotlin/JumpFlood.kt | 12 +++++++++--- .../main/resources/shaders/gl3/pixel-direction.frag | 8 +++++++- .../main/resources/shaders/gl3/pixel-distance.frag | 9 ++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/orx-jumpflood/src/main/kotlin/JumpFlood.kt b/orx-jumpflood/src/main/kotlin/JumpFlood.kt index 8d606dc2..34323ee9 100644 --- a/orx-jumpflood/src/main/kotlin/JumpFlood.kt +++ b/orx-jumpflood/src/main/kotlin/JumpFlood.kt @@ -4,6 +4,7 @@ import org.openrndr.color.ColorRGBa import org.openrndr.draw.* import org.openrndr.filter.blend.passthrough import org.openrndr.math.Matrix44 +import org.openrndr.math.Vector2 import org.openrndr.resourceUrl import kotlin.math.ceil import kotlin.math.max @@ -15,8 +16,12 @@ class JumpFlood : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/jumpflood var step: Int by parameters } -class PixelDirection : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/pixel-direction.frag"))) -class PixelDistance : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/pixel-distance.frag"))) +class PixelDirection : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/pixel-direction.frag"))) { + var originalSize: Vector2 by parameters +} +class PixelDistance : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/pixel-distance.frag"))) { + var originalSize: Vector2 by parameters +} class ContourPoints : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/contour-points.frag"))) class Threshold : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/threshold.frag"))) { var threshold by parameters @@ -37,7 +42,7 @@ class JumpFlooder(val width: Int, val height: Int, format:ColorFormat = ColorFor private val dimension = max(width, height) private val exp = ceil(Math.log(dimension.toDouble()) / Math.log(2.0)).toInt() - private val squareDim = 2.0.pow(exp.toDouble()).toInt() + val squareDim = 2.0.pow(exp.toDouble()).toInt() private val coordinates = listOf(colorBuffer(squareDim, squareDim, format = format, type = type), @@ -105,6 +110,7 @@ private fun encodeDecodeBitmap(drawer: Drawer, preprocess: Filter, decoder: Filt val encoded = _jumpFlooder.jumpFlood(drawer, _result) + decoder.parameters["originalSize"] = Vector2(_jumpFlooder.squareDim.toDouble(), _jumpFlooder.squareDim.toDouble()) decoder.apply(arrayOf(encoded, bitmap), _result) if (jumpFlooder == null) { _jumpFlooder.destroy() diff --git a/orx-jumpflood/src/main/resources/shaders/gl3/pixel-direction.frag b/orx-jumpflood/src/main/resources/shaders/gl3/pixel-direction.frag index 2d81a52b..307cfebf 100644 --- a/orx-jumpflood/src/main/resources/shaders/gl3/pixel-direction.frag +++ b/orx-jumpflood/src/main/resources/shaders/gl3/pixel-direction.frag @@ -2,13 +2,19 @@ uniform sampler2D tex0; uniform sampler2D tex1; +uniform vec2 originalSize; + in vec2 v_texCoord0; out vec4 o_color; void main() { vec2 size = textureSize(tex0, 0); - vec2 pixelPosition = v_texCoord0; + vec2 fixUp = v_texCoord0; + fixUp.y = 1.0 - fixUp.y; + fixUp *= (size/originalSize); + fixUp.y = 1.0 - fixUp.y; + vec2 pixelPosition = fixUp; vec2 centroidPixelPosition = texture(tex0, v_texCoord0).xy; vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * size * vec2(1.0, -1.0); float threshold = texture(tex1, v_texCoord0).r; diff --git a/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag b/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag index 10dcf56c..37b73d43 100644 --- a/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag +++ b/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag @@ -2,13 +2,20 @@ uniform sampler2D tex0; uniform sampler2D tex1; + +uniform vec2 originalSize; + in vec2 v_texCoord0; out vec4 o_color; void main() { vec2 size = textureSize(tex0, 0); - vec2 pixelPosition = v_texCoord0; + vec2 fixUp = v_texCoord0; + fixUp.y = 1.0 - fixUp.y; + fixUp *= (size/originalSize); + fixUp.y = 1.0 - fixUp.y; + vec2 pixelPosition = fixUp; vec2 centroidPixelPosition = texture(tex0, v_texCoord0).xy; vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * size * vec2(1.0, -1.0); float threshold = texture(tex1, v_texCoord0).r;