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);
+ }
+
+}