package time import java.time.LocalTime import org.openrndr.application import org.openrndr.color.* import org.openrndr.draw.* import org.openrndr.math.* import phenax.utils.* fun main() = application { recordDuration(20.seconds()) if (captureEnabled) { configure { width = 1920 height = 1080 windowResizable = false } } else { configure { width = 640 height = 360 windowResizable = false } } oliveProgram { val enableAntialiasing = captureEnabled val charSize = 200.0 val font = program.loadFont("data/fonts/default.otf", charSize) val cs by liveComputeShader("time") val scale = if (enableAntialiasing) 2 else 1 val computeShaderBuffer = colorBuffer(scale * width, scale * height, type = ColorType.UINT8) val characters = 0..9 val textTarget = renderTarget(charSize.toInt() * characters.count(), charSize.toInt()) { colorBuffer(type = ColorType.UINT8) } extend { drawer.isolatedWithTarget(textTarget) { drawer.clear(ColorRGBa.TRANSPARENT) drawer.ortho(textTarget) drawer.fontMap = font drawer.fill = ColorRGBa.WHITE for (char in characters) { drawer.text(char.toString(), Vector2(char * charSize.toDouble(), charSize / 2.0 + 5)) } } val textBuffer = textTarget.colorBuffer(0) cs.image("text_texture", 2, textBuffer.imageBinding(0, ImageAccess.READ)) val time = LocalTime.now() if (recordingEnabled) { cs.uniform("hours", 10.0) cs.uniform("minutes", 10.0 + seconds / 60.0) } else { cs.uniform("hours", time.getHour().toFloat()) cs.uniform("minutes", time.getMinute().toFloat()) } cs.uniform("time", seconds) cs.image("output_image", 0, computeShaderBuffer.imageBinding(0, ImageAccess.WRITE)) cs.execute(computeShaderBuffer.width, computeShaderBuffer.height, 1) drawer.image(computeShaderBuffer, 0.0, 0.0, width.toDouble(), height.toDouble()) } } }