mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-11 06:11:50 +09:00
133 lines
4.8 KiB
Kotlin
133 lines
4.8 KiB
Kotlin
package net.torvald.terrarum
|
|
|
|
import com.badlogic.gdx.Gdx
|
|
import com.badlogic.gdx.graphics.Color
|
|
import com.badlogic.gdx.graphics.GL20
|
|
import com.badlogic.gdx.graphics.OrthographicCamera
|
|
import com.badlogic.gdx.graphics.Texture
|
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
|
import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
|
import com.badlogic.gdx.graphics.glutils.ShaderProgram
|
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
|
import com.badlogic.gdx.math.Matrix4
|
|
import kotlin.system.measureNanoTime
|
|
|
|
/**
|
|
* Must be called by the App Loader
|
|
*/
|
|
object PostProcessor {
|
|
|
|
private lateinit var batch: SpriteBatch // not nulling to save some lines of code
|
|
private lateinit var shapeRenderer: ShapeRenderer
|
|
private lateinit var camera: OrthographicCamera
|
|
|
|
private lateinit var lutTex: Texture
|
|
|
|
private var init = false
|
|
|
|
fun reloadLUT(filename: String) {
|
|
lutTex = Texture(Gdx.files.internal("assets/clut/$filename"))
|
|
}
|
|
|
|
private val defaultResCol = Color(0x66ffff66)
|
|
private val safeAreaCol = Color(0xffffff66.toInt())
|
|
private val safeAreaCol2 = Color(0xffffff44.toInt())
|
|
|
|
fun draw(projMat: Matrix4, fbo: FrameBuffer) {
|
|
|
|
// init
|
|
if (!init) {
|
|
batch = SpriteBatch()
|
|
camera = OrthographicCamera(AppLoader.screenW.toFloat(), AppLoader.screenH.toFloat())
|
|
camera.setToOrtho(true)
|
|
|
|
batch.projectionMatrix = camera.combined
|
|
|
|
shapeRenderer = ShapeRenderer()
|
|
Gdx.gl20.glViewport(0, 0, AppLoader.appConfig.width, AppLoader.appConfig.height)
|
|
}
|
|
|
|
|
|
|
|
|
|
AppLoader.debugTimers["Renderer.PostProcessor"] = measureNanoTime {
|
|
|
|
gdxClearAndSetBlend(.094f, .094f, .094f, 0f)
|
|
|
|
val shader: ShaderProgram? =
|
|
if (AppLoader.getConfigBoolean("fxdither"))
|
|
AppLoader.shaderHicolour
|
|
else
|
|
null
|
|
|
|
fbo.colorBufferTexture.bind(0)
|
|
|
|
shader?.begin()
|
|
shader?.setUniformMatrix("u_projTrans", projMat)
|
|
shader?.setUniformi("u_texture", 0)
|
|
AppLoader.fullscreenQuad.render(shader, GL20.GL_TRIANGLES)
|
|
shader?.end()
|
|
|
|
|
|
Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it
|
|
|
|
if (AppLoader.IS_DEVELOPMENT_BUILD) {
|
|
val tvSafeAreaW = AppLoader.getTvSafeGraphicsWidth().toFloat()
|
|
val tvSafeAreaH = AppLoader.getTvSafeGraphicsHeight().toFloat()
|
|
val tvSafeArea2W = AppLoader.getTvSafeActionWidth().toFloat()
|
|
val tvSafeArea2H = AppLoader.getTvSafeActionHeight().toFloat()
|
|
|
|
shapeRenderer.inUse(ShapeRenderer.ShapeType.Line) {
|
|
shapeRenderer.color = safeAreaCol2
|
|
shapeRenderer.rect(
|
|
tvSafeArea2W, tvSafeArea2H, AppLoader.screenW - 2 * tvSafeArea2W, AppLoader.screenH - 2 * tvSafeArea2H
|
|
)
|
|
|
|
shapeRenderer.color = safeAreaCol
|
|
shapeRenderer.rect(
|
|
tvSafeAreaW, tvSafeAreaH, AppLoader.screenW - 2 * tvSafeAreaW, AppLoader.screenH - 2 * tvSafeAreaH
|
|
)
|
|
|
|
shapeRenderer.color = defaultResCol
|
|
shapeRenderer.rect(
|
|
(AppLoader.screenW - AppLoader.defaultW).div(2).toFloat(),
|
|
(AppLoader.screenH - AppLoader.defaultH).div(2).toFloat(),
|
|
AppLoader.defaultW.toFloat(),
|
|
AppLoader.defaultH.toFloat()
|
|
)
|
|
}
|
|
|
|
try {
|
|
batch.inUse {
|
|
batch.color = safeAreaCol
|
|
AppLoader.fontSmallNumbers.draw(
|
|
batch, safeAreaStr,
|
|
tvSafeAreaW, tvSafeAreaH - 10
|
|
)
|
|
|
|
batch.color = defaultResCol
|
|
AppLoader.fontSmallNumbers.draw(
|
|
batch, defaultResStr,
|
|
(AppLoader.screenW - AppLoader.defaultW).div(2).toFloat(),
|
|
(AppLoader.screenH - AppLoader.defaultH).div(2).minus(10).toFloat()
|
|
)
|
|
}
|
|
}
|
|
catch (doNothing: NullPointerException) { }
|
|
}
|
|
}
|
|
}
|
|
|
|
private val defaultResStr = "${AppLoader.defaultW}x${AppLoader.defaultH}"
|
|
private val safeAreaStr = "TV Safe Area"
|
|
|
|
/**
|
|
* Camera will be moved so that (newX, newY) would be sit on the top-left edge.
|
|
*/
|
|
/*private fun setCameraPosition(newX: Float, newY: Float) {
|
|
camera.position.set((-newX + Terrarum.HALFW).round(), (-newY + Terrarum.HALFH).round(), 0f)
|
|
camera.update()
|
|
batch.projectionMatrix = camera.combined
|
|
}*/
|
|
|
|
} |