[orx-view-box] Add shouldDraw function

This commit is contained in:
Edwin Jakobs
2022-12-21 22:10:32 +01:00
parent 58359b9bab
commit bf2614ebc6
2 changed files with 56 additions and 28 deletions

View File

@@ -13,8 +13,14 @@ class ViewBox(
override val program: Program, var clientArea: Rectangle, override val program: Program, var clientArea: Rectangle,
translateMouse: Boolean = true, translateMouse: Boolean = true,
translateKeyboard: 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 override var width: Int
get() { get() {
@@ -52,10 +58,10 @@ class ViewBox(
} }
override val keyboard: KeyEvents = if (translateKeyboard) object : KeyEvents { override val keyboard: KeyEvents = if (translateKeyboard) object : KeyEvents {
override val character: Event<CharacterEvent> = Event<CharacterEvent>() override val character: Event<CharacterEvent> = Event()
override val keyDown: Event<KeyEvent> = Event<KeyEvent>() override val keyDown: Event<KeyEvent> = Event()
override val keyRepeat: Event<KeyEvent> = Event<KeyEvent>() override val keyRepeat: Event<KeyEvent> = Event()
override val keyUp: Event<KeyEvent> = Event<KeyEvent>() override val keyUp: Event<KeyEvent> = Event()
} else { } else {
program.keyboard program.keyboard
} }
@@ -178,7 +184,6 @@ class ViewBox(
} }
override fun draw() { override fun draw() {
val widthCeil = ceil(clientArea.width).toInt() val widthCeil = ceil(clientArea.width).toInt()
val heightCeil = ceil(clientArea.height).toInt() val heightCeil = ceil(clientArea.height).toInt()
@@ -195,20 +200,26 @@ class ViewBox(
resolved?.destroy() resolved?.destroy()
resolved = null resolved = null
} }
} }
if (renderTarget == null) { if (renderTarget == null) {
viewBoxReconfigured = true
val art = RenderTarget.active val art = RenderTarget.active
renderTarget = renderTarget(widthCeil, heightCeil, art.contentScale, art.multisample) { renderTarget =
renderTarget(widthCeil, heightCeil, contentScale ?: art.contentScale, multisample ?: art.multisample) {
colorBuffer() colorBuffer()
depthBuffer() depthBuffer()
} }
if (art.multisample != BufferMultisample.Disabled) { if ((multisample ?: art.multisample) != BufferMultisample.Disabled) {
resolved = colorBuffer(widthCeil, heightCeil, art.contentScale, multisample = art.multisample) resolved = colorBuffer(
widthCeil,
heightCeil,
contentScale ?: art.contentScale
)
} }
} }
if (viewBoxReconfigured || shouldDraw()) {
program.drawer.isolatedWithTarget(renderTarget!!) { program.drawer.isolatedWithTarget(renderTarget!!) {
drawer.clear(ColorRGBa.BLACK) drawer.clear(ColorRGBa.BLACK)
drawer.defaults() drawer.defaults()
@@ -220,9 +231,17 @@ class ViewBox(
extension.afterDraw(program.drawer, this@ViewBox) extension.afterDraw(program.drawer, this@ViewBox)
} }
program.drawer.defaults() program.drawer.defaults()
viewBoxReconfigured = false
}
} }
program.drawer.isolated { program.drawer.isolated {
if (resolved == null) {
program.drawer.image(renderTarget!!.colorBuffer(0), clientArea.corner) 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, area: Rectangle,
translateMouse: Boolean = true, translateMouse: Boolean = true,
translateKeyboard: Boolean = true, translateKeyboard: Boolean = true,
contentScale: Double? = null,
multisample: BufferMultisample? = null,
f: ViewBox.() -> Unit = {} f: ViewBox.() -> Unit = {}
): ViewBox { ): ViewBox {
val viewBox = ViewBox(this, area, translateMouse, translateKeyboard) val viewBox = ViewBox(this, area, translateMouse, translateKeyboard, contentScale, multisample)
viewBox.f() viewBox.f()
return viewBox return viewBox
} }

View File

@@ -1,5 +1,6 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.draw.BufferMultisample
import org.openrndr.draw.DrawPrimitive import org.openrndr.draw.DrawPrimitive
import org.openrndr.extensions.Screenshots import org.openrndr.extensions.Screenshots
import org.openrndr.extra.camera.Camera2D import org.openrndr.extra.camera.Camera2D
@@ -19,7 +20,9 @@ fun main() {
program { program {
val vbx = viewBox(Rectangle(0.0, 0.0, 200.0, 800.0)) { val vbx = viewBox(Rectangle(0.0, 0.0, 200.0, 800.0)) {
extend(Screenshots()) extend(Screenshots())
extend(Camera2D()) extend(Camera2D()).also {
shouldDraw = { it.hasChanged }
}
extend { extend {
drawer.rectangle(20.0, 20.0, 100.0, 100.0) 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)) { val vbx3d = viewBox(Rectangle(400.0, 0.0, 400.0, 800.0), multisample = BufferMultisample.SampleCount(8)) {
extend(Orbital()) extend(Orbital()).also {
this.shouldDraw = {
it.hasChanged
}
}
val cube = boxMesh() val cube = boxMesh()
extend { extend {
drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES) drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES)