package tk.amberide.ide.data.res.xml; import tk.amberide.engine.al.Audio; import tk.amberide.engine.al.AudioIO; import tk.amberide.ide.data.Workspace; import tk.amberide.ide.data.io.FileIO; import tk.amberide.ide.data.res.AbstractResourceManager; import tk.amberide.ide.data.res.Resource; import tk.amberide.ide.data.res.Tileset; import tk.amberide.engine.gl.model.obj.WavefrontObject; import tk.amberide.ide.gui.misc.ErrorHandler; import java.awt.Dimension; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.File; import java.io.FileOutputStream; import static java.lang.String.valueOf; import static java.lang.Integer.parseInt; import nu.xom.Attribute; import nu.xom.Builder; import nu.xom.Document; import nu.xom.Element; import nu.xom.Elements; import nu.xom.Serializer; /** * @author Tudor */ public class XMLResourceManager extends AbstractResourceManager { /** * Constructs a new XMLResourceManager object for the given Workspace * * @param space the Workspace */ public XMLResourceManager(Workspace space) { super(space); } public void loadResources() throws Exception { try { File resourceFile = new File(workspace.getDataDirectory(), "resources.xml"); Document doc = new Builder().build(resourceFile); Element root = doc.getRootElement(); Elements tileNodes = root.getChildElements("tilesets").get(0).getChildElements(); for (int i = 0; i < tileNodes.size(); i++) { Element sheet = tileNodes.get(i); String name = sheet.getAttributeValue("name"); try { File source = FileIO.getFilesByName(name, imgDir)[0]; BufferedImage img; try { img = ImageIO.read(source); } catch (Exception e) { System.err.println("failed to read " + name); e.printStackTrace(); continue; } importTileset(name, new Tileset.Parser( new Dimension( parseInt(sheet.getAttributeValue("tile-width")), parseInt(sheet.getAttributeValue("tile-height"))), parseInt(sheet.getAttributeValue("margin")), parseInt(sheet.getAttributeValue("spacing"))) .parse(img), source); } catch (Exception e) { e.printStackTrace(); } } Elements audioNodes = root.getChildElements("audio").get(0).getChildElements(); for (int i = 0; i != audioNodes.size(); i++) { String name = audioNodes.get(i).getAttributeValue("name"); try { File source = FileIO.getFilesByName(name, audioDir)[0]; importAudio(name, AudioIO.read(source), source); } catch (Exception e) { e.printStackTrace(); } } Elements modelNodes = root.getChildElements("models").get(0).getChildElements(); for (int i = 0; i != modelNodes.size(); i++) { String name = modelNodes.get(i).getAttributeValue("name"); try { File source = new File(modelDir, name + File.separator + name + ".obj"); System.out.println("Loaded model " + source); importModel(name, new WavefrontObject(source), source); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception ex) { ex.printStackTrace(); } } @Override public void emitResources() { File resourceFile = new File(workspace.getDataDirectory(), "resources.xml"); try { resourceFile.delete(); // Clear file resourceFile.createNewFile(); Element root = new Element("resources"); Document doc = new Document(root); Element sheets = new Element("tilesets"); for (Resource<Tileset> set : getTilesets()) { Element node = new Element("tileset"); node.addAttribute(new Attribute("name", set.getName())); node.addAttribute(new Attribute("margin", valueOf(set.get().getMargin()))); node.addAttribute(new Attribute("spacing", valueOf(set.get().getSpacing()))); node.addAttribute(new Attribute("tile-width", valueOf(set.get().getTileSize().width))); node.addAttribute(new Attribute("tile-height", valueOf(set.get().getTileSize().height))); sheets.appendChild(node); } root.appendChild(sheets); Element clips = new Element("audio"); for (Resource<Audio> audio : getClips()) { Element node = new Element("clip"); node.addAttribute(new Attribute("name", audio.getName())); clips.appendChild(node); } root.appendChild(clips); Element models = new Element("models"); for (Resource<WavefrontObject> model : getModels()) { Element node = new Element("model"); node.addAttribute(new Attribute("name", model.getName())); models.appendChild(node); } root.appendChild(models); Serializer serializer = new Serializer(new FileOutputStream(resourceFile), "UTF-8"); serializer.setIndent(4); serializer.write(doc); serializer.flush(); } catch (Exception ex) { ErrorHandler.alert(ex); } } }