浏览代码

Changed things i guess, I don't remember tbh

tbvns 5 月之前
父节点
当前提交
5824243860

+ 15 - 0
GD4J/src/main/java/xyz/tbvns/GDConstant.java

@@ -0,0 +1,15 @@
+package xyz.tbvns;
+
+public class GDConstant {
+    public static final double SLOW_SPEED = 8.6;
+    public static final double NORMAL_SPEED = 10.4;
+    public static final double FAST_SPEED = 12.96;
+    public static final double FASTER_SPEED = 15.6;
+    public static final double FASTEST_SPEED = 19.27;
+
+    public static final int SLOW_SPEED_OBJECT_ID = 200;
+    public static final int NORMAL_SPEED_OBJECT_ID = 201;
+    public static final int FAST_SPEED_OBJECT_ID = 202;
+    public static final int FASTER_SPEED_OBJECT_ID = 203;
+    public static final int FASTEST_SPEED_OBJECT_ID = 1334;
+}

+ 66 - 0
GD4J/src/main/java/xyz/tbvns/Objects/Level.java

@@ -1,6 +1,12 @@
 package xyz.tbvns.Objects;
 package xyz.tbvns.Objects;
 
 
 import lombok.Data;
 import lombok.Data;
+import xyz.tbvns.GDConstant;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
 
 
 @Data
 @Data
 public class Level {
 public class Level {
@@ -12,4 +18,64 @@ public class Level {
     private int creatorLine;
     private int creatorLine;
     private int descriptionLine;
     private int descriptionLine;
     private int encodedLevelStringLine;
     private int encodedLevelStringLine;
+
+    private HashMap<Float, Double> percentToSpeed = new HashMap<>();
+    private float maxPos;
+
+    public void read() throws IOException {
+        List<Object> objects = Object.fromLevel(this);
+        if (objects.get(0).getProperties().containsKey("kA4")) {
+            int speed = Integer.parseInt(objects.get(0).getProperties().get("kA4"));
+            switch (speed) {
+                case 0:
+                    percentToSpeed.put(0f, GDConstant.SLOW_SPEED);
+                case 1:
+                    percentToSpeed.put(0f, GDConstant.NORMAL_SPEED);
+                case 2:
+                    percentToSpeed.put(0f, GDConstant.FAST_SPEED);
+                case 3:
+                    percentToSpeed.put(0f, GDConstant.FASTER_SPEED);
+                case 4:
+                    percentToSpeed.put(0f, GDConstant.FASTEST_SPEED);
+            }
+        } else {
+            percentToSpeed.put(0f, GDConstant.NORMAL_SPEED);
+        }
+
+        for (Object obj : objects) {
+            if (obj.getProperties().containsKey("2")) {
+                float x = Float.parseFloat(obj.getProperties().get("2"));
+                if (maxPos < x) maxPos = x;
+            }
+        }
+
+        for (Object obj : objects) {
+            if (obj.getProperties().containsKey("1")) {
+                float x = Float.parseFloat(obj.getProperties().get("2"));
+                if (obj.getProperties().get("1").equals(String.valueOf(GDConstant.SLOW_SPEED_OBJECT_ID))) {
+                    percentToSpeed.put((x / maxPos) * 100, GDConstant.SLOW_SPEED);
+                } else if (obj.getProperties().get("1").equals(String.valueOf(GDConstant.NORMAL_SPEED_OBJECT_ID))) {
+                    percentToSpeed.put((x / maxPos) * 100, GDConstant.NORMAL_SPEED);
+                } else if (obj.getProperties().get("1").equals(String.valueOf(GDConstant.FAST_SPEED_OBJECT_ID))) {
+                    percentToSpeed.put((x / maxPos) * 100, GDConstant.FAST_SPEED);
+                } else if (obj.getProperties().get("1").equals(String.valueOf(GDConstant.FASTER_SPEED_OBJECT_ID))) {
+                    percentToSpeed.put((x / maxPos) * 100, GDConstant.FASTER_SPEED);
+                } else if (obj.getProperties().get("1").equals(String.valueOf(GDConstant.FASTEST_SPEED_OBJECT_ID))) {
+                    percentToSpeed.put((x / maxPos) * 100, GDConstant.FASTEST_SPEED);
+                }
+            }
+        }
+    }
+
+    public double getSpeedAt(float percent) {
+        AtomicReference<Double> value = new AtomicReference<>((double) 8.6f);
+        AtomicReference<Float> max = new AtomicReference<>((float) 0);
+        percentToSpeed.forEach((k, v) -> {
+            if (max.get() <= k && k <= percent) {
+                max.set(k);
+                value.set(v);
+            }
+        });
+        return value.get();
+    }
 }
 }

+ 23 - 2
PowerGDEditor/src/main/java/xyz/tbvns/Editor/ModelsManager.java

@@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g3d.Model;
 import com.badlogic.gdx.graphics.g3d.ModelInstance;
 import com.badlogic.gdx.graphics.g3d.ModelInstance;
 import lombok.Getter;
 import lombok.Getter;
 import xyz.tbvns.Models.Animation;
 import xyz.tbvns.Models.Animation;
+import xyz.tbvns.Models.GDInstance;
 import xyz.tbvns.Models.GDModel;
 import xyz.tbvns.Models.GDModel;
 import xyz.tbvns.Models.OBJReader;
 import xyz.tbvns.Models.OBJReader;
 import xyz.tbvns.Physics.BulletManager;
 import xyz.tbvns.Physics.BulletManager;
@@ -14,6 +15,7 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Random;
 
 
 public class ModelsManager {
 public class ModelsManager {
     public static final List<GDModel> models = new ArrayList<>();
     public static final List<GDModel> models = new ArrayList<>();
@@ -77,10 +79,29 @@ public class ModelsManager {
         frame.setVisible(false);
         frame.setVisible(false);
     }
     }
 
 
-    public static void select(GDModel model) {
+    public static void add(GDModel model) {
         selectedModel = model.toModel();
         selectedModel = model.toModel();
         selectedModelInstance = new ModelInstance(selectedModel);
         selectedModelInstance = new ModelInstance(selectedModel);
-        selectedModelInstance.userData = model;
+        selectedModelInstance.userData = new GDInstance(
+                selectedModelInstance,
+                model.getName(),
+                model.getName() + "-" + new Random().nextInt(0, 9999)
+        );
+        BulletManager.addModel(selectedModelInstance);
+        loadedModels.add(selectedModelInstance);
+    }
+
+    public static void addAnimation(Animation animation) {
+        selectedModel = animation.getFrames().get(0).toModel();
+        selectedModelInstance = new ModelInstance(selectedModel);
+        selectedModelInstance.userData = new GDInstance(
+                    selectedModelInstance,
+                    24,
+                    6,
+                    0,
+                    animation.getName(),
+                    animation.getName() + new Random().nextInt(0, 9999)
+                );
         BulletManager.addModel(selectedModelInstance);
         BulletManager.addModel(selectedModelInstance);
         loadedModels.add(selectedModelInstance);
         loadedModels.add(selectedModelInstance);
     }
     }

+ 1 - 9
PowerGDEditor/src/main/java/xyz/tbvns/Inputs/inputManager.java

@@ -3,22 +3,14 @@ package xyz.tbvns.Inputs;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Input;
 import com.badlogic.gdx.Input;
 import com.badlogic.gdx.graphics.Camera;
 import com.badlogic.gdx.graphics.Camera;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g3d.Material;
-import com.badlogic.gdx.graphics.g3d.Model;
 import com.badlogic.gdx.graphics.g3d.ModelInstance;
 import com.badlogic.gdx.graphics.g3d.ModelInstance;
 import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
 import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
-import com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder;
-import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
 import com.badlogic.gdx.math.Intersector;
 import com.badlogic.gdx.math.Intersector;
-import com.badlogic.gdx.math.Octree;
 import com.badlogic.gdx.math.Vector3;
 import com.badlogic.gdx.math.Vector3;
 import com.badlogic.gdx.math.collision.BoundingBox;
 import com.badlogic.gdx.math.collision.BoundingBox;
 import com.badlogic.gdx.math.collision.Ray;
 import com.badlogic.gdx.math.collision.Ray;
-import com.badlogic.gdx.physics.bullet.collision.btCollisionObject;
 import xyz.tbvns.Editor.ModelsManager;
 import xyz.tbvns.Editor.ModelsManager;
 import xyz.tbvns.Main;
 import xyz.tbvns.Main;
-import xyz.tbvns.Physics.BulletManager;
 import xyz.tbvns.ui.UIManager;
 import xyz.tbvns.ui.UIManager;
 import xyz.tbvns.ui.Windows.ObjectEdit;
 import xyz.tbvns.ui.Windows.ObjectEdit;
 
 
@@ -84,7 +76,7 @@ public class inputManager extends CameraInputController {
         Ray ray = Main.getCamera().getPickRay(x, y, 0, 200, Main.getCamera().viewportWidth, Main.getCamera().viewportHeight);
         Ray ray = Main.getCamera().getPickRay(x, y, 0, 200, Main.getCamera().viewportWidth, Main.getCamera().viewportHeight);
 
 
         Vector3 rayStart = ray.origin;
         Vector3 rayStart = ray.origin;
-        Vector3 rayEnd = ray.origin.cpy().add(ray.direction.cpy().scl(1000f));  // Long ray to ensure it reaches objects
+        Vector3 rayEnd = ray.origin.cpy().add(ray.direction.cpy().scl(10000f));
 
 
         ray.set(rayStart, rayEnd);
         ray.set(rayStart, rayEnd);
 
 

+ 9 - 0
PowerGDEditor/src/main/java/xyz/tbvns/LevelInfo.java

@@ -4,10 +4,19 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 import xyz.tbvns.Objects.Level;
 import xyz.tbvns.Objects.Level;
 
 
+import java.util.HashMap;
+
 
 
 public class LevelInfo {
 public class LevelInfo {
     @Getter @Setter
     @Getter @Setter
     private static Level level;
     private static Level level;
     @Getter @Setter
     @Getter @Setter
     private static String levelString;
     private static String levelString;
+
+    static {
+        level = new Level();
+        level.setName("Unknown");
+        level.setDescription("Unknown");
+        level.setMaxPos(1);
+    }
 }
 }

+ 1 - 0
PowerGDEditor/src/main/java/xyz/tbvns/Main.java

@@ -54,6 +54,7 @@ public class Main extends ApplicationAdapter {
         camera = new PerspectiveCamera(60, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
         camera = new PerspectiveCamera(60, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
         camera.far = 1000;
         camera.far = 1000;
         camera.near = 0.01f;
         camera.near = 0.01f;
+        camera.position.set(10, 2, 30);
         viewport = new CustomViewport(camera);
         viewport = new CustomViewport(camera);
 
 
         Gdx.gl.glEnable(GL11.GL_BLEND);
         Gdx.gl.glEnable(GL11.GL_BLEND);

+ 1 - 1
PowerGDEditor/src/main/java/xyz/tbvns/Models/Animation.java

@@ -19,7 +19,7 @@ public class Animation implements Renderable {
         ImGui.text(name);
         ImGui.text(name);
         ImGui.text("Frames:" + frames.size());
         ImGui.text("Frames:" + frames.size());
         if (ImGui.button("Add " + name)) {
         if (ImGui.button("Add " + name)) {
-            ModelsManager.select(frames.get(0));
+            ModelsManager.addAnimation(this);
         }
         }
     }
     }
 }
 }

+ 37 - 0
PowerGDEditor/src/main/java/xyz/tbvns/Models/GDInstance.java

@@ -0,0 +1,37 @@
+package xyz.tbvns.Models;
+
+import com.badlogic.gdx.graphics.g3d.ModelInstance;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class GDInstance {
+    public GDInstance(ModelInstance instance, String name, String id) {
+        this.instance = instance;
+        this.name = name;
+        this.id = id;
+        this.animation = false;
+    }
+
+    public GDInstance(ModelInstance instance, int fps, int frameSkip, int start, String name, String id) {
+        this.instance = instance;
+        this.fps = fps;
+        this.frameSkip = frameSkip;
+        this.start = start;
+        this.name = name;
+        this.id = id;
+        animation = true;
+        expanded = false;
+    }
+
+    private ModelInstance instance;
+    private boolean animation;
+    private int start;
+    private int current;
+    private int fps, frameSkip;
+    //TODO: ad keyframes
+    private String name, id;
+    private boolean expanded;
+}

+ 1 - 1
PowerGDEditor/src/main/java/xyz/tbvns/Models/GDModel.java

@@ -72,7 +72,7 @@ public class GDModel implements Renderable {
         ImGui.separator();
         ImGui.separator();
         ImGui.text(name);
         ImGui.text(name);
         if (ImGui.button("Add " + name)) {
         if (ImGui.button("Add " + name)) {
-            ModelsManager.select(this);
+            ModelsManager.add(this);
         }
         }
     }
     }
 }
 }

+ 5 - 7
PowerGDEditor/src/main/java/xyz/tbvns/ui/Elements/ModelsList.java

@@ -3,7 +3,6 @@ package xyz.tbvns.ui.Elements;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Gdx;
 import imgui.ImGui;
 import imgui.ImGui;
 import imgui.flag.ImGuiWindowFlags;
 import imgui.flag.ImGuiWindowFlags;
-import org.lwjgl.PointerBuffer;
 import org.lwjgl.util.tinyfd.TinyFileDialogs;
 import org.lwjgl.util.tinyfd.TinyFileDialogs;
 import xyz.tbvns.Editor.ModelsManager;
 import xyz.tbvns.Editor.ModelsManager;
 import xyz.tbvns.Models.Animation;
 import xyz.tbvns.Models.Animation;
@@ -11,11 +10,8 @@ import xyz.tbvns.Models.GDModel;
 import xyz.tbvns.ui.Element;
 import xyz.tbvns.ui.Element;
 import xyz.tbvns.ui.Renderable;
 import xyz.tbvns.ui.Renderable;
 
 
-import javax.swing.filechooser.FileNameExtensionFilter;
 import java.awt.*;
 import java.awt.*;
 import java.io.File;
 import java.io.File;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
@@ -30,14 +26,13 @@ public class ModelsList implements Element {
         modelsTab();
         modelsTab();
         ImGui.endTabBar();
         ImGui.endTabBar();
 
 
-
         ImGui.end();
         ImGui.end();
     }
     }
 
 
     public void modelsTab() {
     public void modelsTab() {
         ImGui.beginTabItem("Assets");
         ImGui.beginTabItem("Assets");
         loadButton();
         loadButton();
-        animationButtons();
+        modelList();
         ImGui.endTabItem();
         ImGui.endTabItem();
     }
     }
 
 
@@ -78,7 +73,7 @@ public class ModelsList implements Element {
         }
         }
     }
     }
 
 
-    public void animationButtons() {
+    public void modelList() {
         List<Renderable> renderables = new ArrayList<>();
         List<Renderable> renderables = new ArrayList<>();
         for (GDModel model : ModelsManager.models) {
         for (GDModel model : ModelsManager.models) {
             renderables.add(model);
             renderables.add(model);
@@ -90,5 +85,8 @@ public class ModelsList implements Element {
         for (Renderable renderable : renderables) {
         for (Renderable renderable : renderables) {
             renderable.render();
             renderable.render();
         }
         }
+        if (ModelsManager.models.size() + ModelsManager.animations.size() == 0) {
+            ImGui.text("No models available.\nTry loading some.");
+        }
     }
     }
 }
 }

+ 54 - 17
PowerGDEditor/src/main/java/xyz/tbvns/ui/Elements/Timeline.java

@@ -6,8 +6,12 @@ import com.badlogic.gdx.graphics.g3d.ModelInstance;
 import imgui.ImGui;
 import imgui.ImGui;
 import imgui.extension.imguizmo.ImGuizmo;
 import imgui.extension.imguizmo.ImGuizmo;
 import imgui.flag.ImGuiWindowFlags;
 import imgui.flag.ImGuiWindowFlags;
+import imgui.type.ImInt;
 import imgui.type.ImString;
 import imgui.type.ImString;
 import xyz.tbvns.Editor.ModelsManager;
 import xyz.tbvns.Editor.ModelsManager;
+import xyz.tbvns.LevelInfo;
+import xyz.tbvns.Main;
+import xyz.tbvns.Models.GDInstance;
 import xyz.tbvns.Models.GDModel;
 import xyz.tbvns.Models.GDModel;
 import xyz.tbvns.ui.Element;
 import xyz.tbvns.ui.Element;
 
 
@@ -15,31 +19,64 @@ import java.util.HashMap;
 import java.util.Random;
 import java.util.Random;
 
 
 public class Timeline implements Element {
 public class Timeline implements Element {
-    private HashMap<ModelInstance, String> name = new HashMap<>();
-    private HashMap<ModelInstance, String> id = new HashMap<>();
 
 
     @Override
     @Override
     public void render() {
     public void render() {
         ImGui.begin("TimeMenu", ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoBringToFrontOnFocus);
         ImGui.begin("TimeMenu", ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoBringToFrontOnFocus);
+        float[] pos = new float[]{Main.getCamera().position.x / (LevelInfo.getLevel().getMaxPos() / 30) * 100};
+        ImGui.pushItemWidth(ImGui.getWindowWidth() - 16);
+        ImGui.sliderFloat("##Slider%", pos, 0, 100);
+        Main.getCamera().position.set((pos[0] / 100) * (LevelInfo.getLevel().getMaxPos() / 30), Main.getCamera().position.y, Main.getCamera().position.z);
         ImGui.setWindowSize(Gdx.graphics.getWidth(), 201);
         ImGui.setWindowSize(Gdx.graphics.getWidth(), 201);
         ImGui.setWindowPos(0, Gdx.graphics.getHeight() - 201);
         ImGui.setWindowPos(0, Gdx.graphics.getHeight() - 201);
-        //TODO: replace every model with an object that contains the following information:
-        // - start and en frame
-        // - FPS for animation
-        // - keyframes for positions and scale
-        // - name
-        // - id (unique)
-        // - more thing if I have an idea later
+
+        ImGui.pushItemWidth(200);
+        ImGui.labelText("##", "Name:");
+        ImGui.sameLine();
+        ImGui.pushItemWidth(100);
+        ImGui.labelText("##", "FPS:");
+        ImGui.sameLine();
+        ImGui.pushItemWidth(100);
+        ImGui.labelText("##", "Frame skip:");
+        ImGui.sameLine();
+        ImGui.pushItemWidth(100);
+        ImGui.labelText("##", "Start frame:");
+
         for (ModelInstance model : ModelsManager.getLoadedModels()) {
         for (ModelInstance model : ModelsManager.getLoadedModels()) {
-            ImString string;
-            if (name.containsKey(model)) {
-                string = new ImString(name.get(model));
-            } else {
-                string = new ImString(((GDModel) model.userData).getName() + "-" + new Random().nextInt(1000, 9999));
-                id.put(model, "##" + new Random().nextInt(1000, 9999999));
+            GDInstance instance = ((GDInstance) model.userData);
+            ImString name = new ImString(instance.getName());
+            ImGui.pushItemWidth(200);
+            ImGui.inputText("##name" + instance.getId(), name);
+            instance.setName(name.get());
+
+            ImGui.sameLine();
+            ImInt fps = new ImInt(instance.getFps());
+            ImGui.pushItemWidth(100);
+            ImGui.inputInt("##fps" + instance.getId(), fps);
+            instance.setFps(fps.get());
+
+            if (instance.isAnimation()) {
+                ImGui.sameLine();
+                ImInt skipFrame = new ImInt(instance.getFrameSkip());
+                ImGui.pushItemWidth(100);
+                ImGui.inputInt("##frameSkip" + instance.getId(), skipFrame);
+                instance.setFrameSkip(skipFrame.get());
+
+                ImGui.sameLine();
+                ImInt startFrame = new ImInt(instance.getStart());
+                ImGui.pushItemWidth(100);
+                ImGui.inputInt("##startFrame" + instance.getId(), startFrame);
+                instance.setStart(startFrame.get());
+
+                ImGui.sameLine();
+                if (ImGui.checkbox("Expand", instance.isExpanded())) {
+                    instance.setExpanded(!instance.isExpanded());
+                }
             }
             }
-            ImGui.inputText(id.get(model), string);
-            name.put(model, new String(string.getData()));
+        }
+
+        if (ModelsManager.getLoadedModels().size() == 0) {
+            ImGui.text("No models loaded.\nTry adding some.");
         }
         }
 
 
         ImGui.end();
         ImGui.end();

+ 3 - 1
PowerGDEditor/src/main/java/xyz/tbvns/ui/Windows/LevelSelector.java

@@ -34,13 +34,15 @@ public class LevelSelector implements Element {
         }
         }
     }
     }
 
 
+    ImString string = new ImString();;
+
     public void render() {
     public void render() {
         ImGui.begin("Load a level:", ImGuiWindowFlags.NoCollapse);
         ImGui.begin("Load a level:", ImGuiWindowFlags.NoCollapse);
-        ImString string = new ImString();
         ImGui.inputTextWithHint("##", "Search...", string, ImGuiInputTextFlags.AutoSelectAll);
         ImGui.inputTextWithHint("##", "Search...", string, ImGuiInputTextFlags.AutoSelectAll);
         for (Level level : levelList) {
         for (Level level : levelList) {
             if (level.getName().toLowerCase().contains(string.get().toLowerCase()) && ImGui.button(level.getName())) {
             if (level.getName().toLowerCase().contains(string.get().toLowerCase()) && ImGui.button(level.getName())) {
                 try {
                 try {
+                    level.read();
                     Main.modelCache = LevelUtils.generateModelCache(level);
                     Main.modelCache = LevelUtils.generateModelCache(level);
                     LevelInfo.setLevel(level);
                     LevelInfo.setLevel(level);
                     LevelInfo.setLevelString(Decoder.decodeLevel(level.getEncodedLevelString()));
                     LevelInfo.setLevelString(Decoder.decodeLevel(level.getEncodedLevelString()));