diff --git a/orx-view-box/src/commonMain/kotlin/ViewBox.kt b/orx-view-box/src/commonMain/kotlin/ViewBox.kt index 768d3c4e..229481a4 100644 --- a/orx-view-box/src/commonMain/kotlin/ViewBox.kt +++ b/orx-view-box/src/commonMain/kotlin/ViewBox.kt @@ -13,8 +13,14 @@ class ViewBox( override val program: Program, var clientArea: Rectangle, translateMouse: Boolean = true, translateKeyboard: Boolean = true, + val contentScale: Double? = null, + val multisample: BufferMultisample? = null - ) : Program by program { +) : Program by program { + var viewBoxReconfigured: Boolean = false + private set + + var shouldDraw: () -> Boolean = { true } override var width: Int get() { @@ -52,10 +58,10 @@ class ViewBox( } override val keyboard: KeyEvents = if (translateKeyboard) object : KeyEvents { - override val character: Event = Event() - override val keyDown: Event = Event() - override val keyRepeat: Event = Event() - override val keyUp: Event = Event() + override val character: Event = Event() + override val keyDown: Event = Event() + override val keyRepeat: Event = Event() + override val keyUp: Event = Event() } else { program.keyboard } @@ -178,7 +184,6 @@ class ViewBox( } override fun draw() { - val widthCeil = ceil(clientArea.width).toInt() val heightCeil = ceil(clientArea.height).toInt() @@ -195,34 +200,48 @@ class ViewBox( resolved?.destroy() resolved = null } - } if (renderTarget == null) { + viewBoxReconfigured = true val art = RenderTarget.active - renderTarget = renderTarget(widthCeil, heightCeil, art.contentScale, art.multisample) { - colorBuffer() - depthBuffer() - } - if (art.multisample != BufferMultisample.Disabled) { - resolved = colorBuffer(widthCeil, heightCeil, art.contentScale, multisample = art.multisample) + renderTarget = + renderTarget(widthCeil, heightCeil, contentScale ?: art.contentScale, multisample ?: art.multisample) { + colorBuffer() + depthBuffer() + } + if ((multisample ?: art.multisample) != BufferMultisample.Disabled) { + resolved = colorBuffer( + widthCeil, + heightCeil, + contentScale ?: art.contentScale + ) } } - program.drawer.isolatedWithTarget(renderTarget!!) { - drawer.clear(ColorRGBa.BLACK) - drawer.defaults() - drawer.ortho(renderTarget!!) - for (extension in extensions) { - extension.beforeDraw(program.drawer, this@ViewBox) + if (viewBoxReconfigured || shouldDraw()) { + program.drawer.isolatedWithTarget(renderTarget!!) { + drawer.clear(ColorRGBa.BLACK) + drawer.defaults() + drawer.ortho(renderTarget!!) + for (extension in extensions) { + extension.beforeDraw(program.drawer, this@ViewBox) + } + for (extension in extensions.reversed()) { + extension.afterDraw(program.drawer, this@ViewBox) + } + program.drawer.defaults() + + viewBoxReconfigured = false } - for (extension in extensions.reversed()) { - extension.afterDraw(program.drawer, this@ViewBox) - } - program.drawer.defaults() } program.drawer.isolated { - program.drawer.image(renderTarget!!.colorBuffer(0), clientArea.corner) + if (resolved == null) { + program.drawer.image(renderTarget!!.colorBuffer(0), clientArea.corner) + } else { + renderTarget!!.colorBuffer(0).copyTo(resolved!!) + program.drawer.image(resolved!!, clientArea.corner) + } } } } @@ -239,9 +258,11 @@ fun Program.viewBox( area: Rectangle, translateMouse: Boolean = true, translateKeyboard: Boolean = true, + contentScale: Double? = null, + multisample: BufferMultisample? = null, f: ViewBox.() -> Unit = {} ): ViewBox { - val viewBox = ViewBox(this, area, translateMouse, translateKeyboard) + val viewBox = ViewBox(this, area, translateMouse, translateKeyboard, contentScale, multisample) viewBox.f() return viewBox } \ No newline at end of file diff --git a/orx-view-box/src/demo/kotlin/DemoViewBox01.kt b/orx-view-box/src/demo/kotlin/DemoViewBox01.kt index e930e3b7..63154704 100644 --- a/orx-view-box/src/demo/kotlin/DemoViewBox01.kt +++ b/orx-view-box/src/demo/kotlin/DemoViewBox01.kt @@ -1,5 +1,6 @@ import org.openrndr.application +import org.openrndr.draw.BufferMultisample import org.openrndr.draw.DrawPrimitive import org.openrndr.extensions.Screenshots import org.openrndr.extra.camera.Camera2D @@ -19,7 +20,9 @@ fun main() { program { val vbx = viewBox(Rectangle(0.0, 0.0, 200.0, 800.0)) { extend(Screenshots()) - extend(Camera2D()) + extend(Camera2D()).also { + shouldDraw = { it.hasChanged } + } extend { drawer.rectangle(20.0, 20.0, 100.0, 100.0) } @@ -41,8 +44,12 @@ fun main() { } } - val vbx3d = viewBox(Rectangle(400.0, 0.0, 400.0, 800.0)) { - extend(Orbital()) + val vbx3d = viewBox(Rectangle(400.0, 0.0, 400.0, 800.0), multisample = BufferMultisample.SampleCount(8)) { + extend(Orbital()).also { + this.shouldDraw = { + it.hasChanged + } + } val cube = boxMesh() extend { drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES)