View3D within RaceController now tracks boat heading
- Race leaves lobby on Warning status for development - Latest subject added is used as camera pivot #story[1261]
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package visualiser.Controllers;
|
package visualiser.Controllers;
|
||||||
|
|
||||||
|
|
||||||
|
import com.interactivemesh.jfx.importer.stl.StlMeshImporter;
|
||||||
import javafx.animation.AnimationTimer;
|
import javafx.animation.AnimationTimer;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
@@ -17,6 +18,7 @@ import javafx.scene.layout.AnchorPane;
|
|||||||
import javafx.scene.layout.GridPane;
|
import javafx.scene.layout.GridPane;
|
||||||
import javafx.scene.layout.Pane;
|
import javafx.scene.layout.Pane;
|
||||||
import javafx.scene.layout.StackPane;
|
import javafx.scene.layout.StackPane;
|
||||||
|
import javafx.scene.shape.MeshView;
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
import network.Messages.Enums.RaceStatusEnum;
|
import network.Messages.Enums.RaceStatusEnum;
|
||||||
import shared.model.Leg;
|
import shared.model.Leg;
|
||||||
@@ -24,6 +26,8 @@ import visualiser.app.App;
|
|||||||
import visualiser.gameController.ControllerClient;
|
import visualiser.gameController.ControllerClient;
|
||||||
import visualiser.gameController.Keys.ControlKey;
|
import visualiser.gameController.Keys.ControlKey;
|
||||||
import visualiser.gameController.Keys.KeyFactory;
|
import visualiser.gameController.Keys.KeyFactory;
|
||||||
|
import visualiser.layout.Subject3D;
|
||||||
|
import visualiser.layout.View3D;
|
||||||
import visualiser.model.*;
|
import visualiser.model.*;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -40,27 +44,18 @@ import java.util.logging.Logger;
|
|||||||
* Controller used to display a running race.
|
* Controller used to display a running race.
|
||||||
*/
|
*/
|
||||||
public class RaceController extends Controller {
|
public class RaceController extends Controller {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The race object which describes the currently occurring race.
|
* The race object which describes the currently occurring race.
|
||||||
*/
|
*/
|
||||||
private VisualiserRaceEvent visualiserRace;
|
private VisualiserRaceEvent visualiserRace;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Service for sending keystrokes to server
|
* Service for sending keystrokes to server
|
||||||
*/
|
*/
|
||||||
private ControllerClient controllerClient;
|
private ControllerClient controllerClient;
|
||||||
|
|
||||||
|
|
||||||
private boolean isHost;
|
private boolean isHost;
|
||||||
|
|
||||||
/**
|
|
||||||
* The canvas that draws the race.
|
|
||||||
*/
|
|
||||||
private ResizableRaceCanvas raceCanvas;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The sparkline graph.
|
* The sparkline graph.
|
||||||
*/
|
*/
|
||||||
@@ -71,16 +66,16 @@ public class RaceController extends Controller {
|
|||||||
*/
|
*/
|
||||||
private boolean infoTableShow;
|
private boolean infoTableShow;
|
||||||
|
|
||||||
|
private View3D view3D;
|
||||||
|
private ObservableList<Subject3D> viewSubjects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The arrow controller.
|
* The arrow controller.
|
||||||
*/
|
*/
|
||||||
@FXML private ArrowController arrowController;
|
@FXML private ArrowController arrowController;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@FXML private GridPane canvasBase;
|
@FXML private GridPane canvasBase;
|
||||||
|
|
||||||
|
|
||||||
@FXML private SplitPane race;
|
@FXML private SplitPane race;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -102,9 +97,6 @@ public class RaceController extends Controller {
|
|||||||
@FXML private TableColumn<VisualiserBoat, Leg> boatMarkColumn;
|
@FXML private TableColumn<VisualiserBoat, Leg> boatMarkColumn;
|
||||||
@FXML private TableColumn<VisualiserBoat, Number> boatSpeedColumn;
|
@FXML private TableColumn<VisualiserBoat, Number> boatSpeedColumn;
|
||||||
@FXML private LineChart<Number, Number> sparklineChart;
|
@FXML private LineChart<Number, Number> sparklineChart;
|
||||||
@FXML private AnchorPane annotationPane;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ctor.
|
* Ctor.
|
||||||
@@ -183,9 +175,6 @@ public class RaceController extends Controller {
|
|||||||
//Arrow.
|
//Arrow.
|
||||||
initialiseArrow(this.visualiserRace);
|
initialiseArrow(this.visualiserRace);
|
||||||
|
|
||||||
//Race canvas.
|
|
||||||
initialiseRaceCanvas(this.visualiserRace);
|
|
||||||
|
|
||||||
initialiseView3D(this.visualiserRace);
|
initialiseView3D(this.visualiserRace);
|
||||||
|
|
||||||
//Race timezone label.
|
//Race timezone label.
|
||||||
@@ -194,18 +183,42 @@ public class RaceController extends Controller {
|
|||||||
//Race clock.
|
//Race clock.
|
||||||
initialiseRaceClock(this.visualiserRace);
|
initialiseRaceClock(this.visualiserRace);
|
||||||
|
|
||||||
|
|
||||||
//Start the race animation timer.
|
//Start the race animation timer.
|
||||||
raceTimer();
|
raceTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initialiseView3D(VisualiserRaceEvent race) {
|
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();
|
List<VisualiserBoat> boats = race.getVisualiserRaceState().getBoats();
|
||||||
|
viewSubjects = FXCollections.observableArrayList();
|
||||||
|
|
||||||
|
//Create View3D
|
||||||
|
view3D = new View3D();
|
||||||
|
view3D.setItems(viewSubjects);
|
||||||
for(VisualiserBoat boat: boats) {
|
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) -> {
|
boat.positionProperty().addListener((o, prev, curr) -> {
|
||||||
System.out.println(boat.getCountry() + " is at " + curr.toString());
|
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);
|
this.sparkline = new Sparkline(this.visualiserRace.getVisualiserRaceState(), this.sparklineChart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialises the {@link ResizableRaceCanvas}, provides the race to read data from.
|
* Initialises the race time zone label with the race's time zone.
|
||||||
* @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.
|
|
||||||
* @param race The race to get time zone from.
|
* @param race The race to get time zone from.
|
||||||
*/
|
*/
|
||||||
private void initialiseRaceTimezoneLabel(VisualiserRaceEvent race) {
|
private void initialiseRaceTimezoneLabel(VisualiserRaceEvent race) {
|
||||||
@@ -423,10 +412,6 @@ public class RaceController extends Controller {
|
|||||||
|
|
||||||
//Display this controller.
|
//Display this controller.
|
||||||
race.setVisible(true);
|
race.setVisible(true);
|
||||||
|
|
||||||
|
|
||||||
// set up annotation displays
|
|
||||||
new Annotations(annotationPane, raceCanvas);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -469,13 +454,8 @@ public class RaceController extends Controller {
|
|||||||
finishRace(visualiserRace.getVisualiserRaceState().getBoats());
|
finishRace(visualiserRace.getVisualiserRaceState().getBoats());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//Otherwise, render the canvas.
|
|
||||||
raceCanvas.drawRace();
|
|
||||||
|
|
||||||
|
|
||||||
//Sort the tableview. Doesn't automatically work for all columns.
|
//Sort the tableview. Doesn't automatically work for all columns.
|
||||||
boatInfoTable.sort();
|
boatInfoTable.sort();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Return to main screen if we lose connection.
|
//Return to main screen if we lose connection.
|
||||||
|
|||||||
@@ -225,12 +225,10 @@ public class StartController extends Controller {
|
|||||||
//Get the current race status.
|
//Get the current race status.
|
||||||
RaceStatusEnum raceStatus = visualiserRaceEvent.getVisualiserRaceState().getRaceStatusEnum();
|
RaceStatusEnum raceStatus = visualiserRaceEvent.getVisualiserRaceState().getRaceStatusEnum();
|
||||||
|
|
||||||
//Display it.
|
|
||||||
raceStatusLabel.setText("Race Status: " + raceStatus.name());
|
|
||||||
|
|
||||||
|
|
||||||
//If the race has reached the preparatory phase, or has started...
|
//If the race has reached the preparatory phase, or has started...
|
||||||
if (raceStatus == RaceStatusEnum.PREPARATORY || raceStatus == RaceStatusEnum.STARTED) {
|
if (raceStatus == RaceStatusEnum.WARNING
|
||||||
|
|| raceStatus == RaceStatusEnum.PREPARATORY
|
||||||
|
|| raceStatus == RaceStatusEnum.STARTED) {
|
||||||
//Stop this timer.
|
//Stop this timer.
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user