@ -107,6 +107,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
private int texCoordIndex = 0 ;
private String ignoreUntilEnd = null ;
private List < Geometry > geoms = new ArrayList < Geometry > ( ) ;
private ArrayList < Boolean > usesSharedMesh = new ArrayList < Boolean > ( ) ;
private IntMap < List < VertexBuffer > > lodLevels = new IntMap < List < VertexBuffer > > ( ) ;
private AnimData animData ;
@ -127,6 +128,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
geom = null ;
sharedMesh = null ;
usesSharedMesh . clear ( ) ;
usesSharedVerts = false ;
vertCount = 0 ;
meshIndex = 0 ;
@ -170,9 +172,10 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
}
}
private boolean isUsingSharedVerts ( Geometry geom ) {
return geom . getUserData ( UserData . JME_SHAREDMESH ) ! = null ;
}
// private boolean isUsingSharedVerts(Geometry geom) {
// Old code for buffer sharer
//return geom.getUserData(UserData.JME_SHAREDMESH) != null;
// }
private void startFaces ( String count ) throws SAXException {
int numFaces = parseInt ( count ) ;
@ -215,6 +218,9 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
mat = assetManager . loadMaterial ( matName ) ;
} catch ( AssetNotFoundException ex ) {
// Warning will be raised (see below)
if ( ! ex . getMessage ( ) . equals ( matName ) ) {
throw ex ;
}
}
} else {
if ( materialList ! = null ) {
@ -251,11 +257,16 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
usesBigIndices = parseBool ( use32bitIndices , false ) ;
usesSharedVerts = parseBool ( usesharedvertices , false ) ;
if ( usesSharedVerts ) {
usesSharedMesh . add ( true ) ;
// Old code for buffer sharer
// import vertexbuffers from shared geom
IntMap < VertexBuffer > sharedBufs = sharedMesh . getBuffers ( ) ;
for ( Entry < VertexBuffer > entry : sharedBufs ) {
mesh . setBuffer ( entry . getValue ( ) ) ;
}
// IntMap<VertexBuffer> sharedBufs = sharedMesh.getBuffers();
// for (Entry<VertexBuffer> entry : sharedBufs) {
// mesh.setBuffer(entry.getValue());
// }
} else {
usesSharedMesh . add ( false ) ;
}
if ( meshName = = null ) {
@ -265,8 +276,9 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
}
if ( usesSharedVerts ) {
// Old code for buffer sharer
// this mesh is shared!
geom . setUserData ( UserData . JME_SHAREDMESH , sharedMesh ) ;
//geom.setUserData(UserData.JME_SHAREDMESH, sharedMesh);
}
applyMaterial ( geom , matName ) ;
@ -291,9 +303,9 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
* for all vertices in the buffer .
* /
private void endBoneAssigns ( ) {
if ( mesh ! = sharedMesh & & isUsingSharedVerts ( geom ) ) {
return ;
}
// if (mesh != sharedMesh && isUsingSharedVerts(geom)) {
// return;
// }
if ( ! actuallyHasWeights ) {
// No weights were actually written (the tag didn't have any entries)
@ -725,9 +737,16 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
for ( int i = 0 ; i < geoms . size ( ) ; i + + ) {
Geometry g = geoms . get ( i ) ;
Mesh m = g . getMesh ( ) ;
if ( sharedMesh ! = null & & isUsingSharedVerts ( g ) ) {
m . setBound ( sharedMesh . getBound ( ) . clone ( ) ) ;
// New code for buffer extract
if ( sharedMesh ! = null & & usesSharedMesh . get ( i ) ) {
m . extractVertexData ( sharedMesh ) ;
}
// Old code for buffer sharer
//if (sharedMesh != null && isUsingSharedVerts(g)) {
// m.setBound(sharedMesh.getBound().clone());
//}
model . attachChild ( geoms . get ( i ) ) ;
}
@ -736,45 +755,26 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
if ( animData ! = null ) {
// This model uses animation
// Old code for buffer sharer
// generate bind pose for mesh
// ONLY if not using shared geometry
// This includes the shared geoemtry itself actually
if ( sharedMesh ! = null ) {
sharedMesh . generateBindPose ( ! HARDWARE_SKINNING ) ;
}
//if (sharedMesh != null) {
// sharedMesh.generateBindPose(!HARDWARE_SKINNING);
//}
for ( int i = 0 ; i < geoms . size ( ) ; i + + ) {
Geometry g = geoms . get ( i ) ;
Mesh m = geoms . get ( i ) . getMesh ( ) ;
boolean useShared = isUsingSharedVerts ( g ) ;
if ( ! useShared ) {
m . generateBindPose ( ! HARDWARE_SKINNING ) ;
// Old code for buffer sharer
//boolean useShared = isUsingSharedVerts(g);
//if (!useShared) {
// create bind pose
m . generateBindPose ( ! HARDWARE_SKINNING ) ;
// } else {
// Inherit animation data from shared mesh
// VertexBuffer bindPos = sharedMesh.getBuffer(Type.BindPosePosition);
// VertexBuffer bindNorm = sharedMesh.getBuffer(Type.BindPoseNormal);
// VertexBuffer boneIndex = sharedMesh.getBuffer(Type.BoneIndex);
// VertexBuffer boneWeight = sharedMesh.getBuffer(Type.BoneWeight);
//
// if (bindPos != null) {
// m.setBuffer(bindPos);
// }
//
// if (bindNorm != null) {
// m.setBuffer(bindNorm);
// }
//
// if (boneIndex != null) {
// m.setBuffer(boneIndex);
// }
//
// if (boneWeight != null) {
// m.setBuffer(boneWeight);
// }
}
//m.generateBindPose(!HARDWARE_SKINNING);
//}
}
// Put the animations in the AnimControl