From ae45cf32a76185f4764f144d04f19d9d6f36af36 Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Sun, 25 Dec 2016 16:33:56 +0900 Subject: [PATCH] new blending function for SpriteGlow, which now uses no alpha channel; reduced the number of framebuffer used to draw a world from 2 to 1. Former-commit-id: 823182690f0c0dfc73a46474e194cbf6470fe5ad Former-commit-id: 9c4e041ef2799841d905c2b6dc32d578d9c082a3 --- assets/graphics/sprites/.gitattributes | 1 - assets/graphics/sprites/test_player_glow.png | Bin 0 -> 18189 bytes src/net/torvald/terrarum/StateInGame.kt | 45 ++++++++---------- src/net/torvald/terrarum/Terrarum.kt | 21 +++++++- .../terrarum/gameactors/ActorWithBody.kt | 2 +- .../gameactors/PlayerBuilderSigrid.kt | 2 +- 6 files changed, 42 insertions(+), 29 deletions(-) delete mode 100644 assets/graphics/sprites/.gitattributes create mode 100644 assets/graphics/sprites/test_player_glow.png diff --git a/assets/graphics/sprites/.gitattributes b/assets/graphics/sprites/.gitattributes deleted file mode 100644 index ca82ef549..000000000 --- a/assets/graphics/sprites/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.{psd,tga,ogg} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/assets/graphics/sprites/test_player_glow.png b/assets/graphics/sprites/test_player_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..81fe21069697a90a999955af1f4e4401b8535096 GIT binary patch literal 18189 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 if (actor is ActorWithBody && actor.inScreen() && actor !is Player) { - actor.drawBody(gc, actorsDrawFrameBuffer.graphics) + actor.drawBody(gc, worldDrawFrameBuffer.graphics) } } - player.drawBody(gc, actorsDrawFrameBuffer.graphics) + player.drawBody(gc, worldDrawFrameBuffer.graphics) ///////////////////////////// @@ -313,15 +311,15 @@ constructor() : BasicGameState() { ///////////////////////////// LightmapRenderer.renderLightMap() - MapCamera.renderFront(gc, tilesDrawFrameBuffer.graphics) - MapDrawer.render(gc, tilesDrawFrameBuffer.graphics) + MapCamera.renderFront(gc, worldDrawFrameBuffer.graphics) + MapDrawer.render(gc, worldDrawFrameBuffer.graphics) blendMul() - MapDrawer.drawEnvOverlay(actorsDrawFrameBuffer.graphics) + MapDrawer.drawEnvOverlay(worldDrawFrameBuffer.graphics) if (!KeyToggler.isOn(KEY_LIGHTMAP_RENDER)) blendMul() else blendNormal() - LightmapRenderer.draw(actorsDrawFrameBuffer.graphics) + LightmapRenderer.draw(worldDrawFrameBuffer.graphics) blendNormal() @@ -330,10 +328,10 @@ constructor() : BasicGameState() { ////////////////////// actorContainer.forEach { actor -> if (actor is ActorWithBody && actor.inScreen() && actor !is Player) { - actor.drawGlow(gc, actorsDrawFrameBuffer.graphics) + actor.drawGlow(gc, worldDrawFrameBuffer.graphics) } } - player.drawGlow(gc, actorsDrawFrameBuffer.graphics) + player.drawGlow(gc, worldDrawFrameBuffer.graphics) //////////////////////// @@ -343,17 +341,17 @@ constructor() : BasicGameState() { if (debugWindow.isVisible) { actorContainer.forEachIndexed { i, actor -> if (actor is ActorWithBody) { - actorsDrawFrameBuffer.graphics.color = Color.white - actorsDrawFrameBuffer.graphics.font = Terrarum.fontSmallNumbers - actorsDrawFrameBuffer.graphics.drawString( + worldDrawFrameBuffer.graphics.color = Color.white + worldDrawFrameBuffer.graphics.font = Terrarum.fontSmallNumbers + worldDrawFrameBuffer.graphics.drawString( actor.referenceID.toString(), actor.hitbox.posX.toFloat(), actor.hitbox.pointedY.toFloat() + 4 ) if (DEBUG_ARRAY) { - actorsDrawFrameBuffer.graphics.color = GameFontBase.codeToCol["g"] - actorsDrawFrameBuffer.graphics.drawString( + worldDrawFrameBuffer.graphics.color = GameFontBase.codeToCol["g"] + worldDrawFrameBuffer.graphics.drawString( i.toString(), actor.hitbox.posX.toFloat(), actor.hitbox.pointedY.toFloat() + 4 + 10 @@ -364,7 +362,7 @@ constructor() : BasicGameState() { } // fluidmap debug if (KeyToggler.isOn(Key.F4)) - WorldSimulator.drawFluidMapDebug(actorsDrawFrameBuffer.graphics) + WorldSimulator.drawFluidMapDebug(worldDrawFrameBuffer.graphics) ////////////// @@ -379,8 +377,7 @@ constructor() : BasicGameState() { ///////////////// // draw layers // ///////////////// - gwin.drawImage(tilesDrawFrameBuffer, 0f, 0f) - gwin.drawImage(actorsDrawFrameBuffer.getScaledCopy(screenZoom), 0f, 0f) + gwin.drawImage(worldDrawFrameBuffer.getScaledCopy(screenZoom), 0f, 0f) gwin.drawImage(uisDrawFrameBuffer, 0f, 0f) } diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 02b660661..3e726d044 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -432,9 +432,12 @@ fun main(args: Array) { Terrarum.main(args) } -// I must say: What the fuck is wrong with you, Slick2D?! +/////////////////////////////////// +// customised blending functions // +/////////////////////////////////// fun blendMul() { + // I must say: What the fuck is wrong with you, Slick2D? Your built-it blending is just fucking wrong. GL11.glEnable(GL11.GL_BLEND) GL11.glColorMask(true, true, true, true) GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ONE_MINUS_SRC_ALPHA) @@ -445,13 +448,27 @@ fun blendNormal() { GL11.glColorMask(true, true, true, true) //GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA) - // TODO seems working as intended (no more whitened-out semitransparent colour), but needs further investigation + // semitransparent textures working as intended with this, + // but needs further investigation in the case of: + // TODO blend semitransparent over semitransparent GL14.glBlendFuncSeparate( GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, // blend func for RGB channels GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA // blend func for alpha channels ) } +fun blendLightenOnly() { + GL11.glEnable(GL11.GL_BLEND) + GL14.glBlendFuncSeparate( + GL11.GL_ONE, GL11.GL_ONE, // blend func for RGB channels + GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA // blend func for alpha channels + ) + GL20.glBlendEquationSeparate( + GL14.GL_MAX, + GL14.GL_FUNC_ADD + ) +} + fun blendAlphaMap() { GL11.glDisable(GL11.GL_BLEND) GL11.glColorMask(false, false, false, true) diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index ae79a449b..a133a3243 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -899,7 +899,7 @@ open class ActorWithBody : Actor() { open fun drawGlow(gc: GameContainer, g: Graphics) { if (isVisible && spriteGlow != null) { - blendNormal() + blendLightenOnly() if (!sprite!!.flippedHorizontal()) { spriteGlow!!.render(g, diff --git a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt index a0fa2cf24..de7a0d6fc 100644 --- a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt +++ b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt @@ -32,7 +32,7 @@ object PlayerBuilderSigrid { p.sprite!!.setRowsAndFrames(1, 1) p.makeNewSpriteGlow(28, 51) - p.spriteGlow!!.setSpriteImage("assets/graphics/sprites/test_player_glow.tga") + p.spriteGlow!!.setSpriteImage("assets/graphics/sprites/test_player_glow.png") p.spriteGlow!!.setDelay(200) p.spriteGlow!!.setRowsAndFrames(1, 1)