Files
orx/orx-compute-graph-nodes/src/jvmMain/kotlin/DrawCacheNode.kt
2024-01-14 18:38:46 +01:00

99 lines
3.1 KiB
Kotlin

package org.openrndr.extra.computegraph.nodes
import io.github.oshai.kotlinlogging.KotlinLogging
import org.openrndr.KEY_SPACEBAR
import org.openrndr.Program
import org.openrndr.RequestAssetsEvent
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.*
import org.openrndr.extra.computegraph.ComputeGraph
import org.openrndr.extra.computegraph.ComputeNode
import org.openrndr.extra.computegraph.withKey
import java.io.File
val logger = KotlinLogging.logger { }
private data class RenderTargetDescription(val width: Int, val height: Int, val contentScale: Double)
private fun RenderTarget.description() = RenderTargetDescription(width, height, contentScale)
fun ComputeGraph.drawCacheNode(
program: Program,
inputNodes: List<ComputeNode>,
draw: Program.(node: ComputeNode) -> Unit
): ComputeNode {
return node {
var producingAssets: Boolean by inputs
producingAssets = false
program.keyboard.keyDown.listen {
if (!it.propagationCancelled) {
logger.info { "requesting assets" }
if (it.key == KEY_SPACEBAR) {
program.requestAssets.trigger(RequestAssetsEvent(this, program))
}
}
}
var screenshotTarget = ""
program.produceAssets.listen {
producingAssets = true
screenshotTarget = "screenshots/${it.assetMetadata.assetBaseName}.png"
}
name = "draw-cache"
var rt = renderTarget(program.width, program.height) {
colorBuffer()
depthBuffer()
}
var outputImage: ColorBuffer by outputs.withKey("image")
outputImage = rt.colorBuffer(0)
var description: RenderTargetDescription by inputs
description = RenderTarget.active.description()
update {
description = RenderTarget.active.description()
}
val defaultContentScale = program.window.contentScale
compute {
rt.colorBuffer(0).destroy()
rt.depthBuffer?.destroy()
rt.detachColorAttachments()
rt.detachDepthBuffer()
rt.destroy()
rt = renderTarget(
program.width,
program.height,
contentScale = if (producingAssets) 6.0 else defaultContentScale
) {
colorBuffer()
depthBuffer()
}
program.drawer.isolatedWithTarget(rt) {
clear(ColorRGBa.WHITE)
draw(program, this@node)
}
outputImage = rt.colorBuffer(0)
println(outputImage)
if (producingAssets) {
logger.info { "saving draw cache to file" }
val directory = File("screenshots")
if (!directory.exists()) {
directory.mkdirs()
}
outputImage.saveToFile(File(screenshotTarget), async = false)
producingAssets = false
screenshotTarget = ""
}
}
for (input in inputNodes) {
dependOn(input)
}
}
}