Forráskód Böngészése

Model loading (colors are broken but IDC)

____tbvns____ 6 hónapja
szülő
commit
e057a84509

+ 12 - 0
PowerGDEditor/pom.xml

@@ -17,6 +17,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
+    <repositories>
+        <repository>
+            <id>jitpack.io</id>
+            <url>https://jitpack.io</url>
+        </repository>
+    </repositories>
+
     <dependencies>
         <dependency>
             <groupId>com.badlogicgames.gdx</groupId>
@@ -65,6 +72,11 @@
             <artifactId>imgui-java-natives-macos</artifactId>
             <version>1.86.11</version>
         </dependency>
+        <dependency>
+            <groupId>com.github.steos</groupId>
+            <artifactId>jnafilechooser</artifactId>
+            <version>1.1.2</version>
+        </dependency>
         <dependency>
             <groupId>xyz.tbvns</groupId>
             <artifactId>GD4J</artifactId>

+ 28 - 7
PowerGDEditor/src/main/java/xyz/tbvns/Editor/ModelsManager.java

@@ -1,9 +1,16 @@
 package xyz.tbvns.Editor;
 
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.g3d.Model;
+import imgui.ImGui;
+import javafx.scene.layout.Pane;
+import lombok.Getter;
 import xyz.tbvns.Models.Animation;
 import xyz.tbvns.Models.GDModel;
 import xyz.tbvns.Models.OBJReader;
 
+import javax.swing.*;
+import java.awt.*;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
@@ -13,7 +20,10 @@ public class ModelsManager {
     public static final List<GDModel> models = new ArrayList<>();
     public static final List<Animation> animations = new ArrayList<>();
 
-    public void addAnimated(File folder) throws FileNotFoundException {
+    @Getter
+    private static Model selectedModel;
+
+    public static void addAnimated(File folder) throws FileNotFoundException {
         List<File> OBJs = new ArrayList<>();
         List<File> MTLs = new ArrayList<>();
 
@@ -21,11 +31,7 @@ public class ModelsManager {
             File f = folder.listFiles()[i];
             if (f.getAbsolutePath().endsWith(".obj")) {
                 OBJs.add(f);
-            }
-        }
-
-        for (int i = 0; i < folder.listFiles().length; i++) {
-            File f = folder.listFiles()[i];
+            } else
             if (f.getAbsolutePath().endsWith(".mtl")) {
                 MTLs.add(f);
             }
@@ -33,12 +39,27 @@ public class ModelsManager {
 
         Animation animation = new Animation();
 
+        JFrame frame = new JFrame("Loading...");
+        frame.setContentPane(new JPanel() {{
+            add(new JLabel("Loading animation " + folder.getName()));
+        }});
+        frame.setSize(300, 50);
+        frame.setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2 - 150, Toolkit.getDefaultToolkit().getScreenSize().height / 2 - 25);
+        frame.setVisible(true);
+
         for (int i = 0; i < OBJs.size(); i++) {
             GDModel model = new GDModel(
-                    OBJReader.getFaceAnimation(OBJs.get(i), MTLs.get(i))
+                    OBJReader.getFaces(OBJs.get(i), MTLs.get(i)),
+                    folder.getName()
             );
             animation.getFrames().add(model);
+            animation.setName(folder.getName());
         }
         animations.add(animation);
+        frame.setVisible(false);
+    }
+
+    public static void select(Model model) {
+        selectedModel = model;
     }
 }

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

@@ -12,6 +12,7 @@ import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
 import com.badlogic.gdx.math.Vector3;
 import com.badlogic.gdx.utils.viewport.Viewport;
 import org.lwjgl.opengl.GL11;
+import xyz.tbvns.Editor.ModelsManager;
 import xyz.tbvns.Inputs.Shortcut;
 import xyz.tbvns.Inputs.inputManager;
 import xyz.tbvns.LWJGL3.CustomViewport;
@@ -33,6 +34,7 @@ public class Main extends ApplicationAdapter {
     private InputProcessor cameraInputController;
     private Viewport viewport;
     public static ModelCache modelCache;
+    public static Model selectedModel;
 
     @Override
     public void create() {
@@ -93,6 +95,9 @@ public class Main extends ApplicationAdapter {
         if (modelCache != null) {
             batch.render(modelCache);
         }
+        if (ModelsManager.getSelectedModel() != null) {
+            batch.render(new ModelInstance(ModelsManager.getSelectedModel()));
+        }
         batch.render(worldGridInstance);
         batch.render(levelGridInstance);
         batch.end();

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

@@ -1,11 +1,25 @@
 package xyz.tbvns.Models;
 
+import imgui.ImGui;
 import lombok.Data;
+import xyz.tbvns.Editor.ModelsManager;
+import xyz.tbvns.ui.Renderable;
 
 import java.util.ArrayList;
 import java.util.List;
 
 @Data
-public class Animation {
+public class Animation implements Renderable {
     private List<GDModel> frames = new ArrayList<>();
+    private String name;
+
+    @Override
+    public void render() {
+        ImGui.separator();
+        ImGui.text(name);
+        ImGui.text("Frames:" + frames.size());
+        if (ImGui.button("Select")) {
+            ModelsManager.select(frames.get(0).toModel());
+        }
+    }
 }

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

@@ -1,11 +1,15 @@
 package xyz.tbvns.Models;
 
+import com.badlogic.gdx.math.Vector3;
+import org.joml.Vector4f;
+
 import java.awt.*;
 import java.util.ArrayList;
 import java.util.List;
 
 public class Face {
-    public List<Integer> points = new ArrayList<>();
+    public List<Integer> pointsIndex = new ArrayList<>();
+    public List<Vector4f> points = new ArrayList<>();
     public boolean Has4Point = false;
     public Color color = new Color(0, 0, 0);
     public Integer colorId = 0;

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

@@ -1,13 +1,64 @@
 package xyz.tbvns.Models;
 
+import com.badlogic.gdx.graphics.*;
+import com.badlogic.gdx.graphics.g3d.Material;
+import com.badlogic.gdx.graphics.g3d.Model;
+import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
+import com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder;
+import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
+import com.badlogic.gdx.math.Vector3;
 import lombok.AllArgsConstructor;
 import lombok.Data;
-import org.joml.Vector4f;
+import xyz.tbvns.ui.Renderable;
 
 import java.util.ArrayList;
+import java.util.List;
 
 @Data
 @AllArgsConstructor
-public class GDModel {
+public class GDModel implements Renderable {
     private ArrayList<Face> faces;
+    private String name;
+
+    public Model toModel() {
+        ModelBuilder builder = new ModelBuilder();
+        builder.begin();
+        List<Mesh> meshes = new ArrayList<>();
+        for (Face face : faces) {
+            MeshPartBuilder meshBuilder = builder.part(
+                    "whytfdoineedthis",
+                    GL20.GL_TRIANGLES,
+                    VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal,
+                    new Material(
+                            ColorAttribute.createDiffuse(
+                                    face.color.getRed(),
+                                    face.color.getGreen(),
+                                    face.color.getBlue(),
+                                    face.color.getAlpha()
+                            )
+                    )
+            );
+            if (face.Has4Point) {
+                meshBuilder.rect(
+                        face.points.get(0).x, face.points.get(0).y, face.points.get(0).z,
+                        face.points.get(1).x, face.points.get(1).y, face.points.get(1).z,
+                        face.points.get(2).x, face.points.get(2).y, face.points.get(2).z,
+                        face.points.get(3).x, face.points.get(3).y, face.points.get(3).z,
+                        0, 0, 0
+                );
+
+            } else {
+                meshBuilder.setColor(face.color.getRed(), face.color.getGreen(), face.color.getBlue(), face.color.getAlpha());
+                meshBuilder.triangle(
+                        new Vector3(face.points.get(0).x, face.points.get(0).y, face.points.get(0).z),
+                        Color.BLACK,
+                        new Vector3(face.points.get(1).x, face.points.get(1).y, face.points.get(1).z),
+                        Color.BLACK,
+                        new Vector3(face.points.get(2).x, face.points.get(2).y, face.points.get(2).z),
+                        Color.BLACK
+                );
+            }
+        }
+        return builder.end();
+    }
 }

+ 12 - 50
PowerGDEditor/src/main/java/xyz/tbvns/Models/OBJReader.java

@@ -10,6 +10,7 @@ import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
 @Slf4j
@@ -31,54 +32,7 @@ public class OBJReader {
         return Points;
     }
 
-    public static ArrayList<Face> getFace(File OBJFile, File MTLFile) throws FileNotFoundException {
-        BufferedReader reader = new BufferedReader(new FileReader(OBJFile));
-        ArrayList<Face> Faces = new ArrayList<>();
-        AtomicReference<HashMap<String, Color>> materials = new AtomicReference<>(new HashMap<>());
-        AtomicReference<Color> color = new AtomicReference<>(new Color(0, 0, 0));
-        reader.lines().forEach(l -> {
-                try {
-                    materials.set(MTLReader.getColors(MTLFile));
-                } catch (FileNotFoundException e) {
-                    throw new RuntimeException(e);
-                }
-
-                if (l.startsWith("usemtl")) {
-                    color.set(materials.get().get(l.split(" ")[1]));
-                }
-
-            if (l.startsWith("f")) {
-                Face face = new Face();
-                String substring = l.substring(2);
-                String[] cord = substring.split(" ");
-                if (cord.length == 3) {
-                    for (int i = 0; i < cord.length; i++) {
-                        String id = cord[i].split("/")[0];
-                        face.points.add(Integer.valueOf(id));
-                    }
-
-                    face.color = color.get();
-
-                    Faces.add(face);
-                } else if (cord.length == 4) {
-                    for (int i = 0; i < cord.length; i++) {
-                        String id = cord[i].split("/")[0];
-                        face.points.add(Integer.valueOf(id));
-                    }
-                    face.Has4Point = true;
-
-                    face.color = color.get();
-
-                    Faces.add(face);
-                } else {
-                    log.error("A face had more than 4 point, ignoring it");
-                }
-            }
-        });
-        return Faces;
-    }
-
-    public static ArrayList<Face> getFaceAnimation(File OBJFile, File MTLFile) throws FileNotFoundException {
+    public static ArrayList<Face> getFaces(File OBJFile, File MTLFile) throws FileNotFoundException {
         BufferedReader reader = new BufferedReader(new FileReader(OBJFile));
         ArrayList<Face> Faces = new ArrayList<>();
         AtomicReference<HashMap<String, Color>> materials = new AtomicReference<>(new HashMap<>());
@@ -99,7 +53,7 @@ public class OBJReader {
                 if (cord.length == 3) {
                     for (int i = 0; i < cord.length; i++) {
                         String id = cord[i].split("/")[0];
-                        face.points.add(Integer.valueOf(id));
+                        face.pointsIndex.add(Integer.valueOf(id));
                     }
 
                     face.color = color.get();
@@ -108,7 +62,7 @@ public class OBJReader {
                 } else if (cord.length == 4) {
                     for (int i = 0; i < cord.length; i++) {
                         String id = cord[i].split("/")[0];
-                        face.points.add(Integer.valueOf(id));
+                        face.pointsIndex.add(Integer.valueOf(id));
                     }
                     face.Has4Point = true;
 
@@ -118,6 +72,14 @@ public class OBJReader {
                 } else {
                     log.error("A face had more than 4 point, ignoring it");
                 }
+                try {
+                    List<Vector4f> p = getPoints(OBJFile);
+                    for (Integer index : face.pointsIndex) {
+                        face.points.add(p.get(index-1));
+                    }
+                } catch (FileNotFoundException e) {
+                    throw new RuntimeException(e);
+                }
             }
         });
         return Faces;

+ 50 - 1
PowerGDEditor/src/main/java/xyz/tbvns/ui/Elements/ModelsList.java

@@ -3,7 +3,17 @@ package xyz.tbvns.ui.Elements;
 import com.badlogic.gdx.Gdx;
 import imgui.ImGui;
 import imgui.flag.ImGuiWindowFlags;
+import jnafilechooser.api.JnaFileChooser;
+import xyz.tbvns.Editor.ModelsManager;
+import xyz.tbvns.Models.Animation;
+import xyz.tbvns.Models.GDModel;
 import xyz.tbvns.ui.Element;
+import xyz.tbvns.ui.Renderable;
+
+import java.awt.*;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class ModelsList implements Element {
     @Override
@@ -12,7 +22,46 @@ public class ModelsList implements Element {
         ImGui.setWindowSize(200, Gdx.graphics.getHeight() - 19 - 200);
         ImGui.setWindowPos(0, 19);
 
-        ImGui.button("Load a model");
+        ImGui.beginTabBar("modelbar");
+        modelsTab();
+        ImGui.endTabBar();
+
+
         ImGui.end();
     }
+
+    public void modelsTab() {
+        ImGui.beginTabItem("Models");
+        loadButton();
+        modelsButtons();
+        ImGui.endTabItem();
+    }
+
+    public void loadButton() {
+        if (ImGui.button("Load a model")) {
+            JnaFileChooser fileChooser = new JnaFileChooser();
+            fileChooser.setMode(JnaFileChooser.Mode.Directories);
+            if (fileChooser.showOpenDialog((Window) null)) {
+                try {
+                    ModelsManager.addAnimated(fileChooser.getSelectedFile());
+                } catch (FileNotFoundException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+
+    public void modelsButtons() {
+        List<Renderable> renderables = new ArrayList<>();
+        for (GDModel model : ModelsManager.models) {
+            renderables.add(model);
+        }
+        for (Animation animation : ModelsManager.animations) {
+            renderables.add(animation);
+        }
+        ImGui.text("Available models:");
+        for (Renderable renderable : renderables) {
+            renderable.render();
+        }
+    }
 }

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

@@ -0,0 +1,9 @@
+package xyz.tbvns.ui;
+
+import imgui.ImGui;
+
+public interface Renderable {
+    default void render() {
+        ImGui.text("Default renderable value !");
+    }
+}

+ 0 - 3
PowerGDEditor/src/main/java/xyz/tbvns/ui/UIManager.java

@@ -2,7 +2,6 @@ package xyz.tbvns.ui;
 
 import lombok.Getter;
 import org.reflections.Reflections;
-import xyz.tbvns.ui.Windows.ModelFileSelector;
 
 import java.util.*;
 
@@ -34,8 +33,6 @@ public class UIManager {
                 registeredMenuBarTabs.add(element.getDeclaredConstructor().newInstance());
             }
             registeredMenuBarTabs.sort(Comparator.comparingInt(MenuBarTab::index));
-
-            activeUI.put(ModelFileSelector.class, true);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }

+ 0 - 34
PowerGDEditor/src/main/java/xyz/tbvns/ui/Windows/ModelFileSelector.java

@@ -1,34 +0,0 @@
-package xyz.tbvns.ui.Windows;
-
-import imgui.ImGui;
-import imgui.extension.imguifiledialog.ImGuiFileDialog;
-import imgui.extension.imguifiledialog.callback.ImGuiFileDialogPaneFun;
-import imgui.extension.imguifiledialog.flag.ImGuiFileDialogFlags;
-import imgui.gl3.ImGuiImplGl3;
-import xyz.tbvns.ui.Element;
-
-public class ModelFileSelector implements Element {
-    private static ImGuiFileDialogPaneFun callback = new ImGuiFileDialogPaneFun() {
-        @Override
-        public void paneFun(String filter, long userDatas, boolean canContinue) {
-            ImGui.text("Filter: " + filter);
-        }
-    };
-
-    @Override
-    public void render() {
-        if (!ImGuiFileDialog.isOpened())  {
-            ImGuiFileDialog.openModal(
-                "browse-key",
-                "Choose the model's folder",
-                "",
-                System.getProperty("user.home"),
-                "",
-                1,
-                42,
-                ImGuiFileDialogFlags.ConfirmOverwrite
-            );
-            ImGuiFileDialog.display("browse-key", ImGuiFileDialogFlags.None, 200, 200, 800, 800);
-        }
-    }
-}