From 64b3be533407d1b8031286bb358d5bc239d3931c Mon Sep 17 00:00:00 2001 From: shadowislord Date: Fri, 21 Nov 2014 21:44:16 -0500 Subject: [PATCH] Fix incorrect animation when dynamically switching from SW anim -> HW anim --- .../src/main/java/com/jme3/scene/Mesh.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/scene/Mesh.java b/jme3-core/src/main/java/com/jme3/scene/Mesh.java index 8b3ffc80e..34004c153 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Mesh.java +++ b/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(); } } }