From b1a7c38d6222b112c778bb04d31fc222ecb002f2 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 23 Nov 2020 15:30:52 +0900 Subject: [PATCH] texticsadapter to be actually greyscale with phosphor display --- .../tsvm/peripheral/CharacterLCDdisplay.kt | 2 +- .../tsvm/peripheral/GraphicsAdapter.kt | 49 ++++++++++++------- .../torvald/tsvm/peripheral/TexticsAdapter.kt | 24 +++++++-- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt b/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt index 779ba91..c9f261d 100644 --- a/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt +++ b/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt @@ -6,7 +6,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.tsvm.VM class CharacterLCDdisplay(vm: VM) : GraphicsAdapter(vm, AdapterConfig( - "pmlcd_inverted", 960, 400, 80, 25, 249, 255, 262144L, "./lcd.png", 0.7f + "pmlcd_inverted", 960, 400, 80, 25, 249, 255, 262144L, "./lcd.png", 0.7f, TEXT_TILING_SHADER_LCD, DRAW_SHADER_FRAG_LCD ) ) { diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index e4a05a4..bdee26c 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -11,6 +11,7 @@ import net.torvald.UnsafeHelper import net.torvald.tsvm.AppLoader import net.torvald.tsvm.VM import net.torvald.tsvm.kB +import net.torvald.tsvm.peripheral.GraphicsAdapter.Companion.DRAW_SHADER_FRAG import java.io.InputStream import java.io.OutputStream import kotlin.experimental.and @@ -25,7 +26,9 @@ data class AdapterConfig( val ttyDefaultBack: Int, val vramSize: Long, val chrRomPath: String, - val decay: Float + val decay: Float, + val fragShader: String, + val paletteShader: String = DRAW_SHADER_FRAG ) open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : @@ -56,22 +59,24 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : protected val unusedArea = ByteArray(92) protected val paletteShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, - if (theme.startsWith("pmlcd") && !theme.endsWith("_inverted")) + config.paletteShader + /*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 + DRAW_SHADER_FRAG*/ ) protected val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, - if (theme.startsWith("crt_") && !theme.endsWith("color")) + config.fragShader + /*if (theme.startsWith("crt_") && !theme.endsWith("color")) TEXT_TILING_SHADER_MONOCHROME else 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 + TEXT_TILING_SHADER_COLOUR*/ ) override var blinkCursor = true @@ -782,15 +787,6 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : companion object { val VRAM_SIZE = 256.kB() - val DEFAULT_CONFIG_COLOR_CRT = AdapterConfig( - "crt_color", - 560, 448, 80, 32, 254, 255, 256.kB(), "./cp437_fira_code.png", 0.32f - ) - val DEFAULT_CONFIG_PMLCD = AdapterConfig( - "pmlcd_inverted", - 560, 448, 80, 32, 254, 255, 256.kB(), "./FontROM7x14.png", 0.64f - ) - const val THEME_COLORCRT = "crt_color" const val THEME_GREYCRT = "crt" const val THEME_LCD = "pmlcd" @@ -876,7 +872,7 @@ void main() { } """.trimIndent() - val TEXT_TILING_SHADER = """ + val TEXT_TILING_SHADER_COLOUR = """ #version 130 #ifdef GL_ES precision mediump float; @@ -1000,6 +996,11 @@ int getTileFromColor(vec4 color) { return _colToInt(color) & 0xFFFFF; } +vec4 grey(vec4 color) { + float lum = 0.299 * color.r + 0.587 * color.g + 0.114 * color.b; // common standard used by both NTSC and PAL + return vec4(lum, lum, lum, color.a); +} + void main() { // READ THE FUCKING MANUAL, YOU DONKEY !! // @@ -1015,6 +1016,8 @@ void main() { // get required tile numbers // vec4 tileFromMap = texture2D(tilemap, flippedFragCoord / screenDimension); // raw tile number + vec4 foreColFromMap = grey(texture2D(foreColours, flippedFragCoord / screenDimension)); + vec4 backColFromMap = grey(texture2D(backColours, flippedFragCoord / screenDimension)); int tile = getTileFromColor(tileFromMap); ivec2 tileXY = getTileXY(tile); @@ -1033,9 +1036,8 @@ void main() { vec4 tileCol = texture2D(tilesAtlas, finalUVCoordForTile); - // apply colour - gl_FragColor = tileCol; - + // apply colour. I'm expecting FONT ROM IMAGE to be greyscale + gl_FragColor = mix(backColFromMap, foreColFromMap, tileCol.r); } """.trimIndent() @@ -1233,6 +1235,17 @@ void main() { } """.trimIndent() + + val DEFAULT_CONFIG_COLOR_CRT = AdapterConfig( + "crt_color", + 560, 448, 80, 32, 254, 255, 256.kB(), "./cp437_fira_code.png", 0.32f, TEXT_TILING_SHADER_COLOUR + ) + val DEFAULT_CONFIG_PMLCD = AdapterConfig( + "pmlcd_inverted", + 560, 448, 80, 32, 254, 255, 256.kB(), "./FontROM7x14.png", 0.64f, TEXT_TILING_SHADER_LCD, DRAW_SHADER_FRAG_LCD + ) + + val DEFAULT_PALETTE = intArrayOf( // 0b rrrrrrrr gggggggg bbbbbbbb aaaaaaaa 255, 17663, diff --git a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt index 840bed7..fa4e955 100644 --- a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt @@ -2,7 +2,6 @@ package net.torvald.tsvm.peripheral import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.GL20 -import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.tsvm.VM @@ -10,7 +9,7 @@ import net.torvald.tsvm.kB import kotlin.math.absoluteValue class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig( - "crt", + "crt_white", 720, 375, 80, @@ -19,7 +18,8 @@ class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig( 0, 256.kB(), "./hp2640.png", - 0.32f + 0.32f, + GraphicsAdapter.TEXT_TILING_SHADER_MONOCHROME )) { /*class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig( "crt_color", @@ -36,6 +36,14 @@ class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig( private val crtGradTex = Texture("./crt_grad.png") + companion object { + val crtColor = hashMapOf( + "white" to Color(0xe4eaffff.toInt()), + "amber" to Color(0xffb700ff.toInt()), + "green" to Color(0x4aff00ff) + ) + } + override fun peek(addr: Long): Byte? { return when (addr) { in 0 until 250880 -> (-1).toByte() @@ -52,13 +60,21 @@ class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig( private val TEX_HEIGHT = WIDTH * Math.sqrt(HEIGHT.toDouble() / WIDTH).toFloat() 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) { super.render(delta, batch, xoff, yoff) - // CRT's default grey + batch.inUse { batch.enableBlending() + + // phosphor + batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA) + batch.color = phosphorCol + batch.draw(faketex, xoff, HEIGHT + yoff, WIDTH.toFloat(), -HEIGHT.toFloat()) + + // CRT glass batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_COLOR) batch.color = Color.WHITE batch.draw(crtGradTex, xoff, HEIGHT + ALIGN + yoff, WIDTH.toFloat(), -TEX_HEIGHT)