From 414a0fcc95cb391d107d66d2c979ddc5e461792d Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sun, 2 Dec 2018 19:09:35 +0100 Subject: [PATCH] Bump version to 0.0.15 Add thresholded image to result of jump flood --- build.gradle | 4 +- orx-jumpflood/src/main/kotlin/JumpFlood.kt | 256 +++++++++--------- .../resources/shaders/gl3/pixel-distance.frag | 29 +- 3 files changed, 145 insertions(+), 144 deletions(-) diff --git a/build.gradle b/build.gradle index 700f88c9..0fd7f574 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { allprojects { group 'org.openrndr.extra' - version '0.0.14' + version '0.0.15' } repositories { @@ -13,7 +13,7 @@ repositories { } ext { - openrndrVersion = "0.3.30-rc2" + openrndrVersion = "0.3.30" } subprojects { diff --git a/orx-jumpflood/src/main/kotlin/JumpFlood.kt b/orx-jumpflood/src/main/kotlin/JumpFlood.kt index d8767dcc..b1104d9d 100644 --- a/orx-jumpflood/src/main/kotlin/JumpFlood.kt +++ b/orx-jumpflood/src/main/kotlin/JumpFlood.kt @@ -1,129 +1,129 @@ -package org.openrndr.extra.jumpfill - -import org.openrndr.color.ColorRGBa -import org.openrndr.draw.* -import org.openrndr.filter.filterShaderFromUrl -import org.openrndr.math.Matrix44 -import org.openrndr.math.Vector2 -import org.openrndr.resourceUrl - -class EncodePoints : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/encode-points.frag"))) -class JumpFlood : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/jumpflood.frag"))) { - var maxSteps: Int by parameters - var step: Int by parameters -} - -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"))) { - var threshold by parameters - - init { - threshold = 0.5 - } -} - -val encodePoints by lazy { EncodePoints() } -val jumpFlood by lazy { JumpFlood() } -val pixelDistance by lazy { PixelDistance() } -val contourPoints by lazy { ContourPoints() } -val threshold by lazy { Threshold() } - - -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() - - private val coordinates = - listOf(colorBuffer(squareDim, squareDim, format = ColorFormat.RG, type = ColorType.FLOAT32), - colorBuffer(squareDim, squareDim, format = ColorFormat.RG, type = ColorType.FLOAT32)) - - private val final = renderTarget(width, height) { - colorBuffer(type = ColorType.FLOAT32) - } - - val result: ColorBuffer get() = final.colorBuffer(0) - - private val square = renderTarget(squareDim, squareDim) { - colorBuffer() - } - - private var contourUsed = false - private val thresholded by lazy { colorBuffer(width, height) } - private val edges by lazy { colorBuffer(width, height) } - - fun distanceToContour(drawer: Drawer, input: ColorBuffer, thresholdValue: Double = 0.5): ColorBuffer { - threshold.threshold = thresholdValue - threshold.apply(input, thresholded) - contourPoints.apply(thresholded, edges) - contourUsed = true - return jumpFlood(drawer, edges) - } - - fun directions(xRange: IntProgression = 0 until width, yRange: IntProgression = 0 until height): Array> { - result.shadow.download() - return result.shadow.mapIndexed(xRange, yRange) { _, _, r, g, _, _ -> Vector2(r, g) } - } - - - fun jumpFlood(drawer: Drawer, input: ColorBuffer): ColorBuffer { - if (input.width != width || input.height != height) { - throw IllegalArgumentException("dimensions mismatch") - } - - drawer.isolatedWithTarget(square) { - drawer.background(ColorRGBa.BLACK) - drawer.ortho(square) - drawer.view = Matrix44.IDENTITY - drawer.model = Matrix44.IDENTITY - drawer.image(input) - } - encodePoints.apply(square.colorBuffer(0), coordinates[0]) - - for (i in 0 until exp) { - jumpFlood.step = i - jumpFlood.apply(coordinates[i % 2], coordinates[(i + 1) % 2]) - } - - pixelDistance.apply(coordinates[exp % 2], coordinates[exp % 2]) - drawer.isolatedWithTarget(final) { - drawer.background(ColorRGBa.BLACK) - drawer.ortho(final) - drawer.view = Matrix44.IDENTITY - drawer.model = Matrix44.IDENTITY - drawer.image(coordinates[exp % 2]) - } - return result - } - - 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() - - if (contourUsed) { - edges.destroy() - thresholded.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 +package org.openrndr.extra.jumpfill + +import org.openrndr.color.ColorRGBa +import org.openrndr.draw.* +import org.openrndr.filter.filterShaderFromUrl +import org.openrndr.math.Matrix44 +import org.openrndr.math.Vector2 +import org.openrndr.resourceUrl + +class EncodePoints : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/encode-points.frag"))) +class JumpFlood : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/jumpflood.frag"))) { + var maxSteps: Int by parameters + var step: Int by parameters +} + +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"))) { + var threshold by parameters + + init { + threshold = 0.5 + } +} + +val encodePoints by lazy { EncodePoints() } +val jumpFlood by lazy { JumpFlood() } +val pixelDistance by lazy { PixelDistance() } +val contourPoints by lazy { ContourPoints() } +val threshold by lazy { Threshold() } + + +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() + + private val coordinates = + listOf(colorBuffer(squareDim, squareDim, format = ColorFormat.RGB, type = ColorType.FLOAT32), + colorBuffer(squareDim, squareDim, format = ColorFormat.RGB, type = ColorType.FLOAT32)) + + private val final = renderTarget(width, height) { + colorBuffer(type = ColorType.FLOAT32) + } + + val result: ColorBuffer get() = final.colorBuffer(0) + + private val square = renderTarget(squareDim, squareDim) { + colorBuffer() + } + + private var contourUsed = false + private val thresholded by lazy { colorBuffer(width, height) } + private val edges by lazy { colorBuffer(width, height) } + + fun distanceToContour(drawer: Drawer, input: ColorBuffer, thresholdValue: Double = 0.5): ColorBuffer { + threshold.threshold = thresholdValue + threshold.apply(input, thresholded) + contourPoints.apply(thresholded, edges) + contourUsed = true + return jumpFlood(drawer, edges) + } + + fun directions(xRange: IntProgression = 0 until width, yRange: IntProgression = 0 until height): Array> { + result.shadow.download() + return result.shadow.mapIndexed(xRange, yRange) { _, _, r, g, _, _ -> Vector2(r, g) } + } + + + fun jumpFlood(drawer: Drawer, input: ColorBuffer): ColorBuffer { + if (input.width != width || input.height != height) { + throw IllegalArgumentException("dimensions mismatch") + } + + drawer.isolatedWithTarget(square) { + drawer.background(ColorRGBa.BLACK) + drawer.ortho(square) + drawer.view = Matrix44.IDENTITY + drawer.model = Matrix44.IDENTITY + drawer.image(input) + } + encodePoints.apply(square.colorBuffer(0), coordinates[0]) + + for (i in 0 until exp) { + jumpFlood.step = i + jumpFlood.apply(coordinates[i % 2], coordinates[(i + 1) % 2]) + } + + pixelDistance.apply( arrayOf(coordinates[exp % 2], thresholded), coordinates[exp % 2]) + drawer.isolatedWithTarget(final) { + drawer.background(ColorRGBa.BLACK) + drawer.ortho(final) + drawer.view = Matrix44.IDENTITY + drawer.model = Matrix44.IDENTITY + drawer.image(coordinates[exp % 2]) + } + return result + } + + 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() + + if (contourUsed) { + edges.destroy() + thresholded.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/pixel-distance.frag b/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag index 7a5c2079..2d81a52b 100644 --- a/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag +++ b/orx-jumpflood/src/main/resources/shaders/gl3/pixel-distance.frag @@ -1,15 +1,16 @@ -#version 330 core - -uniform sampler2D tex0; -in vec2 v_texCoord0; - -out vec4 o_color; - -void main() { - vec2 size = textureSize(tex0, 0); - vec2 pixelPosition = v_texCoord0; - vec2 centroidPixelPosition = texture(tex0, v_texCoord0).xy; - vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * size * vec2(1.0, -1.0); - - o_color = vec4(pixelDistance, 0.0, 1.0); +#version 330 core + +uniform sampler2D tex0; +uniform sampler2D tex1; +in vec2 v_texCoord0; + +out vec4 o_color; + +void main() { + vec2 size = textureSize(tex0, 0); + vec2 pixelPosition = v_texCoord0; + vec2 centroidPixelPosition = texture(tex0, v_texCoord0).xy; + vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * size * vec2(1.0, -1.0); + float threshold = texture(tex1, v_texCoord0).r; + o_color = vec4(pixelDistance, threshold, 1.0); } \ No newline at end of file