98 lines
3.4 KiB
Java
98 lines
3.4 KiB
Java
package sg.util;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
import java.net.URISyntaxException;
|
|
import java.net.URL;
|
|
|
|
import com.jme.bounding.BoundingBox;
|
|
import com.jme.scene.Node;
|
|
import com.jme.scene.Spatial;
|
|
import com.jme.util.export.binary.BinaryImporter;
|
|
import com.jme.util.resource.ResourceLocatorTool;
|
|
import com.jme.util.resource.SimpleResourceLocator;
|
|
import com.jmex.model.converters.AseToJme;
|
|
import com.jmex.model.converters.MaxToJme;
|
|
import com.jmex.model.converters.Md2ToJme;
|
|
import com.jmex.model.converters.Md3ToJme;
|
|
import com.jmex.model.converters.MilkToJme;
|
|
import com.jmex.model.converters.ObjToJme;
|
|
|
|
/**
|
|
* Helper class for loading models and other stuff. Currently only loads JME
|
|
* binary models, but it's easily customizable for loading other types.
|
|
*
|
|
* @author Erick B Passos
|
|
*
|
|
*/
|
|
public class Util {
|
|
// So JME can find the model textures easily.
|
|
private static URL textureSearchPath;
|
|
|
|
static {
|
|
textureSearchPath = Util.class.getClassLoader().getResource("tancz/test/physics/vehicle/data/");
|
|
try {
|
|
ResourceLocatorTool.addResourceLocator(ResourceLocatorTool.TYPE_TEXTURE, new SimpleResourceLocator(textureSearchPath));
|
|
} catch (URISyntaxException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Loads a model from file, creating a bounding box for it.
|
|
* @param path Path to jme file.
|
|
* @return loaded model
|
|
* @throws IOException
|
|
*/
|
|
public static Node loadModel(String path) {
|
|
try {
|
|
Node node = new Node();
|
|
BufferedInputStream in = new BufferedInputStream(FileFinder.findURL(path).openStream());
|
|
String ext = FileFinder.fileExtension(path);
|
|
|
|
if(ext.equalsIgnoreCase("jme")){
|
|
node.attachChild((Spatial)BinaryImporter.getInstance().load(in));
|
|
}
|
|
else{
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //For loading the raw file
|
|
|
|
// Converts the file into a jme usable file
|
|
if(ext.equalsIgnoreCase("3ds")) new MaxToJme().convert(in, byteArrayOutputStream);
|
|
else if(ext.equalsIgnoreCase("ase")) new AseToJme().convert(in, byteArrayOutputStream);
|
|
else if(ext.equalsIgnoreCase("md2")) new Md2ToJme().convert(in, byteArrayOutputStream);
|
|
else if(ext.equalsIgnoreCase("md3")) new Md3ToJme().convert(in, byteArrayOutputStream);
|
|
else if(ext.equalsIgnoreCase("ms3d")) new MilkToJme().convert(in, byteArrayOutputStream);
|
|
else if(ext.equalsIgnoreCase("obj")) new ObjToJme().convert(in, byteArrayOutputStream);
|
|
|
|
// Used to convert the jme usable file to a TriMesh
|
|
ByteArrayInputStream bridge = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
|
|
//importer returns a Loadable, cast to Node
|
|
node.attachChild((Spatial)BinaryImporter.getInstance().load(bridge));
|
|
}
|
|
|
|
node.setModelBound(new BoundingBox());
|
|
node.updateModelBound();
|
|
return node;
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Helper method to apply a ZBufferState to a node.
|
|
* @param node
|
|
*/
|
|
/*
|
|
public static void applyZBuffer(Node node) {
|
|
ZBufferState zbuf = DisplaySystem.getDisplaySystem().getRenderer().createZBufferState();
|
|
zbuf.setWritable(false);
|
|
zbuf.setEnabled(true);
|
|
zbuf.setFunction(ZBufferState.CF_LEQUAL);
|
|
node.setRenderState(zbuf);
|
|
}*/
|
|
}
|