diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 320f2d42..02b28e65 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -5,11 +5,19 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; import javafx.animation.AnimationTimer; import javafx.application.Platform; import javafx.geometry.Point2D; import javafx.geometry.Point3D; -import javafx.scene.*; +import javafx.scene.AmbientLight; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.PerspectiveCamera; +import javafx.scene.PointLight; +import javafx.scene.SceneAntialiasing; +import javafx.scene.SubScene; import javafx.scene.effect.BlendMode; import javafx.scene.image.ImageView; import javafx.scene.input.KeyEvent; @@ -29,7 +37,8 @@ import seng302.model.mark.Corner; import seng302.model.mark.Mark; import seng302.model.token.Token; import seng302.utilities.GeoUtility; -import seng302.visualiser.fxObjects.assets_2D.*; +import seng302.visualiser.fxObjects.assets_2D.AnnotationBox; +import seng302.visualiser.fxObjects.assets_2D.BoatObject; import seng302.visualiser.fxObjects.assets_3D.ModelFactory; import seng302.visualiser.fxObjects.assets_3D.ModelType; @@ -78,11 +87,12 @@ public class GameView3D { private Group annotationsGroup = new Group(); private Group wakesGroup = new Group(); private Group boatObjectGroup = new Group(); - private Group trails = new Group(); private Group markers = new Group(); private Group tokens = new Group(); private List course = new ArrayList<>(); private List mapTokens; + private Timer trailMaker = new Timer(); + private Group trail = new Group(); private ImageView mapImage = new ImageView(); @@ -171,7 +181,7 @@ public class GameView3D { gameObjects.getChildren().addAll( // ModelFactory.importModel(ModelType.OCEAN).getAssets(), - raceBorder, markers, tokens, + raceBorder, trail, markers, tokens, white, blue, green, black, red ); @@ -660,4 +670,50 @@ public class GameView3D { tokens.getChildren().setAll(mapTokens); }); } + + public void setBoatAsPlayer (ClientYacht playerYacht) { + this.playerYacht = playerYacht; + + trailMaker.scheduleAtFixedRate(new TimerTask() { + + private Point2D lastLocation = findScaledXY(playerYacht.getLocation()); + + @Override + public void run() { + Node segment = ModelFactory.importModel(ModelType.TRAIL_SEGMENT).getAssets(); + Point2D location = findScaledXY(playerYacht.getLocation()); + segment.getTransforms().addAll( + new Translate(location.getX(), location.getY()), + new Rotate(playerYacht.getHeading(), new Point3D(0,0,1)), + new Scale(1, lastLocation.distance(location) / 5) + ); + Platform.runLater(() -> { + trail.getChildren().add(segment); + if (trail.getChildren().size() > 100) { + trail.getChildren().remove(0); + } + }); + lastLocation = location; + } + }, 0L, 500L); + +// playerYacht.toggleSail(); +// boatObjects.get(playerYacht).setAsPlayer(); +// CompoundMark currentMark = course.get(playerYacht.getLegNumber()); +// for (Mark mark : currentMark.getMarks()) { +// markerObjects.get(mark).showNextExitArrow(); +// } +// annotations.get(playerYacht).addAnnotation( +// "velocity", +// playerYacht.getVelocityProperty(), +// (velocity) -> String.format("Speed: %.2f ms", velocity.doubleValue()) +// ); +// Platform.runLater(() -> { +// boatObjectGroup.getChildren().remove(boatObjects.get(playerYacht)); +// gameObjects.add(boatObjects.get(playerYacht)); +// annotationsGroup.getChildren().remove(annotations.get(playerYacht)); +// gameObjects.add(annotations.get(playerYacht)); +// }); +// playerYacht.addMarkRoundingListener(this::updateMarkArrows); + } } diff --git a/src/main/java/seng302/visualiser/controllers/RaceViewController.java b/src/main/java/seng302/visualiser/controllers/RaceViewController.java index d1bd8b9d..b02b8df2 100644 --- a/src/main/java/seng302/visualiser/controllers/RaceViewController.java +++ b/src/main/java/seng302/visualiser/controllers/RaceViewController.java @@ -150,7 +150,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel new ArrayList<>(raceData.getCompoundMarks().values()), raceData.getMarkSequence() ); // gameView.enableZoom(); -// gameView.setBoatAsPlayer(player); + gameView.setBoatAsPlayer(player); // gameView.startRace(); // raceState.addCollisionListener(gameView::drawCollision); diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java index 71553973..5e119bee 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java @@ -111,6 +111,8 @@ public class ModelFactory { return makeGate(assets); case WAKE: return makeWake(assets); + case TRAIL_SEGMENT: + return makeTrail(assets); default: return new Model(new Group(assets), null); } @@ -184,4 +186,11 @@ public class ModelFactory { ); return new Model(new Group(assets), null); } + + private static Model makeTrail(Group trailPiece) { + trailPiece.getTransforms().addAll( + new Rotate(90, new Point3D(0,0,1)) + ); + return new Model(new Group(trailPiece), null); + } } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelType.java index 30b7551d..680cdc03 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelType.java @@ -17,7 +17,8 @@ public enum ModelType { FINISH_LINE ("finish_line.dae"), START_LINE ("start_line.dae"), GATE_LINE ("gate_line.dae"), - WAKE ("wake.dae"); + WAKE ("wake.dae"), + TRAIL_SEGMENT ("trail_segment.dae"); final String filename;