From 1a53579317af7868e6cd806bff3ac2478e6233d3 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Tue, 26 Sep 2017 16:57:07 +1300 Subject: [PATCH] - Isometric Camera - Zoom Bounds added. - Camera Panning Bounds added. Need to be tested with extra maps. tags : #story[1273] --- .../java/seng302/visualiser/GameView3D.java | 6 +- .../visualiser/cameras/IsometricCamera.java | 75 +++++++++++++++---- 2 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 5094e41c..a7633b3f 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -49,7 +49,6 @@ import seng302.visualiser.fxObjects.assets_3D.ModelType; public class GameView3D { private final double FOV = 60; - private final double DEFAULT_CAMERA_DEPTH = -125; private final double DEFAULT_CAMERA_X = 0; private final double DEFAULT_CAMERA_Y = 155; @@ -96,8 +95,7 @@ public class GameView3D { } public GameView3D () { - isometricCam = new IsometricCamera(DEFAULT_CAMERA_X, DEFAULT_CAMERA_Y, - DEFAULT_CAMERA_DEPTH); + isometricCam = new IsometricCamera(DEFAULT_CAMERA_X, DEFAULT_CAMERA_Y); topDownCam = new TopDownCamera(); chaseCam = new ChaseCamera(); @@ -113,8 +111,6 @@ public class GameView3D { root3D, 1000, 1000, true, SceneAntialiasing.BALANCED ); view.setCamera(isometricCam); - isometricCam.getTransforms() - .add(new Rotate(30, new Point3D(1, 0, 0))); //todo: move this into isometric cam? gameObjects.getChildren().addAll( ModelFactory.importModel(ModelType.OCEAN).getAssets(), diff --git a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java index 434032b7..9814079c 100644 --- a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java +++ b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java @@ -1,54 +1,101 @@ package seng302.visualiser.cameras; import javafx.collections.ObservableList; +import javafx.geometry.Point3D; import javafx.scene.PerspectiveCamera; +import javafx.scene.transform.Rotate; import javafx.scene.transform.Transform; import javafx.scene.transform.Translate; public class IsometricCamera extends PerspectiveCamera implements RaceCamera { - private final Double PAN_LIMIT = 50.0; - private final Double NEAR_ZOOM_LIMIT = -15.0; - private final Double FAR_ZOOM_LIMIT = -125.0; + private final Double MIN_X = -120.0; + private final Double MAX_X = 125.0; - private Double horizontalAdjustment; - private Double verticalAdjustment; + private final Double MIN_Y = 40.0; + private final Double MAX_Y = 170.0; - ObservableList transforms; + private final Double PAN_LIMIT = 160.0; + private final Double NEAR_ZOOM_LIMIT = -50.0; + private final Double FAR_ZOOM_LIMIT = -160.0; - public IsometricCamera(Double cameraStartX, Double cameraStartY, Double cameraDepth) { + private Double horizontalPan; + private Double verticalPan; + private Double zoomFactor; + + private ObservableList transforms; + + public IsometricCamera(Double cameraStartX, Double cameraStartY) { super(true); transforms = this.getTransforms(); - transforms.addAll(new Translate(cameraStartX, cameraStartY, cameraDepth)); + + zoomFactor = (FAR_ZOOM_LIMIT + NEAR_ZOOM_LIMIT) / 2.0; + horizontalPan = cameraStartX; + verticalPan = cameraStartY; + + updateCamera(); + } + + private void updateCamera() { + System.out.println("----"); + System.out.println(horizontalPan); + System.out.println(verticalPan); + System.out.println("----"); + transforms.clear(); + transforms.addAll( + new Translate(horizontalPan, verticalPan, zoomFactor), + new Rotate(30, new Point3D(1, 0, 0)) + ); + } + + private void adjustZoomFactor(Double adjustment) { + if (zoomFactor + adjustment < NEAR_ZOOM_LIMIT && zoomFactor + adjustment > FAR_ZOOM_LIMIT) { + zoomFactor = zoomFactor + adjustment; + updateCamera(); + } + } + + private void adjustVerticalPan(Double adjustment) { + if (verticalPan + adjustment >= MIN_Y && verticalPan + adjustment <= MAX_Y) { + verticalPan += adjustment; + updateCamera(); + } + } + + private void adjustHorizontalPan(Double adjustment) { + if (horizontalPan + adjustment >= MIN_X && horizontalPan + adjustment <= MIN_Y) { + this.horizontalPan += adjustment; + updateCamera(); + } } @Override public void zoomIn() { - transforms.addAll(new Translate(0, 0, 1.5)); + adjustZoomFactor(-2.5); } @Override public void zoomOut() { - transforms.addAll(new Translate(0, 0, -1.5)); + adjustZoomFactor(2.5); } @Override public void panLeft() { - transforms.addAll(new Translate(-1, 0, 0)); + adjustHorizontalPan(-2.5); } @Override public void panRight() { - transforms.addAll(new Translate(1, 0, 0)); + adjustHorizontalPan(2.5); } @Override public void panUp() { - transforms.addAll(new Translate(0, -1, 0)); + adjustVerticalPan(-2.5); } @Override public void panDown() { - transforms.addAll(new Translate(0, 1, 0)); + adjustVerticalPan(2.5); } }