84 lines
3.1 KiB
Kotlin
84 lines
3.1 KiB
Kotlin
import org.openrndr.MouseButton
|
|
import org.openrndr.MouseTracker
|
|
import org.openrndr.application
|
|
import org.openrndr.color.ColorHSVa
|
|
import org.openrndr.color.ColorRGBa
|
|
import org.openrndr.color.rgb
|
|
import org.openrndr.draw.ColorType
|
|
import org.openrndr.draw.colorBuffer
|
|
import org.openrndr.draw.isolatedWithTarget
|
|
import org.openrndr.draw.renderTarget
|
|
import org.openrndr.extra.noise.uniform
|
|
import org.openrndr.math.Polar
|
|
import org.openrndr.math.clamp
|
|
import org.openrndr.poissonfill.PoissonFill
|
|
import org.openrndr.shape.Rectangle
|
|
import kotlin.math.sin
|
|
|
|
|
|
fun main() {
|
|
data class Thing(val color: ColorRGBa, var pos: Polar, val speed: Polar)
|
|
application {
|
|
program {
|
|
val dry = renderTarget(width, height) {
|
|
colorBuffer(type = ColorType.FLOAT32)
|
|
}
|
|
val wet = colorBuffer(width, height, type = ColorType.FLOAT32)
|
|
|
|
val fx = PoissonFill()
|
|
|
|
var borderOpacity = 0.0
|
|
|
|
// Create a list of things with
|
|
// color, polar position and polar speed
|
|
val things = List(10) {
|
|
Thing(
|
|
ColorHSVa(it * 182.0,
|
|
Double.uniform(0.3, 0.6),
|
|
Double.uniform(0.1, 0.9)).toRGBa(),
|
|
Polar(Double.uniform(0.0, 360.0),
|
|
100.0 + it * 10.0),
|
|
Polar(Double.uniform(-1.0, 1.0), 0.0))
|
|
}
|
|
val mouseTracker = MouseTracker(mouse)
|
|
|
|
extend {
|
|
drawer.isolatedWithTarget(dry) {
|
|
stroke = null
|
|
clear(ColorRGBa.TRANSPARENT)
|
|
|
|
// draw color circles
|
|
things.forEach { thing ->
|
|
fill = thing.color.shade(0.9 +
|
|
0.1 * sin(thing.pos.theta * 0.3))
|
|
circle(thing.pos.cartesian + bounds.center, 5.0)
|
|
// A. Use after fix in Polar.kt
|
|
//thing.pos += thing.speed
|
|
// B. temporary solution
|
|
thing.pos = Polar(thing.pos.theta +
|
|
thing.speed.theta, thing.pos.radius)
|
|
}
|
|
|
|
// draw dark gray window border.
|
|
// hold mouse button to fade in.
|
|
borderOpacity += if (MouseButton.LEFT in mouseTracker.pressedButtons) 0.01 else -0.01
|
|
borderOpacity = borderOpacity.clamp(0.0, 1.0)
|
|
stroke = rgb(0.2).opacify(borderOpacity)
|
|
fill = null
|
|
strokeWeight = 3.0
|
|
rectangle(bounds)
|
|
}
|
|
|
|
fx.apply(dry.colorBuffer(0), wet)
|
|
drawer.image(wet)
|
|
|
|
// draw white rectangle
|
|
drawer.stroke = ColorRGBa.WHITE.opacify(0.9)
|
|
drawer.fill = null
|
|
drawer.strokeWeight = 6.0
|
|
drawer.rectangle(Rectangle.fromCenter(drawer.bounds.center,
|
|
300.0, 300.0))
|
|
}
|
|
}
|
|
}
|
|
} |