OSDN Git Service

optimize skinning
authorKazuhiko Kobayashi <chototsu_moushinp@yahoo.co.jp>
Wed, 22 Feb 2012 08:22:44 +0000 (17:22 +0900)
committerKazuhiko Kobayashi <chototsu_moushinp@yahoo.co.jp>
Wed, 22 Feb 2012 08:22:44 +0000 (17:22 +0900)
src/MatDefs/pmd/pmd.frag
src/MatDefs/pmd/pmd.vert
src/MatDefs/pmd/pmd_cartoon.vert
src/projectkyoto/jme3/mmd/PMDLoaderGLSLSkinning2.java
src/projectkyoto/mmd/file/util2/BufferUtil.java
src/projectkyoto/mmd/file/util2/MeshConverter.java
src/projectkyoto/mmd/file/util2/MeshData.java

index 75cfd78..360f939 100755 (executable)
@@ -20,7 +20,7 @@
 //#define HQ_ATTENUATION\r
 \r
 \r
-varying vec2 texCoord;\r
+varying LOWP vec2 texCoord;\r
 \r
 varying LOWP vec4 AmbientSum;\r
 varying LOWP vec4 DiffuseSum;\r
@@ -166,9 +166,9 @@ void main(){
     #ifdef ALPHAMAP\r
        alpha = alpha * texture2D(m_AlphaMap, newTexCoord).r;\r
     #endif\r
-    if(alpha < 0.1 /*m_AlphaDiscardThreshold*/){\r
-        discard;\r
-    }\r
+    //if(alpha < 0.1 /*m_AlphaDiscardThreshold*/){\r
+    //    discard;\r
+    //}\r
 \r
     // ***********************\r
     // Read from textures\r
index 2dda5b6..480b1f8 100755 (executable)
@@ -127,27 +127,44 @@ vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec4 w
      return vec2(diffuseFactor, specularFactor) * vec2(lightDir.w);\r
   }\r
 #endif\r
-attribute vec4 inBoneWeight;\r
-attribute vec4 inBoneIndices;\r
-attribute vec4 inBoneIndex;\r
+attribute vec2 inBoneWeight;\r
+attribute vec2 inBoneIndex;\r
 #ifdef USE_HWSKINNING\r
 void Skinning_Compute(inout vec4 position, inout vec4 normal){\r
 //    vec4 index  = inBoneIndices;\r
-    vec4 index  = inBoneIndex;\r
-    vec4 weight = inBoneWeight;\r
+    vec2 index  = inBoneIndex;\r
+    vec2 weight = inBoneWeight;\r
 \r
-    vec4 newPos    = vec4(0.0,0.0,0.0,0.0);\r
-    vec4 newNormal = vec4(0.0,0.0,0.0,0.0);\r
+    vec4 newPos;\r
+    vec4 newNormal;\r
 \r
     //for (float i = 1.0; i < 2.0; i += 1.0){\r
-        mat4 skinMat = m_BoneMatrices[int(index.x)];\r
-        newPos    = weight.x * (skinMat * position);\r
-        newNormal = weight.x * (skinMat * normal);\r
+        mat4 skinMat;\r
+#if NUM_BONES != 1\r
+        if (weight.x == 1.0) {\r
+            skinMat = m_BoneMatrices[int(index.x)];\r
+            newPos    = (skinMat * position);\r
+            newNormal = (skinMat * normal);\r
+        } else if (weight.x == 0.0) {\r
+            skinMat = m_BoneMatrices[int(index.y)];\r
+            newPos    =  (skinMat * position);\r
+            newNormal = (skinMat * normal);\r
+        } else {\r
+            skinMat = m_BoneMatrices[int(index.x)];\r
+            newPos    = weight.x * (skinMat * position);\r
+            newNormal = weight.x * (skinMat * normal);\r
+\r
+            skinMat = m_BoneMatrices[int(index.y)];\r
+            newPos    = newPos + weight.y * (skinMat * position);\r
+            newNormal = newNormal + weight.y * (skinMat * normal);\r
+        }\r
+#else\r
+            skinMat = m_BoneMatrices[0];\r
+            newPos    = (skinMat * position);\r
+            newNormal = (skinMat * normal);\r
+#endif\r
         //index = index.yzwx;\r
         //weight = weight.yzwx;\r
-        skinMat = m_BoneMatrices[int(index.y)];\r
-        newPos    = newPos + weight.y * (skinMat * position);\r
-        newNormal = newNormal + weight.y * (skinMat * normal);\r
     //}\r
 \r
     position = newPos;\r
index f0aa5e5..fae70c1 100755 (executable)
@@ -1,8 +1,7 @@
 #ifdef USE_HWSKINNING\r
 uniform mat4 m_BoneMatrices[NUM_BONES];\r
-attribute vec4 inBoneWeight;\r
-attribute vec4 inBoneIndices;\r
-attribute vec4 inBoneIndex;\r
+attribute vec2 inBoneWeight;\r
+attribute vec2 inBoneIndex;\r
 #endif\r
 uniform float m_EdgeSize; \r
 // #import "MatDefs/pmd/Skinning.glsllib"\r
@@ -26,21 +25,37 @@ void main(){
 #ifdef USE_HWSKINNING\r
 //   Skinning_Compute(pos, normal);\r
 //    vec4 index  = inBoneIndices;\r
-    vec4 index  = inBoneIndex;\r
-    vec4 weight = inBoneWeight;\r
+    vec2 index  = inBoneIndex;\r
+    vec2 weight = inBoneWeight;\r
 \r
-    vec4 newPos    = vec4(0.0,0.0,0.0,0.0);\r
-    vec4 newNormal = vec4(0.0,0.0,0.0,0.0);\r
+    vec4 newPos;\r
+    vec4 newNormal;\r
 \r
     //for (float i = 1.0; i < 2.0; i += 1.0){\r
-        mat4 skinMat = m_BoneMatrices[int(index.x)];\r
-        newPos    = weight.x * (skinMat * pos);\r
-        newNormal = weight.x * (skinMat * normal);\r
-        //index = index.yzwx;\r
-        //weight = weight.yzwx;\r
-        skinMat = m_BoneMatrices[int(index.y)];\r
-        newPos    = newPos + weight.y * (skinMat * pos);\r
-        newNormal = newNormal + weight.y * (skinMat * normal);\r
+        mat4 skinMat;\r
+#if NUM_BONES != 1\r
+        if (weight.x == 1.0) {\r
+            skinMat = m_BoneMatrices[int(index.x)];\r
+            newPos    = (skinMat * pos);\r
+            newNormal = (skinMat * normal);\r
+        } else if (weight.x == 0.0) {\r
+            skinMat = m_BoneMatrices[int(index.y)];\r
+            newPos    =  (skinMat * pos);\r
+            newNormal = (skinMat * normal);\r
+        } else {\r
+            skinMat = m_BoneMatrices[int(index.x)];\r
+            newPos    = weight.x * (skinMat * pos);\r
+            newNormal = weight.x * (skinMat * normal);\r
+\r
+            skinMat = m_BoneMatrices[int(index.y)];\r
+            newPos    = newPos + weight.y * (skinMat * pos);\r
+            newNormal = newNormal + weight.y * (skinMat * normal);\r
+        }\r
+#else\r
+            skinMat = m_BoneMatrices[0];\r
+            newPos    = (skinMat * pos);\r
+            newNormal = (skinMat * normal);\r
+#endif\r
     //}\r
 \r
     pos = newPos;\r
index 39499e4..cf0c532 100755 (executable)
@@ -136,6 +136,7 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
 //        System.out.println("child size = "+node.getChildren().size()+" "+meshList.size()+" "+skinMeshList.size());
         node.pmdGeometryArray = new PMDGeometry[meshConverter.getMeshDataList().size()];
         int pmdGeometryIndex = 0;
+//        GeometryOptimizer go = GeometryOptimizer.createNewInstance();
         for(int i=0;i<meshConverter.getMeshDataList().size();i++) {
             MeshData md = meshConverter.getMeshDataList().get(i);
             PMDMesh mesh = createMesh_old(md);
@@ -147,13 +148,10 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
             meshList.add(mesh);
             node.pmdGeometryArray[pmdGeometryIndex++] = geom;
             meshConverter.getMeshDataList().set(i, null);
-//            GeometryOptimizer go = GeometryOptimizer.createNewInstance();
 //            go.add(mesh);
-//            mesh.setInterleaved();    
-//            go.optimize();
+            mesh.setInterleaved();    
         }
-//        go.add(meshList.get(0));
-//        go.add(meshList.get(1));
+//        go.optimize();
         createSkinCommonVertData();
         for (PMDMaterial pmdMaterial : meshConverter.getSkinMeshData().getIndexMap().keySet()) {
             PMDSkinMesh mesh = createSkinMesh(pmdMaterial);
@@ -248,11 +246,11 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
             tfb = BufferUtils.createFloatBuffer(md.getVertIndexList().size() * 2);
         }
         VertexBuffer wb = new VertexBuffer(VertexBuffer.Type.BoneWeight);
-        FloatBuffer wfb = BufferUtils.createFloatBuffer(md.getVertIndexList().size() * 4);
+        FloatBuffer wfb = BufferUtils.createFloatBuffer(md.getVertIndexList().size() * 2);
         VertexBuffer ib = new VertexBuffer(VertexBuffer.Type.Index);
         ShortBuffer isb = BufferUtils.createShortBuffer(md.getIndexList().size()/*md.getMaterial().getFaceVertCount()*/);
         VertexBuffer bib = new VertexBuffer(VertexBuffer.Type.BoneIndex);
-        ShortBuffer bisb = BufferUtils.createShortBuffer(md.getVertIndexList().size() * 4);
+        ShortBuffer bisb = BufferUtils.createShortBuffer(md.getVertIndexList().size() * 2);
         PMDVertex v = new PMDVertex();
         for (Integer vertIndex : md.getVertIndexList()) {
             model.getVertex(vertIndex, v);
@@ -265,8 +263,8 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
                 tfb.put(v.getUv().getU()).put(1f - v.getUv().getV());
             }
             float weight = (float) v.getBoneWeight() / 100.0f;
-            wfb.put(weight).put(1f - weight).put(0).put(0);
-            bisb.put((short) md.getBoneList().indexOf(v.getBoneNum1())).put((short) md.getBoneList().indexOf(v.getBoneNum2())).put((short) 0).put((short) 0);
+            wfb.put(weight).put(1f - weight);
+            bisb.put((short) md.getBoneList().indexOf(v.getBoneNum1())).put((short) md.getBoneList().indexOf(v.getBoneNum2()));
         }
         for (Integer index : md.getIndexList()) {
             isb.put(index.shortValue());
@@ -274,17 +272,17 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
         }
 //        System.out.println("isb.capacity() = " + isb.capacity());
 //        System.out.println("isb.capacity() = " + md.getIndexList().size());
-        vb.setupData(VertexBuffer.Usage.Dynamic, 3, VertexBuffer.Format.Float, vfb);
-        nb.setupData(VertexBuffer.Usage.Dynamic, 3, VertexBuffer.Format.Float, nfb);
+        vb.setupData(VertexBuffer.Usage.Static, 3, VertexBuffer.Format.Float, vfb);
+        nb.setupData(VertexBuffer.Usage.Static, 3, VertexBuffer.Format.Float, nfb);
 
 //        bvb.setupData(VertexBuffer.Usage.CpuOnly, 3, VertexBuffer.Format.Float, bvfb);
 //        bnb.setupData(VertexBuffer.Usage.CpuOnly, 3, VertexBuffer.Format.Float, bnfb);
         if (textureFlag) {
             tb.setupData(VertexBuffer.Usage.Static, 2, VertexBuffer.Format.Float, tfb);
         }
-        wb.setupData(VertexBuffer.Usage.Static, 4, VertexBuffer.Format.Float, wfb);
+        wb.setupData(VertexBuffer.Usage.Static, 2, VertexBuffer.Format.Float, wfb);
         ib.setupData(VertexBuffer.Usage.Static, 1, VertexBuffer.Format.UnsignedShort, isb);
-        bib.setupData(VertexBuffer.Usage.Static, 4, VertexBuffer.Format.Short, bisb);
+        bib.setupData(VertexBuffer.Usage.Static, 2, VertexBuffer.Format.Short, bisb);
         mesh.setBuffer(vb);
         mesh.setBuffer(nb);
         
@@ -375,6 +373,9 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
             geom.setGlslSkinningMaterial(mat);
             mat = createMaterial(m, false);
             geom.setNoSkinningMaterial(mat);
+            PMDMesh mesh = (PMDMesh)geom.getMesh();
+//            mat.setInt("NumBones", mesh.boneIndexArray.length);
+
         }
         geom.setPmdMaterial(m);
         if (m.getMaterial().getFaceColor().getAlpha() < 1f) {
@@ -512,10 +513,10 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
             mat.getAdditionalRenderState().setAlphaTest(true);
 //                    mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Back);
         } else {
-            mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
+//            mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 //                    mat.getAdditionalRenderState().setFaceCullMode(FaceCullMode.Back);
 //                    mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
-            mat.getAdditionalRenderState().setAlphaTest(true);
+//            mat.getAdditionalRenderState().setAlphaTest(true);
         }
         return mat;
     }
index 1ac138b..fbc711d 100644 (file)
@@ -10,6 +10,7 @@ import java.io.RandomAccessFile;
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.nio.MappedByteBuffer;
 import java.nio.channels.FileChannel.MapMode;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -24,7 +25,8 @@ public class BufferUtil {
     public static File tmpDir = null;
     public static final Logger logger = Logger.getLogger(BufferUtil.class.getName());
     public static ByteBuffer createByteBuffer2(int size) {
-        ByteBuffer bb = ByteBuffer.allocate(size);
+        ByteBuffer bb = ByteBuffer.allocateDirect(size);
+        bb.order(ByteOrder.nativeOrder());
         return bb;
     }
     public static ByteBuffer createByteBuffer(int size) {
@@ -39,7 +41,7 @@ public class BufferUtil {
             RandomAccessFile os = new RandomAccessFile(tmpFile, "rw");
             os.seek(size);
             os.write(0);
-            ByteBuffer  bb = os.getChannel().map(MapMode.READ_WRITE, 0, size);
+            MappedByteBuffer  bb = os.getChannel().map(MapMode.READ_WRITE, 0, size);
             os.close();
             tmpFile.delete();
             bb.order(ByteOrder.nativeOrder());
index d6f19e0..f43b6a3 100755 (executable)
@@ -39,6 +39,7 @@ import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -54,7 +55,7 @@ import projectkyoto.mmd.file.PMDVertex;
 public class MeshConverter implements Serializable{
 
     PMDModel model;
-    public static int DEFAULT_MAX_BONE_SIZE = 20;
+    public static int DEFAULT_MAX_BONE_SIZE = 50;
     int maxBoneSize = DEFAULT_MAX_BONE_SIZE;
     List<MeshData> meshDataList = new ArrayList<MeshData>();
     SkinMeshData skinMeshData;
@@ -141,6 +142,13 @@ public class MeshConverter implements Serializable{
 //        meshTmpVertMap = null;
         skinTmpVertMap = null;
 //        createInterleavedBuffer();
+        Iterator<MeshData> it = meshDataList.iterator();
+        while(it.hasNext()) {
+            MeshData md = it.next();
+            if (md.getIndexList().size() == 0) {
+                it.remove();
+            }
+        }
     }
     void createInterleavedBuffer() {
         int size = 0;
index 44425d8..ddea9de 100755 (executable)
@@ -86,9 +86,9 @@ public class MeshData {
     }
     private void addBoneList(int vertIndex) {
         PMDVertex v = model.getVertex(vertIndex, tmpVert);
-        if (!boneList.contains(v.getBoneNum1()))
+        if (v.getBoneWeight() != 0 && !boneList.contains(v.getBoneNum1()))
             boneList.add(v.getBoneNum1());
-        if (!boneList.contains(v.getBoneNum2()))
+        if (v.getBoneWeight() != 100 && !boneList.contains(v.getBoneNum2()))
             boneList.add(v.getBoneNum2());
     }
     private void addVertex(MeshConverter mc, int vertIndex) {