diff --git a/orx-compositor/src/demo/kotlin/DemoUse01.kt b/orx-compositor/src/demo/kotlin/DemoUse01.kt new file mode 100644 index 00000000..f275b3f0 --- /dev/null +++ b/orx-compositor/src/demo/kotlin/DemoUse01.kt @@ -0,0 +1,90 @@ +import org.openrndr.application +import org.openrndr.color.ColorRGBa +import org.openrndr.color.rgb +import org.openrndr.extensions.SingleScreenshot +import org.openrndr.extra.compositor.* +import org.openrndr.extra.fx.blend.Add +import org.openrndr.extra.fx.blur.ApproximateGaussianBlur +import org.openrndr.extra.fx.color.ColorCorrection +import kotlin.random.Random + +/** + * Compositor demo of `use`, which makes it possible to + * use the color buffer of a previous layer. + * + * This program draws a series of concentric rings, most of them gray, + * 10% are pink. + * + * In a second layer we reuse that image with rings, applying an extreme + * color correction to make everything black except the pink rings, + * then apply a strong blur and finally compose it over the original + * image using blend mode Add. + * + * The result is an sharp image of gray rings with glowing pink rings. + * + * Note: see also orx-fx Bloom() + * + */ + +// Toggle to see the difference between a simple blur and multilayer bloom +const val effectEnabled = true + +fun main() = application { + configure { + width = 900 + height = 900 + } + + program { + // -- this block is for automation purposes only + if (System.getProperty("takeScreenshot") == "true") { + extend(SingleScreenshot()) { + this.outputFile = System.getProperty("screenshotPath") + } + } + + val composite = compose { + val circles = layer { + draw { + drawer.stroke = null + val rnd = Random(frameCount / 100 + 1) + for (i in 18 downTo 0) { + drawer.fill = if (rnd.nextDouble() < 0.1) + ColorRGBa.PINK.shade(Random.nextDouble(0.88, 1.0)) + else + rgb(rnd.nextInt(6) / 15.0) + + drawer.circle(drawer.bounds.center, 50.0 + i * 20) + } + } + // A. To see how the plain blur looks like + if (!effectEnabled) { + post(ApproximateGaussianBlur()) { + sigma = 25.0 + window = 25 + } + } + } + // B. This is the bloom effect + if (effectEnabled) { + layer { + use(circles) // <-- use the previous layer as starting point + post(ColorCorrection()) { + brightness = -0.3 + contrast = 0.8 + } + post(ApproximateGaussianBlur()) { + sigma = 25.0 + window = 25 + } + blend(Add()) + } + } + } + + extend { + drawer.clear(rgb(0.2)) + composite.draw(drawer) + } + } +}