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]
main
cbt24 9 years ago
parent 35c595adf8
commit 971a061499

@ -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.
* @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. * @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();

Loading…
Cancel
Save