From 007be3e9f31aea87c10b92742edbbd645418a84c Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Mon, 12 Dec 2022 02:06:58 +0000 Subject: [PATCH] started adding bone stuff --- com/danitheskunk/skunkworks/Mat4f.java | 30 ++++++++++++ com/danitheskunk/skunkworks/Test.java | 8 ---- .../skunkworks/backends/gl/BasePipeline.java | 5 ++ .../skunkworks/gfx/threedee/Bone.java | 47 +++++++++++++++++++ .../skunkworks/gfx/threedee/Mesh.java | 9 ++++ .../skunkworks/gfx/threedee/Model.java | 25 ++++++++++ .../skunkworks/gfx/threedee/VertexWeight.java | 25 ++++++++++ 7 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 com/danitheskunk/skunkworks/backends/gl/BasePipeline.java create mode 100644 com/danitheskunk/skunkworks/gfx/threedee/Bone.java create mode 100644 com/danitheskunk/skunkworks/gfx/threedee/VertexWeight.java diff --git a/com/danitheskunk/skunkworks/Mat4f.java b/com/danitheskunk/skunkworks/Mat4f.java index 96bd7a9..abe8e08 100644 --- a/com/danitheskunk/skunkworks/Mat4f.java +++ b/com/danitheskunk/skunkworks/Mat4f.java @@ -1,8 +1,12 @@ package com.danitheskunk.skunkworks; +import org.lwjgl.assimp.AIMatrix4x4; + public final class Mat4f { private final double[] data; + public static Mat4f IDENTITY = new Mat4f(); + public Mat4f() { data = new double[16]; set(0, 0, 1.0); @@ -11,6 +15,32 @@ public final class Mat4f { set(3, 3, 1.0); } + public static Mat4f fromAiMat(AIMatrix4x4 aiMat) { + var mat = new Mat4f(); + + mat.set(0, 0, aiMat.a1()); + mat.set(1, 0, aiMat.a2()); + mat.set(2, 0, aiMat.a3()); + mat.set(3, 0, aiMat.a4()); + + mat.set(0, 1, aiMat.b1()); + mat.set(1, 1, aiMat.b2()); + mat.set(2, 1, aiMat.b3()); + mat.set(3, 1, aiMat.b4()); + + mat.set(0, 2, aiMat.c1()); + mat.set(1, 2, aiMat.c2()); + mat.set(2, 2, aiMat.c3()); + mat.set(3, 2, aiMat.c4()); + + mat.set(0, 3, aiMat.d1()); + mat.set(1, 3, aiMat.d2()); + mat.set(2, 3, aiMat.d3()); + mat.set(3, 3, aiMat.d4()); + + return mat; + } + public static Mat4f perspective( double fovy, double aspect, double zNear, double zFar ) { diff --git a/com/danitheskunk/skunkworks/Test.java b/com/danitheskunk/skunkworks/Test.java index c22535f..a49158a 100644 --- a/com/danitheskunk/skunkworks/Test.java +++ b/com/danitheskunk/skunkworks/Test.java @@ -15,14 +15,6 @@ public class Test extends BaseGame { public Test() { super(new Vec2i(40 * 12, 22 * 12), "Skunkworks"); - var path = "C:\\Program Files (x86)" + - "\\Steam\\steamapps\\common\\Unreal " + - "Tournament\\System\\UnrealTournament.ini"; - - - var data = engine.loadDataWatched(path); - data.onReload(() -> System.out.println(data.get("URL", "Host"))); - var fontThin = window.loadFontTileset("fonts\\thin-6x12.png"); var fontThin2 = window.loadFontTileset("fonts\\thin-12x12.png"); term = new Terminal(new Vec2i(40, 22), fontThin2, fontThin); diff --git a/com/danitheskunk/skunkworks/backends/gl/BasePipeline.java b/com/danitheskunk/skunkworks/backends/gl/BasePipeline.java new file mode 100644 index 0000000..b1279de --- /dev/null +++ b/com/danitheskunk/skunkworks/backends/gl/BasePipeline.java @@ -0,0 +1,5 @@ +package com.danitheskunk.skunkworks.backends.gl; + +public class BasePipeline { + +} diff --git a/com/danitheskunk/skunkworks/gfx/threedee/Bone.java b/com/danitheskunk/skunkworks/gfx/threedee/Bone.java new file mode 100644 index 0000000..da60469 --- /dev/null +++ b/com/danitheskunk/skunkworks/gfx/threedee/Bone.java @@ -0,0 +1,47 @@ +package com.danitheskunk.skunkworks.gfx.threedee; + +import com.danitheskunk.skunkworks.Mat4f; +import org.lwjgl.assimp.AIBone; + +import java.util.ArrayList; +import java.util.List; + +public class Bone { + private String name; + private List vertexWeights; + private Mat4f offsetMatrix; + + public Bone() { + vertexWeights = new ArrayList<>(); + offsetMatrix = Mat4f.IDENTITY; + } + + public static Bone fromAIBone(AIBone aiBone) { + var bone = new Bone(); + var weightBuffer = aiBone.mWeights(); + + bone.name = aiBone.mName().dataString(); + + while(weightBuffer.hasRemaining()) { + var weight = VertexWeight.fromAiWeight(weightBuffer.get()); + bone.vertexWeights.add(weight); + } + + bone.offsetMatrix = Mat4f.fromAiMat(aiBone.mOffsetMatrix()); + + var node = aiBone.mNode(); + if(node.address() != 0) { + System.out.println(node.mName().dataString()); + } + + return bone; + } + + public VertexWeight getVertexWeight(int i) { + return vertexWeights.get(i); + } + + public int getVertexWeightCount() { + return vertexWeights.size(); + } +} diff --git a/com/danitheskunk/skunkworks/gfx/threedee/Mesh.java b/com/danitheskunk/skunkworks/gfx/threedee/Mesh.java index 7e557c6..e098f66 100644 --- a/com/danitheskunk/skunkworks/gfx/threedee/Mesh.java +++ b/com/danitheskunk/skunkworks/gfx/threedee/Mesh.java @@ -4,6 +4,7 @@ import com.danitheskunk.skunkworks.Vec2f; import com.danitheskunk.skunkworks.Vec3f; import com.danitheskunk.skunkworks.Vec3i; import com.danitheskunk.skunkworks.gfx.ITexture; +import org.lwjgl.assimp.AIBone; import org.lwjgl.assimp.AIMesh; import java.util.ArrayList; @@ -27,6 +28,7 @@ public class Mesh { var vertexBuffer = aiMesh.mVertices(); var faceBuffer = aiMesh.mFaces(); var texCoordsBuffer = aiMesh.mTextureCoords(0); + var boneBuffer = aiMesh.mBones(); while(vertexBuffer.remaining() > 0) { var vert = vertexBuffer.get(); @@ -51,6 +53,13 @@ public class Mesh { mesh.addUV(new Vec2f(x, 1.0 - y)); } + while(boneBuffer.remaining() > 0) { + var aiBone = AIBone.create(boneBuffer.get()); + var bone = Bone.fromAIBone(aiBone); + //System.out.printf("bone: %s\n", bone.mName().dataString()); + } + + return mesh; } diff --git a/com/danitheskunk/skunkworks/gfx/threedee/Model.java b/com/danitheskunk/skunkworks/gfx/threedee/Model.java index 39aa029..75e2b12 100644 --- a/com/danitheskunk/skunkworks/gfx/threedee/Model.java +++ b/com/danitheskunk/skunkworks/gfx/threedee/Model.java @@ -58,6 +58,9 @@ public class Model { System.out.printf("tex %dx%d\n", img.getWidth(), img.getHeight()); } + var node = ai.mRootNode(); + walkNodes(node); + var numMeshes = ai.mNumMeshes(); var meshPB = ai.mMeshes(); @@ -75,6 +78,16 @@ public class Model { faces += aiMesh.mNumFaces(); } + + + /* + var animationBuffer = ai.mAnimations(); + while(animationBuffer.hasRemaining()) { + var aiAnim = AIAnimation.create(animationBuffer.get()); + System.out.printf("anim: %s\n", aiAnim.mName().dataString()); + } + */ + //window.setDebug(true); System.out.printf("numMeshes: %d, faces: %d, textures: %d\n", @@ -84,6 +97,18 @@ public class Model { ); } + private void walkNodes(AINode node) { + System.out.println(node.mName().dataString()); + var childBuffer = node.mChildren(); + if(childBuffer == null) { + return; + } + while(childBuffer.hasRemaining()) { + var child = AINode.create(childBuffer.get()); + walkNodes(child); + } + } + public int getMeshCount() { return meshes.length; } diff --git a/com/danitheskunk/skunkworks/gfx/threedee/VertexWeight.java b/com/danitheskunk/skunkworks/gfx/threedee/VertexWeight.java new file mode 100644 index 0000000..68cc836 --- /dev/null +++ b/com/danitheskunk/skunkworks/gfx/threedee/VertexWeight.java @@ -0,0 +1,25 @@ +package com.danitheskunk.skunkworks.gfx.threedee; + +import org.lwjgl.assimp.AIVertexWeight; + +public class VertexWeight { + private final int index; + private final float weight; + + public VertexWeight(int index, float weight) { + this.index = index; + this.weight = weight; + } + + public static VertexWeight fromAiWeight(AIVertexWeight aiWeight) { + return new VertexWeight(aiWeight.mVertexId(), aiWeight.mWeight()); + } + + public int getIndex() { + return index; + } + + public float getWeight() { + return weight; + } +}