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); }*/ }