From 9ed52a12258dc5b16227c4b4d8f0180556b35902 Mon Sep 17 00:00:00 2001 From: Peter Galloway Date: Tue, 19 Sep 2017 19:43:03 +1200 Subject: [PATCH 01/20] created catamaran mesh #story[1274] --- src/main/resources/meshes/catamaran_hull.stl | Bin 0 -> 58884 bytes src/main/resources/meshes/catamaran_mast.stl | Bin 0 -> 58884 bytes src/main/resources/meshes/catamaran_sail.stl | Bin 0 -> 58884 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/meshes/catamaran_hull.stl create mode 100644 src/main/resources/meshes/catamaran_mast.stl create mode 100644 src/main/resources/meshes/catamaran_sail.stl diff --git a/src/main/resources/meshes/catamaran_hull.stl b/src/main/resources/meshes/catamaran_hull.stl new file mode 100644 index 0000000000000000000000000000000000000000..f80d0b8efa893bb7ef58a18d081f137f5b99e245 GIT binary patch literal 58884 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 P43k;KoMd;Eon-t4n0 Date: Wed, 20 Sep 2017 15:58:22 +1200 Subject: [PATCH 02/20] Added catamaran mesh to possible boat meshes. Made catamaran the default boat. #implement #story[1274] --- .../controllers/cells/PlayerCell.java | 2 +- .../fxObjects/assets_3D/BoatMeshType.java | 3 +- .../fxObjects/assets_3D/BoatObject.java | 2 +- .../fxObjects/assets_3D/ModelFactory.java | 10 +- src/main/java/seng302/visualiser/test3d.java | 108 ------------------ .../meshes/boatSTLs/catamaran_hull.stl | Bin 0 -> 55184 bytes .../meshes/boatSTLs/catamaran_mast.stl | Bin 0 -> 2284 bytes .../meshes/boatSTLs/catamaran_sail.stl | Bin 0 -> 1484 bytes .../meshes/{ => boatSTLs}/dinghy_hull.stl | Bin .../meshes/{ => boatSTLs}/dinghy_mast.stl | Bin .../meshes/{ => boatSTLs}/dinghy_sail.stl | Bin src/main/resources/meshes/catamaran_hull.stl | Bin 58884 -> 0 bytes src/main/resources/meshes/catamaran_mast.stl | Bin 58884 -> 0 bytes src/main/resources/meshes/catamaran_sail.stl | Bin 58884 -> 0 bytes 14 files changed, 9 insertions(+), 116 deletions(-) delete mode 100644 src/main/java/seng302/visualiser/test3d.java create mode 100644 src/main/resources/meshes/boatSTLs/catamaran_hull.stl create mode 100644 src/main/resources/meshes/boatSTLs/catamaran_mast.stl create mode 100644 src/main/resources/meshes/boatSTLs/catamaran_sail.stl rename src/main/resources/meshes/{ => boatSTLs}/dinghy_hull.stl (100%) rename src/main/resources/meshes/{ => boatSTLs}/dinghy_mast.stl (100%) rename src/main/resources/meshes/{ => boatSTLs}/dinghy_sail.stl (100%) delete mode 100644 src/main/resources/meshes/catamaran_hull.stl delete mode 100644 src/main/resources/meshes/catamaran_mast.stl delete mode 100644 src/main/resources/meshes/catamaran_sail.stl diff --git a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java index 6fb35708..7af80e04 100644 --- a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java +++ b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java @@ -37,7 +37,7 @@ public class PlayerCell { // Add Rotating Boat to Player Cell with players color on it. Group group = new Group(); boatPane.getChildren().add(group); - BoatModel bo = ModelFactory.boatIconView(BoatMeshType.DINGHY, this.boatColor); + BoatModel bo = ModelFactory.boatIconView(BoatMeshType.CATAMARAN, this.boatColor); group.getChildren().add(bo.getAssets()); } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 9747b892..96bd3459 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -7,7 +7,8 @@ package seng302.visualiser.fxObjects.assets_3D; */ public enum BoatMeshType { - DINGHY ("dinghy_hull.stl", "dinghy_mast.stl", -1.36653, "dinghy_sail.stl", -1.36653); + DINGHY ("dinghy_hull.stl", "dinghy_mast.stl", -1.36653, "dinghy_sail.stl", -1.36653), + CATAMARAN ("catamaran_hull.stl", "catamaran_mast.stl", -1.36845, "catamaran_sail.stl", -1.36845); final String hullFile, mastFile, sailFile; final double mastOffset, sailOffset; diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java index 57975935..e93152d5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java @@ -36,7 +36,7 @@ public class BoatObject extends Group { * Creates a BoatGroup with the default triangular boat polygon. */ public BoatObject() { - boatAssets = ModelFactory.boatGameView(BoatMeshType.DINGHY, colour); + boatAssets = ModelFactory.boatGameView(BoatMeshType.CATAMARAN, colour); boatAssets.hideSail(); boatAssets.getAssets().getTransforms().addAll( rotation 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 f0c50abe..702e8619 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java @@ -86,19 +86,19 @@ public class ModelFactory { private static Group getUnmodifiedBoatModel(BoatMeshType boatType, Color primaryColour) { Group boatAssets = new Group(); - MeshView hull = importFile(boatType.hullFile); + MeshView hull = importSTL(boatType.hullFile); hull.setMaterial(new PhongMaterial(primaryColour)); - MeshView mast = importFile(boatType.mastFile); + MeshView mast = importSTL(boatType.mastFile); mast.setMaterial(new PhongMaterial(primaryColour)); - MeshView sail = importFile(boatType.sailFile); + MeshView sail = importSTL(boatType.sailFile); sail.setMaterial(new PhongMaterial(Color.WHITE)); boatAssets.getChildren().addAll(hull, mast, sail); return boatAssets; } - private static MeshView importFile(String fileName) { + private static MeshView importSTL(String fileName) { StlMeshImporter importer = new StlMeshImporter(); - importer.read(ModelFactory.class.getResource("/meshes/" + fileName)); + importer.read(ModelFactory.class.getResource("/meshes/boatSTLs/" + fileName)); MeshView importedFile = new MeshView(importer.getImport()); importedFile.setCache(true); importedFile.setCacheHint(CacheHint.SCALE_AND_ROTATE); diff --git a/src/main/java/seng302/visualiser/test3d.java b/src/main/java/seng302/visualiser/test3d.java deleted file mode 100644 index 6440e563..00000000 --- a/src/main/java/seng302/visualiser/test3d.java +++ /dev/null @@ -1,108 +0,0 @@ -package seng302.visualiser; - -import com.interactivemesh.jfx.importer.stl.StlMeshImporter; -import javafx.animation.AnimationTimer; -import javafx.application.Application; -import javafx.geometry.Point3D; -import javafx.scene.Camera; -import javafx.scene.Group; -import javafx.scene.PerspectiveCamera; -import javafx.scene.Scene; -import javafx.scene.SceneAntialiasing; -import javafx.scene.paint.Color; -import javafx.scene.paint.PhongMaterial; -import javafx.scene.shape.MeshView; -import javafx.scene.transform.Rotate; -import javafx.scene.transform.Scale; -import javafx.scene.transform.Translate; -import javafx.stage.Stage; - -/** - * Created by cir27 on 7/09/17. - */ -public class test3d extends Application { - - Group root = new Group(); - Scene scene; - - @Override - public void start(Stage primaryStage) throws Exception { -// camera = new PerspectiveCamera(); -// gameObjects = new Group(); -// root3D = new Group(camera, gameObjects); - scene = new Scene( - root, 1000, 1000, true, SceneAntialiasing.BALANCED - ); - gameView3DTest(); - primaryStage.setScene(scene); - primaryStage.show(); -// scene.setCamera(camera); -// primaryStage.setScene(scene); -// primaryStage.show(); -// -// StlMeshImporter importer = new StlMeshImporter(); -// importer.read(test3d.class.getResource("/meshes/dinghy_hull.stl").toString()); -// MeshView boat = new MeshView(importer.getImport()); -// boat.setMaterial(new PhongMaterial(Color.GREENYELLOW)); -// -// importer = new StlMeshImporter(); -// importer.read(getClass().getResource("/meshes/dinghy_mast.stl").toString()); -// MeshView mast = new MeshView(importer.getImport()); -// mast.setMaterial(new PhongMaterial(Color.GREENYELLOW)); -// -// importer = new StlMeshImporter(); -// importer.read(getClass().getResource("/meshes/dinghy_sail.stl").toString()); -// MeshView sail = new MeshView(importer.getImport()); -// sail.setMaterial(new PhongMaterial(Color.LIGHTGREY)); -// -// gameObjects.getChildren().addAll(boat, mast, sail); -// -// gameObjects.getTransforms().add(new Scale(25, 25,25)); -// gameObjects.getTransforms().add(new Translate(15, 20,0)); -// gameObjects.getTransforms().addAll( -// new Rotate(90, new Point3D(0,0,1)), -// new Rotate(90, new Point3D(0, 1, 0)) -// ); -// -//// PointLight light = new PointLight(); -//// light.setLightOn(true); -//// light.getTransforms().add(new Translate(15, 20, 0)); -//// -//// PointLight light2 = new PointLight(); -//// light2.setLightOn(true); -//// light2.getTransforms().add(new Translate(30, 40, 0)); -// -//// root3D.getChildren().addAll(light); -// -// scene.setOnKeyPressed(event -> { -// switch (event.getCode()) { -// case UP: -// gameObjects.getTransforms().add(new Rotate(5, new Point3D(0,0,1))); -// break; -// case DOWN: -// gameObjects.getTransforms().add(new Rotate(-5, new Point3D(0,0,1))); -// break; -// case LEFT: -// gameObjects.getTransforms().add(new Rotate(-5, new Point3D(0,1,0))); -// break; -// case RIGHT: -// gameObjects.getTransforms().add(new Rotate(5, new Point3D(0,1,0))); -// break; -// } -// }); -// -// AnimationTimer animationTimer = new AnimationTimer() { -// @Override -// public void handle(long now) { -// sail.getTransforms().add(new Rotate(0.5, 0, -1.36653, 0, new Point3D(0, 0, 1))); -// } -// }; -// -//// animationTimer.start(); - } - - private void gameView3DTest() { - GameView3D gameView3D = new GameView3D(); - root.getChildren().add(gameView3D.getAssets()); - } -} diff --git a/src/main/resources/meshes/boatSTLs/catamaran_hull.stl b/src/main/resources/meshes/boatSTLs/catamaran_hull.stl new file mode 100644 index 0000000000000000000000000000000000000000..e93a9787f7e11aa3d47b5cd6055ca0d5bbc4e5fb GIT binary patch literal 55184 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/meshes/boatSTLs/catamaran_mast.stl b/src/main/resources/meshes/boatSTLs/catamaran_mast.stl new file mode 100644 index 0000000000000000000000000000000000000000..79bc742b54e04e8e979c0397b2d67e4a67094299 GIT binary patch literal 2284 zcmb7_Pis?A5XG+&mwtfaCYyvR^$*pMLNGz01vd)axNxO3uGC7Z)P>-K6#N1rl!Cju z3AiarP|VYfOFx0)!m0(uzX;+c&UtfB-g$j13xxwSzd3hi?tPiRb$z*aqq|hS+*`g{ zJ$NkJbR=$SDjwDd8vBrVEC`U8O#2?&=VmlHVp;j8&JSvU!Z>3=>1kIvG-CAq?`I*{-=<(f%KatP~HR_Uf zkB|Me(dUKL%tN!N;c@%^x7iE#HloKTBdnK<&BOe25#=ENXZhYE89q7ofA9ciu!o zBh;u%I`&~6cCSX*xn@zbkCk&n@vwPi1Zputjk=`WGs$Eo zi0B5n^D?0k5PTE7?N0Da=tCp=YWdE~ghq5e+F$Mf4~=NIdfFnP5j~-L7YX%Hx=3u> zP2aoE-v=-eQ??WThO8dRSuYr9TvRA9~p+=U{{`+BHpN!B5HBLpk zw2zcosLL#RVE=xq=Ai!ACzfOcBb*PixPK?|`6j7GxDRCUj+F_Ga33V{Z^@oPy}?uQ zh9ir&1e$N9?4c2E5Lr4At3Lnw1U)nY%_(SqAkI!^r4j8(PwUm`p%FcydKZb^9-L2+ F_y>8sayI|~ literal 0 HcmV?d00001 diff --git a/src/main/resources/meshes/boatSTLs/catamaran_sail.stl b/src/main/resources/meshes/boatSTLs/catamaran_sail.stl new file mode 100644 index 0000000000000000000000000000000000000000..a2723d980b7b68c4ed654f7d5c4f57f253606439 GIT binary patch literal 1484 zcmb7DJuE{}7`>#cL5PK+lMqqOBhg5>t^b5d2ZIQUv=%?52m^6rZ6YEziJuT*DVlB~ zZxAG6Gc*RNc94kGhH$_4`qe2hcuT+Zob#RU?{+Lqg(I_}pmQ`5o^ZB~hbDueNUh;& z^f;?#=0=?EYVohHBF9!Hg@H?dbIDE2Os7kI99OnSeeO&DIsH$uE&2RhwiJkPoB}mv zB84*BKX&63A&Xi5F)GMZU$SUN0*sc4zlNF|+AcnTUimi`AIPX0Dg)S^L2Gu$pS;*wJ&Pr_1~9 z-N~FFVrY-G-yk8_ zEi1mSop*u=$EZdRt2&8WV+Cz6ke#l*bK=^cl8E$a7VjK0+1&cmA^Cb%An{G$W&Eu` z1U)d5?eVj7x>v3cW9%b;x`bfo9Dl!B{XUG;yQ2>CVkKB1Ri$J@#f^3Ch_D)`YkPbF Di()J} literal 0 HcmV?d00001 diff --git a/src/main/resources/meshes/dinghy_hull.stl b/src/main/resources/meshes/boatSTLs/dinghy_hull.stl similarity index 100% rename from src/main/resources/meshes/dinghy_hull.stl rename to src/main/resources/meshes/boatSTLs/dinghy_hull.stl diff --git a/src/main/resources/meshes/dinghy_mast.stl b/src/main/resources/meshes/boatSTLs/dinghy_mast.stl similarity index 100% rename from src/main/resources/meshes/dinghy_mast.stl rename to src/main/resources/meshes/boatSTLs/dinghy_mast.stl diff --git a/src/main/resources/meshes/dinghy_sail.stl b/src/main/resources/meshes/boatSTLs/dinghy_sail.stl similarity index 100% rename from src/main/resources/meshes/dinghy_sail.stl rename to src/main/resources/meshes/boatSTLs/dinghy_sail.stl diff --git a/src/main/resources/meshes/catamaran_hull.stl b/src/main/resources/meshes/catamaran_hull.stl deleted file mode 100644 index f80d0b8efa893bb7ef58a18d081f137f5b99e245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58884 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 P43k;KoMd;Eon-t4n0 Date: Wed, 20 Sep 2017 16:36:27 +1200 Subject: [PATCH 03/20] Started working on the boat selection screen. Customised the boat customisation UI to contain it. Need to have another boat to test whether we can switch boats and also if the messages get sent correctly. #story[1274] --- .../java/seng302/gameServer/GameState.java | 3 + .../gameServer/ServerToClientThread.java | 2 +- src/main/java/seng302/model/ServerYacht.java | 3 + .../controllers/LobbyController.java | 2 + .../dialogs/BoatCustomizeController.java | 42 ++++++++++++ .../fxObjects/assets_3D/ModelFactory.java | 29 ++++++++ .../views/dialogs/BoatCustomizeDialog.fxml | 68 +++++++++++-------- 7 files changed, 119 insertions(+), 30 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 0b495a8e..41c619b7 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -702,6 +702,9 @@ public class GameState implements Runnable { int blue = customizeData[2] & 0xFF; Color yachtColor = Color.rgb(red, green, blue); playerYacht.setBoatColor(yachtColor); + } else if (requestType.equals(CustomizeRequestType.SHAPE)) { + String type = new String(customizeData); + playerYacht.setBoatType(type); } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 1138f53d..728e6adb 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -125,7 +125,7 @@ public class ServerToClientThread implements Runnable { lName = all.get(ThreadLocalRandom.current().nextInt(0, all.size())); ServerYacht yacht = new ServerYacht( - "Yacht", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ" + "DINGHY", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ" ); player = new Player(socket, yacht); diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index f2d54538..da5aa37b 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -421,4 +421,7 @@ public class ServerYacht { return boatColor; } + public void setBoatType(String boatType) { + this.boatType = boatType; + } } diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index bbb39f75..a292fc8a 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.ResourceBundle; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; public class LobbyController implements Initializable { @@ -129,6 +130,7 @@ public class LobbyController implements Initializable { controller.setPlayerName(this.playerBoats .get(ViewManager.getInstance().getGameClient().getServerThread().getClientId()) .getBoatName()); + controller.setCurrentBoat(BoatMeshType.DINGHY); return customizationDialog; } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 339f08b8..5690dc35 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -9,12 +9,21 @@ import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.geometry.Insets; +import javafx.scene.Group; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; +import javafx.scene.layout.CornerRadii; +import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import seng302.gameServer.messages.CustomizeRequestType; import seng302.utilities.Sounds; import seng302.visualiser.ClientToServerThread; import seng302.visualiser.controllers.LobbyController; import seng302.visualiser.controllers.ViewManager; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; +import seng302.visualiser.fxObjects.assets_3D.BoatModel; +import seng302.visualiser.fxObjects.assets_3D.ModelFactory; import seng302.visualiser.validators.FieldLengthValidator; import seng302.visualiser.validators.ValidationTools; @@ -28,13 +37,17 @@ public class BoatCustomizeController implements Initializable{ @FXML private JFXTextField boatName; @FXML + private Pane boatPane; + @FXML void colorChanged(ActionEvent event) { Color color = colorPicker.getValue(); + RefreshBoat(); } //---------FXML END---------// private ClientToServerThread socketThread; private LobbyController lobbyController; + private BoatMeshType currentBoat; @Override public void initialize(URL location, ResourceBundle resources) { @@ -55,6 +68,7 @@ public class BoatCustomizeController implements Initializable{ }); submitBtn.setOnMouseEntered(e -> Sounds.playHoverSound()); + } /** @@ -78,7 +92,10 @@ public class BoatCustomizeController implements Initializable{ colorArray[2] = (byte) blue; socketThread.sendCustomizationRequest(CustomizeRequestType.COLOR, colorArray); + socketThread.sendCustomizationRequest(CustomizeRequestType.SHAPE, currentBoat.toString().getBytes()); lobbyController.closeCustomizationDialog(); + + } } @@ -93,4 +110,29 @@ public class BoatCustomizeController implements Initializable{ public void setParentController(LobbyController lobbyController){ this.lobbyController = lobbyController; } + + public void setCurrentBoat(BoatMeshType boatType) { + Group group = new Group(); + this.currentBoat = boatType; + System.out.println(boatType.toString()); + boatPane.setBackground(new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY))); + boatPane.getChildren().add(group); + BoatModel bo = ModelFactory.boatCustomiseView(boatType, colorPicker.getValue()); + group.getChildren().add(bo.getAssets()); + } + + public void nextBoat(ActionEvent actionEvent) { + boatPane.getChildren().clear(); + } + + public void prevBoat(ActionEvent actionEvent) { + } + + private void RefreshBoat() { + boatPane.getChildren().clear(); + Group group = new Group(); + boatPane.getChildren().add(group); + BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); + group.getChildren().add(bo.getAssets()); + } } 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 b49c36c1..54d5768a 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java @@ -51,6 +51,35 @@ public class ModelFactory { return bo; } + public static BoatModel boatCustomiseView(BoatMeshType boatType, Color primaryColour) { + Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour); + final Rotate animationRotate = new Rotate(0, new Point3D(0,0,1)); + boatAssets.getTransforms().addAll( + new Scale(8.0, 8.0, 8.0), + new Rotate(-70, new Point3D(1,0,0)), + new Translate(16,50, 0), + animationRotate + ); + + boatAssets.getTransforms().add(animationRotate); + BoatModel bo = new BoatModel(boatAssets, null, boatType); + bo.rotateSail(45); + + bo.setAnimation(new AnimationTimer() { + double boatAngle = 0; + Rotate rotate = animationRotate; + @Override + public void handle(long now) { + boatAngle += 0.5; + rotate.setAngle(boatAngle); + } + }); + boatAssets.getChildren().addAll( + new AmbientLight() + ); + return bo; + } + public static BoatModel boatRotatingView(BoatMeshType boatType, Color primaryColour) { Group boatAssets = getUnmodifiedBoatModel(boatType, primaryColour); boatAssets.getTransforms().addAll( diff --git a/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml b/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml index 8e8653cf..1d355a33 100644 --- a/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml +++ b/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml @@ -1,5 +1,10 @@ + + + + + @@ -10,54 +15,44 @@ - + + - - - - + + + + + - - - + + From c5d56065b690512e57868a58236659ed90813fb2 Mon Sep 17 00:00:00 2001 From: Calum Date: Wed, 20 Sep 2017 16:42:26 +1200 Subject: [PATCH 04/20] Fixed cat ate a meringue sail rotation. #fix #story[1274] --- .../fxObjects/assets_3D/BoatMeshType.java | 4 ++-- .../fxObjects/assets_3D/BoatModel.java | 4 ++-- .../fxObjects/assets_3D/BoatObject.java | 4 +--- .../meshes/boatSTLs/catamaran_hull.stl | Bin 55184 -> 55184 bytes .../meshes/boatSTLs/catamaran_mast.stl | Bin 2284 -> 2284 bytes .../meshes/boatSTLs/catamaran_sail.stl | Bin 1484 -> 1484 bytes .../resources/meshes/boatSTLs/dinghy_hull.stl | Bin 14284 -> 14284 bytes .../resources/meshes/boatSTLs/dinghy_mast.stl | Bin 2284 -> 2284 bytes .../resources/meshes/boatSTLs/dinghy_sail.stl | Bin 1484 -> 1484 bytes 9 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 75e21604..dfe3d5e5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -7,8 +7,8 @@ package seng302.visualiser.fxObjects.assets_3D; */ public enum BoatMeshType { - DINGHY ("dinghy_hull.stl", "dinghy_mast.stl", -1.36653, "dinghy_sail.stl", -1.36653), - CATAMARAN ("catamaran_hull.stl", "catamaran_mast.stl", -1.36845, "catamaran_sail.stl", -1.36845); + DINGHY ("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653), + CATAMARAN ("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", 0.997); final String hullFile, mastFile, sailFile; final double mastOffset, sailOffset; diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java index b1373c67..78d2c837 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java @@ -37,10 +37,10 @@ public class BoatModel extends Model { MeshView mast = getMeshViewChild(MAST_INDEX); MeshView sail = getMeshViewChild(SAIL_INDEX); mast.getTransforms().setAll( - new Rotate(degrees, -meshType.mastOffset, 0,0, new Point3D(0, 0, 1)) + new Rotate(degrees, 0, -meshType.mastOffset, 0, new Point3D(0, 0, 1)) ); sail.getTransforms().setAll( - new Rotate(degrees, -meshType.sailOffset, 0,0, new Point3D(0, 0, 1)) + new Rotate(degrees, 0, -meshType.sailOffset,0, new Point3D(0, 0, 1)) ); } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java index e93152d5..30820660 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java @@ -28,7 +28,7 @@ public class BoatObject extends Group { private Group wake; private Color colour = Color.BLACK; private Boolean isSelected = false; - private Rotate rotation = new Rotate(0,0,1); + private Rotate rotation = new Rotate(0, new Point3D(0,0,1)); private List selectedBoatListenerListeners = new ArrayList<>(); @@ -66,8 +66,6 @@ public class BoatObject extends Group { * @param windDir . */ public void moveTo(double x, double y, double rotation, double velocity, Boolean sailIn, double windDir) { - Double dx = Math.abs(boatAssets.getAssets().getLayoutX() - x); - Double dy = Math.abs(boatAssets.getAssets().getLayoutY() - y); Platform.runLater(() -> { rotateTo(rotation, sailIn, windDir); this.layoutXProperty().setValue(x); diff --git a/src/main/resources/meshes/boatSTLs/catamaran_hull.stl b/src/main/resources/meshes/boatSTLs/catamaran_hull.stl index e93a9787f7e11aa3d47b5cd6055ca0d5bbc4e5fb..a7f70e54257b99704f432a60648be44fc6bba305 100644 GIT binary patch literal 55184 zcmb82XM7Y@*!B;d&=Wd}l+cvk+wPvBqkupl2{oaU0t5sSiYD~li%L~Mks`g5**Qb+ zT|_z}y(1{n-)nbgmusHqeLuW>i2L)JbI;7F_kCvO{x=%ZKjEuEJ$n@G^;JUOqV@aq z?AN2`SLLfzs9CFMnSq156|MBC`2YI%WqKi=)Jv4h^Dju<_vd6I-Q{{($^7$Eb1cd# z*DbB59qwO8d49LqR$JR#rHT5n*L9~5;bjt~`%-dhhwr8stVGt^_nO=?c84tZXsDd~@RHm*wzkZR-@R(xk~Pv)mQ`m?l0tNP+D6S3 z>73uT&uLSBUUnBpZICr^6k8Hv<;VzGD|DK(*mqgvxW+E6QHiYD$FLimP)FN1wzl{8 zL8FFNB~4|`Q(B0kGup@jCr3G3*2pPYY4=$j?UtF|dlXv|qRE#ja^%Prsc$-b>*hNw zeY1hqZ+^Nhp8I(8O9M?GTU&X43*l^)B3B&!G4;^Yxo%dtcG;2;wZBM_4{Hw8uSd;w z^HE&7!i)Oa_OUxui1!@jagMGvV)UQ$%yzTV@Rg=rJGw(<`5&z*M8_{v)StV4Os(1R zTlcNO7v*oo>QwbyZ>e!tWq3Yc`yYOFRqnIeUx;$8Qq+sVD^h1qnd@ey#gmJ2n{~Hr zNrui?wwnw+IZB&y& z=k=ahbJ>*IH}1)rX)2rLa1>h-Vr}CTIb&m@Blz&QZf*mv(V)-jX&2wsl(|p~=q1fk zWOSghzE^QR1K7vcl28~*AL$<_hTUjHcwFtb|yN0ZZpTt zN|6WGFC?p&E~A|LTTORgo^wOi9lKoydwK?q$GV$t$tKpg5u)U) zWc7C3P-hx_tecgib??c460>M|P?{|X@lBx=^~tL;&cn~=xcP3m7WjNZ{8c_h6&za3 z+3fpiZdTYXTM{C%NQxZRub8vg{W)%KHEzwd;Zmz(-JcLw%cRI0X+L#VS~1Pd${}Yx zZG$xvu_YmjJxf%N8eGx0)Es9#zkgHy)~&Yrc41c8EbK2?@6)ViI^21V(SOV6w%N=U z-Z^nUL3`igxLIZvMjW0iSxjaac-Vv9HSiCzgF#* zI$ulcJFk|vriHk&Dp{^oE1ap*2fJC}8ICOpG3#cs3>h%g`P@0(&3DVSz~>X<+egW= zeB3DK+w)`Htgv0SBt)n=RDDzXlvB^u#Hd#3mApHrmzE#(v-5fytyS4cS^@lS7oJf& z^>B>#+*?=Y(hODdvtONkXLdGN`E^KIEu>s$?Iw<5OF}H!)keDNXLGjvE~n&{;wx!! z+@V#rRt6y|Ai%?vhW?H^gRoPW;OYU3!jBt*5$ zk#ggNAotUsv&a!CwKc4R-gz*zLtW4LyuWkJsOc$f&5192wwDPijXU>~jFOd%V z`DxZ0IcM~b-lN!(5LGenc2+m_pT3&zF8S3}`FV+~W)`#ok3sv0nt*wCT)QXw%FL79 ztniw_mV~(6C`Arxn5yr1G0V-XC9k5dZ`ITM=f<74Op%Z8Z`2nLo9<@i&c9Og&kSry zh=?XBD*nbsJ>%6?idk>xNW`(bvEeYZJEK$vRKR?wqVT!@+ z%&W}Efsf@T%R3Wdl$NND{ga%!_~B%O6<$l&k`Ob{9wYN+bpMcjvYTs^YkJE+cVxnf z-rn{Xq8IL?LrgaJf+J(ytgr{bmV}rvGf{rusEaPgOf=Z{;ToM&v9?yuTH%Bk-7Ha7 zO{k?;9Xr`zh5b^tgu1F3CgZnHN?lnX#OAB5BAgqZhbOIdVlR@d!3 zA(EAk92KsgsAe-Q2FnbeD0?r)<_*%SM!hUk~?Z^{xQEJqN?T}!9qmN93t-@ z_*ah<0}WQbFso_)*?=u!zDfvF>g=S{j}HV(_NjQrxf5|y*0O3EUUGnu&vf>0GX1bGAu8m8aw@MCn zv-0oMr?QW=BC{o|gLRW-p4Y!Q-KHR8emAjO3{(G&H zn-yMP*^&@rtMH!FNkYzcG8i6r%FvqjF(9|svc>+{Tc z?e$w36IDt3!#iIYj}q0j#Uq{l3Xe8e`8@A`vRm(T-lN!(5SwbZQRSb_*PBnvCE2@U zuTLi4k$0^TEQA>urn?~n zXG=n?Xr3ZJeo@T*_)?0SJ(fq6oSt~_f5mO+SDjO2{K`V^sFZ1r%h}trhy2~a z#@mLX#Gfd^O08e=YY(iW*b;oWjwz~p(NEkZCk}M;tj|&7ml4n8fB$T^;*S&2DN06! zx|?T=ceBEMi7g4y0CzrlX(4yDqbY8_TdoB@pAbK{L+t#nnES?@fo@jVE?W|!+w4R& z|M0JR_F5ASj_x=fBqUEwuZdSN$*pd+LZxUtU#D&iK^TrtLfAY@M@VV8s?$(Sd#4qsrhJ}rC24^2& zuu^Gh6)o19o!Jun-O_DkHBGp$WX&mgMDZA$x4Vw^VV}C0jF9m=p6VIyXO*l}tyrIG;-BVYf{6TU7j$(gai0;mQYWTPZ`i>(z4c;9ZOZ!R1I;7LGt(;)q_MRho1$M~dl%9V6 zCWDm=3F)=oJr;Y9VoO34He*$Cf${p%`6q3=wLH2i+;}gK#_v_@yys}~U7Y%)ScIPL z(outz6|;o4zG4pZ2#(_MC`8K<2{O-thq_T~v%%3XN5xeul@DB@5GN!0$%j#f{&Vt9 zgO!JkDg^G9EeSDcQJft5{dj%$+M~AJj|ow=v@X`(bWHZj+6LGH*RZ;>=Noqjq7;UV1@fJTf)xW z^FFFesq6Zh2D@y#oP%<_kc};$YIy6kT2FURtM3{e`>At}HtSdW?KD{7e#|{zh_nS` zRfDM&^l9_Y*j5AHxm%w5z1$tRk9A98RrUf|^mGkQ8LV(W=AMt;T0KTBd)7a7lss#D zy2Lw$1CG3tGXvv%{k<4f=u21X!NlJTR``5;h1iX%kKW$nFMX)K)8<)n59gkbRV{5_ zIseWk{i7BX zV1?VCdyEht&*~#XU(Rx_FK60z4S2;F_j5U|OYu_LSnpi&N3H?#hcEg#U3*s=tZ+Z( zo-ai1mkFwN{<+SyUDn#72_8i}x`b%|Ltjq$|0=x}WnBr!CBD_UdZ*#4 zaPImBuQI$kuZw>#dpF){#Ri@-B~YSup85tW)$Uc+{711RA-WV9sA9jK>U#QTK7*q; z_Vm~T6yo8Uf$GZ&eO;|4wJ=!WRgEp-`FZ~&IePOIedml(2Je`%chAuap3%QZlm}LC z(~q_pXRyMvC|eRD`?JCF{;IwX?b1|(_pJE2vwddxtZ|~ewV{Ed=r5CPvk$L*YzeEu z;{-Wk$z<1xzEKAI(Hz&dy;MSrw$^qbYPb_+`cM128m~!Xu)_W|TSD_W5><|ueI2n^ zCL8>$fOnvHX9{uD>%r<&VgtwcbyE#icxGTrLj02}N$o#4z`5tgQ3mgearDbkF-BCw zL{;s4W9R8b6Ae~)zl<&6S?Y)(a#^dK?u}gs8XWy_RK)WN;;2_i^6OO(^vB}!vHhITWh_+Ela>vdl&esD*8mzGI%a(*Vm4B!T)(W{h=8rXaY;*Kt_m)O% z9jbobme#%HvuK+~#$%o>330gY5OuX=1y`%%RSn)FtbWyCu4)&EGZGJ2iS?a0I~~S;=A< zwd*qvtJB_da+%j~6kEbOUK3(u>W&@ykH4L@c}pBw ztPIqMF<41`Tqbb0>~{%KGrX&8wyA}F;`ZM*Z;2y|rWwly zu26^pxw^QU_}lK)iPUG!j^>CojF=2IBTR%Y4h3^3A1O}=vY~8&lj=k zu=hT?q(;fA-Lj=#?)k=GrT3k(+Vi=C49`&{q!tCjvJe@%^1NV{rzi5?M z>S$`*zb_0{xF2)R$2s;ysV8r%r^YsUV~bcgvRJn*gZ8&o3yA2`Mk~j+*-|IRzcyIm z^YIl5Va)C&b7xwo4=Q)X;0S_yIQM)Z=5OdBgZhuv?>)Y0urh1wr<%j6QMM$+;0#^l z`>)dLJ$ApaMUdRXx#tT}x?Hq8lyoF@$*ETcE8PCvV}v;HtcUCz*TvZ*{4ZN1%#p>l zt);d72_I{2Z@;RSKVDYOQrVef&>@2r?#JBo;WO-yRrgBvbS_?d+~5d;M-h)MM8Y+C zsSHu&otbZ3F<5cj4bt{mSHhNr(AV^k-wa%&7ee2Skd?IUnd*3BWUf)JX*}(_)lH7< z-e14=;(@`+;P}t9(~s+TdpKJ{3)YI3k3(}fvjx2}*59q5Rap02dSbF~S60%>?OrJ7 z;P>aLpJ^3FPnG+;b=A2+cRBHoD~{St?%R}oai3}WBS`EI>hmA0p3Jc@X9 z3Gp;2Nv_^1T^&Ol1}oghxL0DYuT`8}@NTfP?t>$?h=n6a`wUmUT0fc3(a72F@ebSE z$14uUK8T&$_f;dx4|P^(;kHHe90}W3gUyBG)%-Q}od@$AvaLA%wx$it+PpV_FBB@p zs{yy2&Uq&f+TN_;qqsC;&K9w1%#1wFN6$|gtZ*OWUMWQ9o$;zd+%Y|GqXV`GlIJd- ziG)~|v9CH%WtqOX>@I^9_Q*IE!SkrSF;YIQ>s)#IjO_^)_YCea*dyB)FBcZe=iE4V zzilPsR^!&hy!)z;Oc;4wk96#^?RfF-2d}$Aq;bc~-&!u!+jco%^OktV;h6~Uz4mP{ zFFh-umoA)1u_wb`|BBotH1#ONyqx6zsbY{_y*t`t(`uo%j(I#Z+u5Iw1qd-zGb$s=6$M~*S3|7Yco=eO14Zd>1 zQS7haozx0F=F0cp&i_1u(Cd;NZ?A?k`Rm5 zM#!^0GNpzN%BtAAXRlA6RzjR(k5ioJXG`g3&3p=}Q8W!~|g$gWMcYC(wQ%OX@l*qWW6j?JoA;q$R2^xY@X(pWW0FZIt0 zn`g;hf6$@gfm#q^%hb;D_~TH$cU_@a$J)C>K z5X}!p$N~w&QlB=UHjZ%W!CpO z16RV9&>qt}%f36}^zD^}V(*@7lxtduL9IK=%ZqdC=`*HRtlZobs@3`0;qAL@3E#@Z zM9Q-@&p1ky%c9u3=Xjv;%}{MZ*g$D|>q<@UBu^HcXtQHo_s}FPv#R`u{wj{*GejU|; za_1b~)}~V@Ze-NTTd_=J^~~BxD`I&uDTh|exej~efozBaRB<@8RBLF;bW z5_)v^@4;yQp>jr}emo^=?YChfZHtdOw8_N1D< zzTB6BwdK#IYMZ?A;Q1=^y@vcGNK632kNQa2K!F`EG5sxms#ro|KS!7pkm-%;ngB9*$ zYzf=#v%AWg`|CKv|9xV6JAtDK`>HnnTras&T!j+cm-r|yEkus1(dzGU z7ahl*zp$-p+{f6G5EJirQ!^b4^_|Bb*xugZ8HZ;gd}X?+hkDlREBz|=kXhk1oMS`J zyx{xy{(Xwgdu30bJwQD9`Fvb8PZ>`MR@mQVKiFr#^`+d^JSEsJ9~Dw9yVkJweAjNT z@8c;Gh7xE?#Y)CLCA0?CQEbU~jsqq4RrQqMqqsDC9KI5JtrD!Tuf>*pCE8q??Y$~K zic7P{;VThsm0*Q^IJV>~G3D@O?>V?exu)4W_mxPnO0dE)4qNh-7=ET!bx(WnQCylM zWM7F^DB-DHR^p~)4@B5($yeg`#7y22d=!^vZ`oJkl~sZj_Dk84uY~XK2*owZHO=0j zy#y;9i?AhMiPlyN@=;uxqYPh(FslSB9OJMhUx`*$Z|5kUcMyt>&ZDJmK2BR37$1>V z307WzTsUwPTk@SF#wx*A!dJ-W^WTSW46?#@*^;kBf^`nQ628KMy$Wb5WP!Fia38g- z60BsXQ!sE8Tk@U5^VidNxo2>X;fU-*2~Xc;g<~AHWG}%-acPdi?Il>@y$rVWKT6P! z2bX@?q`200) zu@}xeH}=`*O?Z3tYq344HyUNK&2T(_uqC|R_9$BIj-IHOdHKTTh4T)Sy>=Il>86fd zuBgu)_Q+s`>xcb$>@Dfxa>3f;b#MNaO|eJDai)D$+xR#_zAQPmZu*>AZ7V0QOKb@{ zsUP=O+PM|ZjNklfdpm(WOCFDSZcrgkrKWA^>{b1k!3vLgjz4|Y7nm6-SLWFWlxcWV;itvQ8RPx52V(HlKmL z47P-)`Y(IRY}=MN+cvyx^Ikd5_Ji>aR!VzSes4p4 z`cn+$)7R+PtHR-ts0jG-rCn3eQn&316l3>ZS^6Q}m{19@!##?tR=V5esJO zsXlL6Rd=ktVX(q&!>#FS!Lj#)WlMY&$Po*B`aEmh_tqx{E8NG}k`SwhcaXh`Wp$Pa&7e4H|i%p*Ek)J$Ct? zJjacY2a*eI_WWYS|J!5NU)pz$;MDjko})eW#dqt!kN;i5ceJkr+v0Pur4Pq@uFh}Q zbM5}4{`Y-kFEnYRuiOaR9s1AbDZ!TDGpJ+6h=g~J&pwZ{ebxB={YRefsJ$8f4pbFd zPS;m#n-P`9^L^{>59PYzcWk zb_UCyjY_$WxB1eRfu?eqLRxj}p57kAdotD)3Q=+YzphhLFFG?Uj*_f=`AMjD*}7ZK zWh2DBX9rw4K237`uqD)}Fo$^S>hG~PT&^u`^@BNkN>*++t>9@7?@|2i zJHB=b+2# zwk5f=ITS~+CEr*YeImkjxWzEZZNNQ)dyEjnzWA-iPbhH^C0OCMVN1x?lj~38x3F>g zlUqF{XYSyy`%6cr3)BMEk7bvPbx|$!V{dv%R@xUy8>msXgeO=d4jIidRMs=LiMM4! z;LMR@`n{F@TEN$`r}h~=MrYDfKJFt~nX&A(%wg3i=TyMkhEr}E&9W_YPWz_2ZQOBA zxTG{eS~k~kYYZ+b5TaI3o#(6;*;=x~-&-WHi=8gY-d)E!;5uPy5-XEqAY@KTBl zYu5Y5VED7$MvWh**Zp;CAIS=jM;^hxHvjQNgmDNh$Zf#Ak9(!B#5R=hv^gu>Hf#xR zaumocvkchg{B&WY1y7vR02w?q$WZ zOa4}yzwYL*zVR;3x=7i*^Lzd2${@)K&kSq{@6gw2Ba_?S(SI12OY%48oXf&KY7gWL zm#J$m=-18cw(-p0qO&E;?M1@m<_b;qUR6UR=MCblWt`0nPexCN$vN?L^?a3sB`cgy zh%E^*{%x3gb$qh3)PtOo^9*o~EnatpSRf{hW*9eqgh37%Ggs5nDnEL)eQ+;@oV99yTI9m&6aS`H=(qXFb={kD%G9i)` z&VR<1(61sI$oO;pTvJ*XlAO(kuY|7<*J?b)z6#E>6xy z!C5M>;_UCF`mNvStlaXwixr-!Ia?F*Ok4|-MaG6ZP8AB4oClCIgz~(C_eHCQ$v|mFGn2C{@|uXu+=s(djq*G6d8LCTE4=oxCHT};!_6VbH+VhuY}leH%zr{)Wi{zGgz|1>k?-O7Gm<=a5bt<8uz)y*=+fuxo2>XLC)oA zZB@ka$9jfgIV3BbVcMRvrt0E$a)0BM&iDH>+H!>RY{0Vw-a_gYEh+xU{AZI$Zd&s|c3|EgfHFGY#na$>f^Zdw`@TJAPFnPD(etmOn zu;ev^GrY0Si0_?0ZYvwK+o^A_nNzaDs|;Jhh^mkl&$~ST5POpUp~7Fvt;wa8XXUK< zPc?0)^&3yzFS`&4`%19FYb{&y9qTW_3YXwj8((^7>KeEzR@nDpOL#_~sq5w(J43d3 z?t_oAmA1tOmAA!L%i}LW3dcBX$$lTUqo_1TdiD~maQw-Z;FpAS+nn9Hs)8e{Y1@;3 zQORh7=gwE~aecqpll7gWfK`GOjuY6D5TEsn+N_o~z^=gvTibG*^Z9(|*kzSqh3#@* zz=(R#yV|a$d%Wl1E8#0-@7#BeBUTAkIL2X1z7nZc36A19@{W2?R*Q~mt&Kq)`bzAu zO0cqbQ-;7%Y{^%`_ZK@Yw4cDO$>+0|V1@0nC0~jCR_*eY@D;MR>?^U`D!~fJB5cW5 z;<8nOqZIbYInwi$xPuaS+GmT;IW}ZVz7oE_BWzI-Um>5*UV;_2%lBk2vGG!6t!q?k zZ-kvX?!EN?&V5g4Ib6f7`20he5t5a+TPg*PVoSc`O{=cB_i?Y}^Z82nTaXpD%a%S| zlV=R_mGBjERBSK73hz0vr4J=MEyzc4X^!+hl<-^?D;yiLCA^1RZod&#&Fwh%U%buJ z=e5s1!!5u!8J$}$bhJu{m8|fX;5AW*zw;e88jfqDCx*q@JQ?-?xYqI2@BKr@tcAt& z!;W~#3b!EpM0f+c#7WnwZTlU?PQ==>%JXg=k9i@QHa*}<+i8xY$KH6!3hy)V&J;56 zZ#(GvCe4?6%GdF>>|(q++k443t53LA)+nWSdmSrT;eN%jA-=EebKkXcby;VgJl$>N z6ZUF&UJ+tn#>=ji9bP+@9_%Gq;kk?bAR#iOId7zQe&S4C(Oa??&e0vuc0xRNJvFYD z3vzZ_)>X2?a}-;`x37;(*Kgxirxq;Q*Ouv)BUby0GqBYjSMj*b#j2UbD>Ddaz+NdP#W%780zx(kCqh0kHdZR*dwz-7+823ti|MA5xW9XZQJL~1> zYx9sfy5n_MhiSwb^$W z1y7GntyTzeEqNAvKE6V58oC{G<=W9(|7}Q|ZTEwFANNYU{i)8n24!{Vuja={R(Ou$ zeH82nPd8mFia*@h1$WNv%#j!SjCg(?zRMN7X~)jI+4@RWxM#2>M0bzhyQ-IJ>0A@p z+2-l<-U6>z$Q}Lck*n5;e9l8Px=B`etnla(;@|mqjPVT|&edjj8$E)1IQM)Z`VUF3 z4%H~_{Pjc!$qKK19OL3Xu*-QoK9k-XyPVw49Nn?6g(q0&b{qB5olISr+DEd&?a!9* zY$Ep=SIV8Cdhe>SHbMor8n-6$h3~lJN^_u@e)L5z+p5NE2Je>%5tOvs)vHJbeb(_l zwupsCDvw}{!QT5_L1)gS-gp}?Sz+IhV;><>Zk#u&z8#@g__4Pwg5>=RUK26%$B)*tR>`%GE*!z1G0;mzXmuzpmQldor@JP z4b0sZorx{s8^xz>+GY`MmMy!hYFT^~MBb`SfVI{2O>6l!pO4PP z3Sx4#(_$jAC1m}Y(MIJ3IjcFySz{WzOg}Ry;`^= zIg9TW`N-6tmR;_Z*l$M$bOl&jpmV9bpmT-ZpW|U|1r%<7 zwj>0|S+Y!)?Rs~Rv;Mn(Q=PV0Ti-8ut|F`qu=DxSmAnOOG2DaGgRgTIja}QS(PfiQui&^ z)~X?C%{&&zA|gDa`GK`n)Ep|efzEXTbS_r5Ur%HD>0E3H{#Cv(^$EyX(?HJRmclN# ziMhnfXGFw;-#!W>vR~|Kqe4LEYV}=CPgE38_}bYL*fnJ$<$oY&?F2b1xM+~+XKk(e zBa7)LXJzh@4r_^@wH0}>xeNuJD@ow(7E}U)eHqAECyqTa?&mz zor@J7gKWu5&Qb*|au%+P#qZdSN$*pd(8vM9o09$+M15`_y}~ad7yK#!fnHryyPs^ z2jr~kAZM}1!d@ma@tJ;_q?gX6hFEkiR=5q=627VaDolCESzmyh#U2u(EzexyC1)XS zGp{Az-sod()dSlp4s@0e7$Pt-hqqSq(# z(z(5By5Z6YuRog-5 zst$GyE7?bs3CwnE32&s#9HKhx|5tAea+Z5&UDH2Oo14{4|JZg%R5kr$-b?3F9y-?x z(79OobVqH|KTEJByi)}BSvioicA|FKL&8phYF=$|HBTELqF3HV z=P0&>Hg_k>%Nv$BpMjjk{?6Z1pQ?V=`dXsfBL$z)@_mZTPL`!W=c)}l7c1-su_Z4# zOZ^6NR#A|%R4{&%mF$VE9|4NC4A|T)PLpC>!ua29>U8<`1y8K<82|K@au$23$o!-tt!vLR{+VhSU~PfUB}3kS ze|xxW406`{CDq(qKZ7p^nSOGX-Rs*pYq*>RI@h}^?cA(zy|E>H)_W9N@{+UUZjiHTfSkqk!$)yxFP%%8pmY5I zIu|QkZ)^!qGd2uT9YD_N19BGE4__hQ6W$ycFj!pyoht@(E>^hS*b;JCJW7{+rU?3WBkQqz7or!N9Ii+z!XVKvQ2E3Q3T zpoZBXz}kBEcaquzI#*H9xmc-M(rNlVJ+|cQS7|}cT7);xc%UKIf}M*-4+K-vl{}qdVR;;(b3aolBMgohul0E><`mWJ^M5o7&4a#$xAekh6G2 zzHsKP0yD}>&f2p3AFQ>Nz2BSQP4bksavJDdt3c;sh5bafh%4O1bYmuW9=0 zookxg=0l0GD8UMkbGGCqXDJUkD=WxZ>`hi!TE&dF=GviitD8LotS!*Fl%LMU3h!mH zC48wTBh*NcvqC`5;t^H7YHiP6k9Qwt!R|WdhkfelrQ51d(7Dcl&czCkLAK;2XDL59 zi{}r%TdoCU&5le_J6eUh2Z7GT3ePKS$xF_X$I4!Ib_F?$chzby&SGx2$XO4jpJ z!uw2YNr*4Li<9$1BlJQbXYsgOHA|RlEiP518}HTO0Bh@GGgf{LI@eF2bFsqXku7=2 zS!!`-LthSZ7RSqv8&wEgd(BGa1NY>mb14szALJ#{;ab zj-3+J51?~R0iBB#j@#H0zOUUHqq>2d6$5e>_df2G$YO390Y=sM$1&;@=v@0i=VFC- zqu3I@yX)9bo(4I~06B|$ANR^{TBkL;2UuH2pZAd=C9mry=v=G}$?-xpw7f93B*exg zu`(aXS?}tfvaJT(D_7)xuk^ruyun){E2dS@SAfpN3hxebKNjNGdoi*g$XS;`&f=rE zG%~TNZvx{SbS~+kbBzX_ixu8mWJ?%>Y5S^~AZL{VIg35ZZ@;W)cC+e-#|rkZ>i1JW zcK=KN3Un@3cucS*aLKa8s_RCO{vF6!+-lsKJXXAPE_MA~1ziK3ixnOdYzezjxdy1O zoAq%v0Xd6%ANR^JKbJGR1z204bEz*t=UN9k7c0D~u_Z4#OJ)T*t24-198G-tD!u7v zc=34j(z#?P=vPMUYBa!t8DtoS=-{@EB|j_iCQReBc#5; z3VQ%-Nr=a52FeN`XGMaX#ZeruIP5dxDRPm4vLonR;(9)V74{9;60+~TNK^@Hw&_Pe z&f*b@8sB;4N|G-@ z=Q;#B7b_euvn50luaeYPAZOhGIg6too(*`Gz$`jqh*}6b*KW|cSmDTvEqTdV^2)n; z&Rrm9aTL#^h)0)~&Lziz&Q%R`E>?J7j4fg1j7n0!q&9JiuSOc|v9c%2d!%@33HI6d z+xt5gfX>AV?}f4@ydS$2&uh1*b*F-y#UqtRu-#h%olAP?Tx~(;Vuj-!wj@Nh)Fde^ zau)Awu?N6o9$#VC9U}LD&Q%3;E>?JKvn71*Ja>rfB_HaALC)f6i&sltMe&x!y(F0d zbgtc?bFsp4En5=eTHB$@0dm%6kh6Ffm}h66wY_vMwH9=)HK22`!Z8P1LInBSP~`?W zt0c%-JW_cC+dY|(;)!Y`=v{;?WkFPoA4ORQ6 z7jl;Zor@Ko&)Jd?H)kcPUL&XJUx1v&Pv3auzETjtMLL43aH*$yu`g&T0B-kh3`ENINpf^pmq9*Jn0A zu(m+wk}W{zDg`=S(_$XOh79GREV9Bh%ZN*Bv$UJJ0crkCg< zkAcqh4d`5~u-C_y(1J^Qso#f9)z5&O#om(pahbri=P6Rg{J`3Zo)Du9(7EP-&czDH zB5VmeMY+1DXG;p}TR_fYZ|QMzS<}x6`yyl6z&#-|cX(Iza$O7k4Cq{}a4f=>ut&Ba zPId!1YaYm1?8$t7KdX7xVqaY;nZwK!U~RoG*H3l@oofo{T&!>`!j|Cmtw~Vrb~SZ| zgPg@NhjUn{nZ>eua&t-Zck6ukPPlNaS`(4%i~^mD754hr5;&u&QK|~aS=T_$;+O+@ zyv#o=W)w1|o9+Ok3Un^jA9Sv%pmVXp-YZ)I|KsOg^7QO+`Wuk5xc70d9C3&IgA9E-3ey!ZNFv|L=}Xle?`S={@$S0Z!0xifGd4_wjmW6-%Y(79OQ zXo4-_IcM5vd2(8|)V?5R@ljkFS-H$h0oE4iT(V+@8mT=&=VFCp5w?UD+|Wa%x5!x> zbIjTLsaeOWA08{n_d2_m$^tsqP|&$p;W5FMz=JFot-cw0B=u*Iv$)l`HF>Nc$5w_e zDz#5~y(H*dtnip%OZa{;f4q7XRN0vgRjHL5#%h6IqKXEG7ngGc|2m?-5)DW(7BMg&R~Vd9b58}v()!p`|DRg&T1zs znOiN^R#N>~o=7SKN~A>zR@ftBOL+R)CPtpN$XV>Gb8knsX|*80+7cIIXR$9*A-K5dCuiAbxPe*vsmY*o^#`4c74}is64J_i?X8Mr*TzHM)eTyF6A( z(7Bp}&czBxkZcM2aNi}!wIF950Xd7K3Et)Aw(-)r#Y3bz4U@{+SueUP*2 zf}F*X7taj5FYcvtspMl%9Roq)mK;#6DE zxxzu`Vui;YTf)1w)%vOYAZNvZoW&6fuLkxRZb_>+wHS1++Msi>!ci()!Wb+ZFFoX} zl^|zvMBis?TCmdkmis zU!PTqmnA^w8Us2PD{Pl7dC6JQL(W@D%!g%xLKyiADq(YaXRIf^YISJ=LI zwXt|U=WdX*xJJ3AxsM4kYHy563p&?E(79OQzQmTWFA8GeS&*|@f}F*(0nZY=ihAi> z%0uUB2Raukyu-ql@GaTzk*fQNU8(0m&SFpI^QaQ$c#ER6Dt8If9bj#>?b}|Z1)ZxT z=v=IDoWPc_2awcDE&@4g4#-*TWsLegmlLY)Ggs~G59tgvUvmhgt@+i1BCg@jQ1L*$2@(DzT5ScLs|e^^tZF==7b`p_*b?$=|Ite&9=+sv3UU_rKJJy{GZi<#3$V68 z=TdV(=PCs{7b_emuq7`!OD=r#yW=B}vp61@@qNyKT^^6f0(H8FEZw@Ca{}mGtnj#F zOYo^%cT`s`au&w}w>O2FwJdTLw+%QDAj?hO7N;AabFsp0z?Kl*P4A@o6q@8n1UZZ2 zf#P{X&AJws3K?n5X#v*Oq?kx`srDI1MbNoe;W&XUVXXy`Z9|c~`XG?AcogyIs_-Ct z;GTrI-L0cM&^Jc!0Xi2ei>hTZPgqeATf#eDaqXlza=c?K$XUo8Y*w^l8Dt0!T>C$h za+q}jtgWm4I?8lq&pFzI&c#Z2^~~mID=K13cst=`N7)VJtoa~k@ljlw+uuv)lFdQq zIu1G)E8Na(3GcTTj#dx%oU3~c%zu zC&*bxK+fXbAzlrFF9n+)SX=*g7$EP1&Xpf@E>_sHWJ|u-;2)5)u7jM#9`e@arAVurc(L`#A0;Zp@)p>Zqz;9oPhM;q;2Azu) z_Vn2j-broSRSo;InSKxCERF%$Te8n^pmV9MpmW^XA|EJQH?>)%Jr^7@ZH_HUdltxx(IR>$AIhs*jKf3v%9J_pmVhcor@KYSlAN$t4ZDDN|3V- zf`i487q0-kGT;lhV?AXX(79ZobFsp)AzQ*55Lct+>#-LdZjiIMXK;_<^9ivRS5>86 zF6R%pDpuGoTk?{#q=%e!8RRUE0eMB{xl4HHTyhrZTw6isVuj}@wuC$^XU8BHnU7t= z-YfgN>@(s`*$f%|Ip}P$0Y?*T351GvnX9$2h&p@}^7NanEpis90%ofKYwL7|jGNn9 zC0Jp*Y{@sn?FTu_!{A}N>^ZTIg1YLQshXz*#;=EO5b$33d~69`xI260=AbBf&cSxs zhhrbbcU2JoP*ndV;uI*kv-{Z?G3ROYl{_bHMZotDnB`k z?e>|HJrFN*ge=773$ND?vRGTJ@cG!1?;OuT&hp#`+hs44{cB%|hgJzz_&)527be_O(Ux_cR60Go^16%Ty@YA{Y+W9Ch?JLp4ItMF!Pi)CoqQhk$or|wM zO`U?KpRbj-SAoE9Ux_-_IauL)VoSafzP}@E5evsS9Ff^eu)=+ed!@Yu+vU9sj>7FF zSmE=rrTEY^tMdxCL<4?APtiToG%XsmHCSQql`Z*t$rO;Y9)g_3UO4v{?qj|ZlThLbO0dFF5nIALUU$Of zq6t277RQjR$l)mwHU}*?2++|!~Ix@1}W{Odw)ZHC+J+PaDQb>UUHWF zvPD(B7RXs#qg>P6kMZSXuWqss=v)mz=VFEXD_iol;AF72nt`0f5ev`SJkR?|6hevb zQGykYCfE|5t95O!x_+ zEIJn}98It#@FrpsWS0_~oHIbq;*rWDnA-*!Ht=ouwecaY!=Q7q!fn8o@Rmj9_G${q zSxZ6A;y9B%R-U`?7SiExH3D?5te|tT!gCZ`!k+%o;i`X}?mPx^7WWM9F+3g-P5jea z>7aA%0-cK$9(QaB&$b(PRUUHIPatP;oXK98-RlFLOZ5hwD-?7tRyh7-OTOOji6lI~ zvYjko`dM3kwv&e+<^S!WHrY$C;xFwv%KzKPsDgbNTWqP9gXJ&bQTzlb{_Q`<2-(#t z;Xlfw_)GI|-#K>vKX_h2xThr++spskcMdMW3ZKvaJ8&N=`rR>awse09kHUBB{~fpw z6>gPa#b4TUl>fK?93N`ff4Beh9RKeUtnjt7CBJ>of9*Uke`(KE@zvT(u;RDtDd9h# z@6H{rtFD!xa|MIW#a~YTz9X#(E|r(gg&5Wh4)DC{sbj7#Ab^zy0gRPz?>|!atxSb% z3Ge&lJZVe=ohuG>F3wWWu1{q%n`O7@tqP`}28Ji@doLQrKmgkS0vIct=a4Od!WLUb z{s20c8+5KGN%=kbB)mMY;-~ZDK74epQzLVjA9!AA{RS-T*zFnwg-4#oiFTiP5d#zF#rTGRyZdlTf$TQ{r?(u zrd@QV1D%Vr+%*3r)b!K2ULM1{IMzKOkMPc56$=8`84$o&DPN|LCvTXy7T6N9i&fce z)CHX@40JBeL57_DuYB zPnNXGW;x{BIeDjw=RUl2u4c!pntu8evQ3BVGg^QEb{zyTRyZ38Tf&}9`yAWmfX?M% zJ8_M2O>-Z^TgAB#RnK)Y!nGSESmD0JmW0@|?2_y6=ob13(78CDNXH^+1NBojGF_nF zkaZ~6pRU9<;+pqFFf^XJ}$ezFAaR zbS|z@u4(Saz7lIJ0vIdYU)d7&;l6op%mSUO9_U=0^J?YdGME#6^}}Nx?^qVhtO|nw zRty9%R(Nc)C5#Vbw4Mh#*LmDIXZ}LQW^>M;={9-lhsQjKI;VCUUx5Ht6a+9bZDf&f++1Ta=Oj~81KqEApewfn+a z=PJ;-IOkRMtyN5a?gV=;dD5YyS_lGITM)ol;e0!63F~0O#jSHKIv3}u;aQDmJA4h; z_u7^|C@~Q^Qdr>}Icy2fwo8Y}OuzZ)T$~w=Gp2EF8ANxx!(_yvrur}tz*ylNGHeNX zit;+tanQM5fX>Akb9hAYJz;f@XrQ`+05%r{Fjn~5*%IFOxfd>1fX-DJbS}=MvGe>B z<b_Sj6CFoq- zGq}gtSA#z%)s)*n0P70^7%QA_i7k2f&SCNZ=v)gy=i*F5ypr(>Cq&4lHu4t`z$$?N z#tP?tWJ~zw=Wdv613FhQ=vFWJ?(5)7r``Cm!oL zLFeLZHk^6d*2lzzz2Wj02w)dL0Aq#w5?jLa!EWK|{r3x;$3W-e40!B?^SpxbvACUD z4+2=m0~sYNJb$nyARh|b0YL^v`Mc9%MX0%z=Pv-)yz~ei6 zd0y=Gv+s+ykXntYn$Nm(R{nLqf>-P-&6b2v_li_AEM5_}ARoo0eQmzaD!~f3Ia~6T z*lUrq_}V$fVecI8szsZdOsfPdd{1o2cMjbu!EyiYO&RdbsE^^*=|S1RZ_IG*>TTMJ z5_payS>afnEg^&1NAcbk^pxOs=A*bYe9>u{1AUhjZhy9fUXo{gRku~UeC-@ruz&5l zb3b2=6}~67B*do4a$tZ+YOOZKbcYv&yVj-%}*SmAqOOCL&j>Wb}hq{p%0hZ3H; zVujDgmf&AKKjr!ebgrhLbMe~8J={LS^(?pF)d>W!YaoEJ!fPU10@M5cA=ePlxekKP z#hwh;F4sEz#C*qHBR~Kf2m%-@>}9Ye#0E_d7!^Cuar6S6i+6{3rsfeW#Fr&b8V5iC zD+&S_E4;tQmO$-UeZmL>ovSD4TpR;(zq0p|rP~e~uR#F&8U!#_*aKioc+WE9W#c~R zT#G^HVtsvVLym1A?9>FbzKIXt1IYS?1l4;!}FsM+0&eN z)5#BM4xu@R(prLTo*^+tmqlu0^18ajS7_ zvgd@@06VDP+fQ(78BbVNZ|8Jm!+5-Nw{UGUziw0Aq#6Hd_KcqSIMdnl}yg@}P6^ fNaYdCE1VEBZk%^Lc{4&U0|J;$p{&_#Nr?XgRNkQ} literal 55184 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 diff --git a/src/main/resources/meshes/boatSTLs/catamaran_mast.stl b/src/main/resources/meshes/boatSTLs/catamaran_mast.stl index 79bc742b54e04e8e979c0397b2d67e4a67094299..536184da9faa85d6a8d967c5977910f7478de576 100644 GIT binary patch literal 2284 zcmb7EJ!_Lu7`;mU0WM}M85LAS2o)r~)Q_%i(J53(iijGCk-DfaHVzg+oOE(?ue&NuiKIgsn+PGZ zcK6uH<5Q=qhi~7xQay3R{nzKHMQ_b6_z#QycMv|V4C|XS_k8p8?lkesji)o08f*2d za~%&H6d$8P8DdofJGV1Y^ScwZ93C1)jJ*9yvwmo*9X+;1p$swdQXM=#E%v9kXBP?& zjUtA}i-Q+df84(uJvKz43^DRj9Xy8C^-lEAC}McLsx$|w56p>GDMO6BR0oe=HmARF zRvJYNk5*%CkoIA-$~j$Sh>@4-;9)z@KgSJf6fr!WSB3-J0&ubOoI6*B7P=*+JsSX~$t#kW&cxV(cJeF-A7hf+$kDsRa6BWu3BQMp# zW7Fn@Hv$ihA}&1Ew^pw`d=fqE60!535N0`I-K6#N1rl!Cju z3AiarP|VYfOFx0)!m0(uzX;+c&UtfB-g$j13xxwSzd3hi?tPiRb$z*aqq|hS+*`g{ zJ$NkJbR=$SDjwDd8vBrVEC`U8O#2?&=VmlHVp;j8&JSvU!Z>3=>1kIvG-CAq?`I*{-=<(f%KatP~HR_Uf zkB|Me(dUKL%tN!N;c@%^x7iE#HloKTBdnK<&BOe25#=ENXZhYE89q7ofA9ciu!o zBh;u%I`&~6cCSX*xn@zbkCk&n@vwPi1Zputjk=`WGs$Eo zi0B5n^D?0k5PTE7?N0Da=tCp=YWdE~ghq5e+F$Mf4~=NIdfFnP5j~-L7YX%Hx=3u> zP2aoE-v=-eQ??WThO8dRSuYr9TvRA9~p+=U{{`+BHpN!B5HBLpk zw2zcosLL#RVE=xq=Ai!ACzfOcBb*PixPK?|`6j7GxDRCUj+F_Ga33V{Z^@oPy}?uQ zh9ir&1e$N9?4c2E5Lr4At3Lnw1U)nY%_(SqAkI!^r4j8(PwUm`p%FcydKZb^9-L2+ F_y>8sayI|~ diff --git a/src/main/resources/meshes/boatSTLs/catamaran_sail.stl b/src/main/resources/meshes/boatSTLs/catamaran_sail.stl index a2723d980b7b68c4ed654f7d5c4f57f253606439..273b1d5bfe5c205cee453cf2cc1a2ee69467e05c 100644 GIT binary patch literal 1484 zcmb7EJxE(o7=6wz9eiR%Oh!92lms!f#H*GF5etFR7}SD)>0&kds^SuQCnq5p9J>@+ z7l%i9QYaE`%%X)31qX5Hs@4vcDuPAO`@PE-&nqszC5N2veCPXnFS$IIcNTI};Wtix zCfxTnH#?Pc9!Dcx@o>kx#fk8fN7lWbwtBP_1Y1IO<#VPWuD7c|##PF<*OFWe+J1<0CQmSDTAWua5fo;zRYp#(od0 z$&WHyR(@|<4a9f4F$&cu?REt{EX&b~r&@u`u8v|4%tQ`SU1Wy6zvHtmMxh$#W)#0q zhde^aFsAunCW_-nDoiKnDFV6Dg#4mCOci7k5C{hki!U8J&#%IBtj_ zgL!#|xWV8%NDOw%irZ_a%E%2F#;8UQQyp%N6|_P2#qdw95b2NXn9nf zZ8ZpdC-5@vR-9`EGU$PsjK}|-)4g(qh_R30bcw;v8P~r)YURsIua+*lm=`O-3jG@~ literal 1484 zcmb7DJuE{}7`>#cL5PK+lMqqOBhg5>t^b5d2ZIQUv=%?52m^6rZ6YEziJuT*DVlB~ zZxAG6Gc*RNc94kGhH$_4`qe2hcuT+Zob#RU?{+Lqg(I_}pmQ`5o^ZB~hbDueNUh;& z^f;?#=0=?EYVohHBF9!Hg@H?dbIDE2Os7kI99OnSeeO&DIsH$uE&2RhwiJkPoB}mv zB84*BKX&63A&Xi5F)GMZU$SUN0*sc4zlNF|+AcnTUimi`AIPX0Dg)S^L2Gu$pS;*wJ&Pr_1~9 z-N~FFVrY-G-yk8_ zEi1mSop*u=$EZdRt2&8WV+Cz6ke#l*bK=^cl8E$a7VjK0+1&cmA^Cb%An{G$W&Eu` z1U)d5?eVj7x>v3cW9%b;x`bfo9Dl!B{XUG;yQ2>CVkKB1Ri$J@#f^3Ch_D)`YkPbF Di()J} diff --git a/src/main/resources/meshes/boatSTLs/dinghy_hull.stl b/src/main/resources/meshes/boatSTLs/dinghy_hull.stl index 56a443a731a5c5d984fdd3df416d2289b3061e50..9450b75faebce2cfcd42269983ae30f2dc015e00 100644 GIT binary patch literal 14284 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 literal 14284 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 F`~^~AE~5Yd literal 2284 zcmb7FziU%b7`=tp!9hAo7YRsXE47s9GeWQzg%(^CT%D9AQ?-&Rbr2e;j&3eRaH~te zrJxZpPe=a)H>p-dEEL4SL5TOf@1DH#3=VcW^nB+#->>_!c=y(7`*w4=(rT~Xs9acS z-dt|BPuAw@XDicdcdl3FXWW1N&4%cYoA>+sOY0egZ(cp~#~YLVYumG)_}=b=^M|Lm z{fnKX4_sC#L#%3G=MIgh*@q;}Jv53Kc`r^q@zuuGYx6h=(Z8ZX8Diw6+C0989zKU& z(1%75Bk$EmkA3Gvt7aamP=*+JsV+RiycXc0QN-+HuCaBl@Sp;@$Pgnh)zKq#{X0p+ z)T|FESP9kW{N+xvU>-@B?ru~lL#%4^h&#_cG>RB`vHzLIWb{ylGQ`MBwRyY?b2?aB z&pkAX7#?evd(sEy6fQAWC_{|ARGY`xc#;{976W8G?x3S}@KD(Ghli#88sSPAY)s;4^ezwqY7pC?x-lfKH3KqWONGJUlEV#Dx*DVwPl4eTA_NE73%S~n$ayYw DG{7WS diff --git a/src/main/resources/meshes/boatSTLs/dinghy_sail.stl b/src/main/resources/meshes/boatSTLs/dinghy_sail.stl index 12f4b334f02ac125751455011a26506b5572ca9c..f10f0c78b44cd8a21cfd023801ed7bc929444dce 100644 GIT binary patch literal 1484 zcmb7^ze`(D6vv;7*g+9uveY4qU=Y)i0EFTQ3-@rn|q-c6laM>-Er%Yj9(b%aeY0eu2#db_4Ld$j-1%6s)h00smj9^ zq2Y(ho|pMKXgcFRnmLQJRnB6X=jMpq zWF&y%h-l1*D!51xHiTuvBO20a*pYK0^E?J0#?LL;hSq06NTsJ%O;aex?dxhTbbY+g0DuU3FuH^{N zhvxon<9_0=B{;$!T&d6zl=P1KDjl-sbKIUTB0{rvUmrUoWB(t)qc6o-uFIWp Vhv-F{^50eY+s+Z8;UU_2{0Fs~HD>?- literal 1484 zcmb7^%PT~26vxjb8cQ2lkl82}#CTnK{E(qU{sDQ;*m#UCYBq99HYmwTHda=WiG{po zN@Ar@tYo9Hx1enJo!`A@<~w%o;&$qs&-Xm<4aH`o_IxB9n6RVMfzGMOOgLg!2CEva zK>6IlSfILs{`C}_Xh#V&bbO%tuKQa@nr_?0UO#W{V7uP4XvQ6B6A=OeUK$T@shD|+W;@9sW| zT3&(@#h!iIR1IDfDiPhK+*xs5G84QjsZjbOI`L-pWY^bVy*M9KBI+r$&CcHz_u8;q z+#1pu;#Cvq!F;Ghv<;Uio#PJp`Y<2SeJXS9=s{gnGMiJS!=vdhiZ4TQ$dw4;Ui;6_ zl46b@^oWf#+a}O^ISRKX1aFgV&gbqt!#D~(O!s;IP)p|Ch#({i69W@ z!5pZ>HD&*=M5_xT0t C4=3sX From 0e829874c236ea6ec52496f9a824738d1c5f5b4a Mon Sep 17 00:00:00 2001 From: Calum Date: Wed, 20 Sep 2017 16:43:04 +1200 Subject: [PATCH 05/20] Fixed BoatMeshType enum names. #fix --- .../seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index dfe3d5e5..f78e7172 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -8,7 +8,7 @@ package seng302.visualiser.fxObjects.assets_3D; public enum BoatMeshType { DINGHY ("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653), - CATAMARAN ("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", 0.997); + CAT_ATE_A_MERINGUE ("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", 0.997); final String hullFile, mastFile, sailFile; final double mastOffset, sailOffset; From fba522d0c343528161d946cf76cba1720b5805f3 Mon Sep 17 00:00:00 2001 From: Calum Date: Wed, 20 Sep 2017 16:44:38 +1200 Subject: [PATCH 06/20] Fixed BoatMeshType enum names. #fix --- .../java/seng302/visualiser/controllers/cells/PlayerCell.java | 2 +- .../java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java index 7af80e04..09976927 100644 --- a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java +++ b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java @@ -37,7 +37,7 @@ public class PlayerCell { // Add Rotating Boat to Player Cell with players color on it. Group group = new Group(); boatPane.getChildren().add(group); - BoatModel bo = ModelFactory.boatIconView(BoatMeshType.CATAMARAN, this.boatColor); + BoatModel bo = ModelFactory.boatIconView(BoatMeshType.CAT_ATE_A_MERINGUE, this.boatColor); group.getChildren().add(bo.getAssets()); } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java index 30820660..30f49692 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java @@ -36,7 +36,7 @@ public class BoatObject extends Group { * Creates a BoatGroup with the default triangular boat polygon. */ public BoatObject() { - boatAssets = ModelFactory.boatGameView(BoatMeshType.CATAMARAN, colour); + boatAssets = ModelFactory.boatGameView(BoatMeshType.CAT_ATE_A_MERINGUE, colour); boatAssets.hideSail(); boatAssets.getAssets().getTransforms().addAll( rotation From 7197bc2bee0034485f50f0ea310fd6d020399ba5 Mon Sep 17 00:00:00 2001 From: Peter Galloway Date: Wed, 20 Sep 2017 17:33:32 +1200 Subject: [PATCH 07/20] created meshes for pirate ship #story[1274] --- .../meshes/boatSTLs/pirateship_frontsail.stl | Bin 0 -> 4484 bytes .../meshes/boatSTLs/pirateship_hull.stl | Bin 0 -> 23684 bytes .../meshes/boatSTLs/pirateship_mainsail.stl | Bin 0 -> 1884 bytes .../meshes/boatSTLs/pirateship_mast.stl | Bin 0 -> 2284 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/meshes/boatSTLs/pirateship_frontsail.stl create mode 100644 src/main/resources/meshes/boatSTLs/pirateship_hull.stl create mode 100644 src/main/resources/meshes/boatSTLs/pirateship_mainsail.stl create mode 100644 src/main/resources/meshes/boatSTLs/pirateship_mast.stl diff --git a/src/main/resources/meshes/boatSTLs/pirateship_frontsail.stl b/src/main/resources/meshes/boatSTLs/pirateship_frontsail.stl new file mode 100644 index 0000000000000000000000000000000000000000..b344e825d6457179e5430342121dc9f6f39cbe51 GIT binary patch literal 4484 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 MxuYJcZA&8hKTHVu!~g&Q literal 0 HcmV?d00001 diff --git a/src/main/resources/meshes/boatSTLs/pirateship_mainsail.stl b/src/main/resources/meshes/boatSTLs/pirateship_mainsail.stl new file mode 100644 index 0000000000000000000000000000000000000000..c421901a447db4532ff5e4911bfb2a4777ca6ee4 GIT binary patch literal 1884 zcmb7_JugI25QdM!FW3qR8zG?}qOnW3OQI#A(ur6VOBRVl;-l3_bfQxF2NK!68kIyZ zQTPuEojC7V&)&KBR8()wJnzh$JLl~3$-#c}sJ>m^Y3}cpmv-xo?Rs-!dUB>x9y>hV zDo>5OfBlVw?28oW?xy;D)wpgi%=auxKW>!Lub=*)FZ+6fR&JgkBBJt9@6tGR+&5oO zlePECLNN>a_NH1xXT*vpY((1DK!>i94(FWBD$>jp6GTMNyLIYzmHIi_#VlxhZW-a{ zXxoUit$}8O&|Rt;@;&=ptwE!8R?>MwSwuuzjZ=goS^!ba#&S=OmT3_YEv z1FgAvMKs~V;ayGoes;ZG`hE*Dp)+FG6RJT(+R|td7tuGT#!Iz7)Ufqpf*QpRwO4Wy z;hdi%@pH7)2@z>q1Dz3mj+T6hNLv~$B7dWpuy_hM#RQRJhd9Lq+aQ80OUDHLDvQ06 z#z};8y60@W&4RY4kP+M{n`LRVi2OGvVtu8VDJF<0i{7Pi>UO1j9^NYmJFTTNg7?b$ zS{mIUbU#M_wxqa;yul)*Gh*;>6N#uROQS{P&x$Qk?>cGuO5+q0M3jZEG)~>F5KIwS!>EfU&lM6tFC6}+eSo#do(u~2&8-0z)t-@EVc*=v^z#jCmT)I_mx zDRt&zEjKQjf`@AA@gGAj>P-;YD6;<>QG}{(w_0zh{bYc1Q}XI%|6oacgGA6E0Mrj zbf~c|Y0qd|*S`ja?3}$15ZnoAbbe!GU(8TK9craLW8J!59-Z3E&?;*5aew~z;G>88 zW5$}_`6i(bHP$8V8E>p>JK-Jz4hdwOua8x4cKUd2L^~4dP%G^j)_Im^rB&3(Xyj(A zr#kncggVq%m$YZJY)88)e&G1GY; zHdonCkx+*k>yq{i%#;6=dfpmtjc;4uJgf1ylvO8hx3)cg4VZ@=hA=lh{Dc|ma3}ru z@pAgv90{HYs(1&`Ix${LLLE*Y2)-`p5SFHgPmoZD?~X+G>vOx&daMK;Jq7JAgnNzF zaT4liPr6$W6P?c0(H%lF+gJZr##XvZ{IvJ+J$^;GD@+45I@j9_Va}=(%p6w T?8}g-qdU~>UP3c^Y3<`LVyx}y literal 0 HcmV?d00001 From ea0be5e9529521db4ae78b4d506952bb22cacdbb Mon Sep 17 00:00:00 2001 From: Peter Galloway Date: Wed, 20 Sep 2017 17:56:07 +1200 Subject: [PATCH 08/20] Added pirate ship meshes to application. Updated boat model to allow for jib sails and a fixed sail. #story[1274] --- .../controllers/cells/PlayerCell.java | 2 +- .../fxObjects/assets_3D/BoatMeshType.java | 17 ++++++++++++----- .../fxObjects/assets_3D/BoatModel.java | 14 ++++++++------ .../fxObjects/assets_3D/BoatObject.java | 2 +- .../fxObjects/assets_3D/ModelFactory.java | 11 ++++++++++- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java index 09976927..a8051f44 100644 --- a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java +++ b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java @@ -37,7 +37,7 @@ public class PlayerCell { // Add Rotating Boat to Player Cell with players color on it. Group group = new Group(); boatPane.getChildren().add(group); - BoatModel bo = ModelFactory.boatIconView(BoatMeshType.CAT_ATE_A_MERINGUE, this.boatColor); + BoatModel bo = ModelFactory.boatIconView(BoatMeshType.PIRATE_SHIP, this.boatColor); group.getChildren().add(bo.getAssets()); } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index f78e7172..290916a5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -2,22 +2,29 @@ package seng302.visualiser.fxObjects.assets_3D; /** * Enum for boat meshes. Enum values should be of the form : - * ENUM_VALUE (hull file, mast file, Y offset of mast CoR from origin, sail file, Y offset of sail CoR from origin) + * ENUM_VALUE (hull file, mast file, Y offset of mast CoR from origin, sail file, Y offset of sail CoR from origin, jib file, fixed sail) * Files must be valid .stl files. */ public enum BoatMeshType { - DINGHY ("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653), - CAT_ATE_A_MERINGUE ("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", 0.997); + DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false), + CAT_ATE_A_MERINGUE("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", + 0.997, null, false), + PIRATE_SHIP("pirateship_hull.stl", "pirateship_mast.stl", -0.5415, "pirateship_mainsail.stl", + -0.5415, "pirateship_frontsail.stl", true); - final String hullFile, mastFile, sailFile; + final String hullFile, mastFile, sailFile, jibFile; final double mastOffset, sailOffset; + final boolean fixedSail; - BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile, double sailOffset) { + BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile, + double sailOffset, String jibFile, boolean fixedSail) { this.hullFile = hullFile; this.mastFile = mastFile; this.mastOffset = mastOffset; this.sailFile = sailFile; this.sailOffset = sailOffset; + this.jibFile = jibFile; + this.fixedSail = fixedSail; } } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java index 78d2c837..0562d4f7 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java @@ -34,14 +34,16 @@ public class BoatModel extends Model { * @param degrees The rotation of the sail in degrees */ public void rotateSail(double degrees) { - MeshView mast = getMeshViewChild(MAST_INDEX); - MeshView sail = getMeshViewChild(SAIL_INDEX); - mast.getTransforms().setAll( + if (!meshType.fixedSail) { + MeshView mast = getMeshViewChild(MAST_INDEX); + MeshView sail = getMeshViewChild(SAIL_INDEX); + mast.getTransforms().setAll( new Rotate(degrees, 0, -meshType.mastOffset, 0, new Point3D(0, 0, 1)) - ); - sail.getTransforms().setAll( + ); + sail.getTransforms().setAll( new Rotate(degrees, 0, -meshType.sailOffset,0, new Point3D(0, 0, 1)) - ); + ); + } } public void hideSail() { diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java index 30f49692..596a1401 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java @@ -36,7 +36,7 @@ public class BoatObject extends Group { * Creates a BoatGroup with the default triangular boat polygon. */ public BoatObject() { - boatAssets = ModelFactory.boatGameView(BoatMeshType.CAT_ATE_A_MERINGUE, colour); + boatAssets = ModelFactory.boatGameView(BoatMeshType.PIRATE_SHIP, colour); boatAssets.hideSail(); boatAssets.getAssets().getTransforms().addAll( rotation 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 86c7f7f0..f0b0f70f 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java @@ -84,6 +84,7 @@ public class ModelFactory { } private static Group getUnmodifiedBoatModel(BoatMeshType boatType, Color primaryColour) { + Group boatAssets = new Group(); MeshView hull = importSTL(boatType.hullFile); hull.setMaterial(new PhongMaterial(primaryColour)); @@ -91,7 +92,15 @@ public class ModelFactory { mast.setMaterial(new PhongMaterial(primaryColour)); MeshView sail = importSTL(boatType.sailFile); sail.setMaterial(new PhongMaterial(Color.WHITE)); - boatAssets.getChildren().addAll(hull, mast, sail); + + if (boatType.jibFile != null) { + MeshView jib = importSTL(boatType.jibFile); + sail.setMaterial(new PhongMaterial(Color.WHITE)); + boatAssets.getChildren().addAll(hull, mast, sail, jib); + } else { + boatAssets.getChildren().addAll(hull, mast, sail); + } + return boatAssets; } From 307e79ecfc149cf0b3396c06bda29957e541ade0 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Wed, 20 Sep 2017 20:46:23 +1200 Subject: [PATCH 09/20] Completed working boat selection screen. When a user selects a different boat, it is sent to all other clients and updates accordingly. Boats are all shown with their correct models in game. #story[1274] --- src/main/java/seng302/model/ServerYacht.java | 4 ++ .../java/seng302/utilities/XMLParser.java | 4 +- .../java/seng302/visualiser/GameView3D.java | 3 +- .../controllers/LobbyController.java | 5 ++- .../visualiser/controllers/ViewManager.java | 2 + .../controllers/cells/PlayerCell.java | 6 ++- .../dialogs/BoatCustomizeController.java | 21 ++++++++-- .../fxObjects/assets_3D/BoatMeshType.java | 38 +++++++++++++++++++ .../fxObjects/assets_3D/BoatObject.java | 6 +-- .../fxObjects/assets_3D/ModelFactory.java | 5 ++- .../server_config/xml_templates/boats.ftlh | 2 +- .../seng302/utilities/BoatMeshTypeTest.java | 35 +++++++++++++++++ 12 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 src/test/java/seng302/utilities/BoatMeshTypeTest.java diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index da5aa37b..80566afd 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -424,4 +424,8 @@ public class ServerYacht { public void setBoatType(String boatType) { this.boatType = boatType; } + + public String getBoatType() { + return boatType; + } } diff --git a/src/main/java/seng302/utilities/XMLParser.java b/src/main/java/seng302/utilities/XMLParser.java index a903daaf..7a8bbac4 100644 --- a/src/main/java/seng302/utilities/XMLParser.java +++ b/src/main/java/seng302/utilities/XMLParser.java @@ -146,9 +146,7 @@ public class XMLParser { XMLParser.getNodeAttributeString(currentBoat, "BoatName"), XMLParser.getNodeAttributeString(currentBoat, "Country")); yacht.setColour(Color.web(getNodeAttributeString(currentBoat, "Color"))); - if (yacht.getBoatType().equals("Yacht")) { - competingBoats.put(yacht.getSourceId(), yacht); - } + competingBoats.put(yacht.getSourceId(), yacht); } } return competingBoats; diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index c5b52286..8cc6bb9b 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -30,6 +30,7 @@ import seng302.model.token.Token; import seng302.utilities.GeoUtility; import seng302.utilities.Sounds; import seng302.visualiser.fxObjects.MarkArrowFactory; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; import seng302.visualiser.fxObjects.assets_3D.BoatObject; import seng302.visualiser.fxObjects.assets_3D.Marker3D; import seng302.visualiser.fxObjects.assets_3D.ModelFactory; @@ -459,7 +460,7 @@ public class GameView3D { final List wakes = new ArrayList<>(); for (ClientYacht clientYacht : yachts) { Color colour = clientYacht.getColour(); - newBoat = new BoatObject(); + newBoat = new BoatObject(BoatMeshType.getBoatMeshType(clientYacht.getBoatType())); newBoat.setFill(colour); boatObjects.put(clientYacht, newBoat); wakesGroup.getChildren().add(newBoat.getWake()); diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index a292fc8a..03af2d3a 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -130,7 +130,8 @@ public class LobbyController implements Initializable { controller.setPlayerName(this.playerBoats .get(ViewManager.getInstance().getGameClient().getServerThread().getClientId()) .getBoatName()); - controller.setCurrentBoat(BoatMeshType.DINGHY); + controller.setCurrentBoat(this.playerBoats.get(ViewManager.getInstance().getGameClient().getServerThread().getClientId()) + .getBoatType()); return customizationDialog; } @@ -204,7 +205,7 @@ public class LobbyController implements Initializable { FXMLLoader loader = new FXMLLoader( getClass().getResource("/views/cells/PlayerCell.fxml")); - loader.setController(new PlayerCell(playerId, yacht.getBoatName(), yacht.getColour())); + loader.setController(new PlayerCell(playerId, yacht.getBoatName(), yacht.getColour(), yacht.getBoatType())); try { pane = loader.load(); diff --git a/src/main/java/seng302/visualiser/controllers/ViewManager.java b/src/main/java/seng302/visualiser/controllers/ViewManager.java index 165d0c39..8e966813 100644 --- a/src/main/java/seng302/visualiser/controllers/ViewManager.java +++ b/src/main/java/seng302/visualiser/controllers/ViewManager.java @@ -278,6 +278,8 @@ public class ViewManager { stage.setMinHeight(500); stage.setMinWidth(800); + stage.setTitle("Party Parrots At Sea"); + stage.getIcons().add(new Image(getClass().getResourceAsStream("/PP.png"))); stage.setOnCloseRequest(e -> closeAll()); stage.setScene(scene); stage.show(); diff --git a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java index a8051f44..3f434a7f 100644 --- a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java +++ b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java @@ -24,11 +24,13 @@ public class PlayerCell { private String name; private Color boatColor; private Integer playerId; + private BoatMeshType boatype; - public PlayerCell(Integer playerId, String playerName, Color color) { + public PlayerCell(Integer playerId, String playerName, Color color, String boatType) { this.playerId = playerId; this.name = playerName; this.boatColor = color; + this.boatype = BoatMeshType.getBoatMeshType(boatType); } public void initialize() { @@ -37,7 +39,7 @@ public class PlayerCell { // Add Rotating Boat to Player Cell with players color on it. Group group = new Group(); boatPane.getChildren().add(group); - BoatModel bo = ModelFactory.boatIconView(BoatMeshType.PIRATE_SHIP, this.boatColor); + BoatModel bo = ModelFactory.boatIconView(this.boatype, this.boatColor); group.getChildren().add(bo.getAssets()); } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 5690dc35..a418fe41 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -11,6 +11,7 @@ import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.geometry.Insets; import javafx.scene.Group; +import javafx.scene.PointLight; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.CornerRadii; @@ -111,21 +112,35 @@ public class BoatCustomizeController implements Initializable{ this.lobbyController = lobbyController; } - public void setCurrentBoat(BoatMeshType boatType) { + public void setCurrentBoat(String boatType) { Group group = new Group(); - this.currentBoat = boatType; + this.currentBoat = BoatMeshType.getBoatMeshType(boatType); System.out.println(boatType.toString()); boatPane.setBackground(new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY))); boatPane.getChildren().add(group); - BoatModel bo = ModelFactory.boatCustomiseView(boatType, colorPicker.getValue()); + BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); + group.getChildren().add(new PointLight()); } public void nextBoat(ActionEvent actionEvent) { boatPane.getChildren().clear(); + Group group = new Group(); + boatPane.getChildren().add(group); + currentBoat = BoatMeshType.getNextBoatType(currentBoat); + BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); + group.getChildren().add(bo.getAssets()); + group.getChildren().add(new PointLight()); } public void prevBoat(ActionEvent actionEvent) { + boatPane.getChildren().clear(); + Group group = new Group(); + boatPane.getChildren().add(group); + currentBoat = BoatMeshType.getPrevBoatType(currentBoat); + BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); + group.getChildren().add(bo.getAssets()); + group.getChildren().add(new PointLight()); } private void RefreshBoat() { diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 290916a5..947a63f5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -16,6 +16,7 @@ public enum BoatMeshType { final String hullFile, mastFile, sailFile, jibFile; final double mastOffset, sailOffset; final boolean fixedSail; + final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CAT_ATE_A_MERINGUE, PIRATE_SHIP}; BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile, double sailOffset, String jibFile, boolean fixedSail) { @@ -27,4 +28,41 @@ public enum BoatMeshType { this.jibFile = jibFile; this.fixedSail = fixedSail; } + + public static BoatMeshType getBoatMeshType(String boatType) { + switch (boatType){ + case "DINGHY": + return DINGHY; + case "CAT_ATE_A_MERINGUE": + return CAT_ATE_A_MERINGUE; + case "PIRATE_SHIP": + return PIRATE_SHIP; + default: + return DINGHY; + } + } + + + //TODO kre39 make something not terrible to cycle through boat types + public static BoatMeshType getNextBoatType(BoatMeshType boatType) { + for (int i = 0; i < boatTypes.length; i++) { + if (i == boatTypes.length -1) { + return boatTypes[0]; + } else if (boatType == boatTypes[i]) { + return boatTypes[i+1]; + } + } + return boatType; + } + + public static BoatMeshType getPrevBoatType(BoatMeshType boatType) { + for (int i = 0; i < boatTypes.length; i++) { + if (i == 0 && boatType == boatTypes[i]) { + return boatTypes[boatTypes.length -1]; + } else if (boatType == boatTypes[i]) { + return boatTypes[i-1]; + } + } + return boatType; + } } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java index 596a1401..abf969a8 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatObject.java @@ -11,7 +11,7 @@ import javafx.scene.transform.Rotate; /** * BoatGroup is a javafx group that by default contains a graphical objects for representing a 2 * dimensional boat. It contains a single polygon for the boat, a group of lines to show it's path, - * a wake object and two text labels to annotate the boat teams name and the boats velocity. The + * a wake object and two text labels to annotate the boat teams name and the boatTypes velocity. The * boat will update it's position onscreen everytime UpdatePosition is called unless the window is * minimized in which case it attempts to store animations and apply them when the window is * maximised. @@ -35,8 +35,8 @@ public class BoatObject extends Group { /** * Creates a BoatGroup with the default triangular boat polygon. */ - public BoatObject() { - boatAssets = ModelFactory.boatGameView(BoatMeshType.PIRATE_SHIP, colour); + public BoatObject(BoatMeshType boatMeshType) { + boatAssets = ModelFactory.boatGameView(boatMeshType, colour); boatAssets.hideSail(); boatAssets.getAssets().getTransforms().addAll( rotation 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 502fa3c4..91f832ad 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/ModelFactory.java @@ -7,6 +7,7 @@ import javafx.geometry.Point3D; import javafx.scene.AmbientLight; import javafx.scene.CacheHint; import javafx.scene.Group; +import javafx.scene.PointLight; import javafx.scene.paint.Color; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.Circle; @@ -18,7 +19,7 @@ import javafx.scene.transform.Translate; /** - * Factory class for creating 3D models of boats. + * Factory class for creating 3D models of boatTypes. */ public class ModelFactory { @@ -57,7 +58,7 @@ public class ModelFactory { boatAssets.getTransforms().addAll( new Scale(8.0, 8.0, 8.0), new Rotate(-70, new Point3D(1,0,0)), - new Translate(16,50, 0), + new Translate(16,50, 1), animationRotate ); diff --git a/src/main/resources/server_config/xml_templates/boats.ftlh b/src/main/resources/server_config/xml_templates/boats.ftlh index 8186e000..26fae383 100644 --- a/src/main/resources/server_config/xml_templates/boats.ftlh +++ b/src/main/resources/server_config/xml_templates/boats.ftlh @@ -12,7 +12,7 @@ <#list boats as boat> - diff --git a/src/test/java/seng302/utilities/BoatMeshTypeTest.java b/src/test/java/seng302/utilities/BoatMeshTypeTest.java new file mode 100644 index 00000000..baca1b14 --- /dev/null +++ b/src/test/java/seng302/utilities/BoatMeshTypeTest.java @@ -0,0 +1,35 @@ +package seng302.utilities; + +import org.junit.Assert; +import org.junit.Test; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; + +/** + * Basic tests for the next and previous methods + * Created by kre39 on 20/09/17. + */ +public class BoatMeshTypeTest { + + + @Test + public void testNextBoatMeshType() { + BoatMeshType currentBoat = BoatMeshType.DINGHY; + BoatMeshType nextBoat = BoatMeshType.getNextBoatType(currentBoat); + Assert.assertEquals(BoatMeshType.CAT_ATE_A_MERINGUE, nextBoat); + } + + @Test + public void testPreviousBoatMeshType() { + BoatMeshType currentBoat = BoatMeshType.CAT_ATE_A_MERINGUE; + BoatMeshType prevBoat = BoatMeshType.getPrevBoatType(currentBoat); + Assert.assertEquals(BoatMeshType.DINGHY, prevBoat); + } + + @Test + public void testGetBoatMeshType() { + BoatMeshType currentBoat = BoatMeshType.getBoatMeshType("DINGHY"); + Assert.assertEquals(BoatMeshType.DINGHY, currentBoat); + BoatMeshType wrongBoat = BoatMeshType.getBoatMeshType("NOT A REAL BOAT"); + Assert.assertEquals(BoatMeshType.DINGHY, wrongBoat); + } +} From c4a6113f6cb74bd00d3fc167d9c24c3269a3cead Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Wed, 20 Sep 2017 21:07:49 +1200 Subject: [PATCH 10/20] Minor bug fixes (like all enemy sails being toggled in when they should be out) #story[1274] --- src/main/java/seng302/model/ClientYacht.java | 2 +- src/main/java/seng302/visualiser/GameView3D.java | 1 + .../visualiser/controllers/dialogs/BoatCustomizeController.java | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index 89715852..1ebaa3fc 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -46,7 +46,7 @@ public class ClientYacht extends Observable { private Integer position; private Long estimateTimeAtFinish; - private Boolean sailIn = false; + private Boolean sailIn = true; private Integer currentMarkSeqID = 0; private Long markRoundTime; private Long timeTillNext; diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 8cc6bb9b..73815023 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -569,6 +569,7 @@ public class GameView3D { } public void setBoatAsPlayer (ClientYacht playerYacht) { + playerYacht.toggleSail(); playerBoatAnimationTimer = new AnimationTimer() { double count = 60; diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index a418fe41..55f0b7e6 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -115,7 +115,6 @@ public class BoatCustomizeController implements Initializable{ public void setCurrentBoat(String boatType) { Group group = new Group(); this.currentBoat = BoatMeshType.getBoatMeshType(boatType); - System.out.println(boatType.toString()); boatPane.setBackground(new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY))); boatPane.getChildren().add(group); BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); From faeece27ff508bac94aa5ac39a1fc8154672c512 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Fri, 22 Sep 2017 13:52:35 +1200 Subject: [PATCH 11/20] Started working on individual boat stats. Already modified turning rate. Need to add a vsual component. #story[1274] --- .../java/seng302/gameServer/GameState.java | 1 + src/main/java/seng302/model/ServerYacht.java | 45 ++++++++++--------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 41c619b7..4a93f0d5 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -453,6 +453,7 @@ public class GameState implements Runnable { if (yacht.getPowerUp() != null) { if (yacht.getPowerUp().equals(TokenType.BOOST)) { // TODO: 11/09/17 wmu16 CHANGE THIS TO MAGIC NUMBER + // TODO 22/09/17 kre39 change this magic number to a variable maxBoatSpeed *= 2; } } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 80566afd..f9e028d4 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -8,10 +8,9 @@ import seng302.gameServer.messages.BoatStatus; import seng302.model.mark.Mark; import seng302.model.token.TokenType; import seng302.utilities.GeoUtility; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; import java.util.HashMap; -import java.util.Observable; -import java.util.Observer; /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) @@ -22,10 +21,9 @@ public class ServerYacht { private Logger logger = LoggerFactory.getLogger(ClientYacht.class); - public static final Double TURN_STEP = 5.0; - //Boat info private String boatType; + private Double turn_step; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; @@ -59,7 +57,7 @@ public class ServerYacht { public ServerYacht(String boatType, Integer sourceId, String hullID, String shortName, String boatName, String country) { - this.boatType = boatType; + setBoatType(boatType); this.boatStatus = BoatStatus.PRESTART; this.sourceId = sourceId; this.hullID = hullID; @@ -174,7 +172,7 @@ public class ServerYacht { if (isAuto) { turnTowardsHeading(autoHeading); if (Math.abs(heading - autoHeading) - <= TURN_STEP) { //Cancel when within 1 turn step of target. + <= turn_step) { //Cancel when within 1 turn step of target. isAuto = false; } } @@ -189,20 +187,20 @@ public class ServerYacht { Double normalizedHeading = normalizeHeading(); if (normalizedHeading == 0) { if (lastHeading < 180) { - adjustHeading(-TURN_STEP); + adjustHeading(-turn_step); } else { - adjustHeading(TURN_STEP); + adjustHeading(turn_step); } } else if (normalizedHeading == 180) { if (lastHeading < 180) { - adjustHeading(TURN_STEP); + adjustHeading(turn_step); } else { - adjustHeading(-TURN_STEP); + adjustHeading(-turn_step); } } else if (normalizedHeading < 180) { - adjustHeading(-TURN_STEP); + adjustHeading(-turn_step); } else { - adjustHeading(TURN_STEP); + adjustHeading(turn_step); } } @@ -211,20 +209,20 @@ public class ServerYacht { Double normalizedHeading = normalizeHeading(); if (normalizedHeading == 0) { if (lastHeading < 180) { - adjustHeading(TURN_STEP); + adjustHeading(turn_step); } else { - adjustHeading(-TURN_STEP); + adjustHeading(-turn_step); } } else if (normalizedHeading == 180) { if (lastHeading < 180) { - adjustHeading(-TURN_STEP); + adjustHeading(-turn_step); } else { - adjustHeading(TURN_STEP); + adjustHeading(turn_step); } } else if (normalizedHeading < 180) { - adjustHeading(TURN_STEP); + adjustHeading(turn_step); } else { - adjustHeading(-TURN_STEP); + adjustHeading(-turn_step); } } @@ -268,9 +266,9 @@ public class ServerYacht { private void turnTowardsHeading(Double newHeading) { Double newVal = heading - newHeading; if (Math.floorMod(newVal.longValue(), 360L) > 180) { - adjustHeading(TURN_STEP / 5); + adjustHeading(turn_step / 5); } else { - adjustHeading(-TURN_STEP / 5); + adjustHeading(-turn_step / 5); } } @@ -422,6 +420,13 @@ public class ServerYacht { } public void setBoatType(String boatType) { + if (boatType == BoatMeshType.DINGHY.toString()) { + turn_step = 5.0; + } else if (boatType == BoatMeshType.CAT_ATE_A_MERINGUE.toString()){ + turn_step = 10.0; + } else { + turn_step = 7.0; + } this.boatType = boatType; } From b05580f018a94b74780e39f4b6e58d31ae4b9d9e Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Fri, 22 Sep 2017 16:45:10 +1200 Subject: [PATCH 12/20] Worked on making a visual component to the stats. Need to implement acceleration. #story[1274] --- .../java/seng302/gameServer/GameState.java | 3 +- src/main/java/seng302/model/ServerYacht.java | 50 +++++++++++-------- .../dialogs/BoatCustomizeController.java | 39 ++++++++++++++- .../fxObjects/assets_3D/BoatMeshType.java | 14 ++++-- .../fxObjects/assets_3D/BoatModel.java | 7 +++ .../views/dialogs/BoatCustomizeDialog.fxml | 27 ++++++++-- 6 files changed, 108 insertions(+), 32 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 4a93f0d5..cb6d4958 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -449,11 +449,10 @@ public class GameState implements Runnable { private void updateVelocity(ServerYacht yacht) { Double trueWindAngle = Math.abs(windDirection - yacht.getHeading()); Double boatSpeedInKnots = PolarTable.getBoatSpeed(getWindSpeedKnots(), trueWindAngle); - Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier; + Double maxBoatSpeed = GeoUtility.knotsToMMS(boatSpeedInKnots) * speedMultiplier * yacht.getMaxSpeedMultiplier(); if (yacht.getPowerUp() != null) { if (yacht.getPowerUp().equals(TokenType.BOOST)) { // TODO: 11/09/17 wmu16 CHANGE THIS TO MAGIC NUMBER - // TODO 22/09/17 kre39 change this magic number to a variable maxBoatSpeed *= 2; } } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index f9e028d4..6c3ca3dd 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -23,7 +23,8 @@ public class ServerYacht { //Boat info private String boatType; - private Double turn_step; + private Double turnStep = 10.0; + private Double maxSpeedMultiplier = 1.0; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; @@ -172,7 +173,7 @@ public class ServerYacht { if (isAuto) { turnTowardsHeading(autoHeading); if (Math.abs(heading - autoHeading) - <= turn_step) { //Cancel when within 1 turn step of target. + <= turnStep) { //Cancel when within 1 turn step of target. isAuto = false; } } @@ -187,20 +188,20 @@ public class ServerYacht { Double normalizedHeading = normalizeHeading(); if (normalizedHeading == 0) { if (lastHeading < 180) { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } else { - adjustHeading(turn_step); + adjustHeading(turnStep); } } else if (normalizedHeading == 180) { if (lastHeading < 180) { - adjustHeading(turn_step); + adjustHeading(turnStep); } else { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } } else if (normalizedHeading < 180) { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } else { - adjustHeading(turn_step); + adjustHeading(turnStep); } } @@ -209,20 +210,20 @@ public class ServerYacht { Double normalizedHeading = normalizeHeading(); if (normalizedHeading == 0) { if (lastHeading < 180) { - adjustHeading(turn_step); + adjustHeading(turnStep); } else { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } } else if (normalizedHeading == 180) { if (lastHeading < 180) { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } else { - adjustHeading(turn_step); + adjustHeading(turnStep); } } else if (normalizedHeading < 180) { - adjustHeading(turn_step); + adjustHeading(turnStep); } else { - adjustHeading(-turn_step); + adjustHeading(-turnStep); } } @@ -266,9 +267,9 @@ public class ServerYacht { private void turnTowardsHeading(Double newHeading) { Double newVal = heading - newHeading; if (Math.floorMod(newVal.longValue(), 360L) > 180) { - adjustHeading(turn_step / 5); + adjustHeading(turnStep / 5); } else { - adjustHeading(-turn_step / 5); + adjustHeading(-turnStep / 5); } } @@ -420,16 +421,21 @@ public class ServerYacht { } public void setBoatType(String boatType) { - if (boatType == BoatMeshType.DINGHY.toString()) { - turn_step = 5.0; - } else if (boatType == BoatMeshType.CAT_ATE_A_MERINGUE.toString()){ - turn_step = 10.0; - } else { - turn_step = 7.0; + BoatMeshType boatMeshType; + for (BoatMeshType boatMesh: BoatMeshType.values()) { + if (boatType == boatMesh.toString()) { + boatMeshType = boatMesh; + turnStep = boatMeshType.turnStep; + maxSpeedMultiplier = boatMeshType.maxSpeedMultiplier; + } } this.boatType = boatType; } + public Double getMaxSpeedMultiplier() { + return maxSpeedMultiplier; + } + public String getBoatType() { return boatType; } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 55f0b7e6..83b1e520 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -12,6 +12,7 @@ import javafx.fxml.Initializable; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.PointLight; +import javafx.scene.control.ProgressBar; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.CornerRadii; @@ -34,6 +35,12 @@ public class BoatCustomizeController implements Initializable{ @FXML private JFXColorPicker colorPicker; @FXML + private ProgressBar speedBar; + @FXML + private ProgressBar accelBar; + @FXML + private ProgressBar handleBar; + @FXML private JFXButton submitBtn; @FXML private JFXTextField boatName; @@ -49,12 +56,15 @@ public class BoatCustomizeController implements Initializable{ private ClientToServerThread socketThread; private LobbyController lobbyController; private BoatMeshType currentBoat; + private static Double maxSpeedMultiplier = 1.0; + private static Double maxTurnRate = 10.0; + private static Double maxAcceleration = 2.0; @Override public void initialize(URL location, ResourceBundle resources) { socketThread = ViewManager.getInstance().getGameClient().getServerThread(); - + generateMaxStats(); RequiredFieldValidator playerNameReqValidator = new RequiredFieldValidator(); playerNameReqValidator.setMessage("Player name required."); @@ -120,6 +130,8 @@ public class BoatCustomizeController implements Initializable{ BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); group.getChildren().add(new PointLight()); + refreshStatBars(bo); + } public void nextBoat(ActionEvent actionEvent) { @@ -130,6 +142,8 @@ public class BoatCustomizeController implements Initializable{ BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); group.getChildren().add(new PointLight()); + refreshStatBars(bo); + } public void prevBoat(ActionEvent actionEvent) { @@ -140,6 +154,8 @@ public class BoatCustomizeController implements Initializable{ BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); group.getChildren().add(new PointLight()); + refreshStatBars(bo); + } private void RefreshBoat() { @@ -148,5 +164,26 @@ public class BoatCustomizeController implements Initializable{ boatPane.getChildren().add(group); BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); + refreshStatBars(bo); + } + + private void generateMaxStats() { + for (BoatMeshType bmt: BoatMeshType.values()) { + if (bmt.turnStep > maxTurnRate) { + maxTurnRate = bmt.turnStep; + } + if (bmt.maxSpeedMultiplier > maxSpeedMultiplier) { + maxSpeedMultiplier = bmt.maxSpeedMultiplier; + } + if (bmt.accelerationMultiplier > maxAcceleration) { + maxAcceleration = bmt.accelerationMultiplier; + } + } + } + + private void refreshStatBars(BoatModel bo) { + speedBar.setProgress((bo.getMeshType().maxSpeedMultiplier) / maxSpeedMultiplier); + accelBar.setProgress(bo.getMeshType().accelerationMultiplier / maxAcceleration); + handleBar.setProgress(bo.getMeshType().turnStep / maxTurnRate); } } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 947a63f5..e7c375e5 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -7,19 +7,22 @@ package seng302.visualiser.fxObjects.assets_3D; */ public enum BoatMeshType { - DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false), + DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.5, 1.0, 5.0), CAT_ATE_A_MERINGUE("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", - 0.997, null, false), + 0.997, null, false, 1.0, 1.0, 10.0), PIRATE_SHIP("pirateship_hull.stl", "pirateship_mast.stl", -0.5415, "pirateship_mainsail.stl", - -0.5415, "pirateship_frontsail.stl", true); + -0.5415, "pirateship_frontsail.stl", true, 1.2, 1.0, 7.0); final String hullFile, mastFile, sailFile, jibFile; final double mastOffset, sailOffset; + public final double maxSpeedMultiplier; + public final double accelerationMultiplier; + public final double turnStep; final boolean fixedSail; final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CAT_ATE_A_MERINGUE, PIRATE_SHIP}; BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile, - double sailOffset, String jibFile, boolean fixedSail) { + double sailOffset, String jibFile, boolean fixedSail, double maxSpeedMultiplier, double accelerationMultiplier, double turnStep) { this.hullFile = hullFile; this.mastFile = mastFile; this.mastOffset = mastOffset; @@ -27,6 +30,9 @@ public enum BoatMeshType { this.sailOffset = sailOffset; this.jibFile = jibFile; this.fixedSail = fixedSail; + this.maxSpeedMultiplier = maxSpeedMultiplier; + this.accelerationMultiplier = accelerationMultiplier; + this.turnStep = turnStep; } public static BoatMeshType getBoatMeshType(String boatType) { diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java index 0562d4f7..960ceacf 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java @@ -18,6 +18,9 @@ public class BoatModel extends Model { private static final int SAIL_INDEX = 2; private BoatMeshType meshType; + private Double maxSpeedMultiplier; + private Double turnStep; + private Double accelerationMultiplier; /** * Stores a model and it's optional animation. @@ -71,4 +74,8 @@ public class BoatModel extends Model { private MeshView getMeshViewChild(int index) { return (MeshView) assets.getChildren().get(index); } + + public BoatMeshType getMeshType() { + return meshType; + } } \ No newline at end of file diff --git a/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml b/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml index 1d355a33..809b96a2 100644 --- a/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml +++ b/src/main/resources/views/dialogs/BoatCustomizeDialog.fxml @@ -1,5 +1,6 @@ + @@ -24,6 +25,7 @@ + @@ -31,12 +33,12 @@ + + + + + + + + + + + + + + + + + + + From 9f64b2380d4236d948aef9952f1e308b51b2fe0e Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Fri, 22 Sep 2017 17:28:42 +1200 Subject: [PATCH 13/20] Implemented acceleration and full loading bars. #story[1274] --- src/main/java/seng302/gameServer/GameState.java | 10 +++++----- src/main/java/seng302/model/ServerYacht.java | 9 ++++++++- .../controllers/dialogs/BoatCustomizeController.java | 6 +++--- .../visualiser/fxObjects/assets_3D/BoatMeshType.java | 6 +++--- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index cb6d4958..5818eb66 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -461,17 +461,17 @@ public class GameState implements Runnable { // TODO: 15/08/17 remove magic numbers from these equations. if (yacht.getSailIn()) { if (currentVelocity < maxBoatSpeed - 500) { - yacht.changeVelocity(maxBoatSpeed / 100); + yacht.changeVelocity((maxBoatSpeed / 100) * yacht.getAcceleration()); } else if (currentVelocity > maxBoatSpeed + 500) { - yacht.changeVelocity(-currentVelocity / 200); + yacht.changeVelocity((-currentVelocity / 200) * yacht.getAcceleration()); } else { - yacht.setCurrentVelocity(maxBoatSpeed); + yacht.setCurrentVelocity((maxBoatSpeed) * yacht.getAcceleration()); } } else { if (currentVelocity > 3000) { - yacht.changeVelocity(-currentVelocity / 200); + yacht.changeVelocity((-currentVelocity / 200) * yacht.getAcceleration()); } else if (currentVelocity > 100) { - yacht.changeVelocity(-currentVelocity / 50); + yacht.changeVelocity((-currentVelocity / 50) * yacht.getAcceleration()); } else if (currentVelocity <= 100) { yacht.setCurrentVelocity(0d); } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 6c3ca3dd..29f7eecc 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -11,6 +11,7 @@ import seng302.utilities.GeoUtility; import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; import java.util.HashMap; +import java.util.Objects; /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) @@ -25,6 +26,7 @@ public class ServerYacht { private String boatType; private Double turnStep = 10.0; private Double maxSpeedMultiplier = 1.0; + private Double acceleration = 1.0; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; @@ -423,10 +425,11 @@ public class ServerYacht { public void setBoatType(String boatType) { BoatMeshType boatMeshType; for (BoatMeshType boatMesh: BoatMeshType.values()) { - if (boatType == boatMesh.toString()) { + if (Objects.equals(boatType, boatMesh.toString())) { boatMeshType = boatMesh; turnStep = boatMeshType.turnStep; maxSpeedMultiplier = boatMeshType.maxSpeedMultiplier; + acceleration = boatMeshType.accelerationMultiplier; } } this.boatType = boatType; @@ -436,6 +439,10 @@ public class ServerYacht { return maxSpeedMultiplier; } + public Double getAcceleration(){ + return acceleration; + } + public String getBoatType() { return boatType; } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 83b1e520..3a71422a 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -56,9 +56,9 @@ public class BoatCustomizeController implements Initializable{ private ClientToServerThread socketThread; private LobbyController lobbyController; private BoatMeshType currentBoat; - private static Double maxSpeedMultiplier = 1.0; - private static Double maxTurnRate = 10.0; - private static Double maxAcceleration = 2.0; + private Double maxSpeedMultiplier = 1.0; + private Double maxTurnRate = 10.0; + private Double maxAcceleration = 1.0; @Override public void initialize(URL location, ResourceBundle resources) { diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index e7c375e5..2dc55d30 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -7,11 +7,11 @@ package seng302.visualiser.fxObjects.assets_3D; */ public enum BoatMeshType { - DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.5, 1.0, 5.0), + DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.7, 1.0, 5.0), CAT_ATE_A_MERINGUE("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", - 0.997, null, false, 1.0, 1.0, 10.0), + 0.997, null, false, 1.0, 1.4, 10.0), PIRATE_SHIP("pirateship_hull.stl", "pirateship_mast.stl", -0.5415, "pirateship_mainsail.stl", - -0.5415, "pirateship_frontsail.stl", true, 1.2, 1.0, 7.0); + -0.5415, "pirateship_frontsail.stl", true, 1.2, 1.6, 6.0); final String hullFile, mastFile, sailFile, jibFile; final double mastOffset, sailOffset; From 52dc7a956d482dc2459b3b8584a9db3a218eb975 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Fri, 22 Sep 2017 17:42:32 +1200 Subject: [PATCH 14/20] Turned handling into a multiplier. #story[1274] --- src/main/java/seng302/model/ServerYacht.java | 4 ++-- .../controllers/dialogs/BoatCustomizeController.java | 2 +- .../visualiser/fxObjects/assets_3D/BoatMeshType.java | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 29f7eecc..f2965673 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -24,7 +24,7 @@ public class ServerYacht { //Boat info private String boatType; - private Double turnStep = 10.0; + private Double turnStep = 5.0; private Double maxSpeedMultiplier = 1.0; private Double acceleration = 1.0; private Integer sourceId; @@ -427,7 +427,7 @@ public class ServerYacht { for (BoatMeshType boatMesh: BoatMeshType.values()) { if (Objects.equals(boatType, boatMesh.toString())) { boatMeshType = boatMesh; - turnStep = boatMeshType.turnStep; + turnStep = turnStep * boatMeshType.turnStep; maxSpeedMultiplier = boatMeshType.maxSpeedMultiplier; acceleration = boatMeshType.accelerationMultiplier; } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 3a71422a..b587b62d 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -57,7 +57,7 @@ public class BoatCustomizeController implements Initializable{ private LobbyController lobbyController; private BoatMeshType currentBoat; private Double maxSpeedMultiplier = 1.0; - private Double maxTurnRate = 10.0; + private Double maxTurnRate = 1.0; private Double maxAcceleration = 1.0; @Override diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 2dc55d30..7dc25d38 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -7,11 +7,11 @@ package seng302.visualiser.fxObjects.assets_3D; */ public enum BoatMeshType { - DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.7, 1.0, 5.0), + DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.7, 1.0, 1.0), CAT_ATE_A_MERINGUE("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", - 0.997, null, false, 1.0, 1.4, 10.0), + 0.997, null, false, 1.0, 1.4, 2.0), PIRATE_SHIP("pirateship_hull.stl", "pirateship_mast.stl", -0.5415, "pirateship_mainsail.stl", - -0.5415, "pirateship_frontsail.stl", true, 1.2, 1.6, 6.0); + -0.5415, "pirateship_frontsail.stl", true, 1.2, 1.6, 1.2); final String hullFile, mastFile, sailFile, jibFile; final double mastOffset, sailOffset; From da8c91f5c1d31bdc0a1eed05cb024705417d7274 Mon Sep 17 00:00:00 2001 From: William Muir Date: Fri, 22 Sep 2017 20:44:06 +1200 Subject: [PATCH 15/20] Review fixes for merge request. PlayerCell now takes in the yacht for construction rather than taking in a whole lot of values extracted from the yacht Reduced boiler plate in BoatCustomizeController #story[1274] --- src/main/java/seng302/model/ServerYacht.java | 2 +- .../controllers/LobbyController.java | 2 +- .../controllers/cells/PlayerCell.java | 13 ++++--- .../dialogs/BoatCustomizeController.java | 37 ++++++++----------- 4 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 80566afd..99314776 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -20,7 +20,7 @@ import java.util.Observer; */ public class ServerYacht { - private Logger logger = LoggerFactory.getLogger(ClientYacht.class); + private Logger logger = LoggerFactory.getLogger(ServerYacht.class); public static final Double TURN_STEP = 5.0; diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index 03af2d3a..67b1dfbd 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -205,7 +205,7 @@ public class LobbyController implements Initializable { FXMLLoader loader = new FXMLLoader( getClass().getResource("/views/cells/PlayerCell.fxml")); - loader.setController(new PlayerCell(playerId, yacht.getBoatName(), yacht.getColour(), yacht.getBoatType())); + loader.setController(new PlayerCell(playerId, yacht)); try { pane = loader.load(); diff --git a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java index 3f434a7f..adba9968 100644 --- a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java +++ b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java @@ -6,6 +6,7 @@ import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; +import seng302.model.ClientYacht; import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; import seng302.visualiser.fxObjects.assets_3D.BoatModel; import seng302.visualiser.fxObjects.assets_3D.ModelFactory; @@ -24,13 +25,13 @@ public class PlayerCell { private String name; private Color boatColor; private Integer playerId; - private BoatMeshType boatype; + private BoatMeshType boatType; - public PlayerCell(Integer playerId, String playerName, Color color, String boatType) { + public PlayerCell(Integer playerId, ClientYacht yacht) { this.playerId = playerId; - this.name = playerName; - this.boatColor = color; - this.boatype = BoatMeshType.getBoatMeshType(boatType); + this.name = yacht.getBoatName(); + this.boatColor = yacht.getColour(); + this.boatType = BoatMeshType.getBoatMeshType(yacht.getBoatType()); } public void initialize() { @@ -39,7 +40,7 @@ public class PlayerCell { // Add Rotating Boat to Player Cell with players color on it. Group group = new Group(); boatPane.getChildren().add(group); - BoatModel bo = ModelFactory.boatIconView(this.boatype, this.boatColor); + BoatModel bo = ModelFactory.boatIconView(boatType, boatColor); group.getChildren().add(bo.getAssets()); } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 55f0b7e6..9926cc27 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -6,7 +6,6 @@ import com.jfoenix.controls.JFXTextField; import com.jfoenix.validation.RequiredFieldValidator; import java.net.URL; import java.util.ResourceBundle; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.geometry.Insets; @@ -40,9 +39,8 @@ public class BoatCustomizeController implements Initializable{ @FXML private Pane boatPane; @FXML - void colorChanged(ActionEvent event) { - Color color = colorPicker.getValue(); - RefreshBoat(); + void colorChanged() { + refreshBoat(); } //---------FXML END---------// @@ -62,6 +60,8 @@ public class BoatCustomizeController implements Initializable{ playerNameLengthValidator.setMessage("Player name too long."); boatName.setValidators(playerNameLengthValidator, playerNameReqValidator); + boatPane.setBackground( + new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY))); submitBtn.setOnMouseReleased(event -> { Sounds.playButtonClick(); @@ -69,7 +69,6 @@ public class BoatCustomizeController implements Initializable{ }); submitBtn.setOnMouseEntered(e -> Sounds.playHoverSound()); - } /** @@ -113,36 +112,30 @@ public class BoatCustomizeController implements Initializable{ } public void setCurrentBoat(String boatType) { - Group group = new Group(); - this.currentBoat = BoatMeshType.getBoatMeshType(boatType); - boatPane.setBackground(new Background(new BackgroundFill(Color.SKYBLUE, CornerRadii.EMPTY, Insets.EMPTY))); - boatPane.getChildren().add(group); - BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); - group.getChildren().add(bo.getAssets()); - group.getChildren().add(new PointLight()); + currentBoat = BoatMeshType.getBoatMeshType(boatType); + displayCurrentBoat(); } - public void nextBoat(ActionEvent actionEvent) { - boatPane.getChildren().clear(); - Group group = new Group(); - boatPane.getChildren().add(group); + public void nextBoat() { currentBoat = BoatMeshType.getNextBoatType(currentBoat); - BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); - group.getChildren().add(bo.getAssets()); - group.getChildren().add(new PointLight()); + displayCurrentBoat(); } - public void prevBoat(ActionEvent actionEvent) { + public void prevBoat() { + currentBoat = BoatMeshType.getPrevBoatType(currentBoat); + displayCurrentBoat(); + } + + private void displayCurrentBoat() { boatPane.getChildren().clear(); Group group = new Group(); boatPane.getChildren().add(group); - currentBoat = BoatMeshType.getPrevBoatType(currentBoat); BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); group.getChildren().add(new PointLight()); } - private void RefreshBoat() { + private void refreshBoat() { boatPane.getChildren().clear(); Group group = new Group(); boatPane.getChildren().add(group); From 22fdf1e4ac29237751557387b12b8ab78e542223 Mon Sep 17 00:00:00 2001 From: William Muir Date: Fri, 22 Sep 2017 21:00:28 +1200 Subject: [PATCH 16/20] Changed the boatType attribute from all around the place from String lit to enum #story[1274] --- src/main/java/seng302/gameServer/GameState.java | 3 ++- .../seng302/gameServer/ServerToClientThread.java | 3 ++- src/main/java/seng302/model/ClientYacht.java | 7 ++++--- src/main/java/seng302/model/ServerYacht.java | 9 +++++---- src/main/java/seng302/utilities/XMLParser.java | 3 ++- src/main/java/seng302/visualiser/GameView3D.java | 2 +- .../visualiser/controllers/cells/PlayerCell.java | 2 +- .../dialogs/BoatCustomizeController.java | 4 ++-- .../fxObjects/assets_3D/BoatMeshType.java | 13 ------------- src/test/java/seng302/model/UpdateYachtTest.java | 7 +++++-- src/test/java/seng302/models/YachtTest.java | 3 ++- .../java/seng302/utilities/BoatMeshTypeTest.java | 7 ------- .../visualiser/map/BoatSailAnimationToggleTest.java | 3 ++- 13 files changed, 28 insertions(+), 38 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 41c619b7..8ff2556c 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -18,6 +18,7 @@ import seng302.utilities.XMLParser; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.util.*; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** * A Static class to hold information about the current state of the game (model) @@ -704,7 +705,7 @@ public class GameState implements Runnable { playerYacht.setBoatColor(yachtColor); } else if (requestType.equals(CustomizeRequestType.SHAPE)) { String type = new String(customizeData); - playerYacht.setBoatType(type); + playerYacht.setBoatType(BoatMeshType.valueOf(type)); } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 728e6adb..eb5a9ad0 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -33,6 +33,7 @@ import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.StreamPacket; import seng302.model.stream.xml.generator.RaceXMLTemplate; import seng302.utilities.XMLGenerator; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** * A class describing a single connection to a Client for the purposes of sending and receiving on @@ -125,7 +126,7 @@ public class ServerToClientThread implements Runnable { lName = all.get(ThreadLocalRandom.current().nextInt(0, all.size())); ServerYacht yacht = new ServerYacht( - "DINGHY", sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ" + BoatMeshType.DINGHY, sourceId, sourceId.toString(), fName, fName + " " + lName, "NZ" ); player = new Player(socket, yacht); diff --git a/src/main/java/seng302/model/ClientYacht.java b/src/main/java/seng302/model/ClientYacht.java index 1ebaa3fc..2bc1ed91 100644 --- a/src/main/java/seng302/model/ClientYacht.java +++ b/src/main/java/seng302/model/ClientYacht.java @@ -15,6 +15,7 @@ import javafx.beans.property.ReadOnlyLongWrapper; import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) @@ -37,7 +38,7 @@ public class ClientYacht extends Observable { private Logger logger = LoggerFactory.getLogger(ClientYacht.class); - private String boatType; + private BoatMeshType boatType; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; @@ -64,7 +65,7 @@ public class ClientYacht extends Observable { private ReadOnlyIntegerWrapper placingProperty = new ReadOnlyIntegerWrapper(); private Color colour; - public ClientYacht(String boatType, Integer sourceId, String hullID, String shortName, + public ClientYacht(BoatMeshType boatType, Integer sourceId, String hullID, String shortName, String boatName, String country) { this.boatType = boatType; this.sourceId = sourceId; @@ -88,7 +89,7 @@ public class ClientYacht extends Observable { super.addObserver(o); } - public String getBoatType() { + public BoatMeshType getBoatType() { return boatType; } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 99314776..e7d936ca 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -12,6 +12,7 @@ import seng302.utilities.GeoUtility; import java.util.HashMap; import java.util.Observable; import java.util.Observer; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** * Yacht class for the racing boat.

Class created to store more variables (eg. boat statuses) @@ -25,7 +26,7 @@ public class ServerYacht { public static final Double TURN_STEP = 5.0; //Boat info - private String boatType; + private BoatMeshType boatType; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; @@ -57,7 +58,7 @@ public class ServerYacht { private Long powerUpStartTime; - public ServerYacht(String boatType, Integer sourceId, String hullID, String shortName, + public ServerYacht(BoatMeshType boatType, Integer sourceId, String hullID, String shortName, String boatName, String country) { this.boatType = boatType; this.boatStatus = BoatStatus.PRESTART; @@ -421,11 +422,11 @@ public class ServerYacht { return boatColor; } - public void setBoatType(String boatType) { + public void setBoatType(BoatMeshType boatType) { this.boatType = boatType; } - public String getBoatType() { + public BoatMeshType getBoatType() { return boatType; } } diff --git a/src/main/java/seng302/utilities/XMLParser.java b/src/main/java/seng302/utilities/XMLParser.java index 7a8bbac4..71da1248 100644 --- a/src/main/java/seng302/utilities/XMLParser.java +++ b/src/main/java/seng302/utilities/XMLParser.java @@ -18,6 +18,7 @@ import seng302.model.stream.xml.parser.RaceXMLData; import seng302.model.stream.xml.parser.RegattaXMLData; import seng302.model.token.Token; import seng302.model.token.TokenType; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** * Utilities for parsing XML documents @@ -139,7 +140,7 @@ public class XMLParser { if (currentBoat.getNodeName().equals("Boat")) { // Boat boat = new Boat(currentBoat); ClientYacht yacht = new ClientYacht( - XMLParser.getNodeAttributeString(currentBoat, "Type"), + BoatMeshType.valueOf(XMLParser.getNodeAttributeString(currentBoat, "Type")), XMLParser.getNodeAttributeInt(currentBoat, "SourceID"), XMLParser.getNodeAttributeString(currentBoat, "HullNum"), XMLParser.getNodeAttributeString(currentBoat, "ShortName"), diff --git a/src/main/java/seng302/visualiser/GameView3D.java b/src/main/java/seng302/visualiser/GameView3D.java index 73815023..63d0203d 100644 --- a/src/main/java/seng302/visualiser/GameView3D.java +++ b/src/main/java/seng302/visualiser/GameView3D.java @@ -460,7 +460,7 @@ public class GameView3D { final List wakes = new ArrayList<>(); for (ClientYacht clientYacht : yachts) { Color colour = clientYacht.getColour(); - newBoat = new BoatObject(BoatMeshType.getBoatMeshType(clientYacht.getBoatType())); + newBoat = new BoatObject(clientYacht.getBoatType()); newBoat.setFill(colour); boatObjects.put(clientYacht, newBoat); wakesGroup.getChildren().add(newBoat.getWake()); diff --git a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java index adba9968..21bd6644 100644 --- a/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java +++ b/src/main/java/seng302/visualiser/controllers/cells/PlayerCell.java @@ -31,7 +31,7 @@ public class PlayerCell { this.playerId = playerId; this.name = yacht.getBoatName(); this.boatColor = yacht.getColour(); - this.boatType = BoatMeshType.getBoatMeshType(yacht.getBoatType()); + this.boatType = yacht.getBoatType(); } public void initialize() { diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 9926cc27..4b02ac9a 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -111,8 +111,8 @@ public class BoatCustomizeController implements Initializable{ this.lobbyController = lobbyController; } - public void setCurrentBoat(String boatType) { - currentBoat = BoatMeshType.getBoatMeshType(boatType); + public void setCurrentBoat(BoatMeshType boatType) { + currentBoat = boatType; displayCurrentBoat(); } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 947a63f5..65c9714c 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -29,19 +29,6 @@ public enum BoatMeshType { this.fixedSail = fixedSail; } - public static BoatMeshType getBoatMeshType(String boatType) { - switch (boatType){ - case "DINGHY": - return DINGHY; - case "CAT_ATE_A_MERINGUE": - return CAT_ATE_A_MERINGUE; - case "PIRATE_SHIP": - return PIRATE_SHIP; - default: - return DINGHY; - } - } - //TODO kre39 make something not terrible to cycle through boat types public static BoatMeshType getNextBoatType(BoatMeshType boatType) { diff --git a/src/test/java/seng302/model/UpdateYachtTest.java b/src/test/java/seng302/model/UpdateYachtTest.java index 7eaaf990..79c02cb2 100644 --- a/src/test/java/seng302/model/UpdateYachtTest.java +++ b/src/test/java/seng302/model/UpdateYachtTest.java @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.Test; import seng302.gameServer.GameState; import seng302.utilities.GeoUtility; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; import static seng302.gameServer.GameState.checkCollision; @@ -14,8 +15,10 @@ import static seng302.gameServer.GameState.checkCollision; */ public class UpdateYachtTest { - private ServerYacht yacht1 = new ServerYacht("Yacht", 1, "1", "Yacht" + 1, "Yacht" + 1, "Test1"); - private ServerYacht yacht2 = new ServerYacht("Yacht", 2, "2", "Yacht" + 2, "Yacht" + 2, "Test2"); + private ServerYacht yacht1 = new ServerYacht(BoatMeshType.DINGHY, 1, "1", "Yacht" + 1, + "Yacht" + 1, "Test1"); + private ServerYacht yacht2 = new ServerYacht(BoatMeshType.DINGHY, 2, "2", "Yacht" + 2, + "Yacht" + 2, "Test2"); private GeoPoint geoPoint1 = new GeoPoint(50.0, 50.0); private GeoPoint geoPoint2 = GeoUtility.getGeoCoordinate(geoPoint1, 90.0, 50.0); diff --git a/src/test/java/seng302/models/YachtTest.java b/src/test/java/seng302/models/YachtTest.java index 3f342ff5..b73dc61c 100644 --- a/src/test/java/seng302/models/YachtTest.java +++ b/src/test/java/seng302/models/YachtTest.java @@ -4,6 +4,7 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import seng302.gameServer.GameState; import seng302.model.ServerYacht; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; public class YachtTest { @@ -17,7 +18,7 @@ public class YachtTest { @BeforeClass public static void setUp() { new GameState("localhost"); - y1 = new ServerYacht("Yacht", 1, "Y1", "Y1", "Yacht 1", "C1"); + y1 = new ServerYacht(BoatMeshType.DINGHY, 1, "Y1", "Y1", "Yacht 1", "C1"); gs = new GameState("localhost"); } diff --git a/src/test/java/seng302/utilities/BoatMeshTypeTest.java b/src/test/java/seng302/utilities/BoatMeshTypeTest.java index baca1b14..743c7f1e 100644 --- a/src/test/java/seng302/utilities/BoatMeshTypeTest.java +++ b/src/test/java/seng302/utilities/BoatMeshTypeTest.java @@ -25,11 +25,4 @@ public class BoatMeshTypeTest { Assert.assertEquals(BoatMeshType.DINGHY, prevBoat); } - @Test - public void testGetBoatMeshType() { - BoatMeshType currentBoat = BoatMeshType.getBoatMeshType("DINGHY"); - Assert.assertEquals(BoatMeshType.DINGHY, currentBoat); - BoatMeshType wrongBoat = BoatMeshType.getBoatMeshType("NOT A REAL BOAT"); - Assert.assertEquals(BoatMeshType.DINGHY, wrongBoat); - } } diff --git a/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java index 70c5c80b..9e95f169 100644 --- a/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java +++ b/src/test/java/seng302/visualiser/map/BoatSailAnimationToggleTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import seng302.model.ClientYacht; +import seng302.visualiser.fxObjects.assets_3D.BoatMeshType; /** * Created by kre39 on 6/08/17. @@ -16,7 +17,7 @@ public class BoatSailAnimationToggleTest { @Before public void setup() throws Exception{ - yacht = new ClientYacht("Yacht", 1, "YACHT", "YAC", "Test Yacht", "NZ"); + yacht = new ClientYacht(BoatMeshType.DINGHY, 1, "YACHT", "YAC", "Test Yacht", "NZ"); } @Test From 364264377a0454bde02de48fdb473f75cf175e76 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sat, 23 Sep 2017 15:04:11 +1200 Subject: [PATCH 17/20] Fixed merge errors and reimplemented handling multiplier #story[1274] --- src/main/java/seng302/gameServer/GameState.java | 10 +++++----- src/main/java/seng302/model/ServerYacht.java | 14 +++++++++----- .../visualiser/controllers/LobbyController.java | 2 +- .../dialogs/BoatCustomizeController.java | 12 ++++++------ src/test/java/steps/ToggleSailSteps.java | 1 + 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 9735b0c0..4efb1d23 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -462,17 +462,17 @@ public class GameState implements Runnable { // TODO: 15/08/17 remove magic numbers from these equations. if (yacht.getSailIn()) { if (currentVelocity < maxBoatSpeed - 500) { - yacht.changeVelocity((maxBoatSpeed / 100) * yacht.getAcceleration()); + yacht.changeVelocity((maxBoatSpeed / 100) * yacht.getAccelerationMultiplier()); } else if (currentVelocity > maxBoatSpeed + 500) { - yacht.changeVelocity((-currentVelocity / 200) * yacht.getAcceleration()); + yacht.changeVelocity((-currentVelocity / 200) * yacht.getAccelerationMultiplier()); } else { - yacht.setCurrentVelocity((maxBoatSpeed) * yacht.getAcceleration()); + yacht.setCurrentVelocity((maxBoatSpeed) * yacht.getAccelerationMultiplier()); } } else { if (currentVelocity > 3000) { - yacht.changeVelocity((-currentVelocity / 200) * yacht.getAcceleration()); + yacht.changeVelocity((-currentVelocity / 200) * yacht.getAccelerationMultiplier()); } else if (currentVelocity > 100) { - yacht.changeVelocity((-currentVelocity / 50) * yacht.getAcceleration()); + yacht.changeVelocity((-currentVelocity / 50) * yacht.getAccelerationMultiplier()); } else if (currentVelocity <= 100) { yacht.setCurrentVelocity(0d); } diff --git a/src/main/java/seng302/model/ServerYacht.java b/src/main/java/seng302/model/ServerYacht.java index 73628e33..37065649 100644 --- a/src/main/java/seng302/model/ServerYacht.java +++ b/src/main/java/seng302/model/ServerYacht.java @@ -29,7 +29,8 @@ public class ServerYacht { private BoatMeshType boatType; private Double turnStep = 5.0; private Double maxSpeedMultiplier = 1.0; - private Double acceleration = 1.0; + private Double turnStepMultiplier = 1.0; + private Double accelerationMultiplier = 1.0; private Integer sourceId; private String hullID; //matches HullNum in the XML spec. private String shortName; @@ -133,7 +134,7 @@ public class ServerYacht { * @param amount the amount by which to adjust the boat heading. */ public void adjustHeading(Double amount) { - Double newVal = heading + amount; + Double newVal = heading + (amount * turnStepMultiplier); lastHeading = heading; heading = (double) Math.floorMod(newVal.longValue(), 360L); } @@ -272,7 +273,7 @@ public class ServerYacht { private void turnTowardsHeading(Double newHeading) { Double newVal = heading - newHeading; if (Math.floorMod(newVal.longValue(), 360L) > 180) { - adjustHeading(turnStep / 5); + adjustHeading(turnStep / 5); } else { adjustHeading(-turnStep / 5); } @@ -426,6 +427,9 @@ public class ServerYacht { } public void setBoatType(BoatMeshType boatType) { + this.accelerationMultiplier = boatType.accelerationMultiplier; + this.maxSpeedMultiplier = boatType.maxSpeedMultiplier; + this.turnStepMultiplier = boatType.turnStep; this.boatType = boatType; } @@ -433,8 +437,8 @@ public class ServerYacht { return maxSpeedMultiplier; } - public Double getAcceleration(){ - return acceleration; + public Double getAccelerationMultiplier(){ + return accelerationMultiplier; } diff --git a/src/main/java/seng302/visualiser/controllers/LobbyController.java b/src/main/java/seng302/visualiser/controllers/LobbyController.java index 67b1dfbd..aa8430b8 100644 --- a/src/main/java/seng302/visualiser/controllers/LobbyController.java +++ b/src/main/java/seng302/visualiser/controllers/LobbyController.java @@ -131,7 +131,7 @@ public class LobbyController implements Initializable { .get(ViewManager.getInstance().getGameClient().getServerThread().getClientId()) .getBoatName()); controller.setCurrentBoat(this.playerBoats.get(ViewManager.getInstance().getGameClient().getServerThread().getClientId()) - .getBoatType()); + .getBoatType().toString()); return customizationDialog; } diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 5b0cf70b..321f98dd 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -122,7 +122,7 @@ public class BoatCustomizeController implements Initializable{ } public void setCurrentBoat(String boatType) { - currentBoat = boatType; + currentBoat = BoatMeshType.valueOf(boatType); displayCurrentBoat(); refreshStatBars(currentBoat); } @@ -155,7 +155,7 @@ public class BoatCustomizeController implements Initializable{ boatPane.getChildren().add(group); BoatModel bo = ModelFactory.boatCustomiseView(currentBoat, colorPicker.getValue()); group.getChildren().add(bo.getAssets()); - refreshStatBars(bo); + refreshStatBars(currentBoat); } private void generateMaxStats() { @@ -172,9 +172,9 @@ public class BoatCustomizeController implements Initializable{ } } - private void refreshStatBars(BoatModel bo) { - speedBar.setProgress((bo.getMeshType().maxSpeedMultiplier) / maxSpeedMultiplier); - accelBar.setProgress(bo.getMeshType().accelerationMultiplier / maxAcceleration); - handleBar.setProgress(bo.getMeshType().turnStep / maxTurnRate); + private void refreshStatBars(BoatMeshType bo) { + speedBar.setProgress((bo.maxSpeedMultiplier) / maxSpeedMultiplier); + accelBar.setProgress(bo.accelerationMultiplier / maxAcceleration); + handleBar.setProgress(bo.turnStep / maxTurnRate); } } diff --git a/src/test/java/steps/ToggleSailSteps.java b/src/test/java/steps/ToggleSailSteps.java index 4bf20242..5c82a614 100644 --- a/src/test/java/steps/ToggleSailSteps.java +++ b/src/test/java/steps/ToggleSailSteps.java @@ -13,6 +13,7 @@ import seng302.model.ServerYacht; import seng302.visualiser.ClientToServerThread; /** + * * Created by kre39 on 7/08/17. */ public class ToggleSailSteps { From e9b50038a91c922aa146b5439d199f56721698b3 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sat, 23 Sep 2017 15:09:22 +1200 Subject: [PATCH 18/20] Balance changes. Always wanted to use that as a commit message. #story[1274] --- .../visualiser/fxObjects/assets_3D/BoatMeshType.java | 7 +++---- src/test/java/seng302/utilities/BoatMeshTypeTest.java | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java index 185503fb..292c636a 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatMeshType.java @@ -7,8 +7,8 @@ package seng302.visualiser.fxObjects.assets_3D; */ public enum BoatMeshType { - DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.7, 1.0, 1.0), - CAT_ATE_A_MERINGUE("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", + DINGHY("dinghy_hull.stl", "dinghy_mast.stl", 1.36653, "dinghy_sail.stl", 1.36653, null, false, 1.8, 1.0, 1.0), + CATAMARAN("catamaran_hull.stl", "catamaran_mast.stl", 0.997, "catamaran_sail.stl", 0.997, null, false, 1.0, 1.4, 2.0), PIRATE_SHIP("pirateship_hull.stl", "pirateship_mast.stl", -0.5415, "pirateship_mainsail.stl", -0.5415, "pirateship_frontsail.stl", true, 1.2, 1.6, 1.2); @@ -19,7 +19,7 @@ public enum BoatMeshType { public final double accelerationMultiplier; public final double turnStep; final boolean fixedSail; - final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CAT_ATE_A_MERINGUE, PIRATE_SHIP}; + final static BoatMeshType[] boatTypes = new BoatMeshType[]{DINGHY, CATAMARAN, PIRATE_SHIP}; BoatMeshType(String hullFile, String mastFile, double mastOffset, String sailFile, double sailOffset, String jibFile, boolean fixedSail, double maxSpeedMultiplier, double accelerationMultiplier, double turnStep) { @@ -36,7 +36,6 @@ public enum BoatMeshType { } - //TODO kre39 make something not terrible to cycle through boat types public static BoatMeshType getNextBoatType(BoatMeshType boatType) { for (int i = 0; i < boatTypes.length; i++) { if (i == boatTypes.length -1) { diff --git a/src/test/java/seng302/utilities/BoatMeshTypeTest.java b/src/test/java/seng302/utilities/BoatMeshTypeTest.java index 743c7f1e..8f0d30b9 100644 --- a/src/test/java/seng302/utilities/BoatMeshTypeTest.java +++ b/src/test/java/seng302/utilities/BoatMeshTypeTest.java @@ -15,12 +15,12 @@ public class BoatMeshTypeTest { public void testNextBoatMeshType() { BoatMeshType currentBoat = BoatMeshType.DINGHY; BoatMeshType nextBoat = BoatMeshType.getNextBoatType(currentBoat); - Assert.assertEquals(BoatMeshType.CAT_ATE_A_MERINGUE, nextBoat); + Assert.assertEquals(BoatMeshType.CATAMARAN, nextBoat); } @Test public void testPreviousBoatMeshType() { - BoatMeshType currentBoat = BoatMeshType.CAT_ATE_A_MERINGUE; + BoatMeshType currentBoat = BoatMeshType.CATAMARAN; BoatMeshType prevBoat = BoatMeshType.getPrevBoatType(currentBoat); Assert.assertEquals(BoatMeshType.DINGHY, prevBoat); } From 0a885dd8fd339e80332f396952cb480260b48a49 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sat, 23 Sep 2017 15:37:16 +1200 Subject: [PATCH 19/20] Clean up changes #story[1274] --- .../dialogs/BoatCustomizeController.java | 20 +++++++++---------- .../fxObjects/assets_3D/BoatModel.java | 3 --- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java index 321f98dd..67fb089a 100644 --- a/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java +++ b/src/main/java/seng302/visualiser/controllers/dialogs/BoatCustomizeController.java @@ -55,14 +55,14 @@ public class BoatCustomizeController implements Initializable{ private LobbyController lobbyController; private BoatMeshType currentBoat; private Double maxSpeedMultiplier = 1.0; - private Double maxTurnRate = 1.0; - private Double maxAcceleration = 1.0; + private Double maxTurnRateMultiplier = 1.0; + private Double maxAccelerationMultiplier = 1.0; @Override public void initialize(URL location, ResourceBundle resources) { socketThread = ViewManager.getInstance().getGameClient().getServerThread(); - generateMaxStats(); + findMaxStats(); RequiredFieldValidator playerNameReqValidator = new RequiredFieldValidator(); playerNameReqValidator.setMessage("Player name required."); @@ -158,23 +158,23 @@ public class BoatCustomizeController implements Initializable{ refreshStatBars(currentBoat); } - private void generateMaxStats() { + private void findMaxStats() { for (BoatMeshType bmt: BoatMeshType.values()) { - if (bmt.turnStep > maxTurnRate) { - maxTurnRate = bmt.turnStep; + if (bmt.turnStep > maxTurnRateMultiplier) { + maxTurnRateMultiplier = bmt.turnStep; } if (bmt.maxSpeedMultiplier > maxSpeedMultiplier) { maxSpeedMultiplier = bmt.maxSpeedMultiplier; } - if (bmt.accelerationMultiplier > maxAcceleration) { - maxAcceleration = bmt.accelerationMultiplier; + if (bmt.accelerationMultiplier > maxAccelerationMultiplier) { + maxAccelerationMultiplier = bmt.accelerationMultiplier; } } } private void refreshStatBars(BoatMeshType bo) { speedBar.setProgress((bo.maxSpeedMultiplier) / maxSpeedMultiplier); - accelBar.setProgress(bo.accelerationMultiplier / maxAcceleration); - handleBar.setProgress(bo.turnStep / maxTurnRate); + accelBar.setProgress(bo.accelerationMultiplier / maxAccelerationMultiplier); + handleBar.setProgress(bo.turnStep / maxTurnRateMultiplier); } } diff --git a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java index 960ceacf..e056b14d 100644 --- a/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java +++ b/src/main/java/seng302/visualiser/fxObjects/assets_3D/BoatModel.java @@ -18,9 +18,6 @@ public class BoatModel extends Model { private static final int SAIL_INDEX = 2; private BoatMeshType meshType; - private Double maxSpeedMultiplier; - private Double turnStep; - private Double accelerationMultiplier; /** * Stores a model and it's optional animation. From f6b41f051300af7bade75dd9363decac37beae9f Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sun, 24 Sep 2017 18:06:26 +1300 Subject: [PATCH 20/20] Fixes Issue #59 --- src/main/java/seng302/utilities/Sounds.java | 22 ++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/seng302/utilities/Sounds.java b/src/main/java/seng302/utilities/Sounds.java index 944fa93f..f8257b1f 100644 --- a/src/main/java/seng302/utilities/Sounds.java +++ b/src/main/java/seng302/utilities/Sounds.java @@ -14,8 +14,10 @@ public class Sounds { private static MediaPlayer soundEffect; private static MediaPlayer soundPlayer; private static MediaPlayer hoverSoundPlayer; + private static MediaPlayer crashSoundPlayer; private static boolean hoverInitialized = false; + private static boolean crashInitialized = false; private static boolean musicMuted = false; private static boolean soundEffectsMuted = false; @@ -155,11 +157,17 @@ public class Sounds { public static void playCrashSound() { if (!soundEffectsMuted) { - Media crashSound = new Media( - Sounds.class.getClassLoader().getResource("sounds/Large-metal-door-slam.mp3") - .toString()); - soundPlayer = new MediaPlayer(crashSound); - soundPlayer.play(); + if (!crashInitialized) { + Media pickupSound = new Media( + Sounds.class.getClassLoader().getResource("sounds/Large-metal-door-slam.mp3") + .toString()); + crashSoundPlayer = new MediaPlayer(pickupSound); + crashInitialized = true; + } + if (crashSoundPlayer != null) { + crashSoundPlayer.stop(); + } + crashSoundPlayer.play(); } } @@ -176,10 +184,10 @@ public class Sounds { public static void playHoverSound() { if (!soundEffectsMuted) { if (!hoverInitialized) { - Media crashSound = new Media( + Media hoverSound = new Media( Sounds.class.getClassLoader().getResource("sounds/Error-sound-effect.mp3") .toString()); - hoverSoundPlayer = new MediaPlayer(crashSound); + hoverSoundPlayer = new MediaPlayer(hoverSound); hoverInitialized = true; } hoverSoundPlayer.setVolume(0.5);