summaryrefslogtreecommitdiffstats
path: root/core/src/ch/asynk/zproject/engine/Camera.java
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2018-09-14 09:13:20 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2018-09-14 09:13:20 +0200
commit76c4a8eccdc276583c215e5ad09b5fb2f07ac53e (patch)
tree8e026033a22f2b4d3dfe02235ab40d897309321e /core/src/ch/asynk/zproject/engine/Camera.java
parenta3cc66dc1fe2f468b234083baacd82a37c51fd3f (diff)
downloadgdx-boardgame-76c4a8eccdc276583c215e5ad09b5fb2f07ac53e.zip
gdx-boardgame-76c4a8eccdc276583c215e5ad09b5fb2f07ac53e.tar.gz
ch/asynk/zproject/engine -> ch/asynk/gdx/board
Diffstat (limited to 'core/src/ch/asynk/zproject/engine/Camera.java')
-rw-r--r--core/src/ch/asynk/zproject/engine/Camera.java218
1 files changed, 0 insertions, 218 deletions
diff --git a/core/src/ch/asynk/zproject/engine/Camera.java b/core/src/ch/asynk/zproject/engine/Camera.java
deleted file mode 100644
index a560d85..0000000
--- a/core/src/ch/asynk/zproject/engine/Camera.java
+++ /dev/null
@@ -1,218 +0,0 @@
-package ch.asynk.gdx.board.engine;
-
-import com.badlogic.gdx.graphics.glutils.HdpiUtils;
-import com.badlogic.gdx.graphics.OrthographicCamera;
-
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector3;
-import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.math.Matrix4;
-
-public class Camera extends OrthographicCamera
-{
- private static final float ZEROF = 0.01f;
-
- private int padding;
- private float boardWidth;
- private float boardHeight;
- private float boardAspectRatio;
- private float zoomMax;
- private float zoomMin;
- private int screenWidth;
- private int screenHeight;
- private float widthFactor;
- private float heightFactor;
- private Rectangle viewport;
-
- private Rectangle hud;
- private Matrix4 hudMatrix;
- private Matrix4 hudInvProjMatrix;
- private int hudLeft;
- private int hudBottom;
- private boolean hudInBoard;
-
- public Camera(int padding, float boardWidth, float boardHeight, float zoomMax, float zoomMin, boolean hudInBoard)
- {
- super(boardWidth, boardHeight);
- this.boardWidth = boardWidth;
- this.boardHeight = boardHeight;
- this.padding = padding;
- this.boardAspectRatio = (boardWidth / boardHeight);
- this.zoomMax = zoomMax;
- this.zoomMin = zoomMin;
- this.viewport = new Rectangle();
-
- this.hudInBoard = hudInBoard;
- this.hud = new Rectangle();
- this.hudMatrix = new Matrix4();
- this.hudInvProjMatrix = new Matrix4();
- }
-
- public void setDimension(float boardWidth, float boardHeight)
- {
- setToOrtho(false, boardWidth, boardHeight);
- this.boardWidth = boardWidth;
- this.boardHeight = boardHeight;
- this.boardAspectRatio = (boardWidth / boardHeight);
- }
-
- public void updateViewport(int screenWidth, int screenHeight)
- {
- this.screenWidth = screenWidth;
- this.screenHeight = screenHeight;
-
- float screenAvailableWidth = screenWidth - (2 * padding);
- float screenAvailableHeight = screenHeight - (2 * padding);
- float screenAspectRatio = (screenWidth / (float) screenHeight);
- float diff = (boardAspectRatio - screenAspectRatio);
-
- if (diff <= -ZEROF) {
- // screen wider than board : use max height, width grows up until max available on zooming
- viewport.height = screenAvailableHeight;
- viewport.width = java.lang.Math.min((screenAvailableHeight * boardAspectRatio / zoom), screenAvailableWidth);
- viewport.x = padding + ((screenAvailableWidth - viewport.width) / 2f);
- viewport.y = padding;
- // camera aspect ratio must follow viewport aspect ration
- viewportHeight = boardHeight;
- viewportWidth = (viewportHeight * (viewport.width / viewport.height));
- // hud
- hud.y = 0;
- hud.x = (hud.y * viewportWidth / viewportHeight);
- } else if (diff > ZEROF) {
- // word is wider than screen : use max width, height grows up until max available on zooming
- viewport.width = screenAvailableWidth;
- viewport.height = java.lang.Math.min((screenAvailableWidth / boardAspectRatio / zoom), screenAvailableHeight);
- viewport.y = padding + ((screenAvailableHeight - viewport.height) / 2f);
- viewport.x = padding;
- // camera aspect ratio must follow viewport aspect ration
- viewportWidth = boardWidth;
- viewportHeight = (viewportWidth * (viewport.height / viewport.width));
- // hud
- hud.x = 0;
- hud.y = (hud.x * viewportHeight / viewportWidth);
- }
-
- if (hudInBoard) {
- hud.x = 0;
- hud.y = 0;
- hud.width = screenWidth;
- hud.height = screenHeight;
- } else {
- hud.width = (viewport.width - (2 * hud.x));
- hud.height = (viewport.height - (2 * hud.y));
- }
-
- // ratio viewport -> camera
- widthFactor = (viewportWidth / viewport.width);
- heightFactor = (viewportHeight / viewport.height);
-
- clampPosition();
- update(true);
-
- hudMatrix.setToOrtho2D(hud.x, hud.y, hud.width, hud.height);
- hudInvProjMatrix.set(hudMatrix);
- Matrix4.inv(hudInvProjMatrix.val);
- }
-
- public void applyMapViewport()
- {
- HdpiUtils.glViewport((int)viewport.x, (int)viewport.y, (int)viewport.width, (int)viewport.height);
- }
-
- public void applyHudViewport()
- {
- if (hudInBoard)
- HdpiUtils.glViewport(0, 0, screenWidth, screenHeight);
- else
- applyMapViewport();
- }
-
- public void centerOnWorld()
- {
- position.set((boardWidth / 2f), (boardHeight / 2f), 0f);
- }
-
- public void zoom(float dz)
- {
- zoom += dz;
- clampZoom();
- }
-
- public void clampZoom()
- {
- zoom = MathUtils.clamp(zoom, zoomMin, zoomMax);
- }
-
- public void translate(float dx, float dy)
- {
- float deltaX = (dx * zoom * widthFactor);
- float deltaY = (dy * zoom * heightFactor);
- translate(deltaX, -deltaY, 0);
- clampPosition();
- update(true);
- }
-
- public void clampPosition()
- {
- float cameraWidth = (viewportWidth * zoom);
- float cameraHeight = (viewportHeight * zoom);
-
- // on each axis, clamp on [ cameraDim/2 ; boardDim - cameraDim/2 ]
-
- if ((boardWidth - cameraWidth) > ZEROF) {
- cameraWidth /= 2f;
- position.x = MathUtils.clamp(position.x, cameraWidth, (boardWidth - cameraWidth));
- } else {
- position.x = (boardWidth / 2f);
- }
-
- if ((boardHeight - cameraHeight) > ZEROF) {
- cameraHeight /= 2f;
- position.y = MathUtils.clamp(position.y, cameraHeight, (boardHeight - cameraHeight));
- } else {
- position.y = (boardHeight / 2f);
- }
- }
-
- public void unproject(int x, int y, Vector3 v)
- {
- unproject(v.set(x, y, 0), viewport.x, viewport.y, viewport.width, viewport.height);
- }
-
- public void unprojectHud(float x, float y, Vector3 v)
- {
- Rectangle r = (hudInBoard ? hud : viewport);
- x = x - r.x;
- y = screenHeight - y - 1;
- y = y - r.y;
- v.x = (2 * x) / r.width - 1;
- v.y = (2 * y) / r.height - 1;
- v.z = 2 * v.z - 1;
- v.prj(hudInvProjMatrix);
- }
-
- public int getScreenWidth()
- {
- return screenWidth;
- }
-
- public int getScreenHeight()
- {
- return screenHeight;
- }
-
- public Matrix4 getHudMatrix()
- {
- return hudMatrix;
- }
-
- public Rectangle getViewport()
- {
- return viewport;
- }
-
- public Rectangle getHud()
- {
- return hud;
- }
-}