|
|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
package visualiser.Controllers;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.interactivemesh.jfx.importer.stl.StlMeshImporter;
|
|
|
|
|
import javafx.animation.AnimationTimer;
|
|
|
|
|
import javafx.application.Platform;
|
|
|
|
|
import javafx.collections.FXCollections;
|
|
|
|
|
@ -17,6 +18,7 @@ import javafx.scene.layout.AnchorPane;
|
|
|
|
|
import javafx.scene.layout.GridPane;
|
|
|
|
|
import javafx.scene.layout.Pane;
|
|
|
|
|
import javafx.scene.layout.StackPane;
|
|
|
|
|
import javafx.scene.shape.MeshView;
|
|
|
|
|
import javafx.util.Callback;
|
|
|
|
|
import network.Messages.Enums.RaceStatusEnum;
|
|
|
|
|
import shared.model.Leg;
|
|
|
|
|
@ -24,6 +26,8 @@ import visualiser.app.App;
|
|
|
|
|
import visualiser.gameController.ControllerClient;
|
|
|
|
|
import visualiser.gameController.Keys.ControlKey;
|
|
|
|
|
import visualiser.gameController.Keys.KeyFactory;
|
|
|
|
|
import visualiser.layout.Subject3D;
|
|
|
|
|
import visualiser.layout.View3D;
|
|
|
|
|
import visualiser.model.*;
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
@ -40,27 +44,18 @@ import java.util.logging.Logger;
|
|
|
|
|
* Controller used to display a running race.
|
|
|
|
|
*/
|
|
|
|
|
public class RaceController extends Controller {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The race object which describes the currently occurring race.
|
|
|
|
|
*/
|
|
|
|
|
private VisualiserRaceEvent visualiserRace;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Service for sending keystrokes to server
|
|
|
|
|
*/
|
|
|
|
|
private ControllerClient controllerClient;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean isHost;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The canvas that draws the race.
|
|
|
|
|
*/
|
|
|
|
|
private ResizableRaceCanvas raceCanvas;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The sparkline graph.
|
|
|
|
|
*/
|
|
|
|
|
@ -71,16 +66,16 @@ public class RaceController extends Controller {
|
|
|
|
|
*/
|
|
|
|
|
private boolean infoTableShow;
|
|
|
|
|
|
|
|
|
|
private View3D view3D;
|
|
|
|
|
private ObservableList<Subject3D> viewSubjects;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The arrow controller.
|
|
|
|
|
*/
|
|
|
|
|
@FXML private ArrowController arrowController;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@FXML private GridPane canvasBase;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@FXML private SplitPane race;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -102,9 +97,6 @@ public class RaceController extends Controller {
|
|
|
|
|
@FXML private TableColumn<VisualiserBoat, Leg> boatMarkColumn;
|
|
|
|
|
@FXML private TableColumn<VisualiserBoat, Number> boatSpeedColumn;
|
|
|
|
|
@FXML private LineChart<Number, Number> sparklineChart;
|
|
|
|
|
@FXML private AnchorPane annotationPane;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Ctor.
|
|
|
|
|
@ -183,9 +175,6 @@ public class RaceController extends Controller {
|
|
|
|
|
//Arrow.
|
|
|
|
|
initialiseArrow(this.visualiserRace);
|
|
|
|
|
|
|
|
|
|
//Race canvas.
|
|
|
|
|
initialiseRaceCanvas(this.visualiserRace);
|
|
|
|
|
|
|
|
|
|
initialiseView3D(this.visualiserRace);
|
|
|
|
|
|
|
|
|
|
//Race timezone label.
|
|
|
|
|
@ -194,18 +183,42 @@ public class RaceController extends Controller {
|
|
|
|
|
//Race clock.
|
|
|
|
|
initialiseRaceClock(this.visualiserRace);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Start the race animation timer.
|
|
|
|
|
raceTimer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void initialiseView3D(VisualiserRaceEvent race) {
|
|
|
|
|
URL asset = HostController.class.getClassLoader().getResource("assets/V1.2 Complete Boat.stl");
|
|
|
|
|
StlMeshImporter importer = new StlMeshImporter();
|
|
|
|
|
importer.read(asset);
|
|
|
|
|
|
|
|
|
|
List<VisualiserBoat> boats = race.getVisualiserRaceState().getBoats();
|
|
|
|
|
viewSubjects = FXCollections.observableArrayList();
|
|
|
|
|
|
|
|
|
|
//Create View3D
|
|
|
|
|
view3D = new View3D();
|
|
|
|
|
view3D.setItems(viewSubjects);
|
|
|
|
|
for(VisualiserBoat boat: boats) {
|
|
|
|
|
System.out.println("Adding " + boat.getCountry());
|
|
|
|
|
Subject3D subject = new Subject3D(new MeshView(importer.getImport()));
|
|
|
|
|
viewSubjects.add(subject);
|
|
|
|
|
view3D.setPivot(subject); // Filthy hack makes last added boat the pivot
|
|
|
|
|
|
|
|
|
|
boat.positionProperty().addListener((o, prev, curr) -> {
|
|
|
|
|
System.out.println(boat.getCountry() + " is at " + curr.toString());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
boat.bearingProperty().addListener((o, prev, curr) -> {
|
|
|
|
|
subject.setHeading(curr.degrees());
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Display View3D
|
|
|
|
|
view3D.setVisible(true);
|
|
|
|
|
view3D.setDistance(50);
|
|
|
|
|
view3D.setYaw(45);
|
|
|
|
|
view3D.setPitch(20);
|
|
|
|
|
canvasBase.getChildren().add(0, view3D);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -359,32 +372,8 @@ public class RaceController extends Controller {
|
|
|
|
|
this.sparkline = new Sparkline(this.visualiserRace.getVisualiserRaceState(), this.sparklineChart);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Initialises the {@link ResizableRaceCanvas}, provides the race to read data from.
|
|
|
|
|
* @param race Race to read data from.
|
|
|
|
|
*/
|
|
|
|
|
private void initialiseRaceCanvas(VisualiserRaceEvent race) {
|
|
|
|
|
|
|
|
|
|
//Create canvas.
|
|
|
|
|
raceCanvas = new ResizableRaceCanvas(race.getVisualiserRaceState());
|
|
|
|
|
|
|
|
|
|
//Set properties.
|
|
|
|
|
raceCanvas.setMouseTransparent(true);
|
|
|
|
|
raceCanvas.widthProperty().bind(canvasBase.widthProperty());
|
|
|
|
|
raceCanvas.heightProperty().bind(canvasBase.heightProperty());
|
|
|
|
|
|
|
|
|
|
//Draw it and show it.
|
|
|
|
|
raceCanvas.draw();
|
|
|
|
|
raceCanvas.setVisible(true);
|
|
|
|
|
|
|
|
|
|
//Add to scene.
|
|
|
|
|
canvasBase.getChildren().add(0, raceCanvas);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Intialises the race time zone label with the race's time zone.
|
|
|
|
|
* Initialises the race time zone label with the race's time zone.
|
|
|
|
|
* @param race The race to get time zone from.
|
|
|
|
|
*/
|
|
|
|
|
private void initialiseRaceTimezoneLabel(VisualiserRaceEvent race) {
|
|
|
|
|
@ -423,10 +412,6 @@ public class RaceController extends Controller {
|
|
|
|
|
|
|
|
|
|
//Display this controller.
|
|
|
|
|
race.setVisible(true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// set up annotation displays
|
|
|
|
|
new Annotations(annotationPane, raceCanvas);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -469,13 +454,8 @@ public class RaceController extends Controller {
|
|
|
|
|
finishRace(visualiserRace.getVisualiserRaceState().getBoats());
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
//Otherwise, render the canvas.
|
|
|
|
|
raceCanvas.drawRace();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Sort the tableview. Doesn't automatically work for all columns.
|
|
|
|
|
boatInfoTable.sort();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Return to main screen if we lose connection.
|
|
|
|
|
|