Преглед изворни кода

Fix incorrect animation when dynamically switching from SW anim -> HW anim

shadowislord пре 10 година
родитељ
комит
64b3be5334
1 измењених фајлова са 18 додато и 5 уклоњено
  1. 18 5
      jme3-core/src/main/java/com/jme3/scene/Mesh.java

+ 18 - 5
jme3-core/src/main/java/com/jme3/scene/Mesh.java

@@ -388,10 +388,10 @@ public class Mesh implements Savable, Cloneable {
                 tangents.setUsage(Usage.Stream);
             }
         } else {
-            //if HWBoneIndex and HWBoneWieght are empty, we setup them as direct
+            //if HWBoneIndex and HWBoneWeight are empty, we setup them as direct
             //buffers with software anim buffers data 
             VertexBuffer indicesHW = getBuffer(Type.HWBoneIndex);
-            if(indicesHW.getData() == null){
+            if (indicesHW.getData() == null) {
                 VertexBuffer indices = getBuffer(Type.BoneIndex);
                 ByteBuffer originalIndex = (ByteBuffer) indices.getData();
                 ByteBuffer directIndex = BufferUtils.createByteBuffer(originalIndex.capacity());
@@ -401,25 +401,38 @@ public class Mesh implements Savable, Cloneable {
             }
             
             VertexBuffer weightsHW = getBuffer(Type.HWBoneWeight);
-             if(weightsHW.getData() == null){
+            if (weightsHW.getData() == null) {
                 VertexBuffer weights = getBuffer(Type.BoneWeight);
                 FloatBuffer originalWeight = (FloatBuffer) weights.getData();
                 FloatBuffer directWeight = BufferUtils.createFloatBuffer(originalWeight.capacity());
                 originalWeight.clear();
                 directWeight.put(originalWeight);
-                weightsHW.setupData(Usage.Static, weights.getNumComponents(), weights.getFormat(), directWeight);       
-            }           
+                weightsHW.setupData(Usage.Static, weights.getNumComponents(), weights.getFormat(), directWeight);
+            }
             
             // position, normal, and tanget buffers to be in "Static" mode
             VertexBuffer positions = getBuffer(Type.Position);
             VertexBuffer normals = getBuffer(Type.Normal);
             VertexBuffer tangents = getBuffer(Type.Tangent);
+            
+            VertexBuffer positionsBP = getBuffer(Type.BindPosePosition);
+            VertexBuffer normalsBP = getBuffer(Type.BindPoseNormal);
+            VertexBuffer tangentsBP = getBuffer(Type.BindPoseTangent);
+            
             positions.setUsage(Usage.Static);
+            positionsBP.copyElements(0, positions, 0, positionsBP.getNumElements());
+            positions.setUpdateNeeded();
+            
             if (normals != null) {
                 normals.setUsage(Usage.Static);
+                normalsBP.copyElements(0, normals, 0, normalsBP.getNumElements());
+                normals.setUpdateNeeded();
             }
+            
             if (tangents != null) {
                 tangents.setUsage(Usage.Static);
+                tangentsBP.copyElements(0, tangents, 0, tangentsBP.getNumElements());
+                tangents.setUpdateNeeded();
             }
         }
     }