From 6ff309a40cc6486f258e59068a7628e43ff535ad Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Thu, 21 Sep 2017 14:40:35 +1200 Subject: [PATCH 01/11] - Perspective Camera Works - Top Down Camera Works - Started on chase cam but the math is a bit tricky. tags : #story[1273] --- src/main/java/seng302/model/ClientYacht.java | 11 +++ .../java/seng302/visualiser/GameView3D.java | 59 +++++++++--- .../visualiser/cameras/ChaseCamera.java | 89 +++++++++++++++++++ .../visualiser/cameras/IsometricCamera.java | 47 ++++++++++ .../visualiser/cameras/RaceCamera.java | 18 ++++ .../visualiser/cameras/TopDownCamera.java | 48 ++++++++++ 6 files changed, 258 insertions(+), 14 deletions(-) create mode 100644 src/main/java/seng302/visualiser/cameras/ChaseCamera.java create mode 100644 src/main/java/seng302/visualiser/cameras/IsometricCamera.java create mode 100644 src/main/java/seng302/visualiser/cameras/RaceCamera.java create mode 100644 src/main/java/seng302/visualiser/cameras/TopDownCamera.java diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index 89715852..f14b0e5a 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -15,6 +15,7 @@ import javafx.beans.property.ReadOnlyLongWrapper; import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import seng302.visualiser.fxObjects.assets_3D.BoatObject; /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) @@ -56,6 +57,8 @@ public class ClientYacht extends Observable { private Integer boatStatus; private Double currentVelocity; + private BoatObject boatObject; + private List locationListeners = new ArrayList<>(); private List markRoundingListeners = new ArrayList<>(); private ReadOnlyDoubleWrapper velocityProperty = new ReadOnlyDoubleWrapper(); @@ -288,4 +291,12 @@ public class ClientYacht extends Observable { public Double getCurrentVelocity() { return currentVelocity; } + + public void setBoatObject(BoatObject newBoatObject) { + this.boatObject = newBoatObject; + } + + public BoatObject getBoatObject() { + return this.boatObject; + } } diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index c5b52286..f6f6b953 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -29,6 +29,11 @@ import seng302.model.mark.Mark; import seng302.model.token.Token; import seng302.utilities.GeoUtility; import seng302.utilities.Sounds; +import seng302.visualiser.cameras.ChaseCamera; +import seng302.visualiser.cameras.IsometricCamera; +import seng302.visualiser.cameras.RaceCamera; +import seng302.visualiser.cameras.TopDownCamera; +import seng302.visualiser.controllers.ViewManager; import seng302.visualiser.fxObjects.MarkArrowFactory; import seng302.visualiser.fxObjects.assets_3D.BoatObject; import seng302.visualiser.fxObjects.assets_3D.Marker3D; @@ -51,6 +56,8 @@ public class GameView3D { private SubScene view; // ParallelCamera camera; private PerspectiveCamera camera; + private PerspectiveCamera camera2; + private PerspectiveCamera camera3; private Group gameObjects; private double bufferSize = 0; @@ -87,13 +94,21 @@ public class GameView3D { } public GameView3D () { - camera = new PerspectiveCamera(true); - camera.getTransforms().addAll( - new Translate(DEFAULT_CAMERA_X,DEFAULT_CAMERA_Y, DEFAULT_CAMERA_DEPTH) - ); + camera = new IsometricCamera(DEFAULT_CAMERA_X, DEFAULT_CAMERA_Y, DEFAULT_CAMERA_DEPTH); camera.setFarClip(600); camera.setNearClip(0.1); camera.setFieldOfView(FOV); + + camera2 = new TopDownCamera(); + camera2.setFarClip(600); + camera2.setNearClip(0.1); + camera2.setFieldOfView(FOV); + + camera3 = new ChaseCamera(); + camera3.setFarClip(600); + camera3.setNearClip(0.1); + camera3.setFieldOfView(FOV); + gameObjects = new Group(); root3D = new Group(camera, gameObjects); view = new SubScene( @@ -405,35 +420,46 @@ public class GameView3D { public void cameraMovement(KeyEvent event) { switch (event.getCode()) { case NUMPAD8: - camera.getTransforms().addAll(new Rotate(0.5, new Point3D(1,0,0))); + view.getCamera().getTransforms().addAll(new Rotate(0.5, new Point3D(1, 0, 0))); break; case NUMPAD2: - camera.getTransforms().addAll(new Rotate(-0.5, new Point3D(1,0,0))); + view.getCamera().getTransforms().addAll(new Rotate(-0.5, new Point3D(1, 0, 0))); break; case NUMPAD4: - camera.getTransforms().addAll(new Rotate(-0.5, new Point3D(0,1,0))); + view.getCamera().getTransforms().addAll(new Rotate(-0.5, new Point3D(0, 1, 0))); break; case NUMPAD6: - camera.getTransforms().addAll(new Rotate(0.5, new Point3D(0,1,0))); + view.getCamera().getTransforms().addAll(new Rotate(0.5, new Point3D(0, 1, 0))); break; case Z: - camera.getTransforms().addAll(new Translate(0, 0, 1.5)); + ((RaceCamera) view.getCamera()).zoomIn(); break; case X: - camera.getTransforms().addAll(new Translate(0, 0, -1.5)); + ((RaceCamera) view.getCamera()).zoomOut(); break; case W: - camera.getTransforms().addAll(new Translate(0, -1, 0)); + view.getCamera().getTransforms().addAll(new Translate(0, -1, 0)); break; case S: - camera.getTransforms().addAll(new Translate(0, 1, 0)); + view.getCamera().getTransforms().addAll(new Translate(0, 1, 0)); break; case A: - camera.getTransforms().addAll(new Translate(-1, 0, 0)); + view.getCamera().getTransforms().addAll(new Translate(-1, 0, 0)); break; case D: - camera.getTransforms().addAll(new Translate(1, 0, 0)); + view.getCamera().getTransforms().addAll(new Translate(1, 0, 0)); break; + case F1: + if (view.getCamera().equals(camera)) { + view.setCamera(camera2); + if (view.getCamera() instanceof TopDownCamera) { + ((RaceCamera) view.getCamera()).zoomIn(); + } + } else if (view.getCamera().equals(camera2)) { + view.setCamera(camera3); + } else { + view.setCamera(camera); + } } } @@ -470,6 +496,11 @@ public class GameView3D { Point2D p2d = findScaledXY(lat, lon); bo.moveTo(p2d.getX(), p2d.getY(), heading, velocity, sailIn, windDir); }); + + if (clientYacht.getSourceId().equals( + ViewManager.getInstance().getGameClient().getServerThread().getClientId())) { + ((ChaseCamera) camera3).setPlayerBoat(newBoat); + } } Platform.runLater(() -> { gameObjects.getChildren().addAll(wakes); diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java new file mode 100644 index 00000000..1d0a0648 --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -0,0 +1,89 @@ +package seng302.visualiser.cameras; + +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +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; +import seng302.visualiser.fxObjects.assets_3D.BoatObject; + + +public class ChaseCamera extends PerspectiveCamera implements RaceCamera { + + private ObservableList transforms; + private BoatObject playerBoat; + + public ChaseCamera() { + super(true); + transforms = this.getTransforms(); + } + + public void setPlayerBoat(BoatObject playerBoat) { + this.playerBoat = playerBoat; + + this.playerBoat.layoutXProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, + Number newValue) { + updateCameraX((Double) oldValue, (Double) newValue); + } + }); + this.playerBoat.layoutYProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, + Number newValue) { + updateCameraY((Double) oldValue, (Double) newValue); + } + }); + } + + + private void updateCameraX(Double oldXValue, Double newXValue) { + if (transforms.size() == 0) { // boat is placed and then moved at start, + transforms.addAll( + new Translate(playerBoat.getLayoutX() - 30, playerBoat.getLayoutY() - 30, -125), + new Rotate(80, new Point3D(0, 0, 1)) + ); + } else { + transforms.addAll(new Translate(newXValue - oldXValue, 0, 0)); + } + } + + private void updateCameraY(Double oldYValue, Double newYValue) { + transforms.addAll(new Translate(0, (newYValue - oldYValue), 0)); + } + + @Override + public void zoomIn() { + transforms.addAll(new Translate(0, 0, 1.5)); + } + + @Override + public void zoomOut() { + transforms.addAll(new Translate(0, 0, -1.5)); + } + + + /* + These have been left intentionally empty for now. it would be cool to be able to pan around the boat and have the camera move around the boat though. + */ + + @Override + public void panLeft() { + } + + @Override + public void panRight() { + } + + @Override + public void panUp() { + } + + @Override + public void panDown() { + } +} diff --git a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java new file mode 100644 index 00000000..a4abeac4 --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java @@ -0,0 +1,47 @@ +package seng302.visualiser.cameras; + +import javafx.collections.ObservableList; +import javafx.scene.PerspectiveCamera; +import javafx.scene.transform.Transform; +import javafx.scene.transform.Translate; + +public class IsometricCamera extends PerspectiveCamera implements RaceCamera { + + ObservableList transforms; + + public IsometricCamera(Double cameraStartX, Double cameraStartY, Double cameraDepth) { + super(true); + transforms = this.getTransforms(); + transforms.addAll(new Translate(cameraStartX, cameraStartY, cameraDepth)); + } + + @Override + public void zoomIn() { + transforms.addAll(new Translate(0, 0, 1.5)); + } + + @Override + public void zoomOut() { + transforms.addAll(new Translate(0, 0, -1.5)); + } + + @Override + public void panLeft() { + transforms.addAll(new Translate(-1, 0, 0)); + } + + @Override + public void panRight() { + transforms.addAll(new Translate(1, 0, 0)); + } + + @Override + public void panUp() { + transforms.addAll(new Translate(0, -1, 0)); + } + + @Override + public void panDown() { + transforms.addAll(new Translate(0, 1, 0)); + } +} diff --git a/src/main/java/seng302/visualiser/cameras/RaceCamera.java b/src/main/java/seng302/visualiser/cameras/RaceCamera.java new file mode 100644 index 00000000..7416ae4a --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/RaceCamera.java @@ -0,0 +1,18 @@ +package seng302.visualiser.cameras; + + +public interface RaceCamera { + + void zoomIn(); + + void zoomOut(); + + void panLeft(); + + void panRight(); + + void panUp(); + + void panDown(); + +} diff --git a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java new file mode 100644 index 00000000..624ae478 --- /dev/null +++ b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java @@ -0,0 +1,48 @@ +package seng302.visualiser.cameras; + + +import javafx.collections.ObservableList; +import javafx.scene.PerspectiveCamera; +import javafx.scene.transform.Transform; +import javafx.scene.transform.Translate; + +public class TopDownCamera extends PerspectiveCamera implements RaceCamera { + + ObservableList transforms; + + public TopDownCamera() { + super(true); + transforms = this.getTransforms(); + transforms.add(new Translate(0, 0, -125)); + } + + @Override + public void zoomIn() { + transforms.addAll(new Translate(0, 0, 1.5)); + } + + @Override + public void zoomOut() { + transforms.addAll(new Translate(0, 0, -1.5)); + } + + @Override + public void panLeft() { + transforms.addAll(new Translate(-1, 0, 0)); + } + + @Override + public void panRight() { + transforms.addAll(new Translate(1, 0, 0)); + } + + @Override + public void panUp() { + transforms.addAll(new Translate(0, -1, 0)); + } + + @Override + public void panDown() { + transforms.addAll(new Translate(0, 1, 0)); + } +} From a19e191684a84f423c39cecf165cfd79690d5556 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Mon, 25 Sep 2017 14:03:47 +1300 Subject: [PATCH 02/11] - Chase cam kind of working, need to find a fix for the abrupt direction change. tags : #story[1273] --- .../java/seng302/visualiser/GameView3D.java | 11 +++--- .../visualiser/cameras/ChaseCamera.java | 33 +++++++--------- .../visualiser/cameras/TopDownCamera.java | 39 ++++++++++++++++++- 3 files changed, 59 insertions(+), 24 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index f6f6b953..7c3fff69 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -438,16 +438,16 @@ public class GameView3D { ((RaceCamera) view.getCamera()).zoomOut(); break; case W: - view.getCamera().getTransforms().addAll(new Translate(0, -1, 0)); + ((RaceCamera) view.getCamera()).panUp(); break; case S: - view.getCamera().getTransforms().addAll(new Translate(0, 1, 0)); + ((RaceCamera) view.getCamera()).panDown(); break; case A: - view.getCamera().getTransforms().addAll(new Translate(-1, 0, 0)); + ((RaceCamera) view.getCamera()).panLeft(); break; case D: - view.getCamera().getTransforms().addAll(new Translate(1, 0, 0)); + ((RaceCamera) view.getCamera()).panRight(); break; case F1: if (view.getCamera().equals(camera)) { @@ -499,7 +499,8 @@ public class GameView3D { if (clientYacht.getSourceId().equals( ViewManager.getInstance().getGameClient().getServerThread().getClientId())) { - ((ChaseCamera) camera3).setPlayerBoat(newBoat); + ((ChaseCamera) camera3).setPlayerBoat(newBoat, clientYacht); + ((TopDownCamera) camera2).setPlayerBoat(newBoat); } } Platform.runLater(() -> { diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java index 1d0a0648..466e86fa 100644 --- a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -8,6 +8,7 @@ import javafx.scene.PerspectiveCamera; import javafx.scene.transform.Rotate; import javafx.scene.transform.Transform; import javafx.scene.transform.Translate; +import seng302.model.ClientYacht; import seng302.visualiser.fxObjects.assets_3D.BoatObject; @@ -15,45 +16,41 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { private ObservableList transforms; private BoatObject playerBoat; + private ClientYacht playerYacht; + public ChaseCamera() { super(true); transforms = this.getTransforms(); } - public void setPlayerBoat(BoatObject playerBoat) { + public void setPlayerBoat(BoatObject playerBoat, ClientYacht playerYacht) { this.playerBoat = playerBoat; - + this.playerYacht = playerYacht; this.playerBoat.layoutXProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - updateCameraX((Double) oldValue, (Double) newValue); + repositionCamera(); } }); this.playerBoat.layoutYProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - updateCameraY((Double) oldValue, (Double) newValue); + repositionCamera(); } }); } - - private void updateCameraX(Double oldXValue, Double newXValue) { - if (transforms.size() == 0) { // boat is placed and then moved at start, - transforms.addAll( - new Translate(playerBoat.getLayoutX() - 30, playerBoat.getLayoutY() - 30, -125), - new Rotate(80, new Point3D(0, 0, 1)) - ); - } else { - transforms.addAll(new Translate(newXValue - oldXValue, 0, 0)); - } - } - - private void updateCameraY(Double oldYValue, Double newYValue) { - transforms.addAll(new Translate(0, (newYValue - oldYValue), 0)); + private void repositionCamera() { + transforms.clear(); + transforms.addAll( + new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0), + new Rotate(playerYacht.getHeading(), new Point3D(0, 0, 1)), + new Rotate(60, new Point3D(1, 0, 0)), + new Translate(0, 0, -75) + ); } @Override diff --git a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java index 624ae478..af17d553 100644 --- a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java +++ b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java @@ -1,14 +1,18 @@ package seng302.visualiser.cameras; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.scene.PerspectiveCamera; import javafx.scene.transform.Transform; import javafx.scene.transform.Translate; +import seng302.visualiser.fxObjects.assets_3D.BoatObject; public class TopDownCamera extends PerspectiveCamera implements RaceCamera { - ObservableList transforms; + private ObservableList transforms; + private BoatObject playerBoat; public TopDownCamera() { super(true); @@ -16,6 +20,39 @@ public class TopDownCamera extends PerspectiveCamera implements RaceCamera { transforms.add(new Translate(0, 0, -125)); } + public void setPlayerBoat(BoatObject playerBoat) { + this.playerBoat = playerBoat; + this.playerBoat.layoutXProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, + Number newValue) { + updateCameraX((Double) oldValue, (Double) newValue); + } + }); + this.playerBoat.layoutYProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, + Number newValue) { + updateCameraY((Double) oldValue, (Double) newValue); + } + }); + } + + + private void updateCameraX(Double oldXValue, Double newXValue) { + if (transforms.size() == 0) { // boat is placed and then moved at start, + transforms.addAll( + new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), -125) + ); + } else { + transforms.addAll(new Translate(newXValue - oldXValue, 0, 0)); + } + } + + private void updateCameraY(Double oldYValue, Double newYValue) { + transforms.addAll(new Translate(0, (newYValue - oldYValue), 0)); + } + @Override public void zoomIn() { transforms.addAll(new Translate(0, 0, 1.5)); From e66abb43407c6a53bcc4788a630995b3e2372625 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Mon, 25 Sep 2017 14:39:09 +1300 Subject: [PATCH 03/11] - An attempt at chase cam smoothing. needs work. tags : #story[1273] --- src/main/java/seng302/model/ClientYacht.java | 18 +++++++++++ .../visualiser/cameras/ChaseCamera.java | 31 +++++++++++++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index f14b0e5a..f2fcec96 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -65,6 +65,7 @@ public class ClientYacht extends Observable { private ReadOnlyLongWrapper timeTillNextProperty = new ReadOnlyLongWrapper(); private ReadOnlyLongWrapper timeSinceLastMarkProperty = new ReadOnlyLongWrapper(); private ReadOnlyIntegerWrapper placingProperty = new ReadOnlyIntegerWrapper(); + private ReadOnlyDoubleWrapper headingProperty = new ReadOnlyDoubleWrapper(); private Color colour; public ClientYacht(String boatType, Integer sourceId, String hullID, String shortName, @@ -224,6 +225,7 @@ public class ClientYacht extends Observable { public void setHeading(Double heading) { this.heading = heading; + setHeadingProperty(); } @Override @@ -256,6 +258,7 @@ public class ClientYacht extends Observable { public void updateLocation(double lat, double lng, double heading, double velocity) { setLocation(lat, lng); this.heading = heading; + setHeadingProperty(); this.currentVelocity = velocity; updateVelocityProperty(velocity); for (YachtLocationListener yll : locationListeners) { @@ -263,6 +266,15 @@ public class ClientYacht extends Observable { } } + private void setHeadingProperty() { + Double oldHeading = getHeadingProperty().get(); + Double currHeading = heading; + while (oldHeading.equals(currHeading)) { + oldHeading++; + headingProperty.set(oldHeading); + } + } + public void addLocationListener(YachtLocationListener listener) { locationListeners.add(listener); } @@ -299,4 +311,10 @@ public class ClientYacht extends Observable { public BoatObject getBoatObject() { return this.boatObject; } + + public ReadOnlyDoubleWrapper getHeadingProperty() { + + return headingProperty; + } + } diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java index 466e86fa..b84e64ec 100644 --- a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -17,16 +17,27 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { private ObservableList transforms; private BoatObject playerBoat; private ClientYacht playerYacht; + private Double zoomFactor; public ChaseCamera() { super(true); transforms = this.getTransforms(); + this.zoomFactor = -75.0; } public void setPlayerBoat(BoatObject playerBoat, ClientYacht playerYacht) { this.playerBoat = playerBoat; this.playerYacht = playerYacht; + + this.playerYacht.getHeadingProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Number oldValue, + Number newValue) { + repositionCamera(); + } + }); + this.playerBoat.layoutXProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, @@ -49,18 +60,32 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0), new Rotate(playerYacht.getHeading(), new Point3D(0, 0, 1)), new Rotate(60, new Point3D(1, 0, 0)), - new Translate(0, 0, -75) + new Translate(0, 0, zoomFactor) + ); + } + + private void repositionCamera(Double newHeading) { + transforms.clear(); + transforms.addAll( + new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0), + new Rotate(newHeading, new Point3D(0, 0, 1)), + new Rotate(60, new Point3D(1, 0, 0)), + new Translate(0, 0, zoomFactor) ); } @Override public void zoomIn() { - transforms.addAll(new Translate(0, 0, 1.5)); + //transforms.addAll(new Translate(0, 0, 1.5)); + this.zoomFactor += 5; + repositionCamera(); } @Override public void zoomOut() { - transforms.addAll(new Translate(0, 0, -1.5)); + //transforms.addAll(new Translate(0, 0, -1.5)); + this.zoomFactor -= 5; + repositionCamera(); } From d250c635d84e201cea65e55fb81dc266fa71015e Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Mon, 25 Sep 2017 15:32:13 +1300 Subject: [PATCH 04/11] - Adjusted server tick rate to test smoothing tags : #story[1273] --- src/main/java/seng302/model/ClientYacht.java | 11 ++++++++--- .../seng302/visualiser/ClientToServerThread.java | 2 +- .../seng302/visualiser/cameras/ChaseCamera.java | 14 +++++++++----- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index ea3058ce..3cfba60e 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -15,8 +15,8 @@ import javafx.beans.property.ReadOnlyLongWrapper; import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import seng302.visualiser.fxObjects.assets_3D.BoatObject; import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; +import seng302.visualiser.fxObjects.assets_3D.BoatObject; /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) @@ -79,6 +79,7 @@ public class ClientYacht extends Observable { this.country = country; this.location = new GeoPoint(57.670341, 11.826856); this.heading = 120.0; //In degrees + this.headingProperty.set(this.heading); this.currentVelocity = 0d; this.boatStatus = 1; this.colour = Color.rgb(0, 0, 0, 1.0); @@ -271,7 +272,12 @@ public class ClientYacht extends Observable { Double oldHeading = getHeadingProperty().get(); Double currHeading = heading; while (oldHeading.equals(currHeading)) { - oldHeading++; + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + oldHeading += 0.5; headingProperty.set(oldHeading); } } @@ -314,7 +320,6 @@ public class ClientYacht extends Observable { } public ReadOnlyDoubleWrapper getHeadingProperty() { - return headingProperty; } diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index e53aed22..6dbcec70 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -68,7 +68,7 @@ public class ClientToServerThread implements Runnable { private Timer upWindPacketTimer = new Timer(); private Timer downWindPacketTimer = new Timer(); private boolean upwindTimerFlag = false, downwindTimerFlag = false; - static public final int PACKET_SENDING_INTERVAL_MS = 100; + static public final int PACKET_SENDING_INTERVAL_MS = 60; private int clientId = -1; diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java index b84e64ec..c2496ff7 100644 --- a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -29,7 +29,7 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { public void setPlayerBoat(BoatObject playerBoat, ClientYacht playerYacht) { this.playerBoat = playerBoat; this.playerYacht = playerYacht; - + System.out.println(playerYacht.getHeadingProperty().get()); this.playerYacht.getHeadingProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, @@ -74,17 +74,21 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { ); } + private void adjustZoomFactor(Double adjustment) { + if (zoomFactor + adjustment < -15.0 && zoomFactor + adjustment > -125.0) { + zoomFactor = zoomFactor + adjustment; + } + } + @Override public void zoomIn() { - //transforms.addAll(new Translate(0, 0, 1.5)); - this.zoomFactor += 5; + adjustZoomFactor(5.0); repositionCamera(); } @Override public void zoomOut() { - //transforms.addAll(new Translate(0, 0, -1.5)); - this.zoomFactor -= 5; + adjustZoomFactor(-5.0); repositionCamera(); } From 00b09997b07cbd768f9b442f4d037d6f9cf8d161 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Mon, 25 Sep 2017 16:28:37 +1300 Subject: [PATCH 05/11] - Added Camera panning to chase camera mode. tags : #story[1273] --- src/main/java/seng302/model/ClientYacht.java | 16 +++------ .../visualiser/ClientToServerThread.java | 2 +- .../java/seng302/visualiser/GameView3D.java | 2 -- .../visualiser/cameras/ChaseCamera.java | 36 +++++++++++-------- 4 files changed, 26 insertions(+), 30 deletions(-) diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index 3cfba60e..88d588cf 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Observable; import java.util.Observer; +import java.util.Timer; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.beans.property.ReadOnlyDoubleWrapper; import javafx.beans.property.ReadOnlyIntegerProperty; @@ -58,6 +59,8 @@ public class ClientYacht extends Observable { private Integer boatStatus; private Double currentVelocity; + Timer t; + private BoatObject boatObject; private List locationListeners = new ArrayList<>(); @@ -256,7 +259,6 @@ public class ClientYacht extends Observable { this.colour = colour; } - public void updateLocation(double lat, double lng, double heading, double velocity) { setLocation(lat, lng); this.heading = heading; @@ -269,17 +271,7 @@ public class ClientYacht extends Observable { } private void setHeadingProperty() { - Double oldHeading = getHeadingProperty().get(); - Double currHeading = heading; - while (oldHeading.equals(currHeading)) { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - oldHeading += 0.5; - headingProperty.set(oldHeading); - } + headingProperty.set(heading); } public void addLocationListener(YachtLocationListener listener) { diff --git a/src/main/java/seng302/visualiser/ClientToServerThread.java b/src/main/java/seng302/visualiser/ClientToServerThread.java index 6dbcec70..e53aed22 100644 --- a/src/main/java/seng302/visualiser/ClientToServerThread.java +++ b/src/main/java/seng302/visualiser/ClientToServerThread.java @@ -68,7 +68,7 @@ public class ClientToServerThread implements Runnable { private Timer upWindPacketTimer = new Timer(); private Timer downWindPacketTimer = new Timer(); private boolean upwindTimerFlag = false, downwindTimerFlag = false; - static public final int PACKET_SENDING_INTERVAL_MS = 60; + static public final int PACKET_SENDING_INTERVAL_MS = 100; private int clientId = -1; diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index db4a2758..78e43b9a 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -35,7 +35,6 @@ import seng302.visualiser.cameras.RaceCamera; import seng302.visualiser.cameras.TopDownCamera; import seng302.visualiser.controllers.ViewManager; import seng302.visualiser.fxObjects.MarkArrowFactory; -import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; import seng302.visualiser.fxObjects.assets_3D.BoatObject; import seng302.visualiser.fxObjects.assets_3D.Marker3D; import seng302.visualiser.fxObjects.assets_3D.ModelFactory; @@ -47,7 +46,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; diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java index c2496ff7..6c777f77 100644 --- a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -18,18 +18,21 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { private BoatObject playerBoat; private ClientYacht playerYacht; private Double zoomFactor; + private Double horizontalPan; + private Double verticalPan; public ChaseCamera() { super(true); transforms = this.getTransforms(); this.zoomFactor = -75.0; + this.horizontalPan = 0.0; + this.verticalPan = 0.0; } public void setPlayerBoat(BoatObject playerBoat, ClientYacht playerYacht) { this.playerBoat = playerBoat; this.playerYacht = playerYacht; - System.out.println(playerYacht.getHeadingProperty().get()); this.playerYacht.getHeadingProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, @@ -58,18 +61,9 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { transforms.clear(); transforms.addAll( new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0), - new Rotate(playerYacht.getHeading(), new Point3D(0, 0, 1)), - new Rotate(60, new Point3D(1, 0, 0)), - new Translate(0, 0, zoomFactor) - ); - } - - private void repositionCamera(Double newHeading) { - transforms.clear(); - transforms.addAll( - new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0), - new Rotate(newHeading, new Point3D(0, 0, 1)), - new Rotate(60, new Point3D(1, 0, 0)), + new Rotate(playerYacht.getHeadingProperty().getValue() + horizontalPan, + new Point3D(0, 0, 1)), + new Rotate(60 + verticalPan, new Point3D(1, 0, 0)), new Translate(0, 0, zoomFactor) ); } @@ -77,19 +71,25 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { private void adjustZoomFactor(Double adjustment) { if (zoomFactor + adjustment < -15.0 && zoomFactor + adjustment > -125.0) { zoomFactor = zoomFactor + adjustment; + repositionCamera(); + } + } + + private void adjustVerticalPan(Double adjustment) { + if (verticalPan + adjustment >= -20 && verticalPan + adjustment <= 20) { + verticalPan += adjustment; + repositionCamera(); } } @Override public void zoomIn() { adjustZoomFactor(5.0); - repositionCamera(); } @Override public void zoomOut() { adjustZoomFactor(-5.0); - repositionCamera(); } @@ -99,17 +99,23 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { @Override public void panLeft() { + this.horizontalPan -= 5; + repositionCamera(); } @Override public void panRight() { + this.horizontalPan += 5; + repositionCamera(); } @Override public void panUp() { + adjustVerticalPan(-5.0); } @Override public void panDown() { + adjustVerticalPan(5.0); } } From 2e7487fdfcff2de498a66aa746dad68378bb2dec Mon Sep 17 00:00:00 2001 From: alistairjmcintyre Date: Tue, 26 Sep 2017 15:06:21 +1300 Subject: [PATCH 06/11] - Chase Camera: - Has panning bounds, zoom bounds, and general tidy up. - Now correctly observes the boat object rather than getting information from both the boat object AND the client yacht model. Top Down Camera: - Can only pan within certain bounds now, and will continue to follow the boat regardless. - Can only zoom within certain bounds now. Isometric Camera: - Nothing changed. #tags [1273] --- .../java/seng302/visualiser/GameView3D.java | 68 ++++++++------- .../visualiser/cameras/ChaseCamera.java | 66 ++++++-------- .../visualiser/cameras/IsometricCamera.java | 7 ++ .../visualiser/cameras/TopDownCamera.java | 86 +++++++++++-------- .../fxObjects/assets_3D/BoatObject.java | 9 ++ 5 files changed, 130 insertions(+), 106 deletions(-) diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 78e43b9a..5094e41c 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -1,6 +1,7 @@ package seng302.visualiser; import java.util.ArrayList; +import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -9,6 +10,7 @@ import javafx.animation.AnimationTimer; import javafx.application.Platform; import javafx.geometry.Point2D; import javafx.geometry.Point3D; +import javafx.scene.Camera; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.PerspectiveCamera; @@ -53,12 +55,13 @@ public class GameView3D { private Group root3D; private SubScene view; - // ParallelCamera camera; - private PerspectiveCamera camera; - private PerspectiveCamera camera2; - private PerspectiveCamera camera3; private Group gameObjects; + // Cameras + private PerspectiveCamera isometricCam; + private PerspectiveCamera topDownCam; + private PerspectiveCamera chaseCam; + private double bufferSize = 0; private double canvasWidth = 200; private double canvasHeight = 200; @@ -93,28 +96,25 @@ public class GameView3D { } public GameView3D () { - camera = new IsometricCamera(DEFAULT_CAMERA_X, DEFAULT_CAMERA_Y, DEFAULT_CAMERA_DEPTH); - camera.setFarClip(600); - camera.setNearClip(0.1); - camera.setFieldOfView(FOV); + isometricCam = new IsometricCamera(DEFAULT_CAMERA_X, DEFAULT_CAMERA_Y, + DEFAULT_CAMERA_DEPTH); + topDownCam = new TopDownCamera(); + chaseCam = new ChaseCamera(); - camera2 = new TopDownCamera(); - camera2.setFarClip(600); - camera2.setNearClip(0.1); - camera2.setFieldOfView(FOV); - - camera3 = new ChaseCamera(); - camera3.setFarClip(600); - camera3.setNearClip(0.1); - camera3.setFieldOfView(FOV); + for (PerspectiveCamera pc : Arrays.asList(isometricCam, topDownCam, chaseCam)) { + pc.setFarClip(600); + pc.setNearClip(0.1); + pc.setFieldOfView(FOV); + } gameObjects = new Group(); - root3D = new Group(camera, gameObjects); + root3D = new Group(isometricCam, gameObjects); view = new SubScene( root3D, 1000, 1000, true, SceneAntialiasing.BALANCED ); - view.setCamera(camera); - camera.getTransforms().add(new Rotate(30, new Point3D(1,0,0))); + 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(), @@ -449,16 +449,20 @@ public class GameView3D { ((RaceCamera) view.getCamera()).panRight(); break; case F1: - if (view.getCamera().equals(camera)) { - view.setCamera(camera2); - if (view.getCamera() instanceof TopDownCamera) { - ((RaceCamera) view.getCamera()).zoomIn(); - } - } else if (view.getCamera().equals(camera2)) { - view.setCamera(camera3); - } else { - view.setCamera(camera); - } + toggleCamera(); + break; + } + } + + private void toggleCamera() { + Camera currCamera = view.getCamera(); + + if (currCamera.equals(isometricCam)) { + view.setCamera(topDownCam); + } else if (currCamera.equals(topDownCam)) { + view.setCamera(chaseCam); + } else { + view.setCamera(isometricCam); } } @@ -498,8 +502,8 @@ public class GameView3D { if (clientYacht.getSourceId().equals( ViewManager.getInstance().getGameClient().getServerThread().getClientId())) { - ((ChaseCamera) camera3).setPlayerBoat(newBoat, clientYacht); - ((TopDownCamera) camera2).setPlayerBoat(newBoat); + ((ChaseCamera) chaseCam).setPlayerBoat(newBoat); + ((TopDownCamera) topDownCam).setPlayerBoat(newBoat); } } Platform.runLater(() -> { diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java index 6c777f77..daddfaca 100644 --- a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -1,22 +1,25 @@ package seng302.visualiser.cameras; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; +import java.util.Arrays; +import javafx.beans.property.DoubleProperty; 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; -import seng302.model.ClientYacht; import seng302.visualiser.fxObjects.assets_3D.BoatObject; public class ChaseCamera extends PerspectiveCamera implements RaceCamera { + private final Double VERTICAL_PAN_LIMIT = 20.0; + private final Double NEAR_ZOOM_LIMIT = -15.0; + private final Double FAR_ZOOM_LIMIT = -125.0; + private ObservableList transforms; private BoatObject playerBoat; - private ClientYacht playerYacht; + private Double zoomFactor; private Double horizontalPan; private Double verticalPan; @@ -25,43 +28,27 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { public ChaseCamera() { super(true); transforms = this.getTransforms(); - this.zoomFactor = -75.0; + + zoomFactor = (FAR_ZOOM_LIMIT + NEAR_ZOOM_LIMIT) / 2.0; this.horizontalPan = 0.0; this.verticalPan = 0.0; } - public void setPlayerBoat(BoatObject playerBoat, ClientYacht playerYacht) { + public void setPlayerBoat(BoatObject playerBoat) { this.playerBoat = playerBoat; - this.playerYacht = playerYacht; - this.playerYacht.getHeadingProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Number oldValue, - Number newValue) { - repositionCamera(); - } - }); - this.playerBoat.layoutXProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Number oldValue, - Number newValue) { - repositionCamera(); - } - }); - this.playerBoat.layoutYProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Number oldValue, - Number newValue) { - repositionCamera(); - } - }); + for (DoubleProperty o : Arrays + .asList(playerBoat.getRotationProperty(), playerBoat.layoutYProperty(), + playerBoat.layoutXProperty())) { + o.addListener((obs, oldVal, newVal) -> repositionCamera()); + } } private void repositionCamera() { transforms.clear(); transforms.addAll( new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), 0), - new Rotate(playerYacht.getHeadingProperty().getValue() + horizontalPan, + new Rotate(playerBoat.getRotationProperty().getValue() + horizontalPan, new Point3D(0, 0, 1)), new Rotate(60 + verticalPan, new Point3D(1, 0, 0)), new Translate(0, 0, zoomFactor) @@ -69,19 +56,25 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { } private void adjustZoomFactor(Double adjustment) { - if (zoomFactor + adjustment < -15.0 && zoomFactor + adjustment > -125.0) { + if (zoomFactor + adjustment < NEAR_ZOOM_LIMIT && zoomFactor + adjustment > FAR_ZOOM_LIMIT) { zoomFactor = zoomFactor + adjustment; repositionCamera(); } } private void adjustVerticalPan(Double adjustment) { - if (verticalPan + adjustment >= -20 && verticalPan + adjustment <= 20) { + if (verticalPan + adjustment >= -VERTICAL_PAN_LIMIT + && verticalPan + adjustment <= VERTICAL_PAN_LIMIT) { verticalPan += adjustment; repositionCamera(); } } + private void adjustHorizontalPan(Double adjustment) { + this.horizontalPan += adjustment; + repositionCamera(); + } + @Override public void zoomIn() { adjustZoomFactor(5.0); @@ -92,21 +85,14 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { adjustZoomFactor(-5.0); } - - /* - These have been left intentionally empty for now. it would be cool to be able to pan around the boat and have the camera move around the boat though. - */ - @Override public void panLeft() { - this.horizontalPan -= 5; - repositionCamera(); + adjustHorizontalPan(-5.0); } @Override public void panRight() { - this.horizontalPan += 5; - repositionCamera(); + adjustHorizontalPan(5.0); } @Override diff --git a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java index a4abeac4..434032b7 100644 --- a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java +++ b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java @@ -7,6 +7,13 @@ 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 Double horizontalAdjustment; + private Double verticalAdjustment; + ObservableList transforms; public IsometricCamera(Double cameraStartX, Double cameraStartY, Double cameraDepth) { diff --git a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java index af17d553..09455345 100644 --- a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java +++ b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java @@ -1,8 +1,8 @@ package seng302.visualiser.cameras; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; +import java.util.Arrays; +import javafx.beans.property.DoubleProperty; import javafx.collections.ObservableList; import javafx.scene.PerspectiveCamera; import javafx.scene.transform.Transform; @@ -11,75 +11,93 @@ import seng302.visualiser.fxObjects.assets_3D.BoatObject; public class TopDownCamera extends PerspectiveCamera implements RaceCamera { + private final Double PAN_LIMIT = 30.0; + private final Double NEAR_ZOOM_LIMIT = -30.0; + private final Double FAR_ZOOM_LIMIT = -130.0; + private final Double ZOOM_STEP = 2.5; + private ObservableList transforms; private BoatObject playerBoat; + private Double zoomFactor; + private Double horizontalPan; + private Double verticalPan; + public TopDownCamera() { super(true); transforms = this.getTransforms(); - transforms.add(new Translate(0, 0, -125)); + + zoomFactor = (FAR_ZOOM_LIMIT + NEAR_ZOOM_LIMIT) / 2.0; + horizontalPan = 0.0; + verticalPan = 0.0; } public void setPlayerBoat(BoatObject playerBoat) { this.playerBoat = playerBoat; - this.playerBoat.layoutXProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Number oldValue, - Number newValue) { - updateCameraX((Double) oldValue, (Double) newValue); - } - }); - this.playerBoat.layoutYProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Number oldValue, - Number newValue) { - updateCameraY((Double) oldValue, (Double) newValue); - } - }); - } - - private void updateCameraX(Double oldXValue, Double newXValue) { - if (transforms.size() == 0) { // boat is placed and then moved at start, - transforms.addAll( - new Translate(playerBoat.getLayoutX(), playerBoat.getLayoutY(), -125) - ); - } else { - transforms.addAll(new Translate(newXValue - oldXValue, 0, 0)); + for (DoubleProperty o : Arrays + .asList(playerBoat.layoutXProperty(), playerBoat.layoutYProperty())) { + o.addListener((obs, oldVal, newVal) -> updateCamera()); } } - private void updateCameraY(Double oldYValue, Double newYValue) { - transforms.addAll(new Translate(0, (newYValue - oldYValue), 0)); + private void updateCamera() { + transforms.clear(); + transforms.addAll( + new Translate(playerBoat.getLayoutX() + horizontalPan, + playerBoat.getLayoutY() + verticalPan, zoomFactor) + ); + } + + 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 >= -PAN_LIMIT && verticalPan + adjustment <= PAN_LIMIT) { + verticalPan += adjustment; + updateCamera(); + } + } + + private void adjustHorizontalPan(Double adjustment) { + if (horizontalPan + adjustment >= -PAN_LIMIT && horizontalPan + adjustment <= PAN_LIMIT) { + horizontalPan += adjustment; + updateCamera(); + } } @Override public void zoomIn() { - transforms.addAll(new Translate(0, 0, 1.5)); + adjustZoomFactor(ZOOM_STEP); } @Override public void zoomOut() { - transforms.addAll(new Translate(0, 0, -1.5)); + adjustZoomFactor(-ZOOM_STEP); } @Override public void panLeft() { - transforms.addAll(new Translate(-1, 0, 0)); + adjustHorizontalPan(-1.0); } @Override public void panRight() { - transforms.addAll(new Translate(1, 0, 0)); + adjustHorizontalPan(1.0); } @Override public void panUp() { - transforms.addAll(new Translate(0, -1, 0)); + adjustVerticalPan(-1.0); } @Override public void panDown() { - transforms.addAll(new Translate(0, 1, 0)); + adjustVerticalPan(1.0); } + } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java index abf969a8..025ab820 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java @@ -3,6 +3,7 @@ package seng302.visualiser.fxObjects.assets_3D; import java.util.ArrayList; import java.util.List; import javafx.application.Platform; +import javafx.beans.property.ReadOnlyDoubleWrapper; import javafx.geometry.Point3D; import javafx.scene.Group; import javafx.scene.paint.Color; @@ -30,12 +31,15 @@ public class BoatObject extends Group { private Boolean isSelected = false; private Rotate rotation = new Rotate(0, new Point3D(0,0,1)); + private ReadOnlyDoubleWrapper rotationProperty; + private List selectedBoatListenerListeners = new ArrayList<>(); /** * Creates a BoatGroup with the default triangular boat polygon. */ public BoatObject(BoatMeshType boatMeshType) { + rotationProperty = new ReadOnlyDoubleWrapper(0.0); boatAssets = ModelFactory.boatGameView(boatMeshType, colour); boatAssets.hideSail(); boatAssets.getAssets().getTransforms().addAll( @@ -83,6 +87,7 @@ public class BoatObject extends Group { private void rotateTo(double heading, boolean sailsIn, double windDir) { + rotationProperty.set(heading); rotation.setAngle(heading); wake.getTransforms().setAll(new Rotate(heading, new Point3D(0,0,1))); if (sailsIn) { @@ -130,4 +135,8 @@ public class BoatObject extends Group { public void addSelectedBoatListener(SelectedBoatListener sbl) { selectedBoatListenerListeners.add(sbl); } + + public ReadOnlyDoubleWrapper getRotationProperty() { + return rotationProperty; + } } \ No newline at end of file From 1a53579317af7868e6cd806bff3ac2478e6233d3 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Tue, 26 Sep 2017 16:57:07 +1300 Subject: [PATCH 07/11] - 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); } } From 66e6a8a2a4fce06ffcd4f24df8c8d774ec62a00e Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Tue, 26 Sep 2017 17:35:36 +1300 Subject: [PATCH 08/11] - Small Changes tags : #story[1273] --- .../seng302/visualiser/cameras/ChaseCamera.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java index daddfaca..fddd1810 100644 --- a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -17,6 +17,9 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { private final Double NEAR_ZOOM_LIMIT = -15.0; private final Double FAR_ZOOM_LIMIT = -125.0; + private final Double ZOOM_STEP = 2.5; + private final Double PAN_STEP = 2.5; + private ObservableList transforms; private BoatObject playerBoat; @@ -77,31 +80,31 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { @Override public void zoomIn() { - adjustZoomFactor(5.0); + adjustZoomFactor(ZOOM_STEP); } @Override public void zoomOut() { - adjustZoomFactor(-5.0); + adjustZoomFactor(-ZOOM_STEP); } @Override public void panLeft() { - adjustHorizontalPan(-5.0); + adjustHorizontalPan(-PAN_STEP); } @Override public void panRight() { - adjustHorizontalPan(5.0); + adjustHorizontalPan(PAN_STEP); } @Override public void panUp() { - adjustVerticalPan(-5.0); + adjustVerticalPan(-PAN_STEP); } @Override public void panDown() { - adjustVerticalPan(5.0); + adjustVerticalPan(PAN_STEP); } } From 99ce4fa11d3b3a289d2911b22f00db08d26c1aab Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Tue, 26 Sep 2017 18:01:39 +1300 Subject: [PATCH 09/11] Merged develop in and reimplemented keybindings for moving the camera. tags : #story[1273] --- src/main/java/seng302/model/GameKeyBind.java | 4 +++ .../java/seng302/visualiser/GameView3D.java | 35 ++++++++----------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/main/java/seng302/model/GameKeyBind.java b/src/main/java/seng302/model/GameKeyBind.java index c25f6202..5627625c 100644 --- a/src/main/java/seng302/model/GameKeyBind.java +++ b/src/main/java/seng302/model/GameKeyBind.java @@ -52,6 +52,10 @@ public class GameKeyBind { return instance.actionToKeyMap.get(keyAction); } + public KeyAction getKeyAction(KeyCode keyCode) { + return instance.keyToActionMap.get(keyCode); + } + /** * Binds a key to a key action * diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index a7633b3f..8a944c20 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -23,7 +23,9 @@ import javafx.scene.transform.Scale; import javafx.scene.transform.Translate; import seng302.gameServer.messages.RoundingSide; import seng302.model.ClientYacht; +import seng302.model.GameKeyBind; import seng302.model.GeoPoint; +import seng302.model.KeyAction; import seng302.model.Limit; import seng302.model.mark.CompoundMark; import seng302.model.mark.Corner; @@ -121,6 +123,8 @@ public class GameView3D { scene.addEventHandler(KeyEvent.KEY_PRESSED, this::cameraMovement); } }); + + } public void updateCourse(List newCourse, List sequence) { @@ -345,7 +349,6 @@ public class GameView3D { * it to distanceScaleFactor Returns the max horizontal distance of the map. */ private double scaleRaceExtremities() { - double vertAngle = Math.abs( GeoUtility.getBearingRad(minLatPoint, maxLatPoint) ); @@ -413,38 +416,28 @@ public class GameView3D { } public void cameraMovement(KeyEvent event) { - switch (event.getCode()) { - case NUMPAD8: - view.getCamera().getTransforms().addAll(new Rotate(0.5, new Point3D(1, 0, 0))); - break; - case NUMPAD2: - view.getCamera().getTransforms().addAll(new Rotate(-0.5, new Point3D(1, 0, 0))); - break; - case NUMPAD4: - view.getCamera().getTransforms().addAll(new Rotate(-0.5, new Point3D(0, 1, 0))); - break; - case NUMPAD6: - view.getCamera().getTransforms().addAll(new Rotate(0.5, new Point3D(0, 1, 0))); - break; - case Z: + GameKeyBind keyBinds = GameKeyBind.getInstance(); + KeyAction keyPressed = keyBinds.getKeyAction(event.getCode()); + switch (keyPressed) { + case ZOOM_IN: ((RaceCamera) view.getCamera()).zoomIn(); break; - case X: + case ZOOM_OUT: ((RaceCamera) view.getCamera()).zoomOut(); break; - case W: + case FORWARD: ((RaceCamera) view.getCamera()).panUp(); break; - case S: + case BACKWARD: ((RaceCamera) view.getCamera()).panDown(); break; - case A: + case LEFT: ((RaceCamera) view.getCamera()).panLeft(); break; - case D: + case RIGHT: ((RaceCamera) view.getCamera()).panRight(); break; - case F1: + case VIEW: toggleCamera(); break; } From f11c457d28218f7159fadf96b2cc70905b3570e0 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Tue, 26 Sep 2017 18:31:47 +1300 Subject: [PATCH 10/11] removed print statements tags : #story[1273] --- src/main/java/seng302/visualiser/cameras/IsometricCamera.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java index 9814079c..41a1d563 100644 --- a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java +++ b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java @@ -37,10 +37,6 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera { } 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), From 9b00f769072009e2470c5e9b9bec61ffffcf5368 Mon Sep 17 00:00:00 2001 From: Alistair McIntyre Date: Tue, 26 Sep 2017 18:36:13 +1300 Subject: [PATCH 11/11] removed print statements and added documentation. tags : #story[1273] --- .../visualiser/cameras/ChaseCamera.java | 20 +++++++++++++++++++ .../visualiser/cameras/IsometricCamera.java | 16 +++++++++++++++ .../visualiser/cameras/TopDownCamera.java | 20 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java index fddd1810..0647a473 100644 --- a/src/main/java/seng302/visualiser/cameras/ChaseCamera.java +++ b/src/main/java/seng302/visualiser/cameras/ChaseCamera.java @@ -37,6 +37,11 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { this.verticalPan = 0.0; } + /** + * Sets a player boat object to observe and update the camera with. + * + * @param playerBoat The player boat to be observed. + */ public void setPlayerBoat(BoatObject playerBoat) { this.playerBoat = playerBoat; @@ -47,6 +52,9 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Moves the camera to a new position after some change (Zooming or Panning) + */ private void repositionCamera() { transforms.clear(); transforms.addAll( @@ -58,6 +66,10 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { ); } + /** + * Adjusts the zoom amount (camera depth) by some adjustment value + * @param adjustment the adjustment to be made to the camera + */ private void adjustZoomFactor(Double adjustment) { if (zoomFactor + adjustment < NEAR_ZOOM_LIMIT && zoomFactor + adjustment > FAR_ZOOM_LIMIT) { zoomFactor = zoomFactor + adjustment; @@ -65,6 +77,10 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Adjusts the Vertical Panning of the Camera + * @param adjustment the adjustment to be made to the camera + */ private void adjustVerticalPan(Double adjustment) { if (verticalPan + adjustment >= -VERTICAL_PAN_LIMIT && verticalPan + adjustment <= VERTICAL_PAN_LIMIT) { @@ -73,6 +89,10 @@ public class ChaseCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Adjusts the Horizontal Panning of the Camera. + * @param adjustment the adjustment to be made to the camera + */ private void adjustHorizontalPan(Double adjustment) { this.horizontalPan += adjustment; repositionCamera(); diff --git a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java index 41a1d563..85a0e502 100644 --- a/src/main/java/seng302/visualiser/cameras/IsometricCamera.java +++ b/src/main/java/seng302/visualiser/cameras/IsometricCamera.java @@ -36,6 +36,9 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera { updateCamera(); } + /** + * Moves the camera to a new position after some change (Zooming or Panning) + */ private void updateCamera() { transforms.clear(); transforms.addAll( @@ -44,6 +47,11 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera { ); } + /** + * Adjusts the zoom amount (camera depth) by some adjustment value + * + * @param adjustment the adjustment to be made to the camera + */ private void adjustZoomFactor(Double adjustment) { if (zoomFactor + adjustment < NEAR_ZOOM_LIMIT && zoomFactor + adjustment > FAR_ZOOM_LIMIT) { zoomFactor = zoomFactor + adjustment; @@ -51,6 +59,10 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Adjusts the Vertical Panning of the Camera + * @param adjustment the adjustment to be made to the camera + */ private void adjustVerticalPan(Double adjustment) { if (verticalPan + adjustment >= MIN_Y && verticalPan + adjustment <= MAX_Y) { verticalPan += adjustment; @@ -58,6 +70,10 @@ public class IsometricCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Adjusts the Horizontal Panning of the Camera. + * @param adjustment the adjustment to be made to the camera + */ private void adjustHorizontalPan(Double adjustment) { if (horizontalPan + adjustment >= MIN_X && horizontalPan + adjustment <= MIN_Y) { this.horizontalPan += adjustment; diff --git a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java index 09455345..72d58707 100644 --- a/src/main/java/seng302/visualiser/cameras/TopDownCamera.java +++ b/src/main/java/seng302/visualiser/cameras/TopDownCamera.java @@ -32,6 +32,11 @@ public class TopDownCamera extends PerspectiveCamera implements RaceCamera { verticalPan = 0.0; } + /** + * Sets a player boat object to observe and update the camera with. + * + * @param playerBoat The player boat to be observed. + */ public void setPlayerBoat(BoatObject playerBoat) { this.playerBoat = playerBoat; @@ -41,6 +46,9 @@ public class TopDownCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Moves the camera to a new position after some change (Zooming or Panning) + */ private void updateCamera() { transforms.clear(); transforms.addAll( @@ -49,6 +57,10 @@ public class TopDownCamera extends PerspectiveCamera implements RaceCamera { ); } + /** + * Adjusts the zoom amount (camera depth) by some adjustment value + * @param adjustment the adjustment to be made to the camera + */ private void adjustZoomFactor(Double adjustment) { if (zoomFactor + adjustment < NEAR_ZOOM_LIMIT && zoomFactor + adjustment > FAR_ZOOM_LIMIT) { zoomFactor = zoomFactor + adjustment; @@ -56,6 +68,10 @@ public class TopDownCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Adjusts the Vertical Panning of the Camera + * @param adjustment the adjustment to be made to the camera + */ private void adjustVerticalPan(Double adjustment) { if (verticalPan + adjustment >= -PAN_LIMIT && verticalPan + adjustment <= PAN_LIMIT) { verticalPan += adjustment; @@ -63,6 +79,10 @@ public class TopDownCamera extends PerspectiveCamera implements RaceCamera { } } + /** + * Adjusts the Horizontal Panning of the Camera. + * @param adjustment the adjustment to be made to the camera + */ private void adjustHorizontalPan(Double adjustment) { if (horizontalPan + adjustment >= -PAN_LIMIT && horizontalPan + adjustment <= PAN_LIMIT) { horizontalPan += adjustment;