-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
newPMDGeometry.setMesh(getMesh().clone());
newPMDGeometry.glslSkinningMaterial = glslSkinningMaterial.clone();
newPMDGeometry.noSkinningMaterial = noSkinningMaterial.clone();
- System.out.println("PMDGeometry::clone() "+getName());
return newPMDGeometry;
}
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;
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);
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);
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;
/**
*
short boneIndexArray[];
Matrix4f boneMatrixArray[];
+ VertexBuffer vbBackup;
+ VertexBuffer nbBackup;
public PMDMesh() {
super();
@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);
+ }
}
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();
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;
}
- 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();
}
void resetToBind(PMDMesh mesh) {
-
}
void _resetToBind(PMDMesh mesh) {
VertexBuffer vb = mesh.getBuffer(VertexBuffer.Type.Position);
}
public void setGlslSkinning(boolean glslSkinning) {
- glslSkinning = true;
this.glslSkinning = glslSkinning;
for (PMDMesh mesh : targets) {
// resetToBind(mesh);
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);
}
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);
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();
}
@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);