From 5f96526fcc5a9f40bed3b72789d0053a9b7ee4a8 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Wed, 13 Sep 2017 15:34:02 +1200 Subject: [PATCH] Added "arrow" pointing to next mark on third person view #story[1195] --- .../Controllers/RaceController.java | 32 ++++++++++++++++--- .../java/visualiser/layout/Annotation3D.java | 24 ++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 racevisionGame/src/main/java/visualiser/layout/Annotation3D.java diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 29fd50da..a9ba893a 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -3,6 +3,7 @@ package visualiser.Controllers; import com.interactivemesh.jfx.importer.stl.StlMeshImporter; import javafx.animation.AnimationTimer; import javafx.application.Platform; +import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; @@ -20,6 +21,7 @@ import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.paint.Material; import javafx.scene.paint.PhongMaterial; +import javafx.scene.shape.Box; import javafx.scene.shape.MeshView; import javafx.scene.shape.Shape3D; import javafx.scene.shape.Sphere; @@ -79,6 +81,9 @@ public class RaceController extends Controller { private View3D view3D; private ObservableList viewSubjects; + private Subject3D nextMarkArrow; + private ChangeListener pointToMark; + /** * The arrow controller. */ @@ -110,6 +115,7 @@ public class RaceController extends Controller { * Ctor. */ public RaceController() { + this.nextMarkArrow = new Annotation3D(new Box(1,3,0)); } @Override @@ -307,7 +313,7 @@ public class RaceController extends Controller { if(curr != null && visualiserRace.getVisualiserRaceState().isVisualiserBoat(curr.getSourceID())) { addThirdPersonAnnotations(curr); } else { - removeThirdPersonAnnotations(); + removeThirdPersonAnnotations(prev); } }); @@ -357,19 +363,35 @@ public class RaceController extends Controller { } private void addThirdPersonAnnotations(Subject3D subject3D) { + viewSubjects.add(nextMarkArrow); + try { VisualiserBoat boat = visualiserRace.getVisualiserRaceState().getBoat(subject3D.getSourceID()); - boat.bearingProperty().addListener((o, prev, curr) -> { + this.pointToMark = (o, prev, curr) -> { CompoundMark target = boat.getCurrentLeg().getEndCompoundMark(); Bearing headingToMark = GPSCoordinate.calculateBearing(boat.getPosition(), target.getAverageGPSCoordinate()); - System.out.println(headingToMark.degrees() - boat.getBearing().degrees()); - }); + + nextMarkArrow.setY(10); + nextMarkArrow.setX(subject3D.getPosition().getX()); + nextMarkArrow.setZ(subject3D.getPosition().getZ()); + nextMarkArrow.setHeading(headingToMark.degrees()); + }; + + boat.positionProperty().addListener(pointToMark); } catch (BoatNotFoundException e) { e.printStackTrace(); } } - private void removeThirdPersonAnnotations() { + private void removeThirdPersonAnnotations(Subject3D subject3D) { + viewSubjects.remove(nextMarkArrow); + + try { + VisualiserBoat boat = visualiserRace.getVisualiserRaceState().getBoat(subject3D.getSourceID()); + boat.positionProperty().removeListener(pointToMark); + } catch (BoatNotFoundException e) { + e.printStackTrace(); + } } /** diff --git a/racevisionGame/src/main/java/visualiser/layout/Annotation3D.java b/racevisionGame/src/main/java/visualiser/layout/Annotation3D.java new file mode 100644 index 00000000..eae706da --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/layout/Annotation3D.java @@ -0,0 +1,24 @@ +package visualiser.layout; + +import javafx.scene.shape.Shape3D; + +/** + * Created by connortaylorbrown on 13/09/17. + */ +public class Annotation3D extends Subject3D { + /** + * Constructor for view subject wrapper + * + * @param mesh to be rendered + */ + public Annotation3D(Shape3D mesh) { + super(mesh, 0); + } + + /** + * Prevent rescaling of this subject + * @param scale ignored + */ + @Override + public void setScale(double scale) {} +}