From 26ee7498e21875cfb6835aa4b0e361ff25e04052 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 29 Jul 2021 12:56:25 +0900 Subject: [PATCH] closing issue #39 --- assets/tiling.frag | 3 ++- src/net/torvald/terrarum/Terrarum.kt | 5 +++++ .../terrarum/worlddrawer/BlocksDrawerNew.kt | 18 +++++++----------- .../terrarum/worlddrawer/CreateTileAtlas.kt | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/assets/tiling.frag b/assets/tiling.frag index b1a01fd64..bdd0a3b11 100644 --- a/assets/tiling.frag +++ b/assets/tiling.frag @@ -35,6 +35,7 @@ uniform ivec2 cameraTranslation = ivec2(0, 0); // used to offset the drawing; it uniform float drawBreakage = 1.0; // set it to 0f to not draw breakage, 1f to draw it; NEVER set to any other values. +uniform float mulBlendIntensity = 1.0; // used my MUL-blending drawings; works about the same way as the Layer Opacity slider of Photoshop/Krita/etc. ivec2 getTileXY(int tileNumber) { return ivec2(tileNumber % int(tilesInAtlas.x), tileNumber / int(tilesInAtlas.x)); @@ -101,6 +102,6 @@ void main() { vec4 finalColor = vec4(mix(finalTile.rgb, finalBreakage.rgb, finalBreakage.a), finalTile.a); - gl_FragColor = colourFilter * finalColor; + gl_FragColor = mix(colourFilter, colourFilter * finalColor, mulBlendIntensity); } diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index ecfc86498..50472d0f6 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -439,6 +439,11 @@ fun gdxSetBlendNormal() { // - https://www.andersriggelsen.dk/glblendfunc.php } +fun gdxSetBlendMul() { + gdxSetBlend() + Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA) +} + object BlendMode { const val SCREEN = "screen" const val MULTIPLY = "multiply" diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt index 8dad8819c..3fa8952bf 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt @@ -202,8 +202,10 @@ internal object BlocksDrawer { internal fun drawWall(projectionMatrix: Matrix4, drawGlow: Boolean) { gdxSetBlendNormal() - renderUsingBuffer(WALL, projectionMatrix, drawGlow) + + gdxSetBlendMul() + renderUsingBuffer(OCCLUSION, projectionMatrix, false) } internal fun drawTerrain(projectionMatrix: Matrix4, drawGlow: Boolean) { @@ -215,13 +217,7 @@ internal object BlocksDrawer { internal fun drawFront(projectionMatrix: Matrix4) { - // blend mul - Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) - Gdx.gl.glEnable(GL20.GL_BLEND) - Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA) - - // draw occlusion with MUL blend - renderUsingBuffer(OCCLUSION, projectionMatrix, false) + gdxSetBlendMul() // let's just not MUL on terrain, make it FLUID only... renderUsingBuffer(FLUID, projectionMatrix, false) @@ -593,7 +589,7 @@ internal object BlocksDrawer { } private var _tilesBufferAsTex: Texture = Texture(1, 1, Pixmap.Format.RGBA8888) - private val fakeOcclusionColour = Color(.65f, .65f, .65f, 1f) + private val occlusionIntensity = 0.3f private fun renderUsingBuffer(mode: Int, projectionMatrix: Matrix4, drawGlow: Boolean) { //Gdx.gl.glClearColor(.094f, .094f, .094f, 0f) @@ -619,9 +615,8 @@ internal object BlocksDrawer { else -> throw IllegalArgumentException() } val vertexColour = when (mode) { - TERRAIN, WIRE, FLUID -> Color.WHITE + TERRAIN, WIRE, FLUID, OCCLUSION -> Color.WHITE WALL -> AppLoader.tileMaker.wallOverlayColour - OCCLUSION -> Color.WHITE //fakeOcclusionColour else -> throw IllegalArgumentException() } @@ -670,6 +665,7 @@ internal object BlocksDrawer { else 0f ) + shader.setUniformf("mulBlendIntensity", if (mode == OCCLUSION) occlusionIntensity else 1f) //shader.setUniformf("drawBreakage", if (mode == WIRE) 0f else 1f) tilesQuad.render(shader, GL20.GL_TRIANGLES) shader.end() diff --git a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt index 9a34c31dd..577dead29 100644 --- a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt +++ b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt @@ -38,7 +38,7 @@ class CreateTileAtlas { private val TOTAL_TILES = TILES_IN_X * TILES_IN_X - val wallOverlayColour = Color(.65f, .65f, .65f, 1f) + val wallOverlayColour = Color(.8f, .8f, .8f, 1f) lateinit var atlas: Pixmap lateinit var atlasAutumn: Pixmap