From 75b5fb5e841c429a2ee09e1b7d4c65d6707c3cc6 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sun, 7 Oct 2018 17:02:57 +0200 Subject: [PATCH] Bumped to version 0.0.7 version of JumpFlood with reusable color buffers --- build.gradle | 2 +- orx-jumpflood/src/main/kotlin/JumpFlood.kt | 121 ++++++++++-------- .../resources/shaders/gl3/contour-points.frag | 6 +- .../resources/shaders/gl3/pixel-distance.frag | 6 +- .../main/resources/shaders/gl3/threshold.frag | 2 - 5 files changed, 73 insertions(+), 64 deletions(-) diff --git a/build.gradle b/build.gradle index 5284efc7..b881630f 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { allprojects { group 'org.openrndr.extra' - version '0.0.6' + version '0.0.7' } repositories { diff --git a/orx-jumpflood/src/main/kotlin/JumpFlood.kt b/orx-jumpflood/src/main/kotlin/JumpFlood.kt index 339c1b02..45719067 100644 --- a/orx-jumpflood/src/main/kotlin/JumpFlood.kt +++ b/orx-jumpflood/src/main/kotlin/JumpFlood.kt @@ -13,7 +13,12 @@ class JumpFlood : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/jumpflood class PixelDistance : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/pixel-distance.frag"))) class ContourPoints : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/contour-points.frag"))) -class Threshold : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/threshold.frag"))) +class Threshold : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/threshold.frag"))) { + var threshold by parameters + init { + threshold = 0.5 + } +} val encodePoints by lazy { EncodePoints() } val jumpFlood by lazy { JumpFlood() } @@ -21,69 +26,75 @@ val pixelDistance by lazy { PixelDistance() } val contourPoints by lazy { ContourPoints() } val threshold by lazy { Threshold() } -/** [points] is square and power of 2 */ -fun jumpFlood(points: ColorBuffer, coordinates: List) { - encodePoints.apply(points, coordinates[0]) - val exp = Math.ceil(Math.log(points.width.toDouble()) / Math.log(2.0)).toInt() - for (i in 0 until exp) { - jumpFlood.step = i - jumpFlood.apply(coordinates[i % 2], coordinates[(i + 1) % 2]) - } -} -fun jumpFlood(drawer: Drawer, points: ColorBuffer): ColorBuffer { - val dimension = Math.max(points.width, points.height) - val exp = Math.ceil(Math.log(dimension.toDouble()) / Math.log(2.0)).toInt() - val squareDim = Math.pow(2.0, exp.toDouble()).toInt() +class JumpFlooder(val width: Int, val height: Int) { + private val dimension = Math.max(width, height) + private val exp = Math.ceil(Math.log(dimension.toDouble()) / Math.log(2.0)).toInt() + private val squareDim = Math.pow(2.0, exp.toDouble()).toInt() - val rt = renderTarget(squareDim, squareDim) { - colorBuffer() - } + private val coordinates = + listOf(colorBuffer(squareDim, squareDim, format = ColorFormat.RG, type = ColorType.FLOAT32), + colorBuffer(squareDim, squareDim, format = ColorFormat.RG, type = ColorType.FLOAT32)) - val coordinates = - listOf(colorBuffer(squareDim, squareDim, type = ColorType.FLOAT32), - colorBuffer(squareDim, squareDim, type = ColorType.FLOAT32)) - - drawer.isolatedWithTarget(rt) { - drawer.ortho(rt) - drawer.view = Matrix44.IDENTITY - drawer.model = Matrix44.IDENTITY - drawer.image(points) - } - - - jumpFlood(rt.colorBuffer(0), coordinates) - -// encodePoints.apply(rt.colorBuffer(0), coordinates[0]) -// -// -// for (i in 0 until exp) { -// jumpFlood.step = i -// jumpFlood.apply(coordinates[i % 2], coordinates[(i + 1) % 2]) -// -// } - - val final = renderTarget(points.width, points.height) { + private val final = renderTarget(width, height) { colorBuffer(type = ColorType.FLOAT32) } - pixelDistance.apply(coordinates[exp % 2], coordinates[exp % 2]) + val result: ColorBuffer get() = final.colorBuffer(0) - drawer.isolatedWithTarget(final) { - drawer.ortho(final) - drawer.view = Matrix44.IDENTITY - drawer.model = Matrix44.IDENTITY - drawer.image(coordinates[exp % 2]) + private val square = renderTarget(squareDim, squareDim) { + colorBuffer() } - coordinates.forEach { it.destroy() } + fun jumpFlood(drawer: Drawer, input: ColorBuffer) { + if (input.width != width || input.height != height) { + throw IllegalArgumentException("dimensions mismatch") + } - rt.colorBuffer(0).destroy() - rt.detachColorBuffers() - rt.destroy() + drawer.isolatedWithTarget(square) { + drawer.ortho(square) + drawer.view = Matrix44.IDENTITY + drawer.model = Matrix44.IDENTITY + drawer.image(input) + } + encodePoints.apply(square.colorBuffer(0), coordinates[0]) + val exp = Math.ceil(Math.log(input.width.toDouble()) / Math.log(2.0)).toInt() + for (i in 0 until exp) { + jumpFlood.step = i + jumpFlood.apply(coordinates[i % 2], coordinates[(i + 1) % 2]) + } - val fcb = final.colorBuffer(0) - final.detachColorBuffers() - final.destroy() - return fcb + pixelDistance.apply(coordinates[exp % 2], coordinates[exp % 2]) + drawer.isolatedWithTarget(final) { + drawer.ortho(final) + drawer.view = Matrix44.IDENTITY + drawer.model = Matrix44.IDENTITY + drawer.image(coordinates[exp % 2]) + } + } + + fun destroy(destroyFinal: Boolean = true) { + coordinates.forEach { it.destroy() } + + square.colorBuffer(0).destroy() + square.detachColorBuffers() + square.destroy() + + if (destroyFinal) { + final.colorBuffer(0).destroy() + } + final.detachColorBuffers() + + final.destroy() + + } + +} + +fun jumpFlood(drawer: Drawer, points: ColorBuffer): ColorBuffer { + val jumpFlooder = JumpFlooder(points.width, points.height) + jumpFlooder.jumpFlood(drawer, points) + val result = jumpFlooder.result + jumpFlooder.destroy(false) + return result } \ No newline at end of file diff --git a/orx-jumpflood/src/main/resources/shaders/gl3/contour-points.frag b/orx-jumpflood/src/main/resources/shaders/gl3/contour-points.frag index 8c654ac3..19a46f9f 100644 --- a/orx-jumpflood/src/main/resources/shaders/gl3/contour-points.frag +++ b/orx-jumpflood/src/main/resources/shaders/gl3/contour-points.frag @@ -6,15 +6,15 @@ in vec2 v_texCoord0; out vec4 o_color; void main() { - vec2 step = 1.0 / textureSize(tex0, 0); + vec2 stepSize = 1.0 / textureSize(tex0, 0); float ref = step(0.5 , texture(tex0, v_texCoord0).r); vec4 outc = vec4(-1.0, -1.0, 0.0, 1.0); float contour = 0.0; for (int y = -1; y <= 1; ++y) { for (int x = -1; x <= 1; ++x) { - float smp = step(0.5, texture(tex0, v_texCoord0 + vec2(x,y) * step).r); - if (smp != ref) { + float smp = step(0.5, texture(tex0, v_texCoord0 + vec2(x,y) * stepSize).r); + if (smp != ref && ref == 1.0) { contour = 1.0; } } 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 2ad2571f..32d2cc03 100644 --- a/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag +++ b/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag @@ -7,9 +7,9 @@ out vec4 o_color; void main() { vec2 size = textureSize(tex0, 0); - vec2 pixelPosition = v_texCoord0 * size; - vec2 centroidPixelPosition = texture(tex0, v_texCoord0).xy * size; - vec2 pixelDistance = centroidPixelPosition - pixelPosition; + vec2 pixelPosition = v_texCoord0; + vec2 centroidPixelPosition = texture(tex0, v_texCoord0).xy; + vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * size; o_color = vec4(pixelDistance, 0.0, 1.0); } \ No newline at end of file diff --git a/orx-jumpflood/src/main/resources/shaders/gl3/threshold.frag b/orx-jumpflood/src/main/resources/shaders/gl3/threshold.frag index 381e91f7..aa9f5a0d 100644 --- a/orx-jumpflood/src/main/resources/shaders/gl3/threshold.frag +++ b/orx-jumpflood/src/main/resources/shaders/gl3/threshold.frag @@ -7,7 +7,5 @@ out vec4 o_color; void main() { float ref = step(threshold , dot( vec3(1.0/3.0), texture(tex0, v_texCoord0).rgb )); - - o_color = vec4(ref, ref, ref, 1.0); } \ No newline at end of file