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;
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();

Loading…
Cancel
Save