From 97a6aee5cf592126c58ccbc3905b75b53d52782c Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Wed, 23 Nov 2022 03:20:20 +0000 Subject: [PATCH] starting to load and render .vrm --- .idea/inspectionProfiles/Project_Default.xml | 3 + com/danitheskunk/skunkworks/BaseGame.java | 2 +- com/danitheskunk/skunkworks/IWindow.java | 1 + com/danitheskunk/skunkworks/Test3D.java | 50 ++++++++++++-- .../backends/gl/RenderContext3D.java | 18 ++++- .../skunkworks/backends/gl/Window.java | 2 +- .../skunkworks/gfx/BaseRenderContext3D.java | 5 -- .../gfx/threedee/BaseRenderContext3D.java | 7 ++ .../gfx/{ => threedee}/IRenderContext3D.java | 3 +- .../skunkworks/gfx/threedee/Mesh.java | 69 +++++++++++++++++++ 10 files changed, 145 insertions(+), 15 deletions(-) delete mode 100644 com/danitheskunk/skunkworks/gfx/BaseRenderContext3D.java create mode 100644 com/danitheskunk/skunkworks/gfx/threedee/BaseRenderContext3D.java rename com/danitheskunk/skunkworks/gfx/{ => threedee}/IRenderContext3D.java (62%) create mode 100644 com/danitheskunk/skunkworks/gfx/threedee/Mesh.java diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index c241077..2170bc8 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,6 +1,9 @@ \ No newline at end of file diff --git a/com/danitheskunk/skunkworks/BaseGame.java b/com/danitheskunk/skunkworks/BaseGame.java index 4a10c5c..4a6753a 100644 --- a/com/danitheskunk/skunkworks/BaseGame.java +++ b/com/danitheskunk/skunkworks/BaseGame.java @@ -6,7 +6,7 @@ import com.danitheskunk.skunkworks.audio.nodes.Mixer; import com.danitheskunk.skunkworks.audio.nodes.Node; import com.danitheskunk.skunkworks.audio.nodes.SamplePlayer; import com.danitheskunk.skunkworks.gfx.IRenderContext; -import com.danitheskunk.skunkworks.gfx.IRenderContext3D; +import com.danitheskunk.skunkworks.gfx.threedee.IRenderContext3D; import com.danitheskunk.skunkworks.gfx.ITexture; import com.danitheskunk.skunkworks.gfx.font.IFont; import com.danitheskunk.skunkworks.nodes.NodeRoot; diff --git a/com/danitheskunk/skunkworks/IWindow.java b/com/danitheskunk/skunkworks/IWindow.java index 3a1809f..22ecd0e 100644 --- a/com/danitheskunk/skunkworks/IWindow.java +++ b/com/danitheskunk/skunkworks/IWindow.java @@ -2,6 +2,7 @@ package com.danitheskunk.skunkworks; import com.danitheskunk.skunkworks.gfx.*; import com.danitheskunk.skunkworks.gfx.font.IFont; +import com.danitheskunk.skunkworks.gfx.threedee.IRenderContext3D; import java.util.List; diff --git a/com/danitheskunk/skunkworks/Test3D.java b/com/danitheskunk/skunkworks/Test3D.java index ab359aa..2d4974d 100644 --- a/com/danitheskunk/skunkworks/Test3D.java +++ b/com/danitheskunk/skunkworks/Test3D.java @@ -1,10 +1,44 @@ package com.danitheskunk.skunkworks; -import com.danitheskunk.skunkworks.gfx.IRenderContext3D; +import com.danitheskunk.skunkworks.gfx.threedee.IRenderContext3D; +import com.danitheskunk.skunkworks.gfx.threedee.Mesh; +import org.lwjgl.assimp.AIMesh; +import org.lwjgl.assimp.Assimp; public class Test3D extends BaseGame { + private Mesh[] meshes; public Test3D() { super(new Vec2i(1920, 1080), "Skunkworks 3d test"); + System.out.printf("assimp version: %d.%d.%d\n", + Assimp.aiGetVersionMajor(), + Assimp.aiGetVersionMinor(), + Assimp.aiGetVersionPatch() + ); + var path = "C:\\stream\\models\\Dani.glb"; + var bytes = engine.loadBytes(path); + var flags = Assimp.aiProcess_Triangulate; + flags |= Assimp.aiProcess_OptimizeGraph; + flags |= Assimp.aiProcess_PreTransformVertices; + //flags |= Assimp.aiProcess_OptimizeMeshes; + //flags |= Assimp.aiProcess_Debone; + var ai = Assimp.aiImportFile(path, flags); + if(ai == null) { + throw new RuntimeException("couldn't load model because: " + + Assimp.aiGetErrorString()); + } + var numMeshes = ai.mNumMeshes(); + var meshespb = ai.mMeshes(); + meshes = new Mesh[numMeshes]; + int faces = 0; + for(int i = 0; i < numMeshes; ++i) { + var aiMesh = AIMesh.create(meshespb.get(i)); + var mesh = Mesh.fromAIMesh(aiMesh); + meshes[i] = mesh; + System.out.println(aiMesh.mNumFaces()); + faces += aiMesh.mNumFaces(); + } + + System.out.printf("numMeshes: %d, faces: %d\n", numMeshes, faces); } static public void main(String[] args) { @@ -13,11 +47,15 @@ public class Test3D extends BaseGame { @Override protected void render3D(IRenderContext3D rc) { - rc.renderTriangle(new Vec3f(-10, -10, 0), - new Vec3f(10, -10, 0), - new Vec3f(10, 10, -1) - - + for(int i = 0; i < meshes.length; ++i) { + rc.renderMesh(meshes[i]); + } + /* + rc.renderTriangle(new Vec3f(-10, -10, 1), + new Vec3f(10, -10, 1), + new Vec3f(10, 10, 1) ); + */ + } } diff --git a/com/danitheskunk/skunkworks/backends/gl/RenderContext3D.java b/com/danitheskunk/skunkworks/backends/gl/RenderContext3D.java index aa7451c..85d95a5 100644 --- a/com/danitheskunk/skunkworks/backends/gl/RenderContext3D.java +++ b/com/danitheskunk/skunkworks/backends/gl/RenderContext3D.java @@ -1,7 +1,8 @@ package com.danitheskunk.skunkworks.backends.gl; import com.danitheskunk.skunkworks.Vec3f; -import com.danitheskunk.skunkworks.gfx.BaseRenderContext3D; +import com.danitheskunk.skunkworks.gfx.threedee.BaseRenderContext3D; +import com.danitheskunk.skunkworks.gfx.threedee.Mesh; import static org.lwjgl.opengl.GL46.*; @@ -22,4 +23,19 @@ public class RenderContext3D extends BaseRenderContext3D { glEnd(); } + + @Override + public void renderMesh(Mesh mesh) { + glBegin(GL_TRIANGLES); + for(int i = 0; i < mesh.getTriangleCount(); ++i) { + var tri = mesh.getTriangle(i); + var p1 = mesh.getVertex(tri.getX()); + var p2 = mesh.getVertex(tri.getY()); + var p3 = mesh.getVertex(tri.getZ()); + glVertex3d(p1.getX(), p1.getY(), p1.getZ()); + glVertex3d(p2.getX(), p2.getY(), p2.getZ()); + glVertex3d(p3.getX(), p3.getY(), p3.getZ()); + } + glEnd(); + } } diff --git a/com/danitheskunk/skunkworks/backends/gl/Window.java b/com/danitheskunk/skunkworks/backends/gl/Window.java index 880817e..de21734 100644 --- a/com/danitheskunk/skunkworks/backends/gl/Window.java +++ b/com/danitheskunk/skunkworks/backends/gl/Window.java @@ -2,7 +2,7 @@ package com.danitheskunk.skunkworks.backends.gl; import com.danitheskunk.skunkworks.*; import com.danitheskunk.skunkworks.gfx.IRenderContext; -import com.danitheskunk.skunkworks.gfx.IRenderContext3D; +import com.danitheskunk.skunkworks.gfx.threedee.IRenderContext3D; import com.danitheskunk.skunkworks.gfx.ITexture; import com.danitheskunk.skunkworks.gfx.Image; import org.lwjgl.glfw.GLFWErrorCallback; diff --git a/com/danitheskunk/skunkworks/gfx/BaseRenderContext3D.java b/com/danitheskunk/skunkworks/gfx/BaseRenderContext3D.java deleted file mode 100644 index bc60ba4..0000000 --- a/com/danitheskunk/skunkworks/gfx/BaseRenderContext3D.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.danitheskunk.skunkworks.gfx; - -abstract public class BaseRenderContext3D implements IRenderContext3D { - -} diff --git a/com/danitheskunk/skunkworks/gfx/threedee/BaseRenderContext3D.java b/com/danitheskunk/skunkworks/gfx/threedee/BaseRenderContext3D.java new file mode 100644 index 0000000..0039647 --- /dev/null +++ b/com/danitheskunk/skunkworks/gfx/threedee/BaseRenderContext3D.java @@ -0,0 +1,7 @@ +package com.danitheskunk.skunkworks.gfx.threedee; + +import com.danitheskunk.skunkworks.gfx.threedee.IRenderContext3D; + +abstract public class BaseRenderContext3D implements IRenderContext3D { + +} diff --git a/com/danitheskunk/skunkworks/gfx/IRenderContext3D.java b/com/danitheskunk/skunkworks/gfx/threedee/IRenderContext3D.java similarity index 62% rename from com/danitheskunk/skunkworks/gfx/IRenderContext3D.java rename to com/danitheskunk/skunkworks/gfx/threedee/IRenderContext3D.java index a58c0a5..60b442f 100644 --- a/com/danitheskunk/skunkworks/gfx/IRenderContext3D.java +++ b/com/danitheskunk/skunkworks/gfx/threedee/IRenderContext3D.java @@ -1,7 +1,8 @@ -package com.danitheskunk.skunkworks.gfx; +package com.danitheskunk.skunkworks.gfx.threedee; import com.danitheskunk.skunkworks.Vec3f; public interface IRenderContext3D { void renderTriangle(Vec3f p1, Vec3f p2, Vec3f p3); + void renderMesh(Mesh mesh); } diff --git a/com/danitheskunk/skunkworks/gfx/threedee/Mesh.java b/com/danitheskunk/skunkworks/gfx/threedee/Mesh.java new file mode 100644 index 0000000..83ebdae --- /dev/null +++ b/com/danitheskunk/skunkworks/gfx/threedee/Mesh.java @@ -0,0 +1,69 @@ +package com.danitheskunk.skunkworks.gfx.threedee; + +import com.danitheskunk.skunkworks.Vec3f; +import com.danitheskunk.skunkworks.Vec3i; +import org.lwjgl.assimp.AIMesh; + +import java.util.ArrayList; +import java.util.List; + +public class Mesh { + private List triangles; + private List vertices; + + public Mesh() { + vertices = new ArrayList<>(); + triangles = new ArrayList<>(); + } + + public static Mesh fromAIMesh(AIMesh aiMesh) { + var mesh = new Mesh(); + + var numVertices = aiMesh.mNumVertices(); + var numFaces = aiMesh.mNumFaces(); + + var vertexBuffer = aiMesh.mVertices(); + var faceBuffer = aiMesh.mFaces(); + + while(vertexBuffer.remaining() > 0) { + var vert = vertexBuffer.get(); + mesh.addVertex(new Vec3f(vert.x(), vert.y(), vert.z())); + } + + while(faceBuffer.remaining() > 0) { + var face = faceBuffer.get(); + if(face.mNumIndices() != 3) { + throw new RuntimeException("skunkworks only supports " + + "triangles currently"); + } + var indices = face.mIndices(); + mesh.addTriangle(indices.get(0), indices.get(1), indices.get(2)); + } + return mesh; + } + + public void addTriangle(int v1, int v2, int v3) { + triangles.add(new Vec3i(v1, v2, v3)); + } + + public void addVertex(Vec3f vertex) { + vertices.add(vertex); + } + + public int getTriangleCount() { + return triangles.size(); + } + + public int getVertexCount() { + return vertices.size(); + } + + public Vec3f getVertex(int idx) { + return vertices.get(idx); + } + + public Vec3i getTriangle(int idx) { + return triangles.get(idx); + } + +}