From f3c56f5d471befc150b8eaa15a42dfcdee585c19 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 10 Oct 2021 15:38:09 +0900 Subject: [PATCH] dithering on grad overlay --- assets/diff.frag | 17 +++++++++++ assets/graphics/halfgrad.png | 3 -- assets/graphics/halfgrad.tga | 3 ++ assets/graphics/save_grad.png | 3 -- src/net/torvald/terrarum/App.java | 3 ++ src/net/torvald/terrarum/PostProcessor.kt | 2 ++ src/net/torvald/terrarum/TitleScreen.kt | 6 +++- src/net/torvald/terrarum/UIFakeGradOverlay.kt | 23 +++++++++++++++ .../terrarum/serialise/GameSavingThread.kt | 28 +++++++++++++++---- .../torvald/terrarum/weather/WeatherMixer.kt | 7 +++-- 10 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 assets/diff.frag delete mode 100644 assets/graphics/halfgrad.png create mode 100644 assets/graphics/halfgrad.tga delete mode 100644 assets/graphics/save_grad.png diff --git a/assets/diff.frag b/assets/diff.frag new file mode 100644 index 000000000..8ec5c0004 --- /dev/null +++ b/assets/diff.frag @@ -0,0 +1,17 @@ +#version 120 +#ifdef GL_ES + precision mediump float; +#endif +#extension GL_EXT_gpu_shader4 : enable + + +varying vec4 v_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; + +void main(void) { + vec4 inColor = texture2D(u_texture, v_texCoords); + ivec4 bytes = ivec4(255.0 * inColor); + ivec4 mask = ivec4(0x55); + gl_FragColor = (bytes ^ mask) / 255.0; +} \ No newline at end of file diff --git a/assets/graphics/halfgrad.png b/assets/graphics/halfgrad.png deleted file mode 100644 index 8c33ee81f..000000000 --- a/assets/graphics/halfgrad.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6624b98e0ecfec595f56e240b59734cb7773e250897aa12560267f6aaa6b4adc -size 1103781 diff --git a/assets/graphics/halfgrad.tga b/assets/graphics/halfgrad.tga new file mode 100644 index 000000000..8f2f1dbc6 --- /dev/null +++ b/assets/graphics/halfgrad.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38fc452f3510e8ecba6a6c9337687f51c62d392e3aeb4c405bf4620e8a4337ca +size 210 diff --git a/assets/graphics/save_grad.png b/assets/graphics/save_grad.png deleted file mode 100644 index b5486c0da..000000000 --- a/assets/graphics/save_grad.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:180a0a5a21e7ed6a555bef1fe3231e98ecd2cc7cda72550a59c9710b4f12ecdf -size 21574 diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index 3531cf1a6..33cb96dc6 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -218,6 +218,7 @@ public class App implements ApplicationListener { public static Texture ditherPattern; private static ShaderProgram shaderBayerSkyboxFill; // ONLY to be used by the splash screen public static ShaderProgram shaderHicolour; + public static ShaderProgram shaderDebugDiff; public static ShaderProgram shaderPassthruRGB; public static ShaderProgram shaderColLUT; public static ShaderProgram shaderReflect; @@ -409,6 +410,7 @@ public class App implements ApplicationListener { ditherPattern = new Texture(Gdx.files.internal("assets/LDR_512_RGBA_0.tga")); shaderBayerSkyboxFill = loadShaderFromFile("assets/4096.vert", "assets/4096_bayer_skyboxfill.frag"); shaderHicolour = loadShaderFromFile("assets/4096.vert", "assets/hicolour.frag"); + shaderDebugDiff = loadShaderFromFile("assets/4096.vert", "assets/diff.frag"); shaderPassthruRGB = SpriteBatch.createDefaultShader(); shaderColLUT = loadShaderFromFile("assets/4096.vert", "assets/passthrurgb.frag"); shaderReflect = loadShaderFromFile("assets/4096.vert", "assets/reflect.frag"); @@ -713,6 +715,7 @@ public class App implements ApplicationListener { ditherPattern.dispose(); shaderBayerSkyboxFill.dispose(); shaderHicolour.dispose(); + shaderDebugDiff.dispose(); shaderPassthruRGB.dispose(); shaderColLUT.dispose(); shaderReflect.dispose(); diff --git a/src/net/torvald/terrarum/PostProcessor.kt b/src/net/torvald/terrarum/PostProcessor.kt index 79f422277..44529337f 100644 --- a/src/net/torvald/terrarum/PostProcessor.kt +++ b/src/net/torvald/terrarum/PostProcessor.kt @@ -131,6 +131,8 @@ object PostProcessor : Disposable { val shader: ShaderProgram? = if (App.getConfigBoolean("fx_retro")) App.shaderHicolour + else if (App.getConfigBoolean("fx_differential")) + App.shaderDebugDiff else App.shaderPassthruRGB diff --git a/src/net/torvald/terrarum/TitleScreen.kt b/src/net/torvald/terrarum/TitleScreen.kt index 28d6d687e..f19c55b42 100644 --- a/src/net/torvald/terrarum/TitleScreen.kt +++ b/src/net/torvald/terrarum/TitleScreen.kt @@ -183,7 +183,11 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { // load a half-gradient texture that would be used throughout the titlescreen and its sub UIs - CommonResourcePool.addToLoadingList("title_halfgrad") { Texture(Gdx.files.internal("./assets/graphics/halfgrad.png")) } + CommonResourcePool.addToLoadingList("title_halfgrad") { + val t = Texture(Gdx.files.internal("./assets/graphics/halfgrad.tga")) + t.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear) + t + } CommonResourcePool.loadAll() diff --git a/src/net/torvald/terrarum/UIFakeGradOverlay.kt b/src/net/torvald/terrarum/UIFakeGradOverlay.kt index b85126de8..c5cb1ef92 100644 --- a/src/net/torvald/terrarum/UIFakeGradOverlay.kt +++ b/src/net/torvald/terrarum/UIFakeGradOverlay.kt @@ -1,9 +1,13 @@ package net.torvald.terrarum +import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.GL20 import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.random.HQRNG +import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas @@ -24,12 +28,31 @@ class UIFakeGradOverlay : UICanvas() { private val tex = CommonResourcePool.getAsTexture("title_halfgrad") + private val renderng = HQRNG() + init { setAsAlwaysVisible() } override fun updateUI(delta: Float) {} override fun renderUI(batch: SpriteBatch, camera: Camera) { + batch.end() + val dither = App.getConfigBoolean("fx_dither") + + if (dither) { + IngameRenderer.ditherPattern.bind(1) + Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it + } + + + batch.begin() + + batch.shader = if (dither) IngameRenderer.shaderBayer else null + if (dither) { + batch.shader.setUniformi("u_pattern", 1) + batch.shader.setUniformi("rnd", renderng.nextInt(8192), renderng.nextInt(8192)) + } + blendMul(batch) batch.draw(tex, 0f, 0f, App.scr.wf, App.scr.hf) diff --git a/src/net/torvald/terrarum/serialise/GameSavingThread.kt b/src/net/torvald/terrarum/serialise/GameSavingThread.kt index 288916ba2..41372dbed 100644 --- a/src/net/torvald/terrarum/serialise/GameSavingThread.kt +++ b/src/net/torvald/terrarum/serialise/GameSavingThread.kt @@ -25,12 +25,26 @@ private fun addFile(disk: VirtualDisk, file: DiskEntry) { if (!dir.contains(file.entryID)) dir.add(file.entryID) } +abstract class SavingThread(private val ingame: TerrarumIngame) : Runnable { + abstract fun save() + + override fun run() { + try { + save() + } + catch (e: Throwable) { + e.printStackTrace() + ingame.uiAutosaveNotifier.setAsError() + } + } +} + /** * Created by minjaesong on 2021-09-14. */ -class WorldSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: TerrarumIngame, val hasThumbnail: Boolean, val isAuto: Boolean, val callback: () -> Unit) : Runnable { +class WorldSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: TerrarumIngame, val hasThumbnail: Boolean, val isAuto: Boolean, val callback: () -> Unit) : SavingThread(ingame) { - override fun run() { + override fun save() { disk.saveMode = 2 * isAuto.toInt() // no quick @@ -40,8 +54,10 @@ class WorldSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: Te } } - val playersList: List = listOf(ingame.actorContainerActive, ingame.actorContainerInactive).flatMap{ it.filter { it is IngamePlayer } } as List - val actorsList = listOf(ingame.actorContainerActive, ingame.actorContainerInactive).flatMap { it.filter { WriteWorld.actorAcceptable(it) } } + val allTheActors = ingame.actorContainerActive.cloneToList() + ingame.actorContainerInactive.cloneToList() + + val playersList: List = allTheActors.filter{ it is IngamePlayer } as List + val actorsList = allTheActors.filter { WriteWorld.actorAcceptable(it) } val layers = intArrayOf(0,1).map { ingame.world.getLayer(it) } val cw = ingame.world.width / LandUtil.CHUNK_W val ch = ingame.world.height / LandUtil.CHUNK_H @@ -182,9 +198,9 @@ class WorldSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: Te * * Created by minjaesong on 2021-10-08 */ -class PlayerSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: TerrarumIngame, val hasThumbnail: Boolean, val isAuto: Boolean, val callback: () -> Unit) : Runnable { +class PlayerSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: TerrarumIngame, val hasThumbnail: Boolean, val isAuto: Boolean, val callback: () -> Unit) : SavingThread(ingame) { - override fun run() { + override fun save() { disk.saveMode = 2 * isAuto.toInt() // no quick disk.capacity = 0L diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index 8fbf16af9..b54d09d30 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -178,15 +178,16 @@ internal object WeatherMixer : RNGConsumer { skyboxTexture.dispose() skyboxTexture = Texture(skyboxPixmap); skyboxTexture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear) + val dither = App.getConfigBoolean("fx_dither") - if (App.getConfigBoolean("fx_dither")) { + if (dither) { IngameRenderer.ditherPattern.bind(1) Gdx.gl.glActiveTexture(GL20.GL_TEXTURE0) // so that batch that comes next will bind any tex to it } batch.inUse { - it.shader = if (App.getConfigBoolean("fx_dither")) IngameRenderer.shaderBayer else null - if (App.getConfigBoolean("fx_dither")) { + it.shader = if (dither) IngameRenderer.shaderBayer else null + if (dither) { it.shader.setUniformi("u_pattern", 1) it.shader.setUniformi("rnd", renderng.nextInt(8192), renderng.nextInt(8192)) }