mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-09 06:34:04 +09:00
texticsadapter to be actually greyscale with phosphor display
This commit is contained in:
@@ -6,7 +6,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
|||||||
import net.torvald.tsvm.VM
|
import net.torvald.tsvm.VM
|
||||||
|
|
||||||
class CharacterLCDdisplay(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
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
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import net.torvald.UnsafeHelper
|
|||||||
import net.torvald.tsvm.AppLoader
|
import net.torvald.tsvm.AppLoader
|
||||||
import net.torvald.tsvm.VM
|
import net.torvald.tsvm.VM
|
||||||
import net.torvald.tsvm.kB
|
import net.torvald.tsvm.kB
|
||||||
|
import net.torvald.tsvm.peripheral.GraphicsAdapter.Companion.DRAW_SHADER_FRAG
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
import kotlin.experimental.and
|
import kotlin.experimental.and
|
||||||
@@ -25,7 +26,9 @@ data class AdapterConfig(
|
|||||||
val ttyDefaultBack: Int,
|
val ttyDefaultBack: Int,
|
||||||
val vramSize: Long,
|
val vramSize: Long,
|
||||||
val chrRomPath: String,
|
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) :
|
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 unusedArea = ByteArray(92)
|
||||||
|
|
||||||
protected val paletteShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT,
|
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
|
DRAW_SHADER_FRAG_LCD_NOINV
|
||||||
else if (theme.startsWith("pmlcd"))
|
else if (theme.startsWith("pmlcd"))
|
||||||
DRAW_SHADER_FRAG_LCD
|
DRAW_SHADER_FRAG_LCD
|
||||||
else
|
else
|
||||||
DRAW_SHADER_FRAG
|
DRAW_SHADER_FRAG*/
|
||||||
)
|
)
|
||||||
protected val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT,
|
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
|
TEXT_TILING_SHADER_MONOCHROME
|
||||||
else if (theme.startsWith("pmlcd") && !theme.endsWith("_inverted"))
|
else if (theme.startsWith("pmlcd") && !theme.endsWith("_inverted"))
|
||||||
TEXT_TILING_SHADER_LCD_NOINV
|
TEXT_TILING_SHADER_LCD_NOINV
|
||||||
else if (theme.startsWith("pmlcd"))
|
else if (theme.startsWith("pmlcd"))
|
||||||
TEXT_TILING_SHADER_LCD
|
TEXT_TILING_SHADER_LCD
|
||||||
else
|
else
|
||||||
TEXT_TILING_SHADER
|
TEXT_TILING_SHADER_COLOUR*/
|
||||||
)
|
)
|
||||||
|
|
||||||
override var blinkCursor = true
|
override var blinkCursor = true
|
||||||
@@ -782,15 +787,6 @@ open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) :
|
|||||||
companion object {
|
companion object {
|
||||||
val VRAM_SIZE = 256.kB()
|
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_COLORCRT = "crt_color"
|
||||||
const val THEME_GREYCRT = "crt"
|
const val THEME_GREYCRT = "crt"
|
||||||
const val THEME_LCD = "pmlcd"
|
const val THEME_LCD = "pmlcd"
|
||||||
@@ -876,7 +872,7 @@ void main() {
|
|||||||
}
|
}
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
val TEXT_TILING_SHADER = """
|
val TEXT_TILING_SHADER_COLOUR = """
|
||||||
#version 130
|
#version 130
|
||||||
#ifdef GL_ES
|
#ifdef GL_ES
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
@@ -1000,6 +996,11 @@ int getTileFromColor(vec4 color) {
|
|||||||
return _colToInt(color) & 0xFFFFF;
|
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() {
|
void main() {
|
||||||
|
|
||||||
// READ THE FUCKING MANUAL, YOU DONKEY !! //
|
// READ THE FUCKING MANUAL, YOU DONKEY !! //
|
||||||
@@ -1015,6 +1016,8 @@ void main() {
|
|||||||
// get required tile numbers //
|
// get required tile numbers //
|
||||||
|
|
||||||
vec4 tileFromMap = texture2D(tilemap, flippedFragCoord / screenDimension); // raw tile number
|
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);
|
int tile = getTileFromColor(tileFromMap);
|
||||||
ivec2 tileXY = getTileXY(tile);
|
ivec2 tileXY = getTileXY(tile);
|
||||||
@@ -1033,9 +1036,8 @@ void main() {
|
|||||||
|
|
||||||
vec4 tileCol = texture2D(tilesAtlas, finalUVCoordForTile);
|
vec4 tileCol = texture2D(tilesAtlas, finalUVCoordForTile);
|
||||||
|
|
||||||
// apply colour
|
// apply colour. I'm expecting FONT ROM IMAGE to be greyscale
|
||||||
gl_FragColor = tileCol;
|
gl_FragColor = mix(backColFromMap, foreColFromMap, tileCol.r);
|
||||||
|
|
||||||
}
|
}
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
@@ -1233,6 +1235,17 @@ void main() {
|
|||||||
}
|
}
|
||||||
""".trimIndent()
|
""".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
|
val DEFAULT_PALETTE = intArrayOf( // 0b rrrrrrrr gggggggg bbbbbbbb aaaaaaaa
|
||||||
255,
|
255,
|
||||||
17663,
|
17663,
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package net.torvald.tsvm.peripheral
|
|||||||
|
|
||||||
import com.badlogic.gdx.graphics.Color
|
import com.badlogic.gdx.graphics.Color
|
||||||
import com.badlogic.gdx.graphics.GL20
|
import com.badlogic.gdx.graphics.GL20
|
||||||
import com.badlogic.gdx.graphics.Pixmap
|
|
||||||
import com.badlogic.gdx.graphics.Texture
|
import com.badlogic.gdx.graphics.Texture
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import net.torvald.tsvm.VM
|
import net.torvald.tsvm.VM
|
||||||
@@ -10,7 +9,7 @@ import net.torvald.tsvm.kB
|
|||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
|
||||||
class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
||||||
"crt",
|
"crt_white",
|
||||||
720,
|
720,
|
||||||
375,
|
375,
|
||||||
80,
|
80,
|
||||||
@@ -19,7 +18,8 @@ class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
|||||||
0,
|
0,
|
||||||
256.kB(),
|
256.kB(),
|
||||||
"./hp2640.png",
|
"./hp2640.png",
|
||||||
0.32f
|
0.32f,
|
||||||
|
GraphicsAdapter.TEXT_TILING_SHADER_MONOCHROME
|
||||||
)) {
|
)) {
|
||||||
/*class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
/*class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
||||||
"crt_color",
|
"crt_color",
|
||||||
@@ -36,6 +36,14 @@ class TexticsAdapter(vm: VM) : GraphicsAdapter(vm, AdapterConfig(
|
|||||||
|
|
||||||
private val crtGradTex = Texture("./crt_grad.png")
|
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? {
|
override fun peek(addr: Long): Byte? {
|
||||||
return when (addr) {
|
return when (addr) {
|
||||||
in 0 until 250880 -> (-1).toByte()
|
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 TEX_HEIGHT = WIDTH * Math.sqrt(HEIGHT.toDouble() / WIDTH).toFloat()
|
||||||
private val ALIGN = (HEIGHT - TEX_HEIGHT).absoluteValue / 2f
|
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) {
|
override fun render(delta: Float, batch: SpriteBatch, xoff: Float, yoff: Float) {
|
||||||
super.render(delta, batch, xoff, yoff)
|
super.render(delta, batch, xoff, yoff)
|
||||||
|
|
||||||
// CRT's default grey
|
|
||||||
batch.inUse {
|
batch.inUse {
|
||||||
batch.enableBlending()
|
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.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_COLOR)
|
||||||
batch.color = Color.WHITE
|
batch.color = Color.WHITE
|
||||||
batch.draw(crtGradTex, xoff, HEIGHT + ALIGN + yoff, WIDTH.toFloat(), -TEX_HEIGHT)
|
batch.draw(crtGradTex, xoff, HEIGHT + ALIGN + yoff, WIDTH.toFloat(), -TEX_HEIGHT)
|
||||||
|
|||||||
Reference in New Issue
Block a user