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;
|
||||
|
||||
|
||||
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.
|
||||
|
||||
@@ -225,12 +225,10 @@ public class StartController extends Controller {
|
||||
//Get the current race status.
|
||||
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 (raceStatus == RaceStatusEnum.PREPARATORY || raceStatus == RaceStatusEnum.STARTED) {
|
||||
if (raceStatus == RaceStatusEnum.WARNING
|
||||
|| raceStatus == RaceStatusEnum.PREPARATORY
|
||||
|| raceStatus == RaceStatusEnum.STARTED) {
|
||||
//Stop this timer.
|
||||
stop();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user