From 3fbf2754bd8ddcb5541666ad381ca9fab55e12b4 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 11 Aug 2019 05:42:04 +0900 Subject: [PATCH] screen zooming, temporarily toggle with Z key --- assets/4096_bayer_skyboxfill.frag | 11 ++++++---- assets/tiling.frag | 5 +++-- src/net/torvald/terrarum/DefaultConfig.kt | 1 + src/net/torvald/terrarum/IngameInstance.kt | 2 +- src/net/torvald/terrarum/PostProcessor.kt | 20 ++++++++++++++++++ .../gamecontroller/IngameController.kt | 10 +++++++++ .../terrarum/modulebasegame/IngameRenderer.kt | 12 +++++++---- .../modulebasegame/weather/WeatherMixer.kt | 3 ++- .../terrarum/worlddrawer/BlocksDrawerNew.kt | 3 ++- .../terrarum/worlddrawer/WorldCamera.kt | 11 ++++++---- work_files/UI/crafting_ui_sketch.png | Bin 0 -> 31721 bytes 11 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 work_files/UI/crafting_ui_sketch.png diff --git a/assets/4096_bayer_skyboxfill.frag b/assets/4096_bayer_skyboxfill.frag index 1efe7c91e..e61fc8210 100644 --- a/assets/4096_bayer_skyboxfill.frag +++ b/assets/4096_bayer_skyboxfill.frag @@ -20,6 +20,8 @@ uniform float rcount = 64.0; // it even works on 256.0! uniform float gcount = 64.0; // using 64: has less banding and most monitors are internally 6-bit uniform float bcount = 64.0; +// inverted zoom; this value must set to (1f/zoom) +uniform float zoomInv = 1f; /*int bayer[7 * 7] = int[]( 32,42,10,27,37,5,15, @@ -72,12 +74,13 @@ void main(void) { float scale = v_texCoords.y * (1.0 - parallax_size) + (parallax_size / 2.0) + (parallax * parallax_size / 2.0); + float zoomSamplePoint = (1f - zoomInv) / 2f; // will never quite exceed 0.5 - float inR = mix(bottomColor.r, topColor.r, scale); - float inG = mix(bottomColor.g, topColor.g, scale); - float inB = mix(bottomColor.b, topColor.b, scale); + // I don't even know if it works, and also not sure if I actually want it + vec3 newBottom = mix(bottomColor, topColor, zoomSamplePoint); + vec3 newTop = mix(topColor, bottomColor, zoomSamplePoint); - vec4 inColor = vec4(inR, inG, inB, 1.0); + vec4 inColor = vec4(mix(newBottom, newTop, scale), 1.0); vec2 entry = mod(gl_FragCoord.xy, vec2(bayerSize, bayerSize)); diff --git a/assets/tiling.frag b/assets/tiling.frag index 9b8e5fe62..b4c25c46a 100644 --- a/assets/tiling.frag +++ b/assets/tiling.frag @@ -73,6 +73,7 @@ void main() { vec2 overscannedScreenDimension = tilesInAxes * tileSizeInPx; // how many tiles will fit into a screen; one used by the tileFromMap vec2 flippedFragCoord = vec2(gl_FragCoord.x, screenDimension.y - gl_FragCoord.y) + cameraTranslation; // NO IVEC2!!; this flips Y //vec2 pxCoord = flippedFragCoord.xy; // TODO do I actually need 'pxCoord'? + vec2 zoomVec = vec2(zoom); // get required tile numbers // @@ -97,8 +98,8 @@ void main() { // get final UV coord for the actual sampling // - vec2 finalUVCoordForTile = uvCoordForTile + uvCoordOffsetTile;// where we should be actually looking for in atlas, using UV coord (0..1) - vec2 finalUVCoordForBreakage = uvCoordForTile + uvCoordOffsetBreakage; + vec2 finalUVCoordForTile = (uvCoordForTile + uvCoordOffsetTile);// where we should be actually looking for in atlas, using UV coord (0..1) + vec2 finalUVCoordForBreakage = (uvCoordForTile + uvCoordOffsetBreakage); // blending a breakage tex with main tex // diff --git a/src/net/torvald/terrarum/DefaultConfig.kt b/src/net/torvald/terrarum/DefaultConfig.kt index bb439670b..05bee605f 100644 --- a/src/net/torvald/terrarum/DefaultConfig.kt +++ b/src/net/torvald/terrarum/DefaultConfig.kt @@ -72,6 +72,7 @@ object DefaultConfig { jsonObject.addProperty("keyinventory", Input.Keys.Q) jsonObject.addProperty("keyinteract", Input.Keys.R) jsonObject.addProperty("keyclose", Input.Keys.C) // this or hard-coded ESC + jsonObject.addProperty("keyzoom", Input.Keys.Z) jsonObject.addProperty("keygamemenu", Input.Keys.TAB) jsonObject.addProperty("keyquicksel", Input.Keys.SHIFT_LEFT) // pie menu is now LShift because GDX does not read CapsLock diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 3d56f847b..2ee2d2815 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -20,7 +20,7 @@ open class IngameInstance(val batch: SpriteBatch) : Screen { var screenZoom = 1.0f val ZOOM_MAXIMUM = 4.0f - val ZOOM_MINIMUM = 0.5f + val ZOOM_MINIMUM = 1.0f open var consoleHandler: ConsoleWindow = ConsoleWindow() diff --git a/src/net/torvald/terrarum/PostProcessor.kt b/src/net/torvald/terrarum/PostProcessor.kt index e642521b9..15cfcecd7 100644 --- a/src/net/torvald/terrarum/PostProcessor.kt +++ b/src/net/torvald/terrarum/PostProcessor.kt @@ -83,6 +83,7 @@ object PostProcessor : Disposable { postShader(projMat, fbo) + // draw things when F keys are on if (AppLoader.IS_DEVELOPMENT_BUILD && KeyToggler.isOn(Input.Keys.F11)) { drawSafeArea() } @@ -113,6 +114,14 @@ object PostProcessor : Disposable { else { if (!debugUI.isClosed && !debugUI.isClosing) debugUI.setAsClose() } + + // draw dev build notifiers + if (AppLoader.IS_DEVELOPMENT_BUILD && Terrarum.ingame != null) { + batch.inUse { + batch.color = safeAreaCol + AppLoader.fontGame.draw(it, thisIsDebugStr, 5f, AppLoader.screenH - 24f) + } + } } } @@ -143,16 +152,25 @@ object PostProcessor : Disposable { val tvSafeArea2H = AppLoader.getTvSafeActionHeight().toFloat() shapeRenderer.inUse(ShapeRenderer.ShapeType.Line) { + + // centre ind + shapeRenderer.color = safeAreaCol2 + shapeRenderer.line(0f, 0f, AppLoader.screenW.toFloat(), AppLoader.screenH.toFloat()) + shapeRenderer.line(0f, AppLoader.screenH.toFloat(), AppLoader.screenW.toFloat(), 0f) + + // safe action area shapeRenderer.color = safeAreaCol2 shapeRenderer.rect( tvSafeArea2W, tvSafeArea2H, AppLoader.screenW - 2 * tvSafeArea2W, AppLoader.screenH - 2 * tvSafeArea2H ) + // safe graphics area shapeRenderer.color = safeAreaCol shapeRenderer.rect( tvSafeAreaW, tvSafeAreaH, AppLoader.screenW - 2 * tvSafeAreaW, AppLoader.screenH - 2 * tvSafeAreaH ) + // default res ind shapeRenderer.color = defaultResCol shapeRenderer.rect( (AppLoader.screenW - AppLoader.minimumW).div(2).toFloat(), @@ -189,6 +207,8 @@ object PostProcessor : Disposable { private val defaultResStr = "${AppLoader.minimumW}x${AppLoader.minimumH}" private val safeAreaStr = "TV Safe Area" + private val versionStr = "Version ${AppLoader.getVERSION_STRING()}" + private val thisIsDebugStr = "${AppLoader.GAME_NAME} Develoment Build $versionStr" /** * Camera will be moved so that (newX, newY) would be sit on the top-left edge. diff --git a/src/net/torvald/terrarum/gamecontroller/IngameController.kt b/src/net/torvald/terrarum/gamecontroller/IngameController.kt index 5bdd24883..1d5f74cde 100644 --- a/src/net/torvald/terrarum/gamecontroller/IngameController.kt +++ b/src/net/torvald/terrarum/gamecontroller/IngameController.kt @@ -11,6 +11,7 @@ import net.torvald.terrarum.floorInt import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.TerrarumIngame +import net.torvald.terrarum.toInt import net.torvald.terrarum.worlddrawer.CreateTileAtlas import net.torvald.terrarum.worlddrawer.WorldCamera @@ -74,6 +75,15 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { ///////////////////// // GAMEPAD CONTROL // ///////////////////// + + + ////////////////////// + // KEYBOARD CONTROL // + ////////////////////// + + // FIXME temporarily make zoom work with 'Z' key + terrarumIngame.screenZoom = 1f + KeyToggler.isOn(AppLoader.getConfigInt("keyzoom")).toInt() + } private var f12Down = false diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index db62a6133..95b05cf3f 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -198,6 +198,8 @@ object IngameRenderer : Disposable { //renderingParticleCount = (particlesContainer?.buffer?.map { (!it.flagDespawn).toInt() } ?: listOf(0)).sum() renderingUIsCount = ((uisToDraw?.map { (it?.isVisible ?: false).toInt() }) ?: listOf(0)).sum() + val zoom = Terrarum.ingame?.screenZoom ?: 1f + if (uisToDraw != null) { uiListToDraw = uisToDraw @@ -236,6 +238,8 @@ object IngameRenderer : Disposable { val rgbTex = fboRGB_lightMixed.colorBufferTexture val aTex = fboA_lightMixed.colorBufferTexture + rgbTex.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) + aTex.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) // normal behaviour if (!KeyToggler.isOn(Input.Keys.F6) && @@ -250,11 +254,11 @@ object IngameRenderer : Disposable { blendNormal(batch) batch.shader = shaderBlendGlow shaderBlendGlow.setUniformi("tex1", 1) - batch.draw(rgbTex, 0f, 0f) + batch.draw(rgbTex, 0f, 0f, rgbTex.width * zoom, rgbTex.height * zoom) } - // definitely something is not blended correctly + // blending is correct... somewhat. Alpha must be premultiplied } // something about RGB else if (KeyToggler.isOn(Input.Keys.F6) && @@ -264,7 +268,7 @@ object IngameRenderer : Disposable { batch.inUse { blendNormal(batch) batch.shader = null - batch.draw(rgbTex, 0f, 0f) + batch.draw(rgbTex, 0f, 0f, rgbTex.width * zoom, rgbTex.height * zoom) // indicator @@ -287,7 +291,7 @@ object IngameRenderer : Disposable { batch.inUse { blendNormal(batch) batch.shader = null - batch.draw(aTex, 0f, 0f) + batch.draw(aTex, 0f, 0f, aTex.width * zoom, aTex.height * zoom) // indicator diff --git a/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt b/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt index 61e9b6d5e..fb05bbff9 100644 --- a/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/modulebasegame/weather/WeatherMixer.kt @@ -12,9 +12,9 @@ import net.torvald.terrarum.* import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameworld.GameWorld -import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.modulebasegame.RNGConsumer +import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.ParticleMegaRain import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension import net.torvald.terrarum.modulebasegame.worldgenerator.WorldGenerator @@ -161,6 +161,7 @@ internal object WeatherMixer : RNGConsumer { IngameRenderer.shaderSkyboxFill.setUniformf("bottomColor", bottomCol.r, bottomCol.g, bottomCol.b) IngameRenderer.shaderSkyboxFill.setUniformf("parallax", parallax.coerceIn(-1f, 1f)) IngameRenderer.shaderSkyboxFill.setUniformf("parallax_size", 1f/3f) + IngameRenderer.shaderSkyboxFill.setUniformf("zoomInv", 1f / (Terrarum.ingame?.screenZoom ?: 1f)) AppLoader.fullscreenQuad.render(IngameRenderer.shaderSkyboxFill, GL20.GL_TRIANGLES) IngameRenderer.shaderSkyboxFill.end() diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt index 229238a02..22dd8506e 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawerNew.kt @@ -635,7 +635,8 @@ internal object BlocksDrawer { else 0f ) - shader.setUniformf("drawBreakage", if (mode == WIRE) 0f else 1f) + //shader.setUniformf("drawBreakage", if (mode == WIRE) 0f else 1f) + shader.setUniformf("zoom", Terrarum.ingame?.screenZoom ?: 1f) tilesQuad.render(shader, GL20.GL_TRIANGLES) shader.end() diff --git a/src/net/torvald/terrarum/worlddrawer/WorldCamera.kt b/src/net/torvald/terrarum/worlddrawer/WorldCamera.kt index a78094345..cb182757b 100644 --- a/src/net/torvald/terrarum/worlddrawer/WorldCamera.kt +++ b/src/net/torvald/terrarum/worlddrawer/WorldCamera.kt @@ -15,6 +15,9 @@ import org.dyn4j.geometry.Vector2 object WorldCamera { private val TILE_SIZE = CreateTileAtlas.TILE_SIZE + val zoom: Float + get() = Terrarum.ingame?.screenZoom ?: 1f + var x: Int = 0 // left position private set var y: Int = 0 // top position @@ -24,9 +27,9 @@ object WorldCamera { var yEnd: Int = 0 // bottom position private set inline val gdxCamX: Float // centre position - get() = xCentre.toFloat() + get() = (x + width / 2f * zoom).toInt().toFloat() inline val gdxCamY: Float// centre position - get() = yCentre.toFloat() + get() = (y + height / 2f * zoom).toInt().toFloat() var width: Int = 0 private set var height: Int = 0 @@ -41,8 +44,8 @@ object WorldCamera { fun update(world: GameWorld, player: ActorWithBody?) { if (player == null) return - width = FastMath.ceil(AppLoader.screenW / (Terrarum.ingame?.screenZoom ?: 1f)) // div, not mul - height = FastMath.ceil(AppLoader.screenH / (Terrarum.ingame?.screenZoom ?: 1f)) + width = FastMath.ceil(AppLoader.screenW / zoom) // div, not mul + height = FastMath.ceil(AppLoader.screenH / zoom) // TOP-LEFT position of camera border diff --git a/work_files/UI/crafting_ui_sketch.png b/work_files/UI/crafting_ui_sketch.png new file mode 100644 index 0000000000000000000000000000000000000000..675aac3c1714e58e9563e4d7f0df02254ef441cf GIT binary patch literal 31721 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 literal 0 HcmV?d00001