@ -13,7 +13,6 @@ import javafx.scene.control.*;
import javafx.scene.input.KeyCode ;
import javafx.scene.input.KeyCode ;
import javafx.scene.input.KeyEvent ;
import javafx.scene.input.KeyEvent ;
import javafx.scene.layout.GridPane ;
import javafx.scene.layout.GridPane ;
import javafx.scene.layout.Pane ;
import javafx.scene.layout.StackPane ;
import javafx.scene.layout.StackPane ;
import javafx.scene.shape.MeshView ;
import javafx.scene.shape.MeshView ;
import javafx.scene.shape.Sphere ;
import javafx.scene.shape.Sphere ;
@ -21,13 +20,12 @@ import javafx.scene.transform.Translate;
import javafx.util.Callback ;
import javafx.util.Callback ;
import network.Messages.Enums.RaceStatusEnum ;
import network.Messages.Enums.RaceStatusEnum ;
import shared.dataInput.RaceDataSource ;
import shared.dataInput.RaceDataSource ;
import shared.exceptions.BoatNotFoundException ;
import shared.exceptions.MarkNotFoundException ;
import shared.model.Leg ;
import shared.model.Leg ;
import shared.model.Mark ;
import shared.model.Mark ;
import visualiser.app.App ;
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.layout.MarkRadius ;
import visualiser.layout.MarkRadius ;
import visualiser.layout.Subject3D ;
import visualiser.layout.Subject3D ;
import visualiser.layout.View3D ;
import visualiser.layout.View3D ;
@ -36,7 +34,6 @@ import visualiser.utils.GPSConverter;
import java.io.IOException ;
import java.io.IOException ;
import java.net.URL ;
import java.net.URL ;
import java.util.List ;
import java.util.Optional ;
import java.util.Optional ;
import java.util.ResourceBundle ;
import java.util.ResourceBundle ;
import java.util.logging.Level ;
import java.util.logging.Level ;
@ -76,7 +73,7 @@ public class RaceController extends Controller {
@FXML private GridPane canvasBase ;
@FXML private GridPane canvasBase ;
@FXML private SplitPane race ;
@FXML private SplitPane race Pane ;
/ * *
/ * *
* This is the pane we place the actual arrow control inside of .
* This is the pane we place the actual arrow control inside of .
@ -104,7 +101,7 @@ public class RaceController extends Controller {
infoTableShow = true ;
infoTableShow = true ;
// Initialise keyboard handler
// Initialise keyboard handler
race . addEventFilter ( KeyEvent . KEY_PRESSED , event - > {
race Pane . addEventFilter ( KeyEvent . KEY_PRESSED , event - > {
String codeString = event . getCode ( ) . toString ( ) ;
String codeString = event . getCode ( ) . toString ( ) ;
if ( codeString . equals ( "TAB" ) ) { toggleTable ( ) ; }
if ( codeString . equals ( "TAB" ) ) { toggleTable ( ) ; }
@ -130,7 +127,7 @@ public class RaceController extends Controller {
Optional < ButtonType > result = alert . showAndWait ( ) ;
Optional < ButtonType > result = alert . showAndWait ( ) ;
if ( result . get ( ) = = ButtonType . OK ) {
if ( result . get ( ) = = ButtonType . OK ) {
parent . endEvent ( ) ;
parent . endEvent ( ) ;
race . setVisible ( false ) ;
race Pane . setVisible ( false ) ;
App . app . showMainStage ( App . getStage ( ) ) ;
App . app . showMainStage ( App . getStage ( ) ) ;
}
}
} else {
} else {
@ -139,7 +136,7 @@ public class RaceController extends Controller {
alert . setContentText ( "Do you wish to quit the race?" ) ;
alert . setContentText ( "Do you wish to quit the race?" ) ;
Optional < ButtonType > result = alert . showAndWait ( ) ;
Optional < ButtonType > result = alert . showAndWait ( ) ;
if ( result . get ( ) = = ButtonType . OK ) {
if ( result . get ( ) = = ButtonType . OK ) {
race . setVisible ( false ) ;
race Pane . setVisible ( false ) ;
App . app . showMainStage ( App . getStage ( ) ) ;
App . app . showMainStage ( App . getStage ( ) ) ;
}
}
}
}
@ -179,13 +176,14 @@ public class RaceController extends Controller {
}
}
private void initialiseView3D ( VisualiserRaceEvent race ) {
private void initialiseView3D ( VisualiserRaceEvent race ) {
ObservableList< Subject3D > s ubjects = FXCollections . observableArrayList ( ) ;
viewS ubjects = FXCollections . observableArrayList ( ) ;
// read 3d Assets
// Import boat mesh
URL asset = HostController . class . getClassLoader ( ) . getResource ( "assets/V1.2 Complete Boat.stl" ) ;
URL asset = HostController . class . getClassLoader ( ) . getResource ( "assets/V1.2 Complete Boat.stl" ) ;
StlMeshImporter importer = new StlMeshImporter ( ) ;
StlMeshImporter importer = new StlMeshImporter ( ) ;
importer . read ( asset ) ;
importer . read ( asset ) ;
// Configure camera angles and control
URL markerAsset = HostController . class . getClassLoader ( ) . getResource ( "assets/Bouy V1.1.stl" ) ;
URL markerAsset = HostController . class . getClassLoader ( ) . getResource ( "assets/Bouy V1.1.stl" ) ;
StlMeshImporter importerMark = new StlMeshImporter ( ) ;
StlMeshImporter importerMark = new StlMeshImporter ( ) ;
importerMark . read ( markerAsset ) ;
importerMark . read ( markerAsset ) ;
@ -198,22 +196,19 @@ public class RaceController extends Controller {
view3D . setDistance ( 1050 ) ;
view3D . setDistance ( 1050 ) ;
view3D . setYaw ( 0 ) ;
view3D . setYaw ( 0 ) ;
view3D . setPitch ( 60 ) ;
view3D . setPitch ( 60 ) ;
//view3D.rotateCamera(-90, 1, 0, 0);
view3D . enableTracking ( ) ;
//view3D.updatePosition(0, 200, 0);
canvasBase . add ( view3D , 0 , 0 ) ;
RaceDataSource raceData = visualiserRace . getVisualiserRaceState ( ) . getRaceDataSource ( ) ;
double lat1 = raceData . getMapTopLeft ( ) . getLatitude ( ) ;
double long1 = raceData . getMapTopLeft ( ) . getLongitude ( ) ;
double lat2 = raceData . getMapBottomRight ( ) . getLatitude ( ) ;
double long2 = raceData . getMapBottomRight ( ) . getLongitude ( ) ;
System . out . println ( view3D . getWidth ( ) ) ;
System . out . println ( view3D . getHeight ( ) ) ;
final GPSConverter gpsConverter = new GPSConverter ( lat1 , long1 , lat2 , long2 , ( int ) 450 , ( int ) 450 ) ;
view3D . setItems ( subjects ) ;
// Set up projection from GPS to view
canvasBase . getChildren ( ) . add ( 0 , view3D ) ;
RaceDataSource raceData = visualiserRace . getVisualiserRaceState ( ) . getRaceDataSource ( ) ;
final GPSConverter gpsConverter = new GPSConverter ( raceData , 450 , 450 ) ;
view3D . setItems ( viewSubjects ) ;
// Position and add each mark to view
for ( Mark mark : race . getVisualiserRaceState ( ) . getMarks ( ) ) {
for ( Mark mark : race . getVisualiserRaceState ( ) . getMarks ( ) ) {
Subject3D subject = new Subject3D ( new Sphere ( 2 ) ) ;
subject . setX ( gpsConverter . convertGPS ( mark . getPosition ( ) ) . getX ( ) ) ;
subject . setZ ( gpsConverter . convertGPS ( mark . getPosition ( ) ) . getY ( ) ) ;
MeshView mesh = new MeshView ( importerMark . getImport ( ) ) ;
MeshView mesh = new MeshView ( importerMark . getImport ( ) ) ;
Subject3D markModel = new Subject3D ( mesh ) ;
Subject3D markModel = new Subject3D ( mesh ) ;
Subject3D markRadius = new MarkRadius ( 3 ) ;
Subject3D markRadius = new MarkRadius ( 3 ) ;
@ -224,34 +219,53 @@ public class RaceController extends Controller {
markRadius . setX ( x ) ;
markRadius . setX ( x ) ;
markRadius . setZ ( z ) ;
markRadius . setZ ( z ) ;
s ubjects. add ( markModel ) ;
viewS ubjects. add ( markModel ) ;
s ubjects. add ( markRadius ) ;
viewS ubjects. add ( markRadius ) ;
}
}
// Position and add each boat to view
for ( VisualiserBoat boat : race . getVisualiserRaceState ( ) . getBoats ( ) ) {
for ( VisualiserBoat boat : race . getVisualiserRaceState ( ) . getBoats ( ) ) {
MeshView mesh = null ;
MeshView mesh ;
if ( boat . getSourceID ( ) = = race . getVisualiserRaceState ( ) . getPlayerBoatID ( ) ) {
if ( boat . getSourceID ( ) = = race . getVisualiserRaceState ( ) . getPlayerBoatID ( ) ) {
mesh = new MeshView ( importer . getImport ( ) ) ;
mesh = new MeshView ( importer . getImport ( ) ) ;
} else {
} else {
mesh = new MeshView ( importerBurgerBoat . getImport ( ) ) ;
mesh = new MeshView ( importerBurgerBoat . getImport ( ) ) ;
}
}
Subject3D subject = new Subject3D ( mesh ) ;
Subject3D subject = new Subject3D ( mesh ) ;
subjects . add ( subject ) ;
viewSubjects . add ( subject ) ;
// Track this boat's movement with the new subject
AnimationTimer trackBoat = new AnimationTimer ( ) {
AnimationTimer trackBoat = new AnimationTimer ( ) {
@Override
@Override
public void handle ( long now ) {
public void handle ( long now ) {
subject . setHeading ( boat . getBearing ( ) . degrees ( ) ) ;
subject . setHeading ( boat . getBearing ( ) . degrees ( ) ) ;
subject . setX ( gpsConverter . convertGPS ( boat . getPosition ( ) ) . getX ( ) ) ;
subject . setX ( gpsConverter . convertGPS ( boat . getPosition ( ) ) . getX ( ) ) ;
subject . setZ ( gpsConverter . convertGPS ( boat . getPosition ( ) ) . getY ( ) ) ;
subject . setZ ( gpsConverter . convertGPS ( boat . getPosition ( ) ) . getY ( ) ) ;
if ( boat . getSourceID ( ) = = race . getVisualiserRaceState ( ) . getPlayerBoatID ( ) ) {
//view3D.updatePivot(subject.getPosition());
}
//view3D.setYaw(boat.getBearing().degrees());
}
}
} ;
} ;
trackBoat . start ( ) ;
trackBoat . start ( ) ;
}
}
// Fix initial bird's-eye position
view3D . updatePivot ( new Translate ( 250 , 0 , 210 ) ) ;
view3D . updatePivot ( new Translate ( 250 , 0 , 210 ) ) ;
// Bind zooming to scrolling
view3D . setOnScroll ( e - > {
view3D . updateDistance ( e . getDeltaY ( ) ) ;
} ) ;
// Bind zooming to keypress (Z/X default)
racePane . addEventFilter ( KeyEvent . KEY_PRESSED , e - > {
ControlKey key = keyFactory . getKey ( e . getCode ( ) . toString ( ) ) ;
if ( key ! = null ) {
switch ( key . toString ( ) ) {
case "Zoom In" :
view3D . updateDistance ( - 10 ) ;
break ;
case "Zoom Out" :
view3D . updateDistance ( 10 ) ;
break ;
}
}
} ) ;
}
}
@ -434,7 +448,7 @@ public class RaceController extends Controller {
initialiseRace ( ) ;
initialiseRace ( ) ;
//Display this controller.
//Display this controller.
race . setVisible ( true ) ;
race Pane . setVisible ( true ) ;
}
}
/ * *
/ * *
@ -442,7 +456,7 @@ public class RaceController extends Controller {
* @param boats boats there are in the race .
* @param boats boats there are in the race .
* /
* /
public void finishRace ( ObservableList < VisualiserBoat > boats ) {
public void finishRace ( ObservableList < VisualiserBoat > boats ) {
race . setVisible ( false ) ;
race Pane . setVisible ( false ) ;
parent . enterFinish ( boats ) ;
parent . enterFinish ( boats ) ;
}
}
@ -483,7 +497,7 @@ public class RaceController extends Controller {
//Return to main screen if we lose connection.
//Return to main screen if we lose connection.
if ( ! visualiserRace . getServerConnection ( ) . isAlive ( ) ) {
if ( ! visualiserRace . getServerConnection ( ) . isAlive ( ) ) {
race . setVisible ( false ) ;
race Pane . setVisible ( false ) ;
//parent.enterTitle();
//parent.enterTitle();
try {
try {
App . app . showMainStage ( App . getStage ( ) ) ;
App . app . showMainStage ( App . getStage ( ) ) ;
@ -505,10 +519,10 @@ public class RaceController extends Controller {
* toggles if the info table is shown
* toggles if the info table is shown
* /
* /
private void toggleTable ( ) {
private void toggleTable ( ) {
double tablePercent = 1 - ( boatPlacingColumn . getPrefWidth ( ) + boatTeamColumn . getPrefWidth ( ) + boatMarkColumn . getPrefWidth ( ) + boatSpeedColumn . getPrefWidth ( ) ) / race . getWidth ( ) ;
double tablePercent = 1 - ( boatPlacingColumn . getPrefWidth ( ) + boatTeamColumn . getPrefWidth ( ) + boatMarkColumn . getPrefWidth ( ) + boatSpeedColumn . getPrefWidth ( ) ) / race Pane . getWidth ( ) ;
if ( infoTableShow ) {
if ( infoTableShow ) {
race . setDividerPositions ( tablePercent ) ;
race Pane . setDividerPositions ( tablePercent ) ;
arrowPane . setScaleX ( 0.5 ) ;
arrowPane . setScaleX ( 0.5 ) ;
arrowPane . setScaleY ( 0.5 ) ;
arrowPane . setScaleY ( 0.5 ) ;
@ -516,7 +530,7 @@ public class RaceController extends Controller {
arrowPane . setTranslateY ( 0 - arrowPane . getScene ( ) . getHeight ( ) / 4 ) ;
arrowPane . setTranslateY ( 0 - arrowPane . getScene ( ) . getHeight ( ) / 4 ) ;
} else {
} else {
race . setDividerPositions ( 1 ) ;
race Pane . setDividerPositions ( 1 ) ;
arrowPane . setScaleX ( 1 ) ;
arrowPane . setScaleX ( 1 ) ;
arrowPane . setScaleY ( 1 ) ;
arrowPane . setScaleY ( 1 ) ;