|
@@ -0,0 +1,595 @@
|
|
|
+package xyz.tbvns.JavaFX;
|
|
|
+
|
|
|
+import javafx.application.Application;
|
|
|
+import javafx.application.HostServices;
|
|
|
+import javafx.collections.FXCollections;
|
|
|
+import javafx.collections.ObservableList;
|
|
|
+import javafx.geometry.Insets;
|
|
|
+import javafx.geometry.Pos;
|
|
|
+import javafx.scene.Node;
|
|
|
+import javafx.scene.Scene;
|
|
|
+import javafx.scene.control.*;
|
|
|
+import javafx.scene.layout.*;
|
|
|
+import javafx.stage.DirectoryChooser;
|
|
|
+import javafx.stage.FileChooser;
|
|
|
+import javafx.stage.Stage;
|
|
|
+import xyz.tbvns.Constant;
|
|
|
+import xyz.tbvns.Generate.Generate3D;
|
|
|
+import xyz.tbvns.Main;
|
|
|
+import xyz.tbvns.Utils;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+
|
|
|
+public class FXui extends Application {
|
|
|
+ static Stage stage;
|
|
|
+ ObservableList<Node> objects;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void start(Stage stage) throws Exception {
|
|
|
+ Pane pane = new Pane();
|
|
|
+ stage.setScene(new Scene(pane));
|
|
|
+
|
|
|
+ this.stage = stage;
|
|
|
+
|
|
|
+ stage.setOnCloseRequest(windowEvent -> {
|
|
|
+ Constant.shouldClose = true;
|
|
|
+ });
|
|
|
+
|
|
|
+ stage.setMinWidth(500);
|
|
|
+ stage.setMinHeight(500);
|
|
|
+ stage.setMaxWidth(500);
|
|
|
+ stage.setMaxHeight(500);
|
|
|
+ stage.setResizable(false);
|
|
|
+ stage.setTitle("GD3D - Open source 3d model importer for Geometry dash");
|
|
|
+
|
|
|
+ pane.setPrefSize(stage.getMaxWidth(), stage.getMaxHeight());
|
|
|
+
|
|
|
+ objects = pane.getChildren();
|
|
|
+ objects.add(getPane.getBar());
|
|
|
+ objects.add(getPane.files());
|
|
|
+ objects.add(getPane.settings());
|
|
|
+ objects.add(getPane.status());
|
|
|
+ objects.add(getPane.camera());
|
|
|
+ objects.add(getPane.frames());
|
|
|
+ objects.add(getPane.game());
|
|
|
+ objects.add(getPane.optimisation());
|
|
|
+ objects.add(getPane.other());
|
|
|
+ stage.show();
|
|
|
+ }
|
|
|
+
|
|
|
+ public HostServices getHostservices() {
|
|
|
+ return getHostServices();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class getPane {
|
|
|
+ public static Node files() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Files");
|
|
|
+ pane.setCollapsible(false);
|
|
|
+
|
|
|
+ VBox box = new VBox(20);
|
|
|
+ box.setSpacing(5);
|
|
|
+
|
|
|
+ CheckBox useAnimation = new CheckBox("Use animation");
|
|
|
+ useAnimation.setSelected(Constant.useAnimation);
|
|
|
+ Button selectOBJ = new Button("Select OBJ file");
|
|
|
+ Button selectMTL = new Button("Select MTL file");
|
|
|
+
|
|
|
+ if (Constant.useAnimation) {
|
|
|
+ selectOBJ.setText("Select OBJ folder");
|
|
|
+ selectMTL.setText("Select MTL folder");
|
|
|
+ }
|
|
|
+
|
|
|
+ useAnimation.setOnAction(actionEvent -> {
|
|
|
+ Constant.useAnimation = useAnimation.isSelected();
|
|
|
+ if (Constant.useAnimation) {
|
|
|
+ selectOBJ.setText("Select OBJ folder");
|
|
|
+ selectMTL.setText("Select MTL folder");
|
|
|
+ } else {
|
|
|
+ selectOBJ.setText("Select OBJ file");
|
|
|
+ selectMTL.setText("Select MTL file");
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ selectOBJ.setOnAction(actionEvent -> {
|
|
|
+ if (!Constant.useAnimation) {
|
|
|
+ FileChooser fileChooser = new FileChooser();
|
|
|
+ fileChooser.setTitle("GD3D - Select OBJ file");
|
|
|
+ fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Wavefront OBJ (.obj)", "*.obj"));
|
|
|
+ File file = fileChooser.showOpenDialog(FXui.stage);
|
|
|
+ if (file != null) {
|
|
|
+ Constant.obj = file;
|
|
|
+ Constant.hasOBJ = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ DirectoryChooser directoryChooser = new DirectoryChooser();
|
|
|
+ directoryChooser.setTitle("GD3D - Select OBJ folder");
|
|
|
+ File file = directoryChooser.showDialog(FXui.stage);
|
|
|
+ if (file != null) {
|
|
|
+ Constant.obj = file;
|
|
|
+ Constant.hasOBJ = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ selectMTL.setOnAction(actionEvent -> {
|
|
|
+ if (!Constant.useAnimation) {
|
|
|
+ FileChooser fileChooser = new FileChooser();
|
|
|
+ fileChooser.setTitle("GD3D - Select MTL file");
|
|
|
+ fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Material Library File (.mtl)", "*.mtl"));
|
|
|
+ File file = fileChooser.showOpenDialog(FXui.stage);
|
|
|
+ if (file != null) {
|
|
|
+ Constant.mtl = file;
|
|
|
+ Constant.hasMTL = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ DirectoryChooser directoryChooser = new DirectoryChooser();
|
|
|
+ directoryChooser.setTitle("GD3D - Select MTL folder");
|
|
|
+ File file = directoryChooser.showDialog(FXui.stage);
|
|
|
+ if (file != null) {
|
|
|
+ Constant.mtl = file;
|
|
|
+ Constant.hasMTL = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ box.getChildren().addAll(useAnimation, selectOBJ, selectMTL);
|
|
|
+
|
|
|
+ pane.setContent(box);
|
|
|
+
|
|
|
+ pane.setPrefSize(150, 135);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setLayoutX(15);
|
|
|
+ pane.setLayoutY(40);
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+ public static Node settings() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Settings");
|
|
|
+ pane.setCollapsible(false);
|
|
|
+
|
|
|
+ VBox box = new VBox(20);
|
|
|
+ box.setSpacing(5);
|
|
|
+
|
|
|
+ CheckBox followPlayer = new CheckBox("Follow player");
|
|
|
+ followPlayer.setSelected(Constant.followPlayer);
|
|
|
+ CheckBox useColor = new CheckBox("Use color");
|
|
|
+ useColor.setSelected(Constant.useColor);
|
|
|
+ CheckBox keyFrame = new CheckBox("Key frame");
|
|
|
+ keyFrame.setSelected(Constant.useKeyframe);
|
|
|
+
|
|
|
+ followPlayer.setOnAction(actionEvent -> Constant.followPlayer = followPlayer.isSelected());
|
|
|
+ useColor.setOnAction(actionEvent -> Constant.useColor = useColor.isSelected());
|
|
|
+ keyFrame.setOnAction(actionEvent -> Constant.useKeyframe = keyFrame.isSelected());
|
|
|
+
|
|
|
+ box.getChildren().addAll(followPlayer, useColor, keyFrame);
|
|
|
+
|
|
|
+ pane.setContent(box);
|
|
|
+
|
|
|
+ pane.setPrefSize(130, 135);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setLayoutX(180);
|
|
|
+ pane.setLayoutY(40);
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+ public static Label objStatus = new Label("Has obj: " + Constant.hasOBJ);
|
|
|
+ public static Label mtlStatus = new Label("Has mtl: " + Constant.hasMTL);
|
|
|
+ public static Label gdStatus = new Label("Is gd open: " + Constant.hasGD);
|
|
|
+ public static Label readyStatus = new Label("Is ready: " + Constant.isReady);
|
|
|
+
|
|
|
+ public static Node status() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Status");
|
|
|
+ pane.setCollapsible(false);
|
|
|
+
|
|
|
+ VBox box = new VBox(20);
|
|
|
+ box.setSpacing(5);
|
|
|
+
|
|
|
+ box.getChildren().addAll(objStatus, mtlStatus, gdStatus, readyStatus);
|
|
|
+
|
|
|
+ pane.setContent(box);
|
|
|
+
|
|
|
+ pane.setPrefSize(159, 135);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setLayoutX(325);
|
|
|
+ pane.setLayoutY(40);
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Node camera() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Camera");
|
|
|
+ pane.setCollapsible(false);
|
|
|
+
|
|
|
+ GridPane box = new GridPane();
|
|
|
+ box.setVgap(5);
|
|
|
+ box.setHgap(5);
|
|
|
+ box.setPrefSize(290, 140);
|
|
|
+
|
|
|
+ //Screen center
|
|
|
+ FlowPane screenCenter = new FlowPane();
|
|
|
+ screenCenter.setPrefSize(100, 40);
|
|
|
+ screenCenter.setMaxWidth(50);
|
|
|
+ Label screenCenterLabel = new Label("Screen center (x/y)");
|
|
|
+ TextField screenCenterX = new TextField();
|
|
|
+ screenCenterX.setPromptText("x");
|
|
|
+ screenCenterX.setPrefSize(50, 20);
|
|
|
+ screenCenterX.setText(String.valueOf(Constant.xScreenCenter));
|
|
|
+ TextField screenCenterY = new TextField();
|
|
|
+ screenCenterY.setPromptText("y");
|
|
|
+ screenCenterY.setPrefSize(50,20);
|
|
|
+ screenCenterY.setText(String.valueOf(Constant.yScreenCenter));
|
|
|
+ screenCenter.getChildren().addAll(screenCenterLabel, screenCenterX, screenCenterY);
|
|
|
+
|
|
|
+ screenCenterX.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToNumber(screenCenterX, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.xScreenCenter = Utils.safeParseInt(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ screenCenterY.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToNumber(screenCenterY, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.yScreenCenter = Utils.safeParseInt(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ //Model scale
|
|
|
+ FlowPane modelScale = new FlowPane();
|
|
|
+ modelScale.setPrefSize(100, 40);
|
|
|
+ modelScale.setMaxWidth(50);
|
|
|
+ Label modelScaleLabel = new Label("Model scale");
|
|
|
+ TextField modelScaleField = new TextField();
|
|
|
+ modelScaleField.setPromptText("Scale");
|
|
|
+ modelScaleField.setPrefSize(100, 20);
|
|
|
+ modelScaleField.setText(String.valueOf(Constant.modelScale));
|
|
|
+ modelScale.getChildren().addAll(modelScaleLabel, modelScaleField);
|
|
|
+
|
|
|
+ modelScaleField.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(modelScaleField, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.modelScale = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ //Screen position
|
|
|
+ FlowPane screenPosition = new FlowPane();
|
|
|
+ screenPosition.setPrefSize(150, 40);
|
|
|
+ screenPosition.setMaxWidth(150);
|
|
|
+ Label screenPositionLabel = new Label("Screen position (x/y/z)");
|
|
|
+ TextField screenPositionX = new TextField();
|
|
|
+ screenPositionX.setPromptText("x");
|
|
|
+ screenPositionX.setPrefSize(50, 20);
|
|
|
+ screenPositionX.setText(String.valueOf(Constant.screenPositionX));
|
|
|
+ TextField screenPositionY = new TextField();
|
|
|
+ screenPositionY.setPromptText("y");
|
|
|
+ screenPositionY.setPrefSize(50,20);
|
|
|
+ screenPositionY.setText(String.valueOf(Constant.screenPositionY));
|
|
|
+ TextField screenPositionZ = new TextField();
|
|
|
+ screenPositionZ.setPromptText("z");
|
|
|
+ screenPositionZ.setPrefSize(50,20);
|
|
|
+ screenPositionZ.setText(String.valueOf(Constant.screenPositionZ));
|
|
|
+ screenPosition.getChildren().addAll(screenPositionLabel, screenPositionX, screenPositionY, screenPositionZ);
|
|
|
+
|
|
|
+ screenPositionX.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(screenPositionX, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.screenPositionX = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+ screenPositionY.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(screenPositionY, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.screenPositionY = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+ screenPositionZ.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(screenPositionZ, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.screenPositionZ = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ //View angle
|
|
|
+ FlowPane viewAngle = new FlowPane();
|
|
|
+ viewAngle.setPrefSize(150, 40);
|
|
|
+ viewAngle.setMaxWidth(150);
|
|
|
+ Label viewAngleLabel = new Label("View angle (x/y/z)");
|
|
|
+ TextField viewAngleX = new TextField();
|
|
|
+ viewAngleX.setPromptText("x");
|
|
|
+ viewAngleX.setPrefSize(50, 20);
|
|
|
+ viewAngleX.setText(String.valueOf(Constant.viewAngleX));
|
|
|
+ TextField viewAngleY = new TextField();
|
|
|
+ viewAngleY.setPromptText("y");
|
|
|
+ viewAngleY.setPrefSize(50,20);
|
|
|
+ viewAngleY.setText(String.valueOf(Constant.viewAngleY));
|
|
|
+ TextField viewAngleZ = new TextField();
|
|
|
+ viewAngleZ.setPromptText("z");
|
|
|
+ viewAngleZ.setPrefSize(50,20);
|
|
|
+ viewAngleZ.setText(String.valueOf(Constant.viewAngleZ));
|
|
|
+ viewAngle.getChildren().addAll(viewAngleLabel, viewAngleX, viewAngleY, viewAngleZ);
|
|
|
+
|
|
|
+ viewAngleX.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(viewAngleX, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.viewAngleX = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+ viewAngleY.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(viewAngleY, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.viewAngleY = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+ viewAngleZ.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(viewAngleZ, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.viewAngleZ = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ box.add(screenCenter, 0, 0);
|
|
|
+ box.add(modelScale, 0, 1);
|
|
|
+ box.add(screenPosition, 1, 0);
|
|
|
+ box.add(viewAngle, 1, 1);
|
|
|
+
|
|
|
+ pane.setContent(box);
|
|
|
+
|
|
|
+ pane.setPrefSize(295, 140);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setLayoutX(15);
|
|
|
+ pane.setLayoutY(190);
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Node frames() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Frames");
|
|
|
+ pane.setPrefSize(160, 140);
|
|
|
+ pane.setMaxWidth(160);
|
|
|
+ pane.setMinWidth(160);
|
|
|
+ pane.setAlignment(Pos.CENTER);
|
|
|
+
|
|
|
+ GridPane box = new GridPane();
|
|
|
+ box.setPrefSize(140, 100);
|
|
|
+ box.setPadding(new Insets(10));
|
|
|
+ Label skipFrameLabel = new Label("Skip frame");
|
|
|
+ TextField skipFrame = new TextField();
|
|
|
+ skipFrame.setPromptText("frame");
|
|
|
+ skipFrame.setText(String.valueOf(Constant.skipFrame));
|
|
|
+ Label fpsLabel = new Label("FPS");
|
|
|
+ TextField FPS = new TextField();
|
|
|
+ FPS.setPromptText("FPS");
|
|
|
+ FPS.setText(String.valueOf(Constant.fps));
|
|
|
+
|
|
|
+ skipFrame.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToNumber(skipFrame, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.skipFrame = Utils.safeParseInt(t1);
|
|
|
+ });
|
|
|
+ FPS.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToFloat(FPS, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.fps = Utils.safeParseFloat(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ box.add(skipFrameLabel, 0, 0);
|
|
|
+ box.add(skipFrame, 0, 1);
|
|
|
+ box.add(fpsLabel, 0, 2);
|
|
|
+ box.add(FPS, 0, 3);
|
|
|
+ pane.setCollapsible(false);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setContent(box);
|
|
|
+ pane.setLayoutX(325);
|
|
|
+ pane.setLayoutY(190);
|
|
|
+
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Node game() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Game");
|
|
|
+
|
|
|
+ GridPane box = new GridPane();
|
|
|
+ Label gameSpeedLabel = new Label("Game speed");
|
|
|
+ String[] speed = {"Half", "Normal", "Double", "Triple", "Quadruple"};
|
|
|
+ ComboBox gameSpeed = new ComboBox(FXCollections.observableArrayList(speed));
|
|
|
+ gameSpeed.getSelectionModel().select(1);
|
|
|
+ Label startingGroupLabel = new Label("Starting Group");
|
|
|
+ TextField startingGroup = new TextField();
|
|
|
+ startingGroup.setPromptText("Group id");
|
|
|
+ startingGroup.setText(String.valueOf(Constant.startingGroup));
|
|
|
+
|
|
|
+ gameSpeed.setOnAction(actionEvent -> {
|
|
|
+ switch (gameSpeed.getSelectionModel().getSelectedIndex()) {
|
|
|
+ case 0:
|
|
|
+ Constant.gameSpeed = 8.4F;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ Constant.gameSpeed = 10.41667F;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ Constant.gameSpeed = 12.91667F;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ Constant.gameSpeed = 15.667F;
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ Constant.gameSpeed = 19.2F;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ startingGroup.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToNumber(startingGroup, s, t1);
|
|
|
+ if (t1.isBlank()) {
|
|
|
+ t1 = "0";
|
|
|
+ }
|
|
|
+ Constant.fps = Utils.safeParseInt(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ startingGroupLabel.setMaxWidth(100);
|
|
|
+ gameSpeedLabel.setMaxWidth(100);
|
|
|
+ gameSpeed.setMaxWidth(100);
|
|
|
+ startingGroup.setMaxWidth(100);
|
|
|
+
|
|
|
+ box.add(gameSpeedLabel, 0, 0);
|
|
|
+ box.add(gameSpeed, 0, 1);
|
|
|
+ box.add(startingGroupLabel, 0, 2);
|
|
|
+ box.add(startingGroup, 0, 3);
|
|
|
+ pane.setCollapsible(false);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setContent(box);
|
|
|
+ pane.setLayoutX(15);
|
|
|
+ pane.setLayoutY(345);
|
|
|
+ pane.setPrefSize(130, 140);
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Node optimisation() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Optimisation");
|
|
|
+ pane.setPrefSize(100, 140);
|
|
|
+
|
|
|
+ FlowPane box = new FlowPane();
|
|
|
+ box.setPrefSize(100, 130);
|
|
|
+ Label triggersLabel = new Label("Triggers");
|
|
|
+ CheckBox optimizeColors = new CheckBox("Optimize colors");
|
|
|
+ CheckBox optimizeGradients = new CheckBox("Optimize Gradients");
|
|
|
+
|
|
|
+ optimizeColors.setOnAction(actionEvent -> {
|
|
|
+ Constant.optimizeColor = optimizeColors.isSelected();
|
|
|
+ });
|
|
|
+ optimizeGradients.setOnAction(actionEvent -> {
|
|
|
+ Constant.optimizeGradient = optimizeGradients.isSelected();
|
|
|
+ });
|
|
|
+
|
|
|
+ box.getChildren().addAll(triggersLabel, optimizeColors, optimizeGradients);
|
|
|
+ pane.setCollapsible(false);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setContent(box);
|
|
|
+ pane.setLayoutX(160);
|
|
|
+ pane.setLayoutY(345);
|
|
|
+
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Node other() {
|
|
|
+ TitledPane pane = new TitledPane();
|
|
|
+ pane.setText("Other");
|
|
|
+ pane.setPrefSize(145, 140);
|
|
|
+
|
|
|
+ GridPane box = new GridPane();
|
|
|
+ box.setPrefSize(100, 130);
|
|
|
+ Label placeDelayLabel = new Label("Place delay (ms)");
|
|
|
+ TextField placeDelay = new TextField();
|
|
|
+ placeDelay.setPromptText("Delay");
|
|
|
+ placeDelay.setText(String.valueOf(Constant.placeDelay));
|
|
|
+
|
|
|
+ placeDelay.textProperty().addListener((observableValue, s, t1) -> {
|
|
|
+ Utils.fixToNumber(placeDelay, s, t1);
|
|
|
+ Constant.placeDelay = Utils.safeParseInt(t1);
|
|
|
+ });
|
|
|
+
|
|
|
+ box.add(placeDelayLabel, 0, 0);
|
|
|
+ box.add(placeDelay, 0, 1);
|
|
|
+ pane.setCollapsible(false);
|
|
|
+ pane.setAlignment(Pos.TOP_CENTER);
|
|
|
+ pane.setContent(box);
|
|
|
+ pane.setLayoutX(340);
|
|
|
+ pane.setLayoutY(345);
|
|
|
+
|
|
|
+ return pane;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Node getBar() {
|
|
|
+ MenuBar bar = new MenuBar();
|
|
|
+ bar.setLayoutX(0);
|
|
|
+ bar.setLayoutY(0);
|
|
|
+ bar.setPrefSize(500, 25);
|
|
|
+
|
|
|
+ Menu actions = new Menu("Actions");
|
|
|
+ MenuItem actions1 = new MenuItem("Send to Geometry Dash");
|
|
|
+ MenuItem actions2 = new MenuItem("Save level string");
|
|
|
+
|
|
|
+ actions1.setOnAction(actionEvent -> {
|
|
|
+ try {
|
|
|
+ if (Constant.isReady) {
|
|
|
+ if (Constant.useKeyframe) {
|
|
|
+ new Generate3D().GenerateAnimKeyframe();
|
|
|
+ } else {
|
|
|
+ new Generate3D().GenerateAnimMove();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ FXWarning.error("Error !", "The app is not ready !\n" +
|
|
|
+ "Verify that:\n" +
|
|
|
+ "- GD is opened in the editor with the WSLiveEditor mod\n" +
|
|
|
+ "- You selected the OBJ file/folder\n" +
|
|
|
+ "- You selected the MTL file/folder",
|
|
|
+ 450, 150);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ actions.getItems().add(actions1);
|
|
|
+ actions.getItems().add(actions2);
|
|
|
+
|
|
|
+ Menu files = new Menu("Files");
|
|
|
+ files.getItems().add(new MenuItem("Save settings"));
|
|
|
+
|
|
|
+ Menu tools = new Menu("Tools");
|
|
|
+ MenuItem tools1 = new MenuItem("BPM to FPS");
|
|
|
+
|
|
|
+ tools1.setOnAction(actionEvent -> FXBPMtoFPS.show());
|
|
|
+
|
|
|
+ tools.getItems().add(tools1);
|
|
|
+
|
|
|
+ Menu help = new Menu("Help");
|
|
|
+ MenuItem help1 = new MenuItem("Wiki");
|
|
|
+ MenuItem help2 = new MenuItem("Issue");
|
|
|
+ MenuItem help3 = new MenuItem("Discord");
|
|
|
+
|
|
|
+ help1.setOnAction(actionEvent -> Main.ui.getHostservices().showDocument("https://github.com/tbvns/GD3D/wiki"));
|
|
|
+ help2.setOnAction(actionEvent -> Main.ui.getHostservices().showDocument("https://github.com/tbvns/GD3D/issues"));
|
|
|
+ help3.setOnAction(actionEvent -> Main.ui.getHostservices().showDocument("https://discord.gg/SYtmsjSMu6"));
|
|
|
+
|
|
|
+ help.getItems().addAll(help1, help2, help3);
|
|
|
+
|
|
|
+ Menu credits = new Menu("Credits");
|
|
|
+ MenuItem credits1 = new MenuItem("Github");
|
|
|
+ MenuItem credits2 = new MenuItem("Discord");
|
|
|
+ MenuItem credits3 = new MenuItem("Contributors");
|
|
|
+ MenuItem credits4 = new MenuItem("About");
|
|
|
+
|
|
|
+ credits1.setOnAction(actionEvent -> Main.ui.getHostservices().showDocument("https://github.com/tbvns/GD3D/"));
|
|
|
+ credits2.setOnAction(actionEvent -> Main.ui.getHostservices().showDocument("https://discord.gg/SYtmsjSMu6"));
|
|
|
+ credits3.setOnAction(actionEvent -> Main.ui.getHostservices().showDocument("https://github.com/tbvns/GD3D/graphs/contributors"));
|
|
|
+ credits4.setOnAction(actionEvent -> FXAbout.show());
|
|
|
+
|
|
|
+ credits.getItems().addAll(credits1, credits2, credits3, credits4);
|
|
|
+
|
|
|
+ bar.getMenus().addAll(actions, files, tools, help, credits);
|
|
|
+
|
|
|
+ return bar;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void startApp() {
|
|
|
+ launch();
|
|
|
+ }
|
|
|
+}
|