diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml
index 7bb7fc15..a402058d 100644
--- a/racevisionGame/pom.xml
+++ b/racevisionGame/pom.xml
@@ -29,6 +29,12 @@
2.9.0
+
+ eu.hansolo
+ Medusa
+ 7.9
+
+
net.bytebuddy
diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java
index d1f6601c..d1ef843e 100644
--- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java
+++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java
@@ -1,6 +1,9 @@
package visualiser.Controllers;
import com.interactivemesh.jfx.importer.stl.StlMeshImporter;
+import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
+import eu.hansolo.medusa.*;
+import eu.hansolo.medusa.events.UpdateEvent;
import javafx.animation.AnimationTimer;
import javafx.application.Platform;
import javafx.collections.FXCollections;
@@ -20,6 +23,7 @@ import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Material;
import javafx.scene.paint.PhongMaterial;
+import javafx.scene.paint.Stop;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.Shape3D;
import javafx.scene.transform.Translate;
@@ -39,10 +43,7 @@ import visualiser.utils.GPSConverter;
import java.io.IOException;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -63,6 +64,10 @@ public class RaceViewController extends Controller {
private View3D view3D;
private WindCompass windCompass;
private ObservableList viewSubjects;
+ private Gauge gauge;
+ private FGauge fGauge;
+ private long positionDelay = 1000;
+ private long positionTime = 0;
private ResizableRaceCanvas raceCanvas;
private boolean mapToggle = true;
@@ -94,6 +99,8 @@ public class RaceViewController extends Controller {
private @FXML Label tutorialText;
private @FXML AnchorPane infoWrapper;
private @FXML AnchorPane lineChartWrapper;
+ private @FXML StackPane speedPane;
+ private @FXML AnchorPane raceAnchorPane;
/**
* Displays a specified race.
@@ -205,6 +212,78 @@ public class RaceViewController extends Controller {
});
}
+ /**
+ * Create speedometer
+ */
+ private void initialiseSpeedometer() {
+ //Create the Medusa Gauge
+ gauge = GaugeBuilder.create()
+ .prefSize(200,200)
+ .foregroundBaseColor(Color.WHITE)
+ .title("Title")
+ .subTitle("Speed")
+ .unit("Knots")
+ .decimals(2)
+ .lcdVisible(true)
+ .lcdDesign(LcdDesign.STANDARD)
+ .lcdFont(LcdFont.DIGITAL_BOLD)
+ .scaleDirection(Gauge.ScaleDirection.CLOCKWISE)
+ .minValue(0)
+ .maxValue(50)
+ .startAngle(320)
+ .angleRange(280)
+ .tickLabelDecimals(0)
+ .tickLabelLocation(TickLabelLocation.INSIDE)
+ .tickLabelOrientation(TickLabelOrientation.ORTHOGONAL)
+ .onlyFirstAndLastTickLabelVisible(false)
+ .tickLabelSectionsVisible(false)
+ .tickLabelColor(Color.BLACK)
+ .tickMarkSectionsVisible(false)
+ .majorTickMarksVisible(true)
+ .majorTickMarkType(TickMarkType.TRAPEZOID)
+ .mediumTickMarksVisible(false)
+ .mediumTickMarkType(TickMarkType.LINE)
+ .minorTickMarksVisible(true)
+ .minorTickMarkType(TickMarkType.LINE)
+ .ledVisible(false)
+ .ledType(Gauge.LedType.STANDARD)
+ .ledColor(Color.rgb(255, 200, 0))
+ .ledBlinking(false)
+ .needleShape(Gauge.NeedleShape.ANGLED)
+ .needleSize(Gauge.NeedleSize.STANDARD)
+ .needleColor(Color.CRIMSON)
+ .startFromZero(false)
+ .returnToZero(false)
+ .knobType(Gauge.KnobType.METAL)
+ .knobColor(Color.LIGHTGRAY)
+ .interactive(false)
+ .thresholdVisible(true)
+ .threshold(50)
+ .thresholdColor(Color.RED)
+ .checkThreshold(true)
+ .gradientBarEnabled(true)
+ .gradientBarStops(new Stop(0.0, Color.BLUE),
+ new Stop(0.25, Color.CYAN),
+ new Stop(0.5, Color.LIME),
+ new Stop(0.75, Color.YELLOW),
+ new Stop(1.0, Color.RED))
+ .markersVisible(true)
+ .build();
+
+
+ //Create a gauge with a frame and background that utilizes a Medusa gauge
+ fGauge = FGaugeBuilder
+ .create()
+ .prefSize(200, 200)
+ .gauge(gauge)
+ .gaugeDesign(GaugeDesign.METAL)
+ .gaugeBackground(GaugeDesign.GaugeBackground.CARBON)
+ .foregroundVisible(true)
+ .build();
+ speedPane.getChildren().add(fGauge);
+
+ }
+
/**
* Initialises the various UI components to listen to the {@link #visualiserRace}.
*/
@@ -227,7 +306,9 @@ public class RaceViewController extends Controller {
initialiseInfoTable();
initialiseView3D(this.visualiserRace);
initialiseRaceClock();
+ initialiseSpeedometer();
raceTimer(); // start the timer
+ speedometerLoop();
new Sparkline(this.raceState, this.sparklineChart);
timeZone.setText(this.raceState.getRaceClock().getTimeZone());
arrowController.setWindProperty(this.raceState.windProperty());
@@ -324,11 +405,12 @@ public class RaceViewController extends Controller {
// Position and add each boat to view
for(VisualiserBoat boat: race.getVisualiserRaceState().getBoats()) {
- /*if(boat.getSourceID() == race.getVisualiserRaceState().getPlayerBoatID()) {
- mesh = new MeshView(importer.getImport());
- } else {
- mesh = new MeshView(importerBurgerBoat.getImport());
- }*/
+// MeshView mesh;
+// if(boat.getSourceID() == race.getVisualiserRaceState().getPlayerBoatID()) {
+// mesh = new MeshView(importer.getImport());
+// } else {
+// mesh = new MeshView(importerBurgerBoat.getImport());
+// }
Shape3D mesh = Assets3D.getBoat();
PhongMaterial boatColorMat = new PhongMaterial(boat.getColor());
@@ -727,6 +809,39 @@ public class RaceViewController extends Controller {
}.start();
}
+ /**
+ * Animation timer loop for the speedometer
+ */
+ private void speedometerLoop(){
+ new AnimationTimer(){
+ @Override
+ public void handle(long arg0){
+ if (raceState.getRaceStatusEnum() == RaceStatusEnum.FINISHED) {
+ stop(); // stop the timer
+ } else {
+ try {
+ //Set the current speed value of the boat
+ gauge.setValue(raceState.getBoat(raceState.getPlayerBoatID()).getCurrentSpeed());
+ fGauge.getGauge().setValue(raceState.getBoat(raceState.getPlayerBoatID()).getCurrentSpeed());
+
+ //Create list with sorted boat placements
+ List boatList = boatInfoTable.getItems();
+ for (VisualiserBoat boat : boatList){
+ if(raceState.getPlayerBoatID()==boat.getSourceID()){
+ //Set boat current placement value as title of speedometer
+ gauge.titleProperty().setValue("Position: " + (boatInfoTable.getItems().indexOf(boat)+1));
+ fGauge.getGauge().titleProperty().setValue("Position: " + (boatInfoTable.getItems().indexOf(boat)+1));
+ }
+ }
+ } catch (BoatNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }.start();
+ }
+
+
/**
* toggles if the info table is shown
*/
diff --git a/racevisionGame/src/main/resources/visualiser/scenes/newRaceView.fxml b/racevisionGame/src/main/resources/visualiser/scenes/newRaceView.fxml
index bc0d8dfd..cd7a134b 100644
--- a/racevisionGame/src/main/resources/visualiser/scenes/newRaceView.fxml
+++ b/racevisionGame/src/main/resources/visualiser/scenes/newRaceView.fxml
@@ -1,5 +1,11 @@
+
+
+
+
+
+
@@ -22,11 +28,11 @@
-
+
-
+
@@ -103,6 +109,10 @@
+
+
+
+
diff --git a/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml b/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml
index c4180e76..8b8148a8 100644
--- a/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml
+++ b/racevisionGame/src/main/resources/visualiser/scenes/raceView.fxml
@@ -28,11 +28,7 @@
-
+
@@ -89,17 +85,27 @@
-
diff --git a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml
index 8334fd5c..49881e38 100644
--- a/racevisionGame/src/main/resources/visualiser/scenes/title.fxml
+++ b/racevisionGame/src/main/resources/visualiser/scenes/title.fxml
@@ -1,5 +1,10 @@
+
+
+
+
+
@@ -13,7 +18,7 @@
-
+