diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshContext.java b/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshContext.java index de43db7c8..5a58fb7aa 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshContext.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshContext.java @@ -14,13 +14,17 @@ import java.util.Map; */ public class MeshContext { /** The mesh stored here as a list of geometries. */ - private List mesh; + private List mesh; /** Vertex list that is referenced by all the geometries. */ - private List vertexList; + private List vertexList; /** The vertex reference map. */ - private Map> vertexReferenceMap; + private Map> vertexReferenceMap; /** The UV-coordinates for each of the geometries. */ - private Map uvCoordinates = new HashMap(); + private Map uvCoordinates = new HashMap(); + /** Bind buffer for vertices is stored here and applied when required. */ + private VertexBuffer bindPoseBuffer; + /** Bind buffer for normals is stored here and applied when required. */ + private VertexBuffer bindNormalBuffer; /** * This method returns the referenced mesh. @@ -75,8 +79,7 @@ public class MeshContext { * @param vertexReferenceMap * the vertex reference map */ - public void setVertexReferenceMap( - Map> vertexReferenceMap) { + public void setVertexReferenceMap(Map> vertexReferenceMap) { this.vertexReferenceMap = vertexReferenceMap; } @@ -102,4 +105,38 @@ public class MeshContext { public VertexBuffer getUVCoordinates(Geometry geometry) { return uvCoordinates.get(geometry); } + + /** + * This method sets the bind buffer for vertices. + * + * @param bindNormalBuffer + * the bind buffer for vertices + */ + public void setBindNormalBuffer(VertexBuffer bindNormalBuffer) { + this.bindNormalBuffer = bindNormalBuffer; + } + + /** + * @return the bind buffer for vertices + */ + public VertexBuffer getBindNormalBuffer() { + return bindNormalBuffer; + } + + /** + * This method sets the bind buffer for normals. + * + * @param bindNormalBuffer + * the bind buffer for normals + */ + public void setBindPoseBuffer(VertexBuffer bindPoseBuffer) { + this.bindPoseBuffer = bindPoseBuffer; + } + + /** + * @return the bind buffer for normals + */ + public VertexBuffer getBindPoseBuffer() { + return bindPoseBuffer; + } } diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshHelper.java b/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshHelper.java index c20a7a8a2..ef091282c 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshHelper.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/meshes/MeshHelper.java @@ -278,7 +278,7 @@ public class MeshHelper extends AbstractBlenderHelper { geometries = new ArrayList(meshesMap.size()); VertexBuffer verticesBuffer = new VertexBuffer(Type.Position); - verticesBuffer.setupData(Usage.Stream, 3, Format.Float, + verticesBuffer.setupData(Usage.Static, 3, Format.Float, BufferUtils.createFloatBuffer(vertexList.toArray(new Vector3f[vertexList.size()]))); // initial vertex position (used with animation) @@ -286,7 +286,7 @@ public class MeshHelper extends AbstractBlenderHelper { verticesBind.setupData(Usage.CpuOnly, 3, Format.Float, BufferUtils.clone(verticesBuffer.getData())); VertexBuffer normalsBuffer = new VertexBuffer(Type.Normal); - normalsBuffer.setupData(Usage.Stream, 3, Format.Float, BufferUtils.createFloatBuffer(normals)); + normalsBuffer.setupData(Usage.Static, 3, Format.Float, BufferUtils.createFloatBuffer(normals)); // initial normals position (used with animation) VertexBuffer normalsBind = new VertexBuffer(Type.BindPoseNormal); @@ -323,7 +323,7 @@ public class MeshHelper extends AbstractBlenderHelper { } mesh.setBuffer(verticesBuffer); - mesh.setBuffer(verticesBind); + meshContext.setBindPoseBuffer(verticesBind);//this is stored in the context and applied when needed (when animation is applied to the mesh) // setting vertices colors if (verticesColorsBuffer != null) { @@ -333,7 +333,7 @@ public class MeshHelper extends AbstractBlenderHelper { // setting faces' normals mesh.setBuffer(normalsBuffer); - mesh.setBuffer(normalsBind); + meshContext.setBindNormalBuffer(normalsBind);//this is stored in the context and applied when needed (when animation is applied to the mesh) // creating the result Geometry geometry = new Geometry(name + (geometries.size() + 1), mesh); diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java b/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java index c15e91f3b..e5e0e313c 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java @@ -177,9 +177,20 @@ import com.jme3.util.BufferUtils; } // setting weights for bones - List geomList = (List) blenderContext.getLoadedFeature(this.meshOMA, LoadedFeatureDataType.LOADED_FEATURE); + List geomList = (List) blenderContext.getLoadedFeature(meshOMA, LoadedFeatureDataType.LOADED_FEATURE); + MeshContext meshContext = blenderContext.getMeshContext(meshOMA); for (Geometry geom : geomList) { Mesh mesh = geom.getMesh(); + if(meshContext.getBindNormalBuffer() != null) { + mesh.setBuffer(meshContext.getBindNormalBuffer()); + } + if(meshContext.getBindPoseBuffer() != null) { + mesh.setBuffer(meshContext.getBindPoseBuffer()); + } + //change the usage type of vertex and normal buffers from Static to Stream + mesh.getBuffer(Type.Position).setUsage(Usage.Stream); + mesh.getBuffer(Type.Normal).setUsage(Usage.Stream); + if (this.verticesWeights != null) { mesh.setMaxNumWeights(this.boneGroups); mesh.setBuffer(this.verticesWeights);