OSDN Git Service

Support MacBook Air
authorKazuhiko Kobayashi <chototsu_moushinp@yahoo.co.jp>
Mon, 5 Sep 2011 10:17:52 +0000 (19:17 +0900)
committerKazuhiko Kobayashi <chototsu_moushinp@yahoo.co.jp>
Mon, 5 Sep 2011 10:17:52 +0000 (19:17 +0900)
nbproject/project.properties
src/projectkyoto/jme3/mmd/PMDGeometry.java
src/projectkyoto/jme3/mmd/PMDLoaderGLSLSkinning2.java
src/projectkyoto/jme3/mmd/PMDMesh.java
src/projectkyoto/jme3/mmd/PMDNode.java
src/projectkyoto/jme3/mmd/PMDSkinMesh.java

index 0ffc2ae..28ed4e6 100755 (executable)
@@ -1,78 +1,72 @@
-annotation.processing.enabled=true\r
-annotation.processing.enabled.in.editor=false\r
-annotation.processing.run.all.processors=true\r
-annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output\r
-application.title=MMDLoaderJME3-lib\r
-application.vendor=kobayasi\r
-build.classes.dir=${build.dir}/classes\r
-build.classes.excludes=**/*.java,**/*.form\r
-# This directory is removed when the project is cleaned:\r
-build.dir=build\r
-build.generated.dir=${build.dir}/generated\r
-build.generated.sources.dir=${build.dir}/generated-sources\r
-# Only compile against the classpath explicitly listed here:\r
-build.sysclasspath=ignore\r
-build.test.classes.dir=${build.dir}/test/classes\r
-build.test.results.dir=${build.dir}/test/results\r
-# Uncomment to specify the preferred debugger connection transport:\r
-#debug.transport=dt_socket\r
-debug.classpath=\\r
-    ${run.classpath}\r
-debug.test.classpath=\\r
-    ${run.test.classpath}\r
-# This directory is removed when the project is cleaned:\r
-dist.dir=dist\r
-dist.jar=${dist.dir}/MMDLoaderJME3-lib.jar\r
-dist.javadoc.dir=${dist.dir}/javadoc\r
-endorsed.classpath=\r
-excludes=\r
-file.reference.jME3-bullet-natives.jar=../lib/jME3-bullet-natives.jar\r
-file.reference.jME3-bullet.jar=../lib/jME3-bullet.jar\r
-file.reference.jMonkeyEngine3.jar=../lib/jMonkeyEngine3.jar\r
-file.reference.vecmath.jar=../lib/vecmath.jar\r
-includes=**\r
-jar.compress=false\r
-javac.classpath=\\r
-    ${file.reference.jME3-bullet-natives.jar}:\\r
-    ${file.reference.jME3-bullet.jar}:\\r
-    ${file.reference.jMonkeyEngine3.jar}:\\r
-    ${file.reference.vecmath.jar}\r
-# Space-separated list of extra javac options\r
-javac.compilerargs=\r
-javac.deprecation=false\r
-javac.processorpath=\\r
-    ${javac.classpath}\r
-javac.source=1.6\r
-javac.target=1.6\r
-javac.test.classpath=\\r
-    ${javac.classpath}:\\r
-    ${build.classes.dir}\r
-javac.test.processorpath=\\r
-    ${javac.test.classpath}\r
-javadoc.additionalparam=\r
-javadoc.author=false\r
-javadoc.encoding=${source.encoding}\r
-javadoc.noindex=false\r
-javadoc.nonavbar=false\r
-javadoc.notree=false\r
-javadoc.private=false\r
-javadoc.splitindex=true\r
-javadoc.use=true\r
-javadoc.version=false\r
-javadoc.windowtitle=\r
-meta.inf.dir=${src.dir}/META-INF\r
-mkdist.disabled=true\r
-platform.active=default_platform\r
-run.classpath=\\r
-    ${javac.classpath}:\\r
-    ${build.classes.dir}\r
-# Space-separated list of JVM arguments used when running the project\r
-# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value\r
-# or test-sys-prop.name=value to set system properties for unit tests):\r
-run.jvmargs=\r
-run.test.classpath=\\r
-    ${javac.test.classpath}:\\r
-    ${build.test.classes.dir}\r
-source.encoding=UTF-8\r
-src.dir=src\r
-test.src.dir=test\r
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+application.title=MMDLoaderJME3-lib
+application.vendor=kobayasi
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/MMDLoaderJME3-lib.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+includes=**
+jar.compress=false
+javac.classpath=\
+    ${libs.jme3-libraries.classpath}:\
+    ${libs.jme3.classpath}
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+    ${javac.classpath}
+javac.source=1.6
+javac.target=1.6
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+javac.test.processorpath=\
+    ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=true
+platform.active=default_platform
+run.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+# Space-separated list of JVM arguments used when running the project
+# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
+# or test-sys-prop.name=value to set system properties for unit tests):
+run.jvmargs=
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
index 8da309b..98526be 100755 (executable)
@@ -85,7 +85,6 @@ public class PMDGeometry extends Geometry {
         newPMDGeometry.setMesh(getMesh().clone());
         newPMDGeometry.glslSkinningMaterial = glslSkinningMaterial.clone();
         newPMDGeometry.noSkinningMaterial = noSkinningMaterial.clone();
-        System.out.println("PMDGeometry::clone() "+getName());
         return newPMDGeometry;
     }
 
index d04fdc4..e6296ea 100755 (executable)
@@ -60,6 +60,7 @@ import java.nio.ShortBuffer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.StringTokenizer;
+import org.lwjgl.opengl.GL11;
 import projectkyoto.mmd.file.*;
 import projectkyoto.mmd.file.util2.MeshConverter;
 import projectkyoto.mmd.file.util2.MeshData;
@@ -247,6 +248,9 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
         bib.setupData(VertexBuffer.Usage.Static, 4, VertexBuffer.Format.Short, bisb);
         mesh.setBuffer(vb);
         mesh.setBuffer(nb);
+        
+        mesh.setVbBackup(vb);
+        mesh.setNbBackup(nb);
 
 //        mesh.setBuffer(bvb);
 //        mesh.setBuffer(bnb);
@@ -536,7 +540,14 @@ public class PMDLoaderGLSLSkinning2 implements AssetLoader{
                 model = new PMDModel(ai.openStream());
                 folderName = ai.getKey().getFolder();
                 meshConverter = new MeshConverter(model);
-                return createNode(ai.getKey().getName());
+                PMDNode pmdNode = createNode(ai.getKey().getName());
+                String vendor = GL11.glGetString(GL11.GL_VENDOR);
+                if (vendor != null && vendor.toLowerCase().contains("intel")) {
+                    pmdNode.setGlslSkinning(false);
+                } else {
+                    pmdNode.setGlslSkinning(true);
+                }
+                return pmdNode;
             }catch(OutOfMemoryError ex) {
                 if (errFlag) {
                     throw new RuntimeException(ex);
index 6e606a5..ac53fde 100755 (executable)
@@ -34,6 +34,9 @@ import com.jme3.bounding.BoundingVolume;
 import com.jme3.math.Matrix4f;
 import com.jme3.math.Vector3f;
 import com.jme3.scene.Mesh;
+import com.jme3.scene.VertexBuffer;
+import com.jme3.util.BufferUtils;
+import java.nio.FloatBuffer;
 
 /**
  *
@@ -43,6 +46,8 @@ public class PMDMesh extends Mesh {
 
     short boneIndexArray[];
     Matrix4f boneMatrixArray[];
+    VertexBuffer vbBackup;
+    VertexBuffer nbBackup;
 
     public PMDMesh() {
         super();
@@ -72,13 +77,75 @@ public class PMDMesh extends Mesh {
 
     @Override
     public PMDMesh clone() {
-        PMDMesh newMesh = (PMDMesh)super.clone();
+        PMDMesh newMesh = (PMDMesh) super.clone();
         newMesh.boneMatrixArray = new Matrix4f[boneMatrixArray.length];
-        for(int i=0;i<newMesh.boneMatrixArray.length;i++) {
+        for (int i = 0; i < newMesh.boneMatrixArray.length; i++) {
             newMesh.boneMatrixArray[i] = new Matrix4f();
         }
-        System.out.println("PMDMesh::clone()");
         return newMesh;
     }
-    
+
+    public VertexBuffer getNbBackup() {
+        return nbBackup;
+    }
+
+    public void setNbBackup(VertexBuffer nbBackup) {
+        this.nbBackup = nbBackup;
+    }
+
+    public VertexBuffer getVbBackup() {
+        return vbBackup;
+    }
+
+    public void setVbBackup(VertexBuffer vbBackup) {
+        this.vbBackup = vbBackup;
+    }
+
+    public void createSoftwareSkinningBuffers() {
+        boolean retryFlag = false;
+        for (;;) {
+            try {
+                VertexBuffer vb;
+                vb = new VertexBuffer(VertexBuffer.Type.Position);
+                FloatBuffer vfb = BufferUtils.clone((FloatBuffer) vbBackup.getData());
+                vb.setupData(VertexBuffer.Usage.Dynamic, 3, VertexBuffer.Format.Float, vfb);
+                clearBuffer(VertexBuffer.Type.Position);
+                setBuffer(vb);
+                break;
+            } catch (OutOfMemoryError ex) {
+                if (!retryFlag) {
+                    System.gc();
+                    retryFlag = true;
+                } else {
+                    throw new RuntimeException(ex);
+                }
+            }
+        }
+        retryFlag = false;
+        for (;;) {
+            try {
+                VertexBuffer nb;
+                nb = new VertexBuffer(VertexBuffer.Type.Normal);
+                FloatBuffer nfb = BufferUtils.clone((FloatBuffer) nbBackup.getData());
+                nb.setupData(VertexBuffer.Usage.Dynamic, 3, VertexBuffer.Format.Float, nfb);
+                clearBuffer(VertexBuffer.Type.Normal);
+                setBuffer(nb);
+                break;
+            } catch (OutOfMemoryError ex) {
+                if (!retryFlag) {
+                    System.gc();
+                    retryFlag = true;
+                } else {
+                    throw new RuntimeException(ex);
+                }
+            }
+        }
+    }
+
+    public void releaseSoftwareSkinningBufferes() {
+        clearBuffer(VertexBuffer.Type.Position);
+        setBuffer(vbBackup);
+        clearBuffer(VertexBuffer.Type.Normal);
+        setBuffer(nbBackup);
+    }
 }
index b3efd25..e2feaa5 100755 (executable)
@@ -244,7 +244,12 @@ public class PMDNode extends Node {
         VertexBuffer nb = mesh.getBuffer(VertexBuffer.Type.Normal);
         FloatBuffer fnb = (FloatBuffer) nb.getData();
         fnb.rewind();
-
+        
+        FloatBuffer fvb2 = (FloatBuffer)mesh.getVbBackup().getData();
+        fvb2.rewind();
+        FloatBuffer fnb2 = (FloatBuffer)mesh.getNbBackup().getData();
+        fnb2.rewind();
+        
         // get boneIndexes and weights for mesh
         ShortBuffer ib = (ShortBuffer) mesh.getBuffer(VertexBuffer.Type.BoneIndex).getData();
         FloatBuffer wb = (FloatBuffer) mesh.getBuffer(VertexBuffer.Type.BoneWeight).getData();
@@ -265,8 +270,8 @@ public class PMDNode extends Node {
         for (int i = iterations-1; i >= 0; i--){
             // read next set of positions and normals from native buffer
             bufLength = Math.min(posBuf.length, fvb.remaining());
-            fvb.get(posBuf, 0, bufLength);
-            fnb.get(normBuf, 0, bufLength);
+            fvb2.get(posBuf, 0, bufLength);
+            fnb2.get(normBuf, 0, bufLength);
             int verts = bufLength / 3;
             int idxPositions = 0;
 
@@ -306,9 +311,9 @@ public class PMDNode extends Node {
             }
 
 
-            fvb.position(fvb.position()-bufLength);
+//            fvb.position(fvb2.position()-bufLength);
             fvb.put(posBuf, 0, bufLength);
-            fnb.position(fnb.position()-bufLength);
+//            fnb.position(fnb2.position()-bufLength);
             fnb.put(normBuf, 0, bufLength);
         }
         vb.setUpdateNeeded();
@@ -486,7 +491,6 @@ public class PMDNode extends Node {
     }
 
     void resetToBind(PMDMesh mesh) {
-        
     }
     void _resetToBind(PMDMesh mesh) {
         VertexBuffer vb = mesh.getBuffer(VertexBuffer.Type.Position);
@@ -731,7 +735,6 @@ public class PMDNode extends Node {
     }
 
     public void setGlslSkinning(boolean glslSkinning) {
-        glslSkinning = true;
         this.glslSkinning = glslSkinning;
         for (PMDMesh mesh : targets) {
 //            resetToBind(mesh);
@@ -740,11 +743,14 @@ public class PMDNode extends Node {
             if (sp instanceof PMDGeometry) {
                 Mesh mesh = ((PMDGeometry) sp).getMesh();
                 if (mesh instanceof PMDMesh) {
-                    resetToBind((PMDMesh) mesh);
+                    PMDMesh pmdMesh = (PMDMesh)mesh;
+                    resetToBind(pmdMesh);
                     if (glslSkinning) {
+                        pmdMesh.releaseSoftwareSkinningBufferes();
                         mesh.getBuffer(Type.Position).setUsage(Usage.Static);
                         mesh.getBuffer(Type.Normal).setUsage(Usage.Static);
                     } else {
+                        pmdMesh.createSoftwareSkinningBuffers();
                         mesh.getBuffer(Type.Position).setUsage(Usage.Dynamic);
                         mesh.getBuffer(Type.Normal).setUsage(Usage.Dynamic);
                     }
@@ -772,12 +778,6 @@ public class PMDNode extends Node {
         try {
             PMDNode newPMDNode = (PMDNode)super.clone();
 //            newPMDNode.pmdModel = pmdModel;
-            System.out.println("model name = "+pmdModel.getModelName());
-                System.out.println("child size = "+getChildren().size());
-                System.out.println("source targets size = "+targets.length+" "+skinTargets.length);
-            if (newPMDNode.getChildren().size() != getChildren().size()){
-                System.out.println("child size error "+newPMDNode.getChildren().size());
-            }
             newPMDNode.skeleton = new Skeleton(skeleton);
             for(int i=0;i<skeleton.getBoneCount();i++) {
                 Bone newBone = newPMDNode.skeleton.getBone(i);
@@ -817,7 +817,6 @@ public class PMDNode extends Node {
                 newPMDNode.skinNormalArray[i] = new javax.vecmath.Vector3f(skinNormalArray[i]);
             }
 //            newPMDNode.offsetMatrices = new Matrix4f[offsetMatrices.length];
-            System.out.println("skinTargets size = "+skinTargets.length+" "+skinMeshCount);
             newPMDNode.setGlslSkinning(newPMDNode.glslSkinning);
             newPMDNode.skeleton.updateWorldVectors();
             newPMDNode.calcOffsetMatrices();
index 0711fbb..4e8d504 100755 (executable)
@@ -93,7 +93,6 @@ public class PMDSkinMesh extends Mesh {
     }
     @Override
     public PMDSkinMesh clone() {
-        System.out.println("PMDSkinMesh::clone()");
         PMDSkinMesh newMesh = (PMDSkinMesh)super.clone();
 //        newMesh.boneMatrixArray = new Matrix4f[boneMatrixArray.length];
         newMesh.skinvb2 = new VertexBuffer(VertexBuffer.Type.Position);