diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java
index 5cedbfba..4a37360b 100644
--- a/src/main/java/seng302/model/ClientYacht.java
+++ b/src/main/java/seng302/model/ClientYacht.java
@@ -19,6 +19,7 @@ import jdk.nashorn.internal.objects.annotations.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import seng302.model.token.TokenType;
+import seng302.visualiser.fxObjects.assets_3D.BoatObject;
/**
* Yacht class for the racing boat.
Class created to store more variables (eg. boat statuses)
@@ -66,6 +67,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 List powerUpListeners = new ArrayList<>();
@@ -314,4 +317,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 6af253c9..419df72f 100644
--- a/src/main/java/seng302/visualiser/GameView3D.java
+++ b/src/main/java/seng302/visualiser/GameView3D.java
@@ -30,6 +30,11 @@ import seng302.model.token.Token;
import seng302.model.token.TokenType;
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;
@@ -52,6 +57,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;
@@ -88,13 +95,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(
@@ -406,35 +421,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);
+ }
}
}
@@ -471,6 +497,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 extends Number> observable, Number oldValue,
+ Number newValue) {
+ updateCameraX((Double) oldValue, (Double) newValue);
+ }
+ });
+ this.playerBoat.layoutYProperty().addListener(new ChangeListener() {
+ @Override
+ public void changed(ObservableValue extends Number> 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));
+ }
+}
diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java
index 9747b892..9b74aa69 100644
--- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java
+++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java
@@ -2,7 +2,7 @@ package seng302.visualiser.fxObjects.assets_3D;
/**
* Enum for boat meshes. Enum values should be of the form :
- * ENUM_VALUE (hull file, mast file, X offset of mast CoR from origin, sail file, X offset of sail CoR from origin)
+ * ENUM_VALUE (hull file, mast file, Y offset of mast CoR from origin, sail file, Y offset of sail CoR from origin)
* Files must be valid .stl files.
*/
public enum BoatMeshType {
diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java
index 8d7ecadf..6df7bf78 100644
--- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java
+++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java
@@ -78,7 +78,6 @@ public class ModelFactory {
public static BoatModel boatGameView(BoatMeshType boatType, Color primaryColour) {
Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour);
boatAssets.getTransforms().setAll(
- new Rotate(-90, new Point3D(0,0,1)),
new Scale(0.3, 0.3, 0.3)
);
return new BoatModel(boatAssets, null, boatType);
diff --git a/src/main/resources/PP.png b/src/main/resources/PP.png
index 1cc88a95..6db4eb3d 100644
Binary files a/src/main/resources/PP.png and b/src/main/resources/PP.png differ