- add support for material name to OgreMeshKey
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8107 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
ab5541f08d
commit
fab0c6d73c
@ -88,27 +88,22 @@ import static com.jme3.util.xml.SAXUtil.*;
|
||||
public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MeshLoader.class.getName());
|
||||
|
||||
public static boolean AUTO_INTERLEAVE = true;
|
||||
public static boolean HARDWARE_SKINNING = false;
|
||||
|
||||
private static final Type[] TEXCOORD_TYPES =
|
||||
new Type[]{
|
||||
Type.TexCoord,
|
||||
Type.TexCoord2,
|
||||
Type.TexCoord3,
|
||||
Type.TexCoord4,
|
||||
Type.TexCoord5,
|
||||
Type.TexCoord6,
|
||||
Type.TexCoord7,
|
||||
Type.TexCoord8,
|
||||
};
|
||||
|
||||
new Type[]{
|
||||
Type.TexCoord,
|
||||
Type.TexCoord2,
|
||||
Type.TexCoord3,
|
||||
Type.TexCoord4,
|
||||
Type.TexCoord5,
|
||||
Type.TexCoord6,
|
||||
Type.TexCoord7,
|
||||
Type.TexCoord8,};
|
||||
private String meshName;
|
||||
private String folderName;
|
||||
private AssetManager assetManager;
|
||||
private MaterialList materialList;
|
||||
|
||||
// Data per submesh/sharedgeom
|
||||
private ShortBuffer sb;
|
||||
private IntBuffer ib;
|
||||
@ -121,17 +116,15 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
private int vertCount;
|
||||
private boolean usesSharedVerts;
|
||||
private boolean usesBigIndices;
|
||||
|
||||
// Global data
|
||||
private Mesh sharedMesh;
|
||||
private int meshIndex = 0;
|
||||
private int texCoordIndex = 0;
|
||||
private String ignoreUntilEnd = null;
|
||||
|
||||
private List<Geometry> geoms = new ArrayList<Geometry>();
|
||||
private IntMap<List<VertexBuffer>> lodLevels = new IntMap<List<VertexBuffer>>();
|
||||
private AnimData animData;
|
||||
|
||||
|
||||
public MeshLoader() {
|
||||
super();
|
||||
}
|
||||
@ -177,8 +170,8 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
sb.put((short) i1).put((short) i2).put((short) i3);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isUsingSharedVerts(Geometry geom){
|
||||
|
||||
private boolean isUsingSharedVerts(Geometry geom) {
|
||||
return geom.getUserData(UserData.JME_SHAREDMESH) != null;
|
||||
}
|
||||
|
||||
@ -227,7 +220,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
if (mat.isTransparent()) {
|
||||
geom.setQueueBucket(Bucket.Transparent);
|
||||
}
|
||||
|
||||
|
||||
geom.setMaterial(mat);
|
||||
}
|
||||
|
||||
@ -256,8 +249,8 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
} else {
|
||||
geom = new Geometry(meshName + "-geom-" + (++meshIndex), mesh);
|
||||
}
|
||||
|
||||
if (usesSharedVerts){
|
||||
|
||||
if (usesSharedVerts) {
|
||||
// this mesh is shared!
|
||||
geom.setUserData(UserData.JME_SHAREDMESH, sharedMesh);
|
||||
}
|
||||
@ -270,7 +263,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
sharedMesh = new Mesh();
|
||||
vertCount = parseInt(vertexcount);
|
||||
usesSharedVerts = false;
|
||||
|
||||
|
||||
geom = null;
|
||||
mesh = sharedMesh;
|
||||
}
|
||||
@ -345,7 +338,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
weightsFloatData = FloatBuffer.allocate(vertCount * 4);
|
||||
indicesData = ByteBuffer.allocate(vertCount * 4);
|
||||
}
|
||||
|
||||
|
||||
VertexBuffer weights = new VertexBuffer(Type.BoneWeight);
|
||||
VertexBuffer indices = new VertexBuffer(Type.BoneIndex);
|
||||
|
||||
@ -398,7 +391,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
}
|
||||
|
||||
if (i <= 7) {
|
||||
vb = new VertexBuffer( TEXCOORD_TYPES[i] );
|
||||
vb = new VertexBuffer(TEXCOORD_TYPES[i]);
|
||||
} else {
|
||||
// more than 8 texture coordinates are not supported by ogre.
|
||||
throw new SAXException("More than 8 texture coordinates not supported");
|
||||
@ -521,7 +514,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
int vert = parseInt(vertIndex);
|
||||
float w = parseFloat(weight);
|
||||
byte bone = (byte) parseInt(boneIndex);
|
||||
|
||||
|
||||
assert bone >= 0;
|
||||
assert vert >= 0 && vert < mesh.getVertexCount();
|
||||
|
||||
@ -534,7 +527,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (v != 0){
|
||||
if (v != 0) {
|
||||
logger.log(Level.WARNING, "Vertex {0} has more than 4 weights per vertex! Ignoring..", vert);
|
||||
return;
|
||||
}
|
||||
@ -694,7 +687,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
|
||||
private Node compileModel() {
|
||||
Node model = new Node(meshName + "-ogremesh");
|
||||
|
||||
|
||||
for (int i = 0; i < geoms.size(); i++) {
|
||||
Geometry g = geoms.get(i);
|
||||
Mesh m = g.getMesh();
|
||||
@ -703,25 +696,25 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
}
|
||||
model.attachChild(geoms.get(i));
|
||||
}
|
||||
|
||||
|
||||
// Do not attach shared geometry to the node!
|
||||
|
||||
|
||||
if (animData != null) {
|
||||
// This model uses animation
|
||||
|
||||
|
||||
// generate bind pose for mesh
|
||||
// ONLY if not using shared geometry
|
||||
// This includes the shared geoemtry itself actually
|
||||
if (sharedMesh != null){
|
||||
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);
|
||||
|
||||
|
||||
boolean useShared = isUsingSharedVerts(g);
|
||||
|
||||
|
||||
if (!useShared) {
|
||||
// create bind pose
|
||||
m.generateBindPose(!HARDWARE_SKINNING);
|
||||
@ -749,7 +742,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Put the animations in the AnimControl
|
||||
HashMap<String, Animation> anims = new HashMap<String, Animation>();
|
||||
ArrayList<Animation> animList = animData.anims;
|
||||
@ -757,14 +750,14 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
Animation anim = animList.get(i);
|
||||
anims.put(anim.getName(), anim);
|
||||
}
|
||||
|
||||
|
||||
AnimControl ctrl = new AnimControl(animData.skeleton);
|
||||
ctrl.setAnimations(anims);
|
||||
model.addControl(ctrl);
|
||||
|
||||
|
||||
// Put the skeleton in the skeleton control
|
||||
SkeletonControl skeletonControl = new SkeletonControl(animData.skeleton);
|
||||
|
||||
|
||||
// This will acquire the targets from the node
|
||||
model.addControl(skeletonControl);
|
||||
}
|
||||
@ -788,6 +781,10 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
if (key instanceof OgreMeshKey) {
|
||||
meshKey = (OgreMeshKey) key;
|
||||
materialList = meshKey.getMaterialList();
|
||||
String materialName = meshKey.getMaterialName();
|
||||
if (materialList == null && materialName != null) {
|
||||
materialList = (MaterialList) assetManager.loadAsset(new OgreMaterialKey(folderName + materialName + ".material"));
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
materialList = (MaterialList) assetManager.loadAsset(new OgreMaterialKey(folderName + meshName + ".material"));
|
||||
@ -796,7 +793,7 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Added by larynx 25.06.2011
|
||||
// Android needs the namespace aware flag set to true
|
||||
// Kirill 30.06.2011
|
||||
@ -804,8 +801,8 @@ public class MeshLoader extends DefaultHandler implements AssetLoader {
|
||||
// checking with JmeSystem.
|
||||
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||
factory.setNamespaceAware(true);
|
||||
XMLReader xr = factory.newSAXParser().getXMLReader();
|
||||
|
||||
XMLReader xr = factory.newSAXParser().getXMLReader();
|
||||
|
||||
xr.setContentHandler(this);
|
||||
xr.setErrorHandler(this);
|
||||
InputStreamReader r = new InputStreamReader(info.openStream());
|
||||
|
@ -38,18 +38,32 @@ import com.jme3.material.MaterialList;
|
||||
public class OgreMeshKey extends ModelKey {
|
||||
|
||||
private MaterialList materialList;
|
||||
|
||||
public OgreMeshKey(String name, MaterialList materialList){
|
||||
super(name);
|
||||
this.materialList = materialList;
|
||||
}
|
||||
private String materialName;
|
||||
|
||||
public OgreMeshKey(){
|
||||
super();
|
||||
}
|
||||
|
||||
public OgreMeshKey(String name){
|
||||
super(name);
|
||||
}
|
||||
|
||||
public OgreMeshKey(String name, MaterialList materialList){
|
||||
super(name);
|
||||
this.materialList = materialList;
|
||||
}
|
||||
|
||||
public OgreMeshKey(String name, String materialName){
|
||||
super(name);
|
||||
this.materialName = materialName;
|
||||
}
|
||||
|
||||
public MaterialList getMaterialList() {
|
||||
return materialList;
|
||||
}
|
||||
|
||||
public String getMaterialName() {
|
||||
return materialName;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ public class TestBumpModel extends SimpleApplication {
|
||||
|
||||
@Override
|
||||
public void simpleInitApp() {
|
||||
Spatial signpost = (Spatial) assetManager.loadAsset(new OgreMeshKey("Models/Sign Post/Sign Post.mesh.xml", null));
|
||||
Spatial signpost = (Spatial) assetManager.loadAsset(new OgreMeshKey("Models/Sign Post/Sign Post.mesh.xml"));
|
||||
signpost.setMaterial( (Material) assetManager.loadMaterial("Models/Sign Post/Sign Post.j3m"));
|
||||
TangentBinormalGenerator.generate(signpost);
|
||||
rootNode.attachChild(signpost);
|
||||
|
Loading…
x
Reference in New Issue
Block a user