diff --git a/src/net/torvald/tsvm/VMGUI.kt b/src/net/torvald/tsvm/VMGUI.kt index 6d0721c..b891ecb 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/src/net/torvald/tsvm/VMGUI.kt @@ -29,7 +29,7 @@ class VMGUI(val appConfig: LwjglApplicationConfiguration) : ApplicationAdapter() override fun create() { super.create() - gpu = GraphicsAdapter(vm, lcdMode = false) + gpu = GraphicsAdapter(vm, theme = GraphicsAdapter.THEME_COLORCRT) vm.peripheralTable[1] = PeripheralEntry( VM.PERITYPE_GPU_AND_TERM, diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index d415ad7..5be14a3 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -15,7 +15,7 @@ import java.io.InputStream import java.io.OutputStream import kotlin.experimental.and -open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: Boolean = true) : GlassTty(Companion.TEXT_ROWS, Companion.TEXT_COLS), PeriBase { +open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Companion.TEXT_ROWS, Companion.TEXT_COLS), PeriBase { override fun getVM(): VM { return vm @@ -34,8 +34,22 @@ open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: internal val spriteAndTextArea = UnsafeHelper.allocate(10660L) protected val unusedArea = ByteArray(92) - protected val paletteShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, if (lcdMode && !lcdInvert) DRAW_SHADER_FRAG_LCD_NOINV else if (lcdMode) DRAW_SHADER_FRAG_LCD else DRAW_SHADER_FRAG) - protected val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, if (lcdMode && !lcdInvert) TEXT_TILING_SHADER_LCD_NOINV else if (lcdMode) TEXT_TILING_SHADER_LCD else TEXT_TILING_SHADER) + protected val paletteShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, + if (theme.startsWith("pmlcd") && !theme.endsWith("_inverted")) + DRAW_SHADER_FRAG_LCD_NOINV + else if (theme.startsWith("pmlcd")) + DRAW_SHADER_FRAG_LCD + else + DRAW_SHADER_FRAG + ) + protected val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, + if (theme.startsWith("pmlcd") && !theme.endsWith("_inverted")) + TEXT_TILING_SHADER_LCD_NOINV + else if (theme.startsWith("pmlcd")) + TEXT_TILING_SHADER_LCD + else + TEXT_TILING_SHADER + ) override var blinkCursor = true override var ttyRawMode = false @@ -525,7 +539,7 @@ open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: private var textCursorBlinkTimer = 0f private val textCursorBlinkInterval = 0.5f private var textCursorIsOn = true - private var glowDecay = if (lcdMode) 0.63f else 0.32f + private var glowDecay = if (theme.startsWith("pmlcd")) 0.63f else 0.32f private var decayColor = Color(1f, 1f, 1f, 1f - glowDecay) fun render(delta: Float, batch: SpriteBatch, x: Float, y: Float) { @@ -552,7 +566,7 @@ open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: batch.inUse { // clear screen - batch.color = if (lcdMode) LCD_BASE_COL else clearCol + batch.color = if (theme.startsWith("pmlcd")) LCD_BASE_COL else clearCol batch.draw(faketex, 0f, 0f, WIDTH.toFloat(), HEIGHT.toFloat()) @@ -564,7 +578,7 @@ open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: // must be done every time the shader is "actually loaded" // try this: if above line precedes 'batch.shader = paletteShader', it won't work batch.shader.setUniform4fv("pal", paletteOfFloats, 0, paletteOfFloats.size) - if (lcdMode) batch.shader.setUniformf("lcdBaseCol", LCD_BASE_COL) + if (theme.startsWith("pmlcd")) batch.shader.setUniformf("lcdBaseCol", LCD_BASE_COL) // draw framebuffer batch.draw(rendertex, x, y) @@ -638,7 +652,7 @@ open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: textShader.setUniformf("screenDimension", WIDTH.toFloat(), HEIGHT.toFloat()) textShader.setUniformf("tilesInAtlas", 16f, 16f) textShader.setUniformf("atlasTexSize", chrrom0.width.toFloat(), chrrom0.height.toFloat()) - if (lcdMode) batch.shader.setUniformf("lcdBaseCol", LCD_BASE_COL) + if (theme.startsWith("pmlcd")) batch.shader.setUniformf("lcdBaseCol", LCD_BASE_COL) batch.draw(faketex, 0f, 0f, WIDTH.toFloat(), HEIGHT.toFloat()) @@ -718,6 +732,11 @@ open class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false, lcdInvert: private fun Boolean.toInt() = if (this) 1 else 0 companion object { + const val THEME_COLORCRT = "crt_color" + const val THEME_GREYCRT = "crt" + const val THEME_LCD = "pmlcd" + const val THEME_LCD_INVERTED = "pmlcd_inverted" + const val WIDTH = 560 const val HEIGHT = 448 const val TEXT_COLS = 80 diff --git a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt index 5c7325f..f8dea5c 100644 --- a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt @@ -2,7 +2,7 @@ package net.torvald.tsvm.peripheral import net.torvald.tsvm.VM -class TexticsAdapter(vm: VM, lcdMode: Boolean = false, lcdInvert: Boolean = true) : GraphicsAdapter(vm, lcdMode, lcdInvert) { +class TexticsAdapter(vm: VM, theme: String) : GraphicsAdapter(vm, theme) { override fun peek(addr: Long): Byte? { return when (addr) {