From 9140d6d8b042b746f1339de6db70aee81a68fb84 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 7 Jan 2019 17:34:47 +0900 Subject: [PATCH] prolonged alpha blending issue seemingly fixed? at least it's partially fixed... --- .../spriteassembler/SpriteAssemblerApp.kt | 12 +++++----- src/net/torvald/terrarum/AppLoader.java | 9 +++---- src/net/torvald/terrarum/ErrorDisp.kt | 4 +--- src/net/torvald/terrarum/LoadScreen.kt | 12 +++++----- src/net/torvald/terrarum/PostProcessor.kt | 6 +---- src/net/torvald/terrarum/Terrarum.kt | 24 +++++++++++++++---- src/net/torvald/terrarum/TitleScreen.kt | 8 ++++--- .../torvald/terrarum/modulebasegame/Ingame.kt | 16 ------------- .../terrarum/modulebasegame/IngameRenderer.kt | 17 ++++--------- 9 files changed, 46 insertions(+), 62 deletions(-) diff --git a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt index bd27efd04..035d8868e 100644 --- a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt +++ b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt @@ -4,8 +4,12 @@ import com.badlogic.gdx.Game import com.badlogic.gdx.Gdx import com.badlogic.gdx.backends.lwjgl.LwjglApplication import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration -import com.badlogic.gdx.graphics.* +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.Pixmap +import com.badlogic.gdx.graphics.PixmapIO2 +import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.terrarum.gdxClearAndSetBlend import net.torvald.terrarum.inUse import java.awt.BorderLayout import java.awt.Font @@ -272,11 +276,7 @@ class SpriteAssemblerPreview: Game() { } - Gdx.gl.glClearColor(.62f,.79f,1f,1f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) - Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) - Gdx.gl.glEnable(GL20.GL_BLEND) - Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + gdxClearAndSetBlend(.62f,.79f,1f,1f) batch.inUse { diff --git a/src/net/torvald/terrarum/AppLoader.java b/src/net/torvald/terrarum/AppLoader.java index 7a805834d..aee92603a 100644 --- a/src/net/torvald/terrarum/AppLoader.java +++ b/src/net/torvald/terrarum/AppLoader.java @@ -26,6 +26,8 @@ import java.io.IOException; import java.util.Arrays; import java.util.Random; +import static net.torvald.terrarum.TerrarumKt.gdxClearAndSetBlend; + /** * The framework's Application Loader * @@ -245,12 +247,7 @@ public class AppLoader implements ApplicationListener { FrameBufferManager.begin(renderFBO); - Gdx.gl.glClearColor(.094f, .094f, .094f, 0f); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - Gdx.gl.glEnable(GL20.GL_TEXTURE_2D); - Gdx.gl.glEnable(GL20.GL_BLEND); - Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); - Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD); + gdxClearAndSetBlend(.094f, .094f, .094f, 0f); FrameBufferManager.end(); diff --git a/src/net/torvald/terrarum/ErrorDisp.kt b/src/net/torvald/terrarum/ErrorDisp.kt index 146f266b3..f79aa727e 100644 --- a/src/net/torvald/terrarum/ErrorDisp.kt +++ b/src/net/torvald/terrarum/ErrorDisp.kt @@ -3,7 +3,6 @@ package net.torvald.terrarum import com.badlogic.gdx.Gdx import com.badlogic.gdx.Screen 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.terrarum.langpack.Lang @@ -39,8 +38,7 @@ object ErrorDisp : Screen { } override fun render(delta: Float) { - Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + gdxClearAndSetBlend(.094f, .094f, .094f, 0f) diff --git a/src/net/torvald/terrarum/LoadScreen.kt b/src/net/torvald/terrarum/LoadScreen.kt index 99fad6dd4..9de4f7bbf 100644 --- a/src/net/torvald/terrarum/LoadScreen.kt +++ b/src/net/torvald/terrarum/LoadScreen.kt @@ -2,12 +2,14 @@ package net.torvald.terrarum import com.badlogic.gdx.Gdx import com.badlogic.gdx.ScreenAdapter -import com.badlogic.gdx.graphics.* +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.OrthographicCamera +import com.badlogic.gdx.graphics.Pixmap +import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.glutils.FrameBuffer import com.jme3.math.FastMath import net.torvald.dataclass.HistoryArray import net.torvald.terrarum.langpack.Lang -import net.torvald.terrarum.modulebasegame.Ingame /** * Created by minjaesong on 2017-07-13. @@ -123,12 +125,10 @@ object LoadScreen : ScreenAdapter() { - Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + gdxClearAndSetBlend(.094f, .094f, .094f, 0f) textFbo.inAction(null, null) { - Gdx.gl.glClearColor(0f, 0f, 0f, 0f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + gdxClearAndSetBlend(0f, 0f, 0f, 0f) } // update arrow object diff --git a/src/net/torvald/terrarum/PostProcessor.kt b/src/net/torvald/terrarum/PostProcessor.kt index ad5744799..7993d15b3 100644 --- a/src/net/torvald/terrarum/PostProcessor.kt +++ b/src/net/torvald/terrarum/PostProcessor.kt @@ -39,11 +39,7 @@ object PostProcessor { AppLoader.debugTimers["Renderer.PostProcessor"] = measureNanoTime { - Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) - Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) - Gdx.gl.glEnable(GL20.GL_BLEND) - Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + gdxClearAndSetBlend(.094f, .094f, .094f, 0f) val shader: ShaderProgram? = if (AppLoader.getConfigBoolean("fxdither")) diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index c654df9e8..bf18e73f5 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -21,7 +21,6 @@ import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorID import net.torvald.terrarum.imagefont.TinyAlphNum import net.torvald.terrarum.itemproperties.ItemCodex -import net.torvald.terrarum.modulebasegame.Ingame import net.torvald.terrarum.worlddrawer.FeaturesDrawer import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarumsansbitmap.gdx.GameFontBase @@ -396,17 +395,17 @@ object Terrarum : Screen { // jump straight into the ingame - val ingame = Ingame(batch) + /*val ingame = Ingame(batch) ingame.gameLoadInfoPayload = Ingame.NewWorldParameters(2400, 800, HQRNG().nextLong()) ingame.gameLoadMode = Ingame.GameLoadMode.CREATE_NEW LoadScreen.screenToLoad = ingame this.ingame = ingame - setScreen(LoadScreen) + setScreen(LoadScreen)*/ // title screen - //AppLoader.getINSTANCE().setScreen(TitleScreen(batch)) + AppLoader.getINSTANCE().setScreen(TitleScreen(batch)) } fun setScreen(screen: Screen) { @@ -598,7 +597,10 @@ fun blendMul(batch: SpriteBatch? = null) { fun blendNormal(batch: SpriteBatch? = null) { (batch ?: Terrarum.batch).enableBlending() (batch ?: Terrarum.batch).setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + + // alpha must not be premultiplied Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD) // batch.flush does not touch blend equation + Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA, GL20.GL_ONE) } fun blendScreen(batch: SpriteBatch? = null) { @@ -611,6 +613,20 @@ fun blendDisable(batch: SpriteBatch? = null) { (batch ?: Terrarum.batch).disableBlending() } +fun gdxClearAndSetBlend(r: Float, g: Float, b: Float, a: Float) { + Gdx.gl.glClearColor(0f,0f,0f,0f) + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) + Gdx.gl.glEnable(GL20.GL_BLEND) + + // this assumens premultiplied alpha? + //Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + // alpha must not be premultiplied + + Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA, GL20.GL_ONE) + Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD) +} + object BlendMode { const val SCREEN = "screen" const val MULTIPLY = "multiply" diff --git a/src/net/torvald/terrarum/TitleScreen.kt b/src/net/torvald/terrarum/TitleScreen.kt index 86dcc7a89..d3d2792b7 100644 --- a/src/net/torvald/terrarum/TitleScreen.kt +++ b/src/net/torvald/terrarum/TitleScreen.kt @@ -3,7 +3,10 @@ package net.torvald.terrarum import com.badlogic.gdx.Gdx import com.badlogic.gdx.InputAdapter import com.badlogic.gdx.Screen -import com.badlogic.gdx.graphics.* +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.OrthographicCamera +import com.badlogic.gdx.graphics.Pixmap +import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.glutils.FrameBuffer @@ -241,8 +244,7 @@ class TitleScreen(val batch: SpriteBatch) : Screen { //camera.setToOrtho(true, Terrarum.WIDTH.toFloat(), Terrarum.HEIGHT.toFloat()) // render world - Gdx.gl.glClearColor(.64f, .754f, .84f, 1f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + gdxClearAndSetBlend(.64f, .754f, .84f, 1f) IngameRenderer.invoke(world = demoWorld, uisToDraw = uiContainer) diff --git a/src/net/torvald/terrarum/modulebasegame/Ingame.kt b/src/net/torvald/terrarum/modulebasegame/Ingame.kt index a79495f63..4bbd558d9 100644 --- a/src/net/torvald/terrarum/modulebasegame/Ingame.kt +++ b/src/net/torvald/terrarum/modulebasegame/Ingame.kt @@ -251,22 +251,6 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) { historicalFigureIDBucket = ArrayList() - - - - // add new player and put it to actorContainer - //playableActorDelegate = PlayableActorDelegate(PlayerBuilderSigrid()) - //playableActorDelegate = PlayableActorDelegate(PlayerBuilderTestSubject1()) - //addNewActor(player) - - - // test actor - //addNewActor(PlayerBuilderCynthia()) - - - // it won't work: - //setTheRealGamerFirstTime(PlayerBuilderSigrid()) - // because NO GL CONTEXT IN THIS THREAD, might want 'postInit()'? } } diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index 561c753e9..25e9c7010 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -12,8 +12,8 @@ import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.gameactors.ParticleBase import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension -import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.modulebasegame.weather.WeatherMixer +import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.worlddrawer.BlocksDrawer import net.torvald.terrarum.worlddrawer.FeaturesDrawer import net.torvald.terrarum.worlddrawer.LightmapRenderer @@ -93,11 +93,7 @@ object IngameRenderer { // clear main or whatever super-FBO being used //clearBuffer() - Gdx.gl.glClearColor(.64f, .754f, .84f, 1f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) - Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) - Gdx.gl.glEnable(GL20.GL_BLEND) - Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + gdxClearAndSetBlend(.64f, .754f, .84f, 1f) /////////////////////////////////////////////////////////////////////// @@ -321,8 +317,7 @@ object IngameRenderer { fboA.inAction(null, null) { clearBuffer() // paint black - Gdx.gl.glClearColor(0f,0f,0f,1f) // solid black: so that unused area will be also black - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) + gdxClearAndSetBlend(0f,0f,0f,1f) // solid black: so that unused area will be also black } fboA_lightMixed.inAction(null, null) { clearBuffer() } @@ -433,11 +428,7 @@ object IngameRenderer { } private fun clearBuffer() { - Gdx.gl.glClearColor(0f,0f,0f,0f) - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) - Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) - Gdx.gl.glEnable(GL20.GL_BLEND) - Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) + gdxClearAndSetBlend(0f,0f,0f,0f) } private fun moveCameraToWorldCoord() {