package com.jmrapp.terralegion.engine.camera; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.math.Matrix4; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.jmrapp.terralegion.engine.utils.Settings; public class OrthoCamera extends OrthographicCamera { private Vector3 tmp = new Vector3(); private Vector2 origin = new Vector2(); private VirtualViewport virtualViewport; private Vector2 pos = new Vector2(); private Vector3 cachedVec3 = new Vector3(); public OrthoCamera() { this(new VirtualViewport(Settings.getWidth(), Settings.getHeight())); } public OrthoCamera(VirtualViewport virtualViewport) { this(virtualViewport, 0f, 0f); } public OrthoCamera(VirtualViewport virtualViewport, float cx, float cy) { this.virtualViewport = virtualViewport; this.origin.set(cx, cy); } public void setVirtualViewport(VirtualViewport virtualViewport) { this.virtualViewport = virtualViewport; } public void setPosition(float x, float y) { position.set(x - viewportWidth * origin.x, y - viewportHeight * origin.y, 0f); pos.set(x, y); } public Vector2 getPos() { return pos; } @Override public void update() { float left = zoom * -viewportWidth / 2 + virtualViewport.getVirtualWidth() * origin.x; float right = zoom * viewportWidth / 2 + virtualViewport.getVirtualWidth() * origin.x; float top = zoom * viewportHeight / 2 + virtualViewport.getVirtualHeight() * origin.y; float bottom = zoom * -viewportHeight / 2 + virtualViewport.getVirtualHeight() * origin.y; projection.setToOrtho(left, right, bottom, top, Math.abs(near), Math.abs(far)); view.setToLookAt(position, tmp.set(position).add(direction), up); combined.set(projection); Matrix4.mul(combined.val, view.val); invProjectionView.set(combined); Matrix4.inv(invProjectionView.val); frustum.update(invProjectionView); //Gdx.gl.glViewport((int) viewport.x, (int) viewport.y, (int) viewport.width, (int) viewport.height); } /** * This must be called in ApplicationListener.resize() in order to correctly update the camera viewport. */ public void updateViewport() { setToOrtho(false, virtualViewport.getWidth(), virtualViewport.getHeight()); } public void updateViewport(float width, float height) { setToOrtho(false, width, height); } public Vector2 unprojectCoordinates(float x, float y) { cachedVec3.set(x, y,0); unproject(cachedVec3); return new Vector2(cachedVec3.x, cachedVec3.y); } public float unprojectXCoordinate(float x, float y) { cachedVec3.set(x, y,0); unproject(cachedVec3); return cachedVec3.x; } public float unprojectYCoordinate(float x, float y) { cachedVec3.set(x, y, 0); unproject(cachedVec3); return cachedVec3.y; } public void resize() { VirtualViewport virtualViewport = new VirtualViewport(Settings.getWidth(), Settings.getHeight()); setVirtualViewport(virtualViewport); updateViewport(Settings.getWidth(), Settings.getHeight()); } public void resize(int width, int height) { VirtualViewport virtualViewport = new VirtualViewport(width, height); setVirtualViewport(virtualViewport); updateViewport(Settings.getWidth(), Settings.getHeight()); } }