diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml
index 41157414..16afe756 100644
--- a/racevisionGame/pom.xml
+++ b/racevisionGame/pom.xml
@@ -54,6 +54,11 @@
9.0
+
+ InteractiveMesh
+ STLImporter
+ 0_4_1
+
@@ -72,7 +77,11 @@
http://download.osgeo.org/webdav/geotools/
-
+
+ interactivemesh
+ Interactive Mesh
+ http://umbrasheep.com:8888/repository/internal/
+
diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java
new file mode 100644
index 00000000..7bff7325
--- /dev/null
+++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java
@@ -0,0 +1,209 @@
+package visualiser.Controllers;
+
+import javafx.animation.AnimationTimer;
+import javafx.application.Platform;
+import javafx.fxml.FXML;
+import javafx.scene.control.*;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.Pane;
+import mock.app.Event;
+import network.Messages.Enums.RaceStatusEnum;
+import network.Messages.Enums.RequestToJoinEnum;
+import visualiser.gameController.ControllerClient;
+import visualiser.model.View3D;
+import visualiser.model.VisualiserRaceEvent;
+import visualiser.model.VisualiserRaceState;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.net.URL;
+import java.util.Optional;
+import java.util.ResourceBundle;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Controller for Hosting a game.
+ */
+public class InGameLobby extends Controller {
+
+
+// @FXML
+// TextField gameNameField;
+//
+// @FXML
+// TextField hostNameField;
+
+ @FXML
+ private ImageView imageView;
+
+ @FXML
+ AnchorPane gameLobbyWrapper;
+
+ @FXML
+ AnchorPane imagePane;
+
+ @FXML
+ SplitPane splitPane;
+
+ @FXML
+ AnchorPane specPane;
+
+ @FXML
+ GridPane playerContainer;
+
+ @FXML
+ private Pane playerPane;
+
+ @FXML
+ private Pane playerPane4;
+
+ @FXML
+ private Button startButton;
+
+ @FXML
+ private Label countdownLable;
+
+ private Event game;
+
+ private View3D fancyStuff;
+
+ private VisualiserRaceEvent visualiserRaceEvent;
+
+ private boolean isHost;
+
+ private ControllerClient controllerClient;
+
+ @Override
+ public void initialize(URL location, ResourceBundle resources) {
+ fancyStuff = new View3D();
+ playerPane4.getChildren().add(fancyStuff);
+
+ //centering the 3d object
+ fancyStuff.layoutXProperty().bind(playerPane4.widthProperty().subtract(fancyStuff.widthProperty()).divide(2));
+ fancyStuff.layoutYProperty().bind(playerPane4.heightProperty().subtract(fancyStuff.heightProperty()).divide(2));
+ //playerContainer.add(fancyStuff, 0,0);
+
+ fancyStuff.spinBox();
+ }
+
+ /**
+ * Starts the race.
+ */
+ private void startRace() {
+ initialiseRaceClock(this.visualiserRaceEvent.getVisualiserRaceState());
+ //Starts the race countdown timer.
+ countdownTimer();
+ }
+
+ /**
+ * Initialises the race clock/timer labels for the start time, current time, and remaining time.
+ * @param visualiserRace The race to get data from.
+ */
+ private void initialiseRaceClock(VisualiserRaceState visualiserRace) {
+ //Remaining time.
+ initialiseRaceClockDuration(visualiserRace);
+
+ }
+
+
+ /**
+ * Initialises the race duration label.
+ * @param visualiserRace The race to get data from.
+ */
+ private void initialiseRaceClockDuration(VisualiserRaceState visualiserRace) {
+
+ visualiserRace.getRaceClock().durationProperty().addListener((observable, oldValue, newValue) -> {
+ Platform.runLater(() -> {
+ countdownLable.setText(newValue);
+ });
+ });
+
+ }
+ /**
+ * Countdown timer until race starts.
+ */
+ private void countdownTimer() {
+ new AnimationTimer() {
+ @Override
+ public void handle(long arg0) {
+
+ //Get the current race status.
+ RaceStatusEnum raceStatus = visualiserRaceEvent.getVisualiserRaceState().getRaceStatusEnum();
+
+
+ //If the race has reached the preparatory phase, or has started...
+ if (raceStatus == RaceStatusEnum.PREPARATORY || raceStatus == RaceStatusEnum.STARTED) {
+ //Stop this timer.
+ stop();
+
+ //Hide this, and display the race controller.
+ gameLobbyWrapper.setVisible(false);
+
+ parent.beginRace(visualiserRaceEvent, controllerClient, isHost);
+
+ }
+ }
+ }.start();
+ }
+
+ /**
+ * Hosts a game.
+ */
+ public void enterGameLobby(Socket socket, boolean isHost){
+ splitPane.setResizableWithParent(specPane, false);
+ splitPane.lookupAll(".split-pane-divider").stream().forEach(div -> div.setMouseTransparent(true));
+ imageView.fitWidthProperty().bind(imagePane.widthProperty());
+ imageView.fitHeightProperty().bind(imagePane.heightProperty());
+ this.isHost = isHost;
+ this.controllerClient = visualiserRaceEvent.getControllerClient();
+
+ if (!isHost){
+ startButton.setVisible(false);
+ }
+
+ try {
+
+ this.visualiserRaceEvent = new VisualiserRaceEvent(socket, RequestToJoinEnum.PARTICIPANT);
+ gameLobbyWrapper.setVisible(true);
+ startRace();
+
+ } catch (IOException e) {
+ //TODO should probably let this propagate, so that we only enter this scene if everything works
+ Logger.getGlobal().log(Level.WARNING, "Could not connect to server.", e);
+ }
+ }
+
+ /**
+ * Menu button pressed. Prompt alert then return to menu
+ */
+ public void menuBtnPressed(){
+ Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
+ alert.setTitle("Quitting race");
+ alert.setContentText("Do you wish to quit the race?");
+ alert.setHeaderText("You are about to quit the race");
+ Optional result = alert.showAndWait();
+ if(result.get() == ButtonType.OK){
+ gameLobbyWrapper.setVisible(false);
+ parent.enterTitle();
+ }
+ }
+
+ /**
+ * Start button pressed. Currently only prints out start
+ */
+ public void startBtnPressed(){
+ System.out.println("Should start the race. This button is only visible for the host");
+ }
+
+ public void joinSpecPressed(){
+ System.out.println("Spectator list pressed. Joining spectators");
+ }
+
+ public void joinRacePressed(){
+ System.out.println("Empty race user pane pressed. Joining racers");
+ }
+
+}
diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java
index 184965c0..a820e226 100644
--- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java
+++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java
@@ -29,7 +29,7 @@ import java.util.ResourceBundle;
public class LobbyController extends Controller {
@FXML
- AnchorPane lobbyWrapper;
+ private AnchorPane lobbyWrapper;
@FXML
private TableView lobbyTable;
@FXML
diff --git a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java
index 32e033c8..5617e3da 100644
--- a/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java
+++ b/racevisionGame/src/main/java/visualiser/Controllers/TitleController.java
@@ -81,7 +81,6 @@ public class TitleController extends Controller {
@Override
public void initialize(URL location, ResourceBundle resources) {
-
}
/**
diff --git a/racevisionGame/src/main/java/visualiser/app/App.java b/racevisionGame/src/main/java/visualiser/app/App.java
index eeae5a5d..31dcae24 100644
--- a/racevisionGame/src/main/java/visualiser/app/App.java
+++ b/racevisionGame/src/main/java/visualiser/app/App.java
@@ -96,15 +96,15 @@ public class App extends Application {
);
updateMessage("Preparing ingredients . . .");
- Thread.sleep(1000);
+ Thread.sleep(200);
for (int i = 0; i < burgerFilling.size(); i++) {
- Thread.sleep(800);
+ Thread.sleep(100);
updateProgress(i + 1, burgerFilling.size());
String nextFilling = burgerFilling.get(i);
addedFilling.add(nextFilling);
updateMessage("Adding the " + nextFilling + " . . .");
}
- Thread.sleep(400);
+ Thread.sleep(100);
updateMessage("Burger's done!");
return addedFilling;
diff --git a/racevisionGame/src/main/java/visualiser/model/BoatDisplay3D.java b/racevisionGame/src/main/java/visualiser/model/BoatDisplay3D.java
new file mode 100644
index 00000000..9314f5cd
--- /dev/null
+++ b/racevisionGame/src/main/java/visualiser/model/BoatDisplay3D.java
@@ -0,0 +1,18 @@
+package visualiser.model;
+
+import com.interactivemesh.jfx.importer.Importer;
+import javafx.scene.layout.Pane;
+
+/**
+ * Created by fwy13 on 29/08/17.
+ */
+public class BoatDisplay3D extends Pane {
+
+
+ public BoatDisplay3D(String filePath){
+ super();
+// Shape3D
+// this.getChildren().add();
+ }
+
+}
diff --git a/racevisionGame/src/main/java/visualiser/model/View3D.java b/racevisionGame/src/main/java/visualiser/model/View3D.java
new file mode 100644
index 00000000..f6937755
--- /dev/null
+++ b/racevisionGame/src/main/java/visualiser/model/View3D.java
@@ -0,0 +1,49 @@
+package visualiser.model;
+
+import javafx.animation.AnimationTimer;
+import javafx.scene.Group;
+import javafx.scene.PerspectiveCamera;
+import javafx.scene.SubScene;
+import javafx.scene.layout.Pane;
+import javafx.scene.shape.Box;
+import javafx.scene.shape.CullFace;
+import javafx.scene.transform.Rotate;
+
+/**
+ * Created by connortaylorbrown on 30/08/17.
+ */
+public class View3D extends Pane {
+ SubScene scene;
+ PerspectiveCamera camera;
+ Box box;
+
+ public View3D() {
+ scene = new SubScene(this, 500, 500);
+ camera = new PerspectiveCamera();
+ scene.setCamera(camera);
+ }
+
+ public void spinBox() {
+ camera.getTransforms().add(new Rotate(-20, Rotate.X_AXIS));
+
+ box = new Box(50,50,50);
+ box.setTranslateX(100);
+ box.setTranslateY(100);
+ box.setCullFace(CullFace.BACK);
+
+ Rotate ry = new Rotate(0, 0,0,0, Rotate.Y_AXIS);
+ box.getTransforms().add(ry);
+
+ this.getChildren().add(camera);
+ this.getChildren().add(box);
+
+ AnimationTimer rotation = new AnimationTimer() {
+ @Override
+ public void handle(long now) {
+ ry.setAngle(ry.getAngle() + 0.1);
+ }
+ };
+
+ rotation.start();
+ }
+}
diff --git a/racevisionGame/src/main/resources/visualiser/images/lobby.gif b/racevisionGame/src/main/resources/visualiser/images/lobby.gif
new file mode 100644
index 00000000..c70d8df6
Binary files /dev/null and b/racevisionGame/src/main/resources/visualiser/images/lobby.gif differ
diff --git a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml
index ced36627..ab14abaf 100644
--- a/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml
+++ b/racevisionGame/src/main/resources/visualiser/scenes/hostgame.fxml
@@ -1,40 +1,44 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/racevisionGame/src/main/resources/visualiser/scenes/inGameLobby.fxml b/racevisionGame/src/main/resources/visualiser/scenes/inGameLobby.fxml
new file mode 100644
index 00000000..bc41218d
--- /dev/null
+++ b/racevisionGame/src/main/resources/visualiser/scenes/inGameLobby.fxml
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml
index 074a9b31..7aff44c0 100644
--- a/racevisionGame/src/main/resources/visualiser/scenes/main.fxml
+++ b/racevisionGame/src/main/resources/visualiser/scenes/main.fxml
@@ -7,7 +7,7 @@
-
+
diff --git a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml
index f448a226..255381af 100644
--- a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml
+++ b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml
@@ -1,61 +1,61 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+