Upgraded marks and how to look rounded #story[1299]

main
Fan-Wu Yang 8 years ago
parent 666e9d0ad9
commit 8120b1bbab

@ -30,6 +30,7 @@ import javafx.scene.transform.Translate;
import javafx.util.Callback;
import network.Messages.Enums.RaceStatusEnum;
import shared.dataInput.RaceDataSource;
import shared.enums.RoundingType;
import shared.exceptions.BoatNotFoundException;
import shared.model.*;
import visualiser.app.App;
@ -70,6 +71,7 @@ public class RaceViewController extends Controller {
private long positionTime = 0;
private ResizableRaceCanvas raceCanvas;
private boolean mapToggle = true;
private GPSConverter gpsConverter;
/**
* Arrow pointing to next mark in third person
@ -355,7 +357,7 @@ public class RaceViewController extends Controller {
// Set up projection from GPS to view
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);
viewSubjects.addAll(skyBox.getSkyBoxPlanes());
@ -378,8 +380,9 @@ public class RaceViewController extends Controller {
}
// Position and add each mark to view
for(Mark mark: race.getVisualiserRaceState().getMarks()) {
MeshView mesh = new MeshView(importerMark.getImport());
Subject3D markModel = new Subject3D(mesh, mark.getSourceID());
// MeshView mesh = new MeshView(importerMark.getImport());
// Subject3D markModel = new Subject3D(mesh, mark.getSourceID());
Subject3D markModel = new Subject3D(Assets3D.getMark(), mark.getSourceID());
markModel.setX(gpsConverter.convertGPS(mark.getPosition()).getX());
markModel.setZ(gpsConverter.convertGPS(mark.getPosition()).getY());
@ -502,17 +505,33 @@ public class RaceViewController extends Controller {
};
trackBoat.start();
Material markColor = new PhongMaterial(new Color(0.15,0.9,0.2,1));
CompoundMark nextMark = boat.getCurrentLeg().getEndCompoundMark();
//next mark indicator
//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);
if(nextMark.getMark2() != null) {
view3D.getShape(nextMark.getMark2().getSourceID()).getMesh().setMaterial(markColor);
}
}*/
Subject3D shockwave = new Shockwave(10);
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)));
}
// 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
* frame rate, and connect the fps label to the race's fps property.

@ -1,9 +1,13 @@
package visualiser.layout;
import com.interactivemesh.jfx.importer.obj.ObjModelImporter;
import com.interactivemesh.jfx.importer.stl.StlMeshImporter;
import com.interactivemesh.jfx.importer.x3d.X3dModelImporter;
import javafx.geometry.Point3D;
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.Shape3D;
import visualiser.Controllers.HostGameController;
@ -18,10 +22,33 @@ public class Assets3D {
public static MeshView[] sails;
public static Subject3D windArrow;
public static Subject3D compass;
public static Subject3D cwNextArrow;
public static Subject3D ccwNextArrow;
public static void loadAssets(){
loadSails();
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(){
@ -45,6 +72,11 @@ public class Assets3D {
return loadX3d(path);
}
public static Shape3D getMark(){
String path = "assets/Burger Bouy V1.1.x3d";
return loadX3d(path);
}
private static void loadWindArrow(){
String compassPath = "assets/wind_compass.x3d";
compass = new Annotation3D(loadX3d(compassPath));

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

Loading…
Cancel
Save