Browse Source

made it 20000000x faster to render, but perspective projection still isn't working

____tbvns____ 5 months ago
parent
commit
5b4173ea27

+ 20 - 10
GD4J/src/main/java/xyz/tbvns/LevelStringBuilder.java

@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 import java.util.HashMap;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static xyz.tbvns.GDConstant.EDITOR_LAYER_PROPERTY_ID;
 
@@ -13,31 +14,40 @@ import static xyz.tbvns.GDConstant.EDITOR_LAYER_PROPERTY_ID;
 @AllArgsConstructor
 public class LevelStringBuilder {
     @Getter
-    private String levelString = "";
+    private StringBuilder levelString;
     @Getter @Setter
     private int editorLayer;
 
     public LevelStringBuilder add(double ... properties) {
-        for (double s : properties) {
-            levelString += s + ",";
+        StringBuilder local = new StringBuilder();
+//        for (double s : properties) {
+//            local += s + ",";
+//        }
+        for (int i = 0; i < properties.length; i++) {
+            StringBuilder s = new StringBuilder(String.valueOf(properties[i]));
+            if (i+1 != properties.length) {
+                s.append(",");
+            }
+            local.append(s);
         }
         if (editorLayer != 0) {
-            levelString += EDITOR_LAYER_PROPERTY_ID + "," + editorLayer + ",";
+            local.append(",").append(EDITOR_LAYER_PROPERTY_ID).append(",").append(editorLayer);
         }
-        levelString = removeLastChar(levelString);
-        levelString += ";";
+        local.append(";");
+        levelString.append(local);
         return this;
     }
 
     public LevelStringBuilder add(HashMap<String, String> properties) {
+        final AtomicReference<String> local = new AtomicReference<>("");
         properties.forEach((k, v) -> {
-            levelString += k + "," + v;
+            local.set(local.get() + k + "," + v);
         });
         if (editorLayer != 0) {
-            levelString += EDITOR_LAYER_PROPERTY_ID + "," + editorLayer + ",";
+            local.set(local.get() + EDITOR_LAYER_PROPERTY_ID + "," + editorLayer + ",");
         }
-        levelString = removeLastChar(levelString);
-        levelString += ";";
+        local.set(removeLastChar(local.get()) + ";");
+        levelString.append(local.get());
         return this;
     }
 

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

@@ -24,8 +24,8 @@ public class Level {
 
     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"));
+        if (objects.getFirst().getProperties().containsKey("kA4")) {
+            int speed = Integer.parseInt(objects.getFirst().getProperties().get("kA4"));
             switch (speed) {
                 case 0:
                     percentToSpeed.put(0f, GDConstant.SLOW_SPEED);

+ 20 - 23
PowerGDEditor/src/main/java/xyz/tbvns/GeometryDash/Render.java

@@ -3,10 +3,7 @@ package xyz.tbvns.GeometryDash;
 import com.badlogic.gdx.graphics.g3d.ModelInstance;
 import com.badlogic.gdx.math.Vector3;
 import lombok.extern.slf4j.Slf4j;
-import org.joml.Matrix4d;
-import org.joml.Vector3d;
-import org.joml.Vector4d;
-import org.joml.Vector4f;
+import org.joml.*;
 import xyz.tbvns.Editor.ModelsManager;
 import xyz.tbvns.GDConstant;
 import xyz.tbvns.LevelInfo;
@@ -15,6 +12,7 @@ import xyz.tbvns.Models.Face;
 import xyz.tbvns.Models.GDInstance;
 import xyz.tbvns.Models.GDModel;
 
+import java.lang.Math;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -26,24 +24,23 @@ public class Render {
     public double currentPercent;
     public double currentDistance;
     public HashMap<GDInstance, Integer> animationToCurrentframe = new HashMap<>();
+
     public String fullRender(double fps) {
-        LevelStringBuilder builder = new LevelStringBuilder(LevelInfo.getLevelString(), 10); //TODO: make the editor layer configurable
+        LevelStringBuilder builder = new LevelStringBuilder(new StringBuilder(LevelInfo.getLevelString()), 10); //TODO: make the editor layer configurable
+        Matrix4f camera = new Matrix4f();
+        camera.perspective((float) Math.toRadians(2),  (float) 16 /9, 0.001F, 1000);
         while (currentPercent <= 1) {
             double speed = LevelInfo.getLevel().getSpeedAt((float) currentPercent);
             double distancePerFrame = (speed / fps);
-//            currentPercent += distancePerFrame;
             double realDistancePerFrame = (speed / fps) * 30;
             double distancePerFramePercent = realDistancePerFrame / LevelInfo.getLevel().getMaxPos() / 30;
             currentPercent += distancePerFramePercent;
-            System.out.println(currentPercent);
-//            log.info("Speed: {} \n distancePerFrame: {} \n currentPercent: {} \n realDistancePerFrame: {}");
 
-            Matrix4d camera = new Matrix4d();
-            camera.perspective(Math.toRadians(2), (double) 16/9, 0.001, 1000);
-            Vector3d cameraTranslation = new Vector3d(realDistancePerFrame * currentPercent, 5, 10);
+            Vector3f cameraTranslation = new Vector3f(0, 0, 5);
             camera.translation(cameraTranslation); //TODO: make that follow a new camera path editor
             //builder.add(1, 1, X_PROPERTY_ID, projectPoint(camera, new Vector4f((float) cameraTranslation.x, (float) cameraTranslation.y, (float) cameraTranslation.z, 0)).x, Y_PROPERTY_ID,projectPoint(camera, new Vector4f((float) cameraTranslation.x, (float) cameraTranslation.y, (float) cameraTranslation.z, 0)).y);
 
+            System.out.println(currentPercent * 100);
 
             for (ModelInstance model : ModelsManager.getLoadedModels()) {
                 GDInstance instance = (GDInstance) model.userData;
@@ -56,9 +53,9 @@ public class Render {
                         for (Face face : gdModel.getFaces()) {
                             for (Vector4f point : face.points) {
                                 Vector3 translation = instance.getInstance().transform.getTranslation(Vector3.Zero);
-                                point = point.add(translation.x, translation.y, translation.z, 0);
-                                Vector4d projected = projectPoint(camera, point);
-                                builder.add(1, POINT_OBJECT_ID, X_PROPERTY_ID, projected.x, Y_PROPERTY_ID, projected.y);
+                                point = point.add(translation.x, translation.y, translation.z, 1);
+                                Vector4f projected = projectPoint(camera, point);
+                                builder.add(1, POINT_OBJECT_ID, X_PROPERTY_ID, projected.x * 30, Y_PROPERTY_ID, projected.y * 30);
                             }
                         }
                     } else {
@@ -69,25 +66,25 @@ public class Render {
                     for (Face face : gdModel.getFaces()) {
                         for (Vector4f point : face.points) {
                             Vector3 translation = instance.getInstance().transform.getTranslation(Vector3.Zero);
-                            point = point.add(translation.x, translation.y, translation.z, 0);
-                            Vector4d projected = projectPoint(camera, point);
+                            point = point.add(translation.x * 30, translation.y * 30, translation.z * 30, 1);
+                            Vector4f projected = projectPoint(camera, point);
                             builder.add(1, POINT_OBJECT_ID, X_PROPERTY_ID, projected.x, Y_PROPERTY_ID, projected.y);
                         }
                     }
                 }
             }
         }
-        return builder.getLevelString();
+        return builder.getLevelString().toString();
     }
 
-    public Vector4d projectPoint(Matrix4d camera, Vector4f input) {
-        Vector4d point = camera.transform(new Vector4d(input.x, input.y, input.z, input.w));
+    public Vector4f projectPoint(Matrix4f camera, Vector4f input) {
+        camera.transform(input);
 
-        point.x = (float) (point.x / point.w);
-        point.y = (float) (point.y / point.w);
-        point.z = (float) (point.z / point.w);
+        input.x = input.x / input.w;
+        input.y = input.y / input.w;
+        input.z = input.z / input.w;
 
-        return point;
+        return input;
     }
 
     public static float getZ(Face face) {

+ 1 - 1
PowerGDEditor/src/main/java/xyz/tbvns/ui/MenuBarTabs/SaveMenu.java

@@ -16,7 +16,7 @@ public class SaveMenu implements MenuBarTab {
         if (ImGui.beginMenu("Files")) {
             if (ImGui.menuItem("Save", "CTRL S")) {
                 try {
-                    LevelInfo.setLevelString(LevelInfo.getLevelString() + new Render().fullRender(24));
+                    LevelInfo.setLevelString(new Render().fullRender(24));
                     LevelInfo.getLevel().setEncodedLevelString(Decoder.encodeLevel(LevelInfo.getLevelString()));
                     DataManager.saveLevel(LevelInfo.getLevel());
                 } catch (Exception e) {