From 8b7633d4225bca965fbec5c01609a19aa597b7b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lubo=C5=A1=20Hor=C3=A1=C4=8Dek?= <horaceklubos@gmail.com>
Date: Mon, 13 Apr 2015 19:47:32 +0200
Subject: [PATCH] #12 Auto x-filling centering viewport

---
 core/assets/common/screen/debug/black.png     | Bin 0 -> 86 bytes
 core/assets/common/screen/debug/blue.png      | Bin 0 -> 86 bytes
 core/assets/common/screen/debug/pink.png      | Bin 0 -> 86 bytes
 core/assets/common/screen/debug/red.png       | Bin 0 -> 86 bytes
 core/assets/common/screen/debug/yellow.png    | Bin 0 -> 86 bytes
 .../src/cz/nic/tablexia/TablexiaSettings.java |   4 +-
 .../tablexia/screen/loader/LoaderScreen.java  |  22 +++++---
 .../screen/viewport/ViewportDebugScreen.java  |  51 ++++++++++++++++++
 .../nic/tablexia/util/ui/XFillViewport.java   |  33 ++++++++++--
 .../nic/tablexia/desktop/DesktopLauncher.java |   2 +-
 10 files changed, 97 insertions(+), 15 deletions(-)
 create mode 100644 core/assets/common/screen/debug/black.png
 create mode 100644 core/assets/common/screen/debug/blue.png
 create mode 100644 core/assets/common/screen/debug/pink.png
 create mode 100644 core/assets/common/screen/debug/red.png
 create mode 100644 core/assets/common/screen/debug/yellow.png
 create mode 100644 core/src/cz/nic/tablexia/screen/viewport/ViewportDebugScreen.java

diff --git a/core/assets/common/screen/debug/black.png b/core/assets/common/screen/debug/black.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8fc30a3129c1ed8bf6f5c1ffb25a031c3e894ea
GIT binary patch
literal 86
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blmSQK*5Dp-y;YjHK@_9X7978x}
fCMP5${NQI`WMO2e-E`tUP=dkJ)z4*}Q$iB}VX6^*

literal 0
HcmV?d00001

diff --git a/core/assets/common/screen/debug/blue.png b/core/assets/common/screen/debug/blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3870f917f4968a8db714a3628a502e7fc310841
GIT binary patch
literal 86
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blmSQK*5Dp-y;YjHK@_9X7978x}
fCMN{^{x8qKT*9PUd2;sypag@btDnm{r-UW|d=e7A

literal 0
HcmV?d00001

diff --git a/core/assets/common/screen/debug/pink.png b/core/assets/common/screen/debug/pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..26eb49ed2d2bc4562b4b7bf96c20f6d45268bebe
GIT binary patch
literal 86
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blmSQK*5Dp-y;YjHK@_9X7978x}
fCjW^4|IMC(Bb+&#o&7>AP=dkJ)z4*}Q$iB}dO#8l

literal 0
HcmV?d00001

diff --git a/core/assets/common/screen/debug/red.png b/core/assets/common/screen/debug/red.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bc4cc83c9b5d765531cf3061344e26ba428e430
GIT binary patch
literal 86
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blmSQK*5Dp-y;YjHK@_9X7978x}
fCjU5p;DbB^D+A;I)#uDW3K=|I{an^LB{Ts5j<yp`

literal 0
HcmV?d00001

diff --git a/core/assets/common/screen/debug/yellow.png b/core/assets/common/screen/debug/yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..de8ab0bd398bc00d945e679e6a301d971caa7f2f
GIT binary patch
literal 86
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blmSQK*5Dp-y;YjHK@_9X7978x}
fCjY2!erV6Y-obSJCfAKSKnVs<S3j3^P6<r_j<yq%

literal 0
HcmV?d00001

diff --git a/core/src/cz/nic/tablexia/TablexiaSettings.java b/core/src/cz/nic/tablexia/TablexiaSettings.java
index ca685d3b4..8eca7f111 100644
--- a/core/src/cz/nic/tablexia/TablexiaSettings.java
+++ b/core/src/cz/nic/tablexia/TablexiaSettings.java
@@ -13,7 +13,7 @@ import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
-import cz.nic.tablexia.screen.gamemenu.GameMenuScreen;
+import cz.nic.tablexia.screen.viewport.ViewportDebugScreen;
 import cz.nic.tablexia.util.Log;
 import cz.nic.tablexia.util.Utility;
 
@@ -24,7 +24,7 @@ public class TablexiaSettings {
     private static final int     MIN_SCREEN_HEIGHT         = (int) (DEFAULT_SCREEN_WIDTH * MAXIMUM_RATIO);
     private static final boolean DEBUG_SHOW_BOUNDING_BOXES = true;
 
-    public  static final Class<? extends AbstractTablexiaScreen<?>> INITIAL_SCREEN = GameMenuScreen.class;
+    public  static final Class<? extends AbstractTablexiaScreen<?>> INITIAL_SCREEN = ViewportDebugScreen.class;
 
     private static final String PREFERENCES_KEY             = "cz.nic.tablexia.";
     public static final String  LOCALE_KEY                  = "locale";
diff --git a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
index 8bc3b3a99..ab4540de9 100644
--- a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
+++ b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
@@ -1,5 +1,6 @@
 package cz.nic.tablexia.screen.loader;
 
+import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.scenes.scene2d.actions.Actions;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
 
@@ -12,7 +13,7 @@ public class LoaderScreen extends AbstractTablexiaScreen<Void> {
 
     private static final String LOADER_BACKGROUND = "gfx/screen_loader_background.jpg";
     private static final String LOADER_SMALL_HAND = "gfx/screen_loader_smallhand.png";
-    private static final String LOADER_BIG_HAND   = "gfx/screen_loader_bighand.png";
+    private static final String LOADER_BIG_HAND = "gfx/screen_loader_bighand.png";
 
     public LoaderScreen() {
         super(false, false, TablexiaAssetManager.StorageType.INTERNAL);
@@ -33,17 +34,24 @@ public class LoaderScreen extends AbstractTablexiaScreen<Void> {
         getStage().addActor(background);
 
         Image smallhand = new Image(getTexture(LOADER_SMALL_HAND));
-        smallhand.setPosition(getStage().getWidth()*0.22f, getStage().getHeight() * 0.64f);
-        smallhand.setSize(getStage().getWidth()*0.01f, getStage().getHeight()*0.06f);
+        smallhand.setPosition(getStage().getWidth() * 0.22f, getStage().getHeight() * 0.64f);
+        smallhand.setSize(getStage().getWidth() * 0.01f, getStage().getHeight() * 0.06f);
         getStage().addActor(smallhand);
-        smallhand.setOrigin(smallhand.getWidth()/2,0);
+        smallhand.setOrigin(smallhand.getWidth() / 2, 0);
         smallhand.addAction(Actions.forever(Actions.rotateBy(-360, 6)));
 
         Image bighand = new Image(getTexture(LOADER_BIG_HAND));
-        bighand.setPosition(getStage().getWidth()*0.22f, getStage().getHeight() * 0.64f);
-        bighand.setSize(getStage().getWidth()*0.01f, getStage().getHeight()*0.06f);
+        bighand.setPosition(getStage().getWidth() * 0.22f, getStage().getHeight() * 0.64f);
+        bighand.setSize(getStage().getWidth() * 0.01f, getStage().getHeight() * 0.06f);
         getStage().addActor(bighand);
-        bighand.setOrigin(bighand.getWidth()/2,0);
+        bighand.setOrigin(bighand.getWidth() / 2, 0);
         bighand.addAction(Actions.forever(Actions.rotateBy(-360, 0.5f)));
     }
+
+    @Override
+    public Texture getTexture(String textureName) {
+        Texture t = super.getTexture(textureName);
+        t.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
+        return t;
+    }
 }
diff --git a/core/src/cz/nic/tablexia/screen/viewport/ViewportDebugScreen.java b/core/src/cz/nic/tablexia/screen/viewport/ViewportDebugScreen.java
new file mode 100644
index 000000000..55d5cb127
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/viewport/ViewportDebugScreen.java
@@ -0,0 +1,51 @@
+package cz.nic.tablexia.screen.viewport;
+
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+
+import java.util.List;
+
+import cz.nic.tablexia.TablexiaSettings;
+import cz.nic.tablexia.screen.AbstractTablexiaScreen;
+
+/**
+ * Created by lhoracek on 4/13/15.
+ */
+public class ViewportDebugScreen extends AbstractTablexiaScreen<Void> {
+
+    private static final String BASE = "screen/debug/";
+
+    @Override
+    protected void prepareScreenTextureAssetNames(List<String> textureFileNames) {
+        textureFileNames.add(BASE + "red.png");
+        textureFileNames.add(BASE + "blue.png");
+        textureFileNames.add(BASE + "yellow.png");
+        textureFileNames.add(BASE + "pink.png");
+        textureFileNames.add(BASE + "black.png");
+    }
+
+    @Override
+    protected void screenLoaded() {
+        getStage().setDebugAll(true);
+
+        Image large = new Image(getTexture("yellow.png"));
+        large.setSize(TablexiaSettings.getDefaultScreenWidth(), TablexiaSettings.getMinScreenHeight()*2);
+        large.setPosition(0,TablexiaSettings.getMinScreenHeight()/-2.0f);
+        getStage().addActor(large);
+
+
+
+        Image widescreen = new Image(getTexture("red.png"));
+        widescreen.setSize(TablexiaSettings.getDefaultScreenWidth(), TablexiaSettings.getMinScreenHeight());
+        widescreen.setPosition(0,0);
+        getStage().addActor(widescreen);
+
+
+        // TODO
+    }
+
+    @Override
+    public Texture getTexture(String textureName) {
+        return super.getTexture(BASE + textureName);
+    }
+}
diff --git a/core/src/cz/nic/tablexia/util/ui/XFillViewport.java b/core/src/cz/nic/tablexia/util/ui/XFillViewport.java
index 6f9a192ae..9d4f515ea 100644
--- a/core/src/cz/nic/tablexia/util/ui/XFillViewport.java
+++ b/core/src/cz/nic/tablexia/util/ui/XFillViewport.java
@@ -1,5 +1,6 @@
 package cz.nic.tablexia.util.ui;
 
+import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.graphics.Camera;
 import com.badlogic.gdx.graphics.OrthographicCamera;
 import com.badlogic.gdx.utils.viewport.Viewport;
@@ -12,9 +13,6 @@ import cz.nic.tablexia.util.Log;
  */
 public class XFillViewport extends Viewport {
 
-
-    private float worldWidth, worldHeight;
-
     /**
      * Creates a new viewport using a new {@link com.badlogic.gdx.graphics.OrthographicCamera} with no maximum world size.
      */
@@ -31,10 +29,35 @@ public class XFillViewport extends Viewport {
         setCamera(camera);
     }
 
+    private int screenX, screenY, screenWidth, screenHeight;
+    private float cameraYOffset;
+
+
     @Override
     public void update(int screenWidth, int screenHeight, boolean centerCamera) {
-        int height = (int) Math.min(screenHeight, screenWidth * TablexiaSettings.getMaximumRatio());
-        setScreenBounds(0, Math.max(0, (screenHeight - height) / 2), screenWidth, height);
+        float newWorldHeight = getWorldWidth() / ((float) screenWidth / (float) screenHeight);
+
+        // FIT into screen keeping at least minimum ration
+        this.screenX = (newWorldHeight < TablexiaSettings.getMinScreenHeight()) ? ((int) ((screenWidth - (screenHeight / TablexiaSettings.getMaximumRatio())) / 2)) : 0;
+        this.screenY = 0;
+        this.screenWidth = (newWorldHeight < TablexiaSettings.getMinScreenHeight()) ? ((int) (screenHeight / TablexiaSettings.getMaximumRatio())) : screenWidth;
+        this.screenHeight = screenHeight;
+
+        // SET NEW WORLD HEIGHT
+        this.setWorldHeight(newWorldHeight < TablexiaSettings.getMinScreenHeight() ? TablexiaSettings.getMinScreenHeight() : newWorldHeight); // World width dooes not change
+        cameraYOffset = (getWorldHeight() - TablexiaSettings.getMinScreenHeight()) / 2;
+        Log.info(getClass().getName(), "New viewport size: update: " + screenWidth + "x" + screenHeight + " - position: " + screenX + "x" + screenY + " - bounds: " + this.screenWidth + "x" + this.screenHeight + " - world: " + getWorldWidth() + "x" + getWorldHeight() + " - y offset: " + cameraYOffset);
         apply(centerCamera);
     }
+
+    @Override
+    public void apply(boolean centerCamera) {
+        Gdx.gl.glViewport(screenX, screenY, screenWidth, screenHeight);
+        getCamera().viewportWidth = getWorldWidth();
+        getCamera().viewportHeight = getWorldHeight();
+        if (centerCamera) getCamera().position.set(getWorldWidth() / 2, getWorldHeight() / 2, 0);
+        getCamera().position.y -= cameraYOffset;
+        getCamera().update();
+    }
+
 }
\ No newline at end of file
diff --git a/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java b/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java
index 2b8c7bf1a..e9bbd1056 100644
--- a/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java
+++ b/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java
@@ -32,7 +32,7 @@ public class DesktopLauncher {
         String versionName = loadAttributeFromManifest(VERSION_NAME_MANIFEST_ATTRIBUTE);
 
 	    LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
-	    config.resizable = false;
+	    config.resizable = buildType == null || buildType.equals(TablexiaSettings.BuildType.DEVEL.getKey());
 	    config.width = 1280;
 	    config.height = 800;
 
-- 
GitLab