• R/O
  • SSH

MMDLoaderJME: 提交

Java版MikuMikuDanceライブラリ


Commit MetaInfo

修訂ac64e0b6f749220f046fc958de56c9c2fedb80cf (tree)
時間2012-06-13 07:34:56
作者Kazuhiko Kobayashi <chototsu_ <moushinp@yaho...>
CommiterKazuhiko Kobayashi <chototsu_

Log Message

Some improvement of bone matrix calculation.

Change Summary

差異

diff -r f549644ab399 -r ac64e0b6f749 src/projectkyoto/jme3/mmd/PMDGeometry.java
--- a/src/projectkyoto/jme3/mmd/PMDGeometry.java Wed Jun 13 07:31:54 2012 +0900
+++ b/src/projectkyoto/jme3/mmd/PMDGeometry.java Wed Jun 13 07:34:56 2012 +0900
@@ -38,7 +38,9 @@
3838 import com.jme3.scene.Geometry;
3939 import com.jme3.scene.Mesh;
4040 import com.jme3.scene.VertexBuffer.Type;
41+import com.jme3.util.BufferUtils;
4142 import java.io.IOException;
43+import java.nio.FloatBuffer;
4244 import projectkyoto.mmd.file.PMDMaterial;
4345
4446 /**
@@ -112,6 +114,10 @@
112114 newMesh.bound = oldMesh.bound.clone();
113115 newMesh.setBuffer(oldMesh.getBuffer(Type.Index));
114116 newPMDGeometry.setMesh(newMesh);
117+
118+ newMesh.setBoneIndexBuffer(oldMesh.getBoneIndexBuffer());
119+ FloatBuffer fb = BufferUtils.createFloatBuffer(oldMesh.getBoneMatrixBuffer().capacity());
120+ newMesh.setBoneMatrixBuffer(fb);
115121 } else {
116122 PMDMesh oldMesh = (PMDMesh)mesh;
117123 PMDMesh newMesh = new PMDMesh();
@@ -135,6 +141,10 @@
135141 if (oldMesh.getBuffer(Type.InterleavedData) != null)
136142 newMesh.setBuffer(oldMesh.getBuffer(Type.InterleavedData));
137143 newPMDGeometry.setMesh(newMesh);
144+
145+ newMesh.setBoneIndexBuffer(oldMesh.getBoneIndexBuffer());
146+ FloatBuffer fb = BufferUtils.createFloatBuffer(oldMesh.getBoneMatrixBuffer().capacity());
147+ newMesh.setBoneMatrixBuffer(fb);
138148 // newMesh.setInterleaved();
139149 }
140150 newPMDGeometry.glslSkinningMaterial = glslSkinningMaterial.clone();
diff -r f549644ab399 -r ac64e0b6f749 src/projectkyoto/jme3/mmd/PMDLoaderGLSLSkinning2.java
--- a/src/projectkyoto/jme3/mmd/PMDLoaderGLSLSkinning2.java Wed Jun 13 07:31:54 2012 +0900
+++ b/src/projectkyoto/jme3/mmd/PMDLoaderGLSLSkinning2.java Wed Jun 13 07:34:56 2012 +0900
@@ -312,11 +312,18 @@
312312 ib.setupData(VertexBuffer.Usage.Static, 1, VertexBuffer.Format.UnsignedShort, isb);
313313 mesh.setBuffer(ib);
314314 mesh.setBoneIndexArray(skinIndexArray);
315+ ShortBuffer boneIndexBuffer = BufferUtils.createShortBuffer(skinIndexArray.length);
316+ for(int i=0;i<skinIndexArray.length;i++) {
317+ boneIndexBuffer.put((short)skinIndexArray[i]);
318+ }
319+ mesh.setBoneIndexBuffer(boneIndexBuffer);
315320 mesh.setBoneMatrixArray(new Matrix4f[skinIndexArray.length]);
316321 for (int i = 0; i < mesh.getBoneMatrixArray().length; i++) {
317322 mesh.getBoneMatrixArray()[i] = new Matrix4f();
318323 mesh.getBoneMatrixArray()[i].loadIdentity();
319324 }
325+ FloatBuffer boneMatrixBuffer = BufferUtils.createFloatBuffer(skinIndexArray.length * 16);
326+ mesh.setBoneMatrixBuffer(boneMatrixBuffer);
320327 return mesh;
321328 }
322329
@@ -413,19 +420,26 @@
413420 mesh.setBuffer(ib);
414421 mesh.setBuffer(bib);
415422 int[] indexArray = new int[md.getBoneList().size()];
423+ ShortBuffer indexBuffer = BufferUtils.createShortBuffer(md.getBoneList().size());
416424 for (int i = 0; i < indexArray.length; i++) {
417425 if (i < md.getBoneList().size()) {
418426 indexArray[i] = md.getBoneList().get(i).shortValue();
419427 } else {
420428 indexArray[i] = 0;
421429 }
430+ indexBuffer.put((short)indexArray[i]);
422431 }
423432 mesh.setBoneIndexArray(indexArray);
433+ mesh.setBoneIndexBuffer(indexBuffer);
434+ FloatBuffer boneMatrixBuffer = BufferUtils.createFloatBuffer(16 * indexArray.length);
424435 mesh.setBoneMatrixArray(new Matrix4f[indexArray.length]);
436+ mesh.setBoneMatrixBuffer(boneMatrixBuffer);
425437 for (int i = 0; i < mesh.getBoneMatrixArray().length; i++) {
426438 mesh.getBoneMatrixArray()[i] = new Matrix4f();
427439 mesh.getBoneMatrixArray()[i].loadIdentity();
440+ mesh.getBoneMatrixArray()[i].fillFloatBuffer(boneMatrixBuffer, true);
428441 }
442+ boneMatrixBuffer.position(0);
429443 return mesh;
430444 }
431445
diff -r f549644ab399 -r ac64e0b6f749 src/projectkyoto/jme3/mmd/PMDMesh.java
--- a/src/projectkyoto/jme3/mmd/PMDMesh.java Wed Jun 13 07:31:54 2012 +0900
+++ b/src/projectkyoto/jme3/mmd/PMDMesh.java Wed Jun 13 07:34:56 2012 +0900
@@ -42,6 +42,7 @@
4242 import com.jme3.util.BufferUtils;
4343 import java.io.IOException;
4444 import java.nio.FloatBuffer;
45+import java.nio.ShortBuffer;
4546
4647 /**
4748 *
@@ -53,6 +54,8 @@
5354 Matrix4f boneMatrixArray[];
5455 VertexBuffer vbBackup;
5556 VertexBuffer nbBackup;
57+ ShortBuffer boneIndexBuffer;
58+ FloatBuffer boneMatrixBuffer;
5659
5760 int boneMatricesParamIndex = -1;
5861
@@ -178,5 +181,21 @@
178181 OutputCapsule c = ex.getCapsule(this);
179182 c.write(boneIndexArray, "boneIndexArray", null);
180183 }
184+
185+ public ShortBuffer getBoneIndexBuffer() {
186+ return boneIndexBuffer;
187+ }
188+
189+ public void setBoneIndexBuffer(ShortBuffer boneIndexBuffer) {
190+ this.boneIndexBuffer = boneIndexBuffer;
191+ }
192+
193+ public FloatBuffer getBoneMatrixBuffer() {
194+ return boneMatrixBuffer;
195+ }
196+
197+ public void setBoneMatrixBuffer(FloatBuffer boneMatrixBuffer) {
198+ this.boneMatrixBuffer = boneMatrixBuffer;
199+ }
181200
182201 }
diff -r f549644ab399 -r ac64e0b6f749 src/projectkyoto/jme3/mmd/PMDNode.java
--- a/src/projectkyoto/jme3/mmd/PMDNode.java Wed Jun 13 07:31:54 2012 +0900
+++ b/src/projectkyoto/jme3/mmd/PMDNode.java Wed Jun 13 07:34:56 2012 +0900
@@ -58,6 +58,7 @@
5858 import com.jme3.scene.debug.SkeletonWire;
5959 import com.jme3.scene.shape.Box;
6060 import com.jme3.shader.VarType;
61+import com.jme3.util.BufferUtils;
6162 import java.nio.ShortBuffer;
6263 import java.util.Arrays;
6364 import java.util.HashMap;
@@ -95,6 +96,7 @@
9596 // int skinBoneArray[];
9697 AssetManager assetManager;
9798 Matrix4f[] offsetMatrices;
99+ FloatBuffer offsetMatrixbuffer;
98100 boolean updateNeeded = true;
99101 boolean skinUpdateNeeded = true;
100102 boolean wireFrame = false;
@@ -270,6 +272,13 @@
270272
271273 public Matrix4f[] calcOffsetMatrices() {
272274 offsetMatrices = skeleton.computeSkinningMatrices();
275+ if (offsetMatrixbuffer == null) {
276+ offsetMatrixbuffer = BufferUtils.createFloatBuffer(offsetMatrices.length * 16);
277+ }
278+ offsetMatrixbuffer.position(0);
279+ for(Matrix4f m : offsetMatrices) {
280+ m.fillFloatBuffer(offsetMatrixbuffer, true);
281+ }
273282 return offsetMatrices;
274283 }
275284 boolean setBoneMatricesFlag = true;
@@ -289,18 +298,35 @@
289298 PMDMesh pmdMesh = (PMDMesh)g.getMesh();
290299 int boneIndexArray[] = pmdMesh.getBoneIndexArray();
291300 Matrix4f[] boneMatrixArray = pmdMesh.getBoneMatrixArray();
292- for (int i = pmdMesh.getBoneIndexArray().length-1; i >=0; i--) {
293- boneMatrixArray[i] = (offsetMatrices[boneIndexArray[i]]);
294- }
301+// for (int i = pmdMesh.getBoneIndexArray().length-1; i >=0; i--) {
302+// boneMatrixArray[i] = (offsetMatrices[boneIndexArray[i]]);
303+// }
304+
295305 if (glslSkinning) {
306+// if (pmdMesh.boneMatricesParamIndex < 0) {
307+// m.setParam("BoneMatrices", VarType.Matrix4Array, pmdMesh.getBoneMatrixArray());
308+// pmdMesh.boneMatricesParamIndex = g.getMaterial().getParamIndex("BoneMatrices");
309+// } else {
310+// m.setParam(pmdMesh.boneMatricesParamIndex, VarType.Matrix4Array, pmdMesh.getBoneMatrixArray());
311+// }
312+ FloatBuffer fb = pmdMesh.getBoneMatrixBuffer();
313+ fb.position(0);
314+// for(int i=0;i<pmdMesh.getBoneIndexArray().length;i++) {
315+// offsetMatrices[pmdMesh.getBoneIndexBuffer().get(i)].fillFloatBuffer(fb, true);
316+//// pmdMesh.getBoneMatrixArray()[i].fillFloatBuffer(fb, true);
317+// }
318+ projectkyoto.jme3.mmd.nativelib.SkinUtil.copyBoneMatrix(offsetMatrixbuffer, fb, pmdMesh.getBoneIndexBuffer());
319+
320+// fb.position(0);
296321 if (pmdMesh.boneMatricesParamIndex < 0) {
297- m.setParam("BoneMatrices", VarType.Matrix4Array, pmdMesh.getBoneMatrixArray());
322+ m.setParam("BoneMatrices", VarType.Matrix4Array, pmdMesh.getBoneMatrixBuffer());
298323 pmdMesh.boneMatricesParamIndex = g.getMaterial().getParamIndex("BoneMatrices");
299324 } else {
300- m.setParam(pmdMesh.boneMatricesParamIndex, VarType.Matrix4Array, pmdMesh.getBoneMatrixArray());
325+ m.setParam(pmdMesh.boneMatricesParamIndex, VarType.Matrix4Array, pmdMesh.getBoneMatrixBuffer());
301326 }
302327 }
303328 }
329+ FloatBuffer fb = null;
304330 for(int i=getChildren().size()-1;i>=0;i--) {
305331 Spatial sp = getChild(i);
306332 if (sp instanceof PMDGeometry) {
@@ -310,16 +336,21 @@
310336 PMDSkinMesh skinMesh = (PMDSkinMesh)mesh;
311337 Material m = g.getMaterial();
312338 int boneIndexArray[] = skinMesh.getBoneIndexArray();
313- Matrix4f[] boneMatrixArray = skinMesh.getBoneMatrixArray();
314- for (int i2 = skinMesh.getBoneIndexArray().length-1; i2 >=0; i2--) {
315- boneMatrixArray[i2] = (offsetMatrices[boneIndexArray[i2]]);
339+// Matrix4f[] boneMatrixArray = skinMesh.getBoneMatrixArray();
340+// for (int i2 = skinMesh.getBoneIndexArray().length-1; i2 >=0; i2--) {
341+// boneMatrixArray[i2] = (offsetMatrices[boneIndexArray[i2]]);
342+// }
343+ if (fb == null) {
344+ fb = skinMesh.getBoneMatrixBuffer();
345+ fb.position(0);
346+ projectkyoto.jme3.mmd.nativelib.SkinUtil.copyBoneMatrix(offsetMatrixbuffer, fb, skinMesh.getBoneIndexBuffer());
316347 }
317348 if (glslSkinning) {
318349 if (skinMesh.boneMatricesParamIndex < 0) {
319- m.setParam("BoneMatrices", VarType.Matrix4Array, skinMesh.getBoneMatrixArray());
350+ m.setParam("BoneMatrices", VarType.Matrix4Array, fb);
320351 skinMesh.boneMatricesParamIndex = g.getMaterial().getParamIndex("BoneMatrices");
321352 } else {
322- m.setParam(skinMesh.boneMatricesParamIndex, VarType.Matrix4Array, skinMesh.getBoneMatrixArray());
353+ m.setParam(skinMesh.boneMatricesParamIndex, VarType.Matrix4Array, fb);
323354 }
324355 }
325356 }
diff -r f549644ab399 -r ac64e0b6f749 src/projectkyoto/jme3/mmd/PMDSkinMesh.java
--- a/src/projectkyoto/jme3/mmd/PMDSkinMesh.java Wed Jun 13 07:31:54 2012 +0900
+++ b/src/projectkyoto/jme3/mmd/PMDSkinMesh.java Wed Jun 13 07:34:56 2012 +0900
@@ -41,6 +41,7 @@
4141 import com.jme3.util.BufferUtils;
4242 import java.io.IOException;
4343 import java.nio.FloatBuffer;
44+import java.nio.ShortBuffer;
4445
4546 /**
4647 *
@@ -53,6 +54,8 @@
5354 VertexBuffer skinvb2;
5455 VertexBuffer skinnb2;
5556 int boneMatricesParamIndex = -1;
57+ ShortBuffer boneIndexBuffer;
58+ FloatBuffer boneMatrixBuffer;
5659 public PMDSkinMesh() {
5760 super();
5861 }
@@ -88,6 +91,22 @@
8891 public void setSkinvb2(VertexBuffer skinvb2) {
8992 this.skinvb2 = skinvb2;
9093 }
94+
95+ public ShortBuffer getBoneIndexBuffer() {
96+ return boneIndexBuffer;
97+ }
98+
99+ public void setBoneIndexBuffer(ShortBuffer boneIndexBuffer) {
100+ this.boneIndexBuffer = boneIndexBuffer;
101+ }
102+
103+ public FloatBuffer getBoneMatrixBuffer() {
104+ return boneMatrixBuffer;
105+ }
106+
107+ public void setBoneMatrixBuffer(FloatBuffer boneMatrixBuffer) {
108+ this.boneMatrixBuffer = boneMatrixBuffer;
109+ }
91110
92111 BoundingVolume bound = new BoundingBox(Vector3f.ZERO, 20, 20, 20);
93112
Show on old repository browser