diff --git a/tsvm_core/src/net/torvald/tsvm/FBM.kt b/tsvm_core/src/net/torvald/tsvm/FBM.kt new file mode 100644 index 0000000..1136b0b --- /dev/null +++ b/tsvm_core/src/net/torvald/tsvm/FBM.kt @@ -0,0 +1,29 @@ +package net.torvald.tsvm + +import com.badlogic.gdx.graphics.glutils.FrameBuffer +import java.util.* + +/** + * Nested FBOs are just not a thing in GL! + * + * Created by minjaesong on 2018-07-03. + * + * @link https://stackoverflow.com/questions/25471727/libgdx-nested-framebuffer + */ +internal object FBM { + private val stack = Stack() + + fun begin(buffer: FrameBuffer) { + if (!stack.isEmpty()) { + stack.peek().end() + } + stack.push(buffer).begin() + } + + fun end() { + stack.pop().end() + if (!stack.isEmpty()) { + stack.peek().begin() + } + } +} \ No newline at end of file diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt index db64cab..cfc6fb4 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt @@ -3,6 +3,7 @@ package net.torvald.tsvm.peripheral import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.graphics.glutils.FrameBuffer import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUlong import net.torvald.tsvm.TsvmTextureRegionPack import net.torvald.tsvm.VM @@ -29,16 +30,23 @@ class CharacterLCDdisplay(assetsRoot: String, vm: VM) : GraphicsAdapter(assetsRo } }*/ - override fun render(delta: Float, batch: SpriteBatch, xoff: Float, yoff: Float, flipY: Boolean) { + override fun render( + delta: Float, + batch: SpriteBatch, + xoff: Float, + yoff: Float, + flipY: Boolean, + uiFBO: FrameBuffer? + ) { batch.shader = null batch.inUse { batch.color = Color.WHITE batch.draw(machine, xoff, yoff) } if (!flipY) - super.render(delta, batch, xoff+74, yoff+102, flipY) + super.render(delta, batch, xoff+74, yoff+102, flipY, uiFBO) else - super.render(delta, batch, xoff+74, yoff+72, flipY) + super.render(delta, batch, xoff+74, yoff+72, flipY, uiFBO) // draw BMS and RTC val batPerc = "89" diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index 58de29f..0f89839 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -6,11 +6,10 @@ import com.badlogic.gdx.graphics.g2d.Gdx2DPixmap import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.glutils.FrameBuffer -import com.badlogic.gdx.graphics.glutils.PixmapTextureData import com.badlogic.gdx.math.Matrix4 -import com.badlogic.gdx.utils.GdxRuntimeException import net.torvald.UnsafeHelper import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint +import net.torvald.tsvm.FBM import net.torvald.tsvm.LoadShader import net.torvald.tsvm.VM import net.torvald.tsvm.kB @@ -710,7 +709,10 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi unusedArea[1].toInt().and(15).toFloat() / 15f, unusedArea[2].toInt().and(15).toFloat() / 15f, 1f) - open fun render(delta: Float, uiBatch: SpriteBatch, xoff: Float, yoff: Float, flipY: Boolean = false) { + open fun render(delta: Float, uiBatch: SpriteBatch, xoff: Float, yoff: Float, flipY: Boolean = false, uiFBO: FrameBuffer? = null) { + uiFBO?.end() + + // must reset positions as pixmaps expect them to be zero framebuffer.pixels.position(0) chrrom.pixels.position(0) @@ -880,6 +882,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi outFBObatch.draw(outFBOregion[0], 0f, HEIGHT.toFloat(), WIDTH.toFloat(), -HEIGHT.toFloat()) } } + uiFBO?.begin() uiBatch.inUse { uiBatch.shader = null @@ -1753,9 +1756,9 @@ internal infix fun Int.fmod(other: Int): Int { } internal fun FrameBuffer.inUse(action: () -> Unit) { - this.begin() + FBM.begin(this) action() - this.end() + FBM.end() } internal fun SpriteBatch.inUse(action: () -> Unit) { diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt index 6825df5..7f7e485 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.GL20 import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.graphics.glutils.FrameBuffer import net.torvald.tsvm.VM import net.torvald.tsvm.kB import kotlin.math.absoluteValue @@ -38,9 +39,16 @@ open class TexticsAdapterBase(assetsRoot: String, vm: VM, config: AdapterConfig) private val ALIGN = (HEIGHT - TEX_HEIGHT).absoluteValue / 2f private val phosphorCol = crtColor[theme.substring(4)] ?: crtColor["white"] - override fun render(delta: Float, batch: SpriteBatch, xoff: Float, yoff: Float, flipY: Boolean) { + override fun render( + delta: Float, + batch: SpriteBatch, + xoff: Float, + yoff: Float, + flipY: Boolean, + uiFBO: FrameBuffer? + ) { - super.render(delta, batch, xoff, yoff, flipY) + super.render(delta, batch, xoff, yoff, flipY, uiFBO) batch.inUse { batch.enableBlending()