|
|
|
@ -30,6 +30,7 @@ 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.enums.RoundingType;
|
|
|
|
import shared.exceptions.BoatNotFoundException;
|
|
|
|
import shared.exceptions.BoatNotFoundException;
|
|
|
|
import shared.model.*;
|
|
|
|
import shared.model.*;
|
|
|
|
import visualiser.app.App;
|
|
|
|
import visualiser.app.App;
|
|
|
|
@ -70,6 +71,7 @@ public class RaceViewController extends Controller {
|
|
|
|
private long positionTime = 0;
|
|
|
|
private long positionTime = 0;
|
|
|
|
private ResizableRaceCanvas raceCanvas;
|
|
|
|
private ResizableRaceCanvas raceCanvas;
|
|
|
|
private boolean mapToggle = true;
|
|
|
|
private boolean mapToggle = true;
|
|
|
|
|
|
|
|
private GPSConverter gpsConverter;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Arrow pointing to next mark in third person
|
|
|
|
* Arrow pointing to next mark in third person
|
|
|
|
@ -355,7 +357,7 @@ public class RaceViewController extends Controller {
|
|
|
|
|
|
|
|
|
|
|
|
// Set up projection from GPS to view
|
|
|
|
// Set up projection from GPS to view
|
|
|
|
RaceDataSource raceData = visualiserRace.getVisualiserRaceState().getRaceDataSource();
|
|
|
|
RaceDataSource raceData = visualiserRace.getVisualiserRaceState().getRaceDataSource();
|
|
|
|
final GPSConverter gpsConverter = new GPSConverter(raceData, 450, 450);
|
|
|
|
gpsConverter = new GPSConverter(raceData, 450, 450);
|
|
|
|
|
|
|
|
|
|
|
|
SkyBox skyBox = new SkyBox(750, 200, 250, 0, 210);
|
|
|
|
SkyBox skyBox = new SkyBox(750, 200, 250, 0, 210);
|
|
|
|
viewSubjects.addAll(skyBox.getSkyBoxPlanes());
|
|
|
|
viewSubjects.addAll(skyBox.getSkyBoxPlanes());
|
|
|
|
@ -378,8 +380,9 @@ public class RaceViewController extends Controller {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Position and add each mark to view
|
|
|
|
// Position and add each mark to view
|
|
|
|
for(Mark mark: race.getVisualiserRaceState().getMarks()) {
|
|
|
|
for(Mark mark: race.getVisualiserRaceState().getMarks()) {
|
|
|
|
MeshView mesh = new MeshView(importerMark.getImport());
|
|
|
|
// MeshView mesh = new MeshView(importerMark.getImport());
|
|
|
|
Subject3D markModel = new Subject3D(mesh, mark.getSourceID());
|
|
|
|
// Subject3D markModel = new Subject3D(mesh, mark.getSourceID());
|
|
|
|
|
|
|
|
Subject3D markModel = new Subject3D(Assets3D.getMark(), mark.getSourceID());
|
|
|
|
|
|
|
|
|
|
|
|
markModel.setX(gpsConverter.convertGPS(mark.getPosition()).getX());
|
|
|
|
markModel.setX(gpsConverter.convertGPS(mark.getPosition()).getX());
|
|
|
|
markModel.setZ(gpsConverter.convertGPS(mark.getPosition()).getY());
|
|
|
|
markModel.setZ(gpsConverter.convertGPS(mark.getPosition()).getY());
|
|
|
|
@ -502,17 +505,33 @@ public class RaceViewController extends Controller {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
trackBoat.start();
|
|
|
|
trackBoat.start();
|
|
|
|
|
|
|
|
|
|
|
|
Material markColor = new PhongMaterial(new Color(0.15,0.9,0.2,1));
|
|
|
|
//next mark indicator
|
|
|
|
CompoundMark nextMark = boat.getCurrentLeg().getEndCompoundMark();
|
|
|
|
//Material markColor = new PhongMaterial(new Color(0.15,0.9,0.2,1));
|
|
|
|
|
|
|
|
changeNextMark(boat.getCurrentLeg());
|
|
|
|
|
|
|
|
viewSubjects.add(Assets3D.ccwNextArrow);
|
|
|
|
|
|
|
|
viewSubjects.add(Assets3D.cwNextArrow);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AnimationTimer rotateArrows = new AnimationTimer() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void handle(long now) {
|
|
|
|
|
|
|
|
Assets3D.ccwNextArrow.setHeading(Assets3D.ccwNextArrow.getHeading().getAngle() - 3.0);
|
|
|
|
|
|
|
|
Assets3D.cwNextArrow.setHeading(Assets3D.cwNextArrow.getHeading().getAngle() + 3.0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
rotateArrows.start();
|
|
|
|
|
|
|
|
/*CompoundMark nextMark = boat.getCurrentLeg().getEndCompoundMark();
|
|
|
|
|
|
|
|
|
|
|
|
view3D.getShape(nextMark.getMark1().getSourceID()).getMesh().setMaterial(markColor);
|
|
|
|
view3D.getShape(nextMark.getMark1().getSourceID()).getMesh().setMaterial(markColor);
|
|
|
|
if(nextMark.getMark2() != null) {
|
|
|
|
if(nextMark.getMark2() != null) {
|
|
|
|
view3D.getShape(nextMark.getMark2().getSourceID()).getMesh().setMaterial(markColor);
|
|
|
|
view3D.getShape(nextMark.getMark2().getSourceID()).getMesh().setMaterial(markColor);
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
Subject3D shockwave = new Shockwave(10);
|
|
|
|
Subject3D shockwave = new Shockwave(10);
|
|
|
|
|
|
|
|
|
|
|
|
viewSubjects.add(shockwave);
|
|
|
|
viewSubjects.add(shockwave);
|
|
|
|
|
|
|
|
|
|
|
|
boat.legProperty().addListener((o, prev, curr) -> Platform.runLater(() -> swapColours(curr)));
|
|
|
|
//boat.legProperty().addListener((o, prev, curr) -> Platform.runLater(() -> swapColours(curr)));
|
|
|
|
|
|
|
|
boat.legProperty().addListener((o, prev, curr) -> Platform.runLater(() -> changeNextMark(curr)));
|
|
|
|
boat.hasCollidedProperty().addListener((o, prev, curr) -> Platform.runLater(() -> showCollision(boat, shockwave)));
|
|
|
|
boat.hasCollidedProperty().addListener((o, prev, curr) -> Platform.runLater(() -> showCollision(boat, shockwave)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Fix initial bird's-eye position
|
|
|
|
// Fix initial bird's-eye position
|
|
|
|
@ -662,6 +681,57 @@ public class RaceViewController extends Controller {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void changeNextMark(Leg leg){
|
|
|
|
|
|
|
|
CompoundMark start = leg.getStartCompoundMark();
|
|
|
|
|
|
|
|
CompoundMark end = leg.getEndCompoundMark();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//The last leg "finish" doesn't have compound marks.
|
|
|
|
|
|
|
|
if (start == null || end == null ) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
Leg legOfInterest;
|
|
|
|
|
|
|
|
for (int i = 0; i < raceState.getLegs().size(); i ++){
|
|
|
|
|
|
|
|
if (raceState.getLegs().get(i) == leg){
|
|
|
|
|
|
|
|
legOfInterest = raceState.getLegs().get(i);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
CompoundMark nextMark = leg.getStartCompoundMark();
|
|
|
|
|
|
|
|
CompoundMark dirMark = leg.getEndCompoundMark();*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
boolean firstMarkCCW = end.getRoundingType() == RoundingType.Port;
|
|
|
|
|
|
|
|
// double angle = gpsConverter.getAngle(gpsConverter.convertGPS(dirMark.getMark1().getPosition()),
|
|
|
|
|
|
|
|
// gpsConverter.convertGPS(nextMark.getMark1().getPosition()));
|
|
|
|
|
|
|
|
// if (nextMark.getRoundingType() == RoundingType.Port){
|
|
|
|
|
|
|
|
// if (angle < 90 || angle >= 270){
|
|
|
|
|
|
|
|
// firstMarkCCW = false;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
|
|
// if (angle < 270 && angle >= 90){
|
|
|
|
|
|
|
|
// firstMarkCCW = false;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
Mark startMark1 = end.getMark1();
|
|
|
|
|
|
|
|
Mark startMark2 = end.getMark2();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (firstMarkCCW){
|
|
|
|
|
|
|
|
Assets3D.ccwNextArrow.setX(gpsConverter.convertGPS(startMark1.getPosition()).getX());
|
|
|
|
|
|
|
|
Assets3D.ccwNextArrow.setZ(gpsConverter.convertGPS(startMark1.getPosition()).getY());
|
|
|
|
|
|
|
|
if (end.getMark2() != null) {
|
|
|
|
|
|
|
|
Assets3D.cwNextArrow.setX(gpsConverter.convertGPS(startMark2.getPosition()).getX());
|
|
|
|
|
|
|
|
Assets3D.cwNextArrow.setZ(gpsConverter.convertGPS(startMark2.getPosition()).getY());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Assets3D.cwNextArrow.setX(gpsConverter.convertGPS(startMark1.getPosition()).getX());
|
|
|
|
|
|
|
|
Assets3D.cwNextArrow.setZ(gpsConverter.convertGPS(startMark1.getPosition()).getY());
|
|
|
|
|
|
|
|
if (end.getMark2() != null) {
|
|
|
|
|
|
|
|
Assets3D.ccwNextArrow.setX(gpsConverter.convertGPS(startMark2.getPosition()).getX());
|
|
|
|
|
|
|
|
Assets3D.ccwNextArrow.setZ(gpsConverter.convertGPS(startMark2.getPosition()).getY());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Initialises the frame rate functionality. This allows for toggling the
|
|
|
|
* Initialises the frame rate functionality. This allows for toggling the
|
|
|
|
* frame rate, and connect the fps label to the race's fps property.
|
|
|
|
* frame rate, and connect the fps label to the race's fps property.
|
|
|
|
|