From 971a061499e7135d570e531687ed854a9b65dbeb Mon Sep 17 00:00:00 2001 From: cbt24 Date: Mon, 4 Sep 2017 18:51:37 +1200 Subject: [PATCH] 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] --- .../Controllers/RaceController.java | 86 +++++++------------ .../Controllers/StartController.java | 8 +- 2 files changed, 36 insertions(+), 58 deletions(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 9d7e36c9..885a4371 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -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 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 boatMarkColumn; @FXML private TableColumn boatSpeedColumn; @FXML private LineChart 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 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. diff --git a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java index 890eb816..b46bf79f 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/StartController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/StartController.java @@ -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();