single mark rounding arrow now works
This commit is contained in:
@@ -326,6 +326,11 @@ public class InGameLobbyController extends Controller {
|
|||||||
* Start button pressed. Currently only prints out start
|
* Start button pressed. Currently only prints out start
|
||||||
*/
|
*/
|
||||||
public void startBtnPressed(){
|
public void startBtnPressed(){
|
||||||
|
try {
|
||||||
|
HttpMatchBrowserHost.httpMatchBrowserHost.sendStarted();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
App.game.getRaceLogic().getRace().startRace(App.game.getRaceLogic().getRace().getRacePreparatoryTime(), true);
|
App.game.getRaceLogic().getRace().startRace(App.game.getRaceLogic().getRace().getRacePreparatoryTime(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -471,15 +471,18 @@ public class RaceViewController extends Controller {
|
|||||||
highlightTrack.start();
|
highlightTrack.start();
|
||||||
|
|
||||||
// Highlight next mark only for player boat
|
// Highlight next mark only for player boat
|
||||||
Material markColor = new PhongMaterial(new Color(0.15,0.9,0.2,1));
|
// Material markColor = new PhongMaterial(new Color(0.15,0.9,0.2,1));
|
||||||
CompoundMark nextMark = boat.getCurrentLeg().getEndCompoundMark();
|
// 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);
|
||||||
}
|
// }
|
||||||
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)));
|
||||||
} else {
|
} else {
|
||||||
viewSubjects.add(boatModel);
|
viewSubjects.add(boatModel);
|
||||||
|
boatModel.getMesh().toFront();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Create health effect
|
//Create health effect
|
||||||
@@ -494,9 +497,22 @@ public class RaceViewController extends Controller {
|
|||||||
sails3D.setMaterial(boatColorMat);
|
sails3D.setMaterial(boatColorMat);
|
||||||
sailsSubject.setXRot(0d);
|
sailsSubject.setXRot(0d);
|
||||||
sailsSubject.setHeading(visualiserRace.getVisualiserRaceState().getWindDirection().degrees());
|
sailsSubject.setHeading(visualiserRace.getVisualiserRaceState().getWindDirection().degrees());
|
||||||
|
|
||||||
viewSubjects.add(sailsSubject);
|
viewSubjects.add(sailsSubject);
|
||||||
|
|
||||||
|
//next mark indicator
|
||||||
|
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();
|
||||||
|
|
||||||
AnimationTimer sailsFollowBoat = new AnimationTimer() {
|
AnimationTimer sailsFollowBoat = new AnimationTimer() {
|
||||||
double sailCurrent = visualiserRace.getVisualiserRaceState().getWindDirection().degrees();
|
double sailCurrent = visualiserRace.getVisualiserRaceState().getWindDirection().degrees();
|
||||||
boolean canLuff = true;
|
boolean canLuff = true;
|
||||||
@@ -555,7 +571,7 @@ public class RaceViewController extends Controller {
|
|||||||
}
|
}
|
||||||
sailsSubject.setX(gpsConverter.convertGPS(boat.getPosition()).getX());
|
sailsSubject.setX(gpsConverter.convertGPS(boat.getPosition()).getX());
|
||||||
sailsSubject.setZ(gpsConverter.convertGPS(boat.getPosition()).getY());
|
sailsSubject.setZ(gpsConverter.convertGPS(boat.getPosition()).getY());
|
||||||
|
sailsSubject.getMesh().toFront();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
sailsFollowBoat.start();
|
sailsFollowBoat.start();
|
||||||
@@ -581,18 +597,6 @@ public class RaceViewController extends Controller {
|
|||||||
|
|
||||||
//next mark indicator
|
//next mark indicator
|
||||||
//Material markColor = new PhongMaterial(new Color(0.15,0.9,0.2,1));
|
//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();
|
/*CompoundMark nextMark = boat.getCurrentLeg().getEndCompoundMark();
|
||||||
|
|
||||||
view3D.getShape(nextMark.getMark1().getSourceID()).getMesh().setMaterial(markColor);
|
view3D.getShape(nextMark.getMark1().getSourceID()).getMesh().setMaterial(markColor);
|
||||||
@@ -604,7 +608,6 @@ public class RaceViewController extends Controller {
|
|||||||
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
|
||||||
@@ -749,6 +752,71 @@ public class RaceViewController extends Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setNextMarkArrowDirection(Mark mark1, Mark mark2, RoundingType roundingType, int direction){
|
||||||
|
boolean port = roundingType == RoundingType.Port;
|
||||||
|
Mark chosenMark = null;
|
||||||
|
|
||||||
|
if (mark2 == null){
|
||||||
|
chosenMark = mark1;
|
||||||
|
} else {
|
||||||
|
boolean rounding = port;
|
||||||
|
System.out.println(direction);
|
||||||
|
switch (direction) {
|
||||||
|
case 2:
|
||||||
|
rounding = !port;
|
||||||
|
case 0:
|
||||||
|
if (rounding){
|
||||||
|
if (mark1.getPosition().getLongitude() < mark2.getPosition().getLongitude()){
|
||||||
|
chosenMark = mark1;
|
||||||
|
} else {
|
||||||
|
chosenMark = mark2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (mark1.getPosition().getLongitude() > mark2.getPosition().getLongitude()){
|
||||||
|
chosenMark = mark1;
|
||||||
|
} else {
|
||||||
|
chosenMark = mark2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
rounding = !port;
|
||||||
|
case 1:
|
||||||
|
if (rounding){
|
||||||
|
if (mark1.getPosition().getLatitude() > mark2.getPosition().getLatitude()){
|
||||||
|
chosenMark = mark1;
|
||||||
|
} else {
|
||||||
|
chosenMark = mark2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (mark1.getPosition().getLatitude() < mark2.getPosition().getLatitude()){
|
||||||
|
chosenMark = mark1;
|
||||||
|
} else {
|
||||||
|
chosenMark = mark2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chosenMark == null){
|
||||||
|
System.err.println("Mark to pick is null.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port){
|
||||||
|
Assets3D.ccwNextArrow.setX(gpsConverter.convertGPS(chosenMark.getPosition()).getX());
|
||||||
|
Assets3D.ccwNextArrow.setZ(gpsConverter.convertGPS(chosenMark.getPosition()).getY());
|
||||||
|
Assets3D.ccwNextArrow.getMesh().setVisible(true);
|
||||||
|
Assets3D.cwNextArrow.getMesh().setVisible(false);
|
||||||
|
} else {
|
||||||
|
Assets3D.cwNextArrow.setX(gpsConverter.convertGPS(chosenMark.getPosition()).getX());
|
||||||
|
Assets3D.cwNextArrow.setZ(gpsConverter.convertGPS(chosenMark.getPosition()).getY());
|
||||||
|
Assets3D.cwNextArrow.getMesh().setVisible(true);
|
||||||
|
Assets3D.ccwNextArrow.getMesh().setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void changeNextMark(Leg leg){
|
private void changeNextMark(Leg leg){
|
||||||
CompoundMark start = leg.getStartCompoundMark();
|
CompoundMark start = leg.getStartCompoundMark();
|
||||||
CompoundMark end = leg.getEndCompoundMark();
|
CompoundMark end = leg.getEndCompoundMark();
|
||||||
@@ -757,47 +825,30 @@ public class RaceViewController extends Controller {
|
|||||||
if (start == null || end == null ) {
|
if (start == null || end == null ) {
|
||||||
return;
|
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()),
|
//find direction coming
|
||||||
// gpsConverter.convertGPS(nextMark.getMark1().getPosition()));
|
double angle = gpsConverter.getAngle(gpsConverter.convertGPS(start.getMark1().getPosition()),
|
||||||
// if (nextMark.getRoundingType() == RoundingType.Port){
|
gpsConverter.convertGPS(end.getMark1Position()));
|
||||||
// if (angle < 90 || angle >= 270){
|
angle = (Math.toDegrees(angle) % 360 + 360) % 360;
|
||||||
// firstMarkCCW = false;
|
System.out.println(angle);
|
||||||
// }
|
int dir = 0; //0 = top 1 = right 2 = down 3 = down
|
||||||
// } else {
|
if (angle < 315){
|
||||||
// if (angle < 270 && angle >= 90){
|
if (angle > 45){
|
||||||
// firstMarkCCW = false;
|
dir ++;
|
||||||
// }
|
}
|
||||||
// }
|
if (angle > 135){
|
||||||
|
dir ++;
|
||||||
|
}
|
||||||
|
if (angle > 225){
|
||||||
|
dir ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Mark startMark1 = end.getMark1();
|
Mark startMark1 = end.getMark1();
|
||||||
Mark startMark2 = end.getMark2();
|
Mark startMark2 = end.getMark2();
|
||||||
|
|
||||||
if (firstMarkCCW){
|
setNextMarkArrowDirection(startMark1, startMark2, end.getRoundingType(), dir);
|
||||||
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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ public class Assets3D {
|
|||||||
|
|
||||||
MeshView cwMesh = new MeshView(objModelImporter.getImport());
|
MeshView cwMesh = new MeshView(objModelImporter.getImport());
|
||||||
cwMesh.setMaterial(markColor);
|
cwMesh.setMaterial(markColor);
|
||||||
|
cwMesh.setMouseTransparent(true);
|
||||||
|
cwMesh.toBack();
|
||||||
|
cwMesh.setVisible(false);
|
||||||
cwNextArrow = new Annotation3D(cwMesh);
|
cwNextArrow = new Annotation3D(cwMesh);
|
||||||
|
|
||||||
String ccwPath = "assets/Next Mark Arrow CCW V1.0.stl";
|
String ccwPath = "assets/Next Mark Arrow CCW V1.0.stl";
|
||||||
@@ -52,7 +55,11 @@ public class Assets3D {
|
|||||||
|
|
||||||
MeshView ccwMesh = new MeshView(objModelImporter.getImport());
|
MeshView ccwMesh = new MeshView(objModelImporter.getImport());
|
||||||
ccwMesh.setMaterial(markColor);
|
ccwMesh.setMaterial(markColor);
|
||||||
|
ccwMesh.setMouseTransparent(true);
|
||||||
|
ccwMesh.toBack();
|
||||||
|
cwMesh.setVisible(false);
|
||||||
ccwNextArrow = new Annotation3D(ccwMesh);
|
ccwNextArrow = new Annotation3D(ccwMesh);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void loadSails(){
|
private static void loadSails(){
|
||||||
|
|||||||
@@ -96,6 +96,10 @@ public class HttpMatchBrowserHost extends Thread {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendStarted() throws IOException {
|
||||||
|
sendHttp("http://api.umbrasheep.com/seng/match_started/");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* THe host starts sending out heartbeat messages every 2 seconds.
|
* THe host starts sending out heartbeat messages every 2 seconds.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.7 MiB |
Reference in New Issue
Block a user