@ -353,6 +353,27 @@ public class Mesh implements Savable, Cloneable {
* /
public void prepareForAnim ( boolean forSoftwareAnim ) {
if ( forSoftwareAnim ) {
// convert indices to ubytes on the heap
VertexBuffer indices = getBuffer ( Type . BoneIndex ) ;
if ( ! indices . getData ( ) . hasArray ( ) ) {
ByteBuffer originalIndex = ( ByteBuffer ) indices . getData ( ) ;
ByteBuffer arrayIndex = ByteBuffer . allocate ( originalIndex . capacity ( ) ) ;
originalIndex . clear ( ) ;
arrayIndex . put ( originalIndex ) ;
indices . updateData ( arrayIndex ) ;
}
indices . setUsage ( Usage . CpuOnly ) ;
// convert weights on the heap
VertexBuffer weights = getBuffer ( Type . BoneWeight ) ;
if ( ! weights . getData ( ) . hasArray ( ) ) {
FloatBuffer originalWeight = ( FloatBuffer ) weights . getData ( ) ;
FloatBuffer arrayWeight = FloatBuffer . allocate ( originalWeight . capacity ( ) ) ;
originalWeight . clear ( ) ;
arrayWeight . put ( originalWeight ) ;
weights . updateData ( arrayWeight ) ;
}
weights . setUsage ( Usage . CpuOnly ) ;
// position, normal, and tanget buffers to be in "Stream" mode
VertexBuffer positions = getBuffer ( Type . Position ) ;
VertexBuffer normals = getBuffer ( Type . Normal ) ;
@ -1305,18 +1326,32 @@ public class Mesh implements Savable, Cloneable {
out . write ( modeStart , "modeStart" , null ) ;
out . write ( pointSize , "pointSize" , 1f ) ;
if ( isAnimated ( ) ) {
VertexBuffer vb = getBuffer ( Type . HWBoneIndex ) ;
if ( vb ! = null ) {
//Removing HW skinning buffers to not save them
VertexBuffer hwBoneIndex = null ;
VertexBuffer hwBoneWeight = null ;
if ( isAnimated ( ) ) {
hwBoneIndex = getBuffer ( Type . HWBoneIndex ) ;
if ( hwBoneIndex ! = null ) {
buffers . remove ( Type . HWBoneIndex . ordinal ( ) ) ;
}
vb = getBuffer ( Type . HWBoneWeight ) ;
if ( vb ! = null ) {
hwBoneWeight = getBuffer ( Type . HWBoneWeight ) ;
if ( hwBoneWeight ! = null ) {
buffers . remove ( Type . HWBoneWeight . ordinal ( ) ) ;
}
}
out . writeIntSavableMap ( buffers , "buffers" , null ) ;
//restoring Hw skinning buffers.
if ( isAnimated ( ) ) {
if ( hwBoneIndex ! = null ) {
buffers . put ( hwBoneIndex . getBufferType ( ) . ordinal ( ) , hwBoneIndex ) ;
}
if ( hwBoneWeight ! = null ) {
buffers . put ( hwBoneWeight . getBufferType ( ) . ordinal ( ) , hwBoneWeight ) ;
}
}
out . write ( lodLevels , "lodLevels" , null ) ;
}