Upgraded marks and how to look rounded #story[1299]
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package visualiser.layout;
|
package visualiser.layout;
|
||||||
|
|
||||||
import com.interactivemesh.jfx.importer.obj.ObjModelImporter;
|
import com.interactivemesh.jfx.importer.obj.ObjModelImporter;
|
||||||
|
import com.interactivemesh.jfx.importer.stl.StlMeshImporter;
|
||||||
import com.interactivemesh.jfx.importer.x3d.X3dModelImporter;
|
import com.interactivemesh.jfx.importer.x3d.X3dModelImporter;
|
||||||
import javafx.geometry.Point3D;
|
import javafx.geometry.Point3D;
|
||||||
import javafx.scene.Group;
|
import javafx.scene.Group;
|
||||||
|
import javafx.scene.paint.Color;
|
||||||
|
import javafx.scene.paint.Material;
|
||||||
|
import javafx.scene.paint.PhongMaterial;
|
||||||
import javafx.scene.shape.MeshView;
|
import javafx.scene.shape.MeshView;
|
||||||
import javafx.scene.shape.Shape3D;
|
import javafx.scene.shape.Shape3D;
|
||||||
import visualiser.Controllers.HostGameController;
|
import visualiser.Controllers.HostGameController;
|
||||||
@@ -18,10 +22,33 @@ public class Assets3D {
|
|||||||
public static MeshView[] sails;
|
public static MeshView[] sails;
|
||||||
public static Subject3D windArrow;
|
public static Subject3D windArrow;
|
||||||
public static Subject3D compass;
|
public static Subject3D compass;
|
||||||
|
public static Subject3D cwNextArrow;
|
||||||
|
public static Subject3D ccwNextArrow;
|
||||||
|
|
||||||
public static void loadAssets(){
|
public static void loadAssets(){
|
||||||
loadSails();
|
loadSails();
|
||||||
loadWindArrow();
|
loadWindArrow();
|
||||||
|
loadNextArrow();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void loadNextArrow(){
|
||||||
|
StlMeshImporter objModelImporter = new StlMeshImporter();
|
||||||
|
String cwPath = "assets/Next Mark Arrow CW V1.0.stl";
|
||||||
|
URL asset = Assets3D.class.getClassLoader().getResource(cwPath);
|
||||||
|
objModelImporter.read(asset);
|
||||||
|
Material markColor = new PhongMaterial(new Color(0.15,0.9,0.2,1));
|
||||||
|
|
||||||
|
MeshView cwMesh = new MeshView(objModelImporter.getImport());
|
||||||
|
cwMesh.setMaterial(markColor);
|
||||||
|
cwNextArrow = new Annotation3D(cwMesh);
|
||||||
|
|
||||||
|
String ccwPath = "assets/Next Mark Arrow CCW V1.0.stl";
|
||||||
|
URL ccwAsset = Assets3D.class.getClassLoader().getResource(ccwPath);
|
||||||
|
objModelImporter.read(ccwAsset);
|
||||||
|
|
||||||
|
MeshView ccwMesh = new MeshView(objModelImporter.getImport());
|
||||||
|
ccwMesh.setMaterial(markColor);
|
||||||
|
ccwNextArrow = new Annotation3D(ccwMesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void loadSails(){
|
private static void loadSails(){
|
||||||
@@ -45,6 +72,11 @@ public class Assets3D {
|
|||||||
return loadX3d(path);
|
return loadX3d(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Shape3D getMark(){
|
||||||
|
String path = "assets/Burger Bouy V1.1.x3d";
|
||||||
|
return loadX3d(path);
|
||||||
|
}
|
||||||
|
|
||||||
private static void loadWindArrow(){
|
private static void loadWindArrow(){
|
||||||
String compassPath = "assets/wind_compass.x3d";
|
String compassPath = "assets/wind_compass.x3d";
|
||||||
compass = new Annotation3D(loadX3d(compassPath));
|
compass = new Annotation3D(loadX3d(compassPath));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 408 KiB |
Reference in New Issue
Block a user