From f06bb6beaa0a773761f44d13788373e5593d951b Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 12 Feb 2003 07:21:50 +0000 Subject: [PATCH] Combined display/runtime/editable scenes; revamped parser system. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2272 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../miso/tools/EditableMisoScene.java | 97 --------- .../miso/tools/EditableMisoSceneImpl.java | 184 ------------------ .../miso/tools/xml/MisoSceneParser.java | 76 -------- .../miso/tools/xml/MisoSceneRuleSet.java | 102 ---------- .../tools/xml/SimpleMisoSceneRuleSet.java | 90 +++++++++ ...Writer.java => SimpleMisoSceneWriter.java} | 31 +-- 6 files changed, 106 insertions(+), 474 deletions(-) delete mode 100644 src/java/com/threerings/miso/tools/EditableMisoScene.java delete mode 100644 src/java/com/threerings/miso/tools/EditableMisoSceneImpl.java delete mode 100644 src/java/com/threerings/miso/tools/xml/MisoSceneParser.java delete mode 100644 src/java/com/threerings/miso/tools/xml/MisoSceneRuleSet.java create mode 100644 src/java/com/threerings/miso/tools/xml/SimpleMisoSceneRuleSet.java rename src/java/com/threerings/miso/tools/xml/{MisoSceneWriter.java => SimpleMisoSceneWriter.java} (79%) diff --git a/src/java/com/threerings/miso/tools/EditableMisoScene.java b/src/java/com/threerings/miso/tools/EditableMisoScene.java deleted file mode 100644 index 89d9aa555..000000000 --- a/src/java/com/threerings/miso/tools/EditableMisoScene.java +++ /dev/null @@ -1,97 +0,0 @@ -// -// $Id: EditableMisoScene.java,v 1.19 2003/01/31 23:10:45 mdb Exp $ - -package com.threerings.miso.tools; - -import java.awt.Rectangle; - -import com.threerings.media.tile.ObjectTile; -import com.threerings.media.tile.Tile; -import com.threerings.media.tile.TileUtil; - -import com.threerings.miso.client.DisplayMisoScene; -import com.threerings.miso.client.DisplayObjectInfo; -import com.threerings.miso.data.MisoSceneModel; -import com.threerings.miso.tile.BaseTile; -import com.threerings.miso.tile.BaseTileSet; - -/** - * The editable Miso scene interface is used in the offline scene building - * tools as well as by the tools that load those prototype scenes into the - * runtime database. Accordingly, it provides a means for modifying scene - * values and for obtaining access to the underlying scene models that - * represent the underlying scene information. - * - * @see DisplayMisoScene - */ -public interface EditableMisoScene - extends DisplayMisoScene -{ - /** - * Returns the default base tile. - */ - public BaseTileSet getDefaultBaseTileSet (); - - /** - * Sets the default base tile. - * - * @param defaultBaseTile the new default base tile. - * @param fqTileId the fully-qualified tile id (@see - * TileUtil#getFQTileId}) of the new default base tile. - */ - public void setDefaultBaseTileSet (BaseTileSet defaultBaseTileSet, - int setId); - - /** - * Updates the tile at the specified location in the base layer. - * - * @param x the x-coordinate of the tile to set. - * @param y the y-coordinate of the tile to set. - * @param tile the tile to set. - * @param fqTileId the fully-qualified tile id (@see - * TileUtil#getFQTileId}) of the new default base tile. - */ - public void setBaseTile (int x, int y, BaseTile tile, int fqTileId); - - /** - * Fill a rectangular area with random tiles from - * the specified base tileset. - */ - public void setBaseTiles (Rectangle r, BaseTileSet set, int setId); - - /** - * Adds an object to this scene. - * - * @param x the object's origin x-coordinate. - * @param y the object's origin y-coordinate. - * @param tile the tile to set. - * @param fqTileId the fully-qualified tile id (@see - * TileUtil#getFQTileId}) of the new default base tile. - * - * @return the new scene object instance. - */ - public DisplayObjectInfo addObject ( - ObjectTile tile, int x, int y, int fqTileId); - - /** - * Clears out the tile at the specified location in the base layer. - */ - public void clearBaseTile (int x, int y); - - /** - * Removes the specified object from the scene. - */ - public boolean removeObject (DisplayObjectInfo scobj); - - /** - * Returns a reference to the miso scene model that reflects the - * changes that have been made to this editable miso scene. - */ - public MisoSceneModel getMisoSceneModel (); - - /** - * Replaces the model in use by this editable miso scene with the - * specified model. - */ - public void setMisoSceneModel (MisoSceneModel model); -} diff --git a/src/java/com/threerings/miso/tools/EditableMisoSceneImpl.java b/src/java/com/threerings/miso/tools/EditableMisoSceneImpl.java deleted file mode 100644 index 547220466..000000000 --- a/src/java/com/threerings/miso/tools/EditableMisoSceneImpl.java +++ /dev/null @@ -1,184 +0,0 @@ -// -// $Id: EditableMisoSceneImpl.java,v 1.25 2003/01/31 23:10:45 mdb Exp $ - -package com.threerings.miso.tools; - -import java.awt.Point; -import java.awt.Rectangle; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -import com.threerings.media.tile.NoSuchTileException; -import com.threerings.media.tile.NoSuchTileSetException; -import com.threerings.media.tile.ObjectTile; -import com.threerings.media.tile.Tile; -import com.threerings.media.tile.TileUtil; - -import com.threerings.miso.Log; - -import com.threerings.miso.tile.BaseTile; -import com.threerings.miso.tile.BaseTileSet; -import com.threerings.miso.tile.MisoTileManager; - -import com.threerings.miso.client.DisplayMisoSceneImpl; -import com.threerings.miso.client.DisplayObjectInfo; -import com.threerings.miso.client.util.IsoUtil; -import com.threerings.miso.data.MisoSceneModel; -import com.threerings.miso.data.ObjectInfo; - -/** - * The default implementation of the {@link EditableMisoScene} interface. - */ -public class EditableMisoSceneImpl - extends DisplayMisoSceneImpl implements EditableMisoScene -{ - /** - * Constructs an instance that will be used to display and edit the - * supplied miso scene data. The tiles identified by the scene model - * will be loaded via the supplied tile manager. - * - * @param model the scene data that we'll be displaying. - * @param tmgr the tile manager from which to load our tiles. - */ - public EditableMisoSceneImpl (MisoSceneModel model, MisoTileManager tmgr) - { - super(model, tmgr); - } - - /** - * Constructs an instance that will be used to display and edit the - * supplied miso scene data. The tiles identified by the scene model - * will not be loaded until a tile manager is provided via {@link - * #setTileManager}. - * - * @param model the scene data that we'll be displaying. - */ - public EditableMisoSceneImpl (MisoSceneModel model) - { - super(model); - } - - // documentation inherited - public void setMisoSceneModel (MisoSceneModel model) - { - super.setMisoSceneModel(model); - } - - // documentation inherited - public BaseTileSet getDefaultBaseTileSet () - { - return _defaultBaseTileSet; - } - - // documentation inherited - public void setDefaultBaseTileSet (BaseTileSet defaultBaseTileSet, - int setId) - { - _defaultBaseTileSet = defaultBaseTileSet; - _defaultBaseTileSetId = setId; - } - - // documentation inherited - public void setBaseTiles (Rectangle r, BaseTileSet set, int setId) - { - int setcount = set.getTileCount(); - - for (int x = r.x; x < r.x + r.width; x++) { - for (int y = r.y; y < r.y + r.height; y++) { - try { - int index = _rando.nextInt(setcount); - _base.setTile(x, y, (BaseTile) set.getTile(index)); - _model.setBaseTile( - x, y, TileUtil.getFQTileId(setId, index)); - - } catch (NoSuchTileException nste) { - // not going to happen - Log.warning("A tileset is lying to me " + - "[error=" + nste + "]."); - } - } - } - - _fringer.fringe(_model, _fringe, r, _rando); - } - - // documentation inherited - public void setBaseTile (int x, int y, BaseTile tile, int fqTileId) - { - _base.setTile(x, y, tile); - _model.setBaseTile(x, y, fqTileId); - _fringer.fringe(_model, _fringe, new Rectangle(x, y, 1, 1), _rando); - } - - // documentation inherited - public DisplayObjectInfo addObject ( - ObjectTile tile, int x, int y, int fqTileId) - { - // sanity check - if (x > Short.MAX_VALUE || y > Short.MAX_VALUE || - x < Short.MIN_VALUE || y < Short.MIN_VALUE) { - throw new IllegalArgumentException( - "Invalid tile coordinates [x=" + x + ", y=" + y + "]"); - } - - // create a scene object record and add it to the list - DisplayObjectInfo info = new DisplayObjectInfo(fqTileId, x, y); - initObject(info, tile); - _objects.add(info); - - return info; - } - - // documentation inherited - public void clearBaseTile (int x, int y) - { - // implemented as a set of one of the random base tiles - setBaseTiles(new Rectangle(x, y, 1, 1), - _defaultBaseTileSet, _defaultBaseTileSetId); - } - - // documentation inherited - public boolean removeObject (DisplayObjectInfo info) - { - if (_objects.remove(info)) { - // toggle the "covered" flag off on the base tiles in this object - // tile's footprint - setObjectTileFootprint(info.tile, info.x, info.y, false); - return true; - } else { - return false; - } - } - - // documentation inherited - public MisoSceneModel getMisoSceneModel () - { - // we need to flush the object layer to the model prior to - // returning it; first split our objects into two lists - ArrayList ilist = new ArrayList(); - ArrayList ulist = new ArrayList(); - for (int ii = 0, ll = _objects.size(); ii < ll; ii++) { - ObjectInfo info = (ObjectInfo)_objects.get(ii); - if (info.isInteresting()) { - // convert to a plain object info record - ilist.add(new ObjectInfo(info)); - } else { - ulist.add(info); - } - } - - // now populate the scene model appropriately - MisoSceneModel.populateObjects(_model, ilist, ulist); - - // and we're ready to roll - return _model; - } - - /** The default tileset with which to fill the base layer. */ - protected BaseTileSet _defaultBaseTileSet; - - /** The tileset id of the default base tileset. */ - protected int _defaultBaseTileSetId; -} diff --git a/src/java/com/threerings/miso/tools/xml/MisoSceneParser.java b/src/java/com/threerings/miso/tools/xml/MisoSceneParser.java deleted file mode 100644 index 842f06cc4..000000000 --- a/src/java/com/threerings/miso/tools/xml/MisoSceneParser.java +++ /dev/null @@ -1,76 +0,0 @@ -// -// $Id: MisoSceneParser.java,v 1.3 2003/01/31 23:10:46 mdb Exp $ - -package com.threerings.miso.tools.xml; - -import java.io.IOException; -import java.io.FileInputStream; - -import org.xml.sax.SAXException; -import org.apache.commons.digester.Digester; -import org.apache.commons.digester.RuleSet; - -import com.threerings.miso.data.MisoSceneModel; - -/** - * A simple class for parsing a standalone miso scene model. - */ -public class MisoSceneParser -{ - /** - * Constructs a miso scene parser that parses scenes with the - * specified XML path prefix and a standard scene rule set. See the - * {@link MisoSceneRuleSet#MisoSceneRuleSet} documentation for more - * information. - */ - public MisoSceneParser (String prefix) - { - MisoSceneRuleSet set = new MisoSceneRuleSet(); - set.setPrefix(prefix); - init(prefix, set); - } - - /** - * Constructs a miso scene parser that parses scenes with the - * specified XML path prefix, using the supplied rule set. The rule - * set should leave a {@link MisoSceneModel} at the top of the - * digester's stack. - */ - public MisoSceneParser (String prefix, RuleSet rules) - { - init(prefix, rules); - } - - /** Constructor helper function. */ - protected void init (String prefix, RuleSet rules) - { - // create and configure our digester - _digester = new Digester(); - _digester.addRuleSet(rules); - _digester.addSetNext(prefix, "setSceneModel", - MisoSceneModel.class.getName()); - } - - /** - * Parses the XML file at the specified path into a miso scene model. - */ - public MisoSceneModel parseScene (String path) - throws IOException, SAXException - { - _model = null; - _digester.push(this); - _digester.parse(new FileInputStream(path)); - return _model; - } - - /** - * Called by the parser once the scene is parsed. - */ - public void setSceneModel (MisoSceneModel model) - { - _model = model; - } - - protected Digester _digester; - protected MisoSceneModel _model; -} diff --git a/src/java/com/threerings/miso/tools/xml/MisoSceneRuleSet.java b/src/java/com/threerings/miso/tools/xml/MisoSceneRuleSet.java deleted file mode 100644 index 4d4ba5864..000000000 --- a/src/java/com/threerings/miso/tools/xml/MisoSceneRuleSet.java +++ /dev/null @@ -1,102 +0,0 @@ -// -// $Id: MisoSceneRuleSet.java,v 1.12 2003/01/31 23:10:46 mdb Exp $ - -package com.threerings.miso.tools.xml; - -import java.util.ArrayList; - -import org.apache.commons.digester.Digester; -import org.apache.commons.digester.RuleSetBase; - -import com.samskivert.xml.CallMethodSpecialRule; -import com.samskivert.xml.SetFieldRule; -import com.samskivert.xml.SetPropertyFieldsRule; - -import com.threerings.miso.Log; -import com.threerings.miso.data.MisoSceneModel; -import com.threerings.miso.data.ObjectInfo; - -/** - * Used to parse a {@link MisoSceneModel} from XML. - */ -public class MisoSceneRuleSet extends RuleSetBase -{ - /** - * Configures the rule set to match scenes with the supplied prefix. - * For example, passing scene.miso will match the scene - * in the following XML file: - * - *
-     * <scene>
-     *   <miso>
-     *     <width>50</width>
-     *     <height>50</height>
-     *     <!-- ... -->
-     *   </miso>
-     * </scene>
-     * 
- */ - public void setPrefix (String prefix) - { - _prefix = prefix; - } - - /** - * Adds the necessary rules to the digester to parse our miso scene - * data. - */ - public void addRuleInstances (Digester digester) - { - // this creates the appropriate instance when we encounter our - // prefix tag - digester.addObjectCreate(_prefix, MisoSceneModel.class.getName()); - - // set up rules to parse and set our fields - digester.addRule(_prefix + "/width", - new SetFieldRule(digester, "width")); - digester.addRule(_prefix + "/height", - new SetFieldRule(digester, "height")); - digester.addRule(_prefix + "/viewwidth", - new SetFieldRule(digester, "vwidth")); - digester.addRule(_prefix + "/viewheight", - new SetFieldRule(digester, "vheight")); - digester.addRule(_prefix + "/base", - new SetFieldRule(digester, "baseTileIds")); - - digester.addObjectCreate(_prefix + "/objects", - ArrayList.class.getName()); - digester.addObjectCreate(_prefix + "/objects/object", - ObjectInfo.class.getName()); - digester.addSetNext(_prefix + "/objects/object", "add", - Object.class.getName()); - - digester.addRule(_prefix + "/objects/object", - new SetPropertyFieldsRule(digester)); - - digester.addRule(_prefix + "/objects", new CallMethodSpecialRule( - digester) { - public void parseAndSet (String bodyText, Object target) - throws Exception - { - ArrayList ilist = (ArrayList)target; - ArrayList ulist = new ArrayList(); - MisoSceneModel model = (MisoSceneModel)this.digester.peek(1); - - // filter interesting and uninteresting into two lists - for (int ii = 0; ii < ilist.size(); ii++) { - ObjectInfo info = (ObjectInfo)ilist.get(ii); - if (!info.isInteresting()) { - ilist.remove(ii--); - ulist.add(info); - } - } - - // now populate the model - MisoSceneModel.populateObjects(model, ilist, ulist); - } - }); - } - - /** The prefix at which me match our scenes. */ - protected String _prefix; -} diff --git a/src/java/com/threerings/miso/tools/xml/SimpleMisoSceneRuleSet.java b/src/java/com/threerings/miso/tools/xml/SimpleMisoSceneRuleSet.java new file mode 100644 index 000000000..081819e9a --- /dev/null +++ b/src/java/com/threerings/miso/tools/xml/SimpleMisoSceneRuleSet.java @@ -0,0 +1,90 @@ +// +// $Id: SimpleMisoSceneRuleSet.java,v 1.1 2003/02/12 07:21:50 mdb Exp $ + +package com.threerings.miso.tools.xml; + +import java.util.ArrayList; +import org.xml.sax.Attributes; + +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.Rule; + +import com.samskivert.xml.CallMethodSpecialRule; +import com.samskivert.xml.SetFieldRule; +import com.samskivert.xml.SetPropertyFieldsRule; + +import com.threerings.tools.xml.NestableRuleSet; + +import com.threerings.miso.data.ObjectInfo; +import com.threerings.miso.data.SimpleMisoSceneModel; + +/** + * Used to parse a {@link SimpleMisoSceneModel} from XML. + */ +public class SimpleMisoSceneRuleSet implements NestableRuleSet +{ + // documentation inherited from interface + public String getOuterElement () + { + return SimpleMisoSceneWriter.OUTER_ELEMENT; + } + + // documentation inherited from interface + public void addRuleInstances (String prefix, Digester dig) + { + // this creates the appropriate instance when we encounter our + // prefix tag + dig.addRule(prefix, new Rule(dig) { + public void begin (Attributes attributes) throws Exception { + digester.push(createMisoSceneModel()); + } + public void end () throws Exception { + digester.pop(); + } + }); + + // set up rules to parse and set our fields + dig.addRule(prefix + "/width", new SetFieldRule(dig, "width")); + dig.addRule(prefix + "/height", new SetFieldRule(dig, "height")); + dig.addRule(prefix + "/viewwidth", new SetFieldRule(dig, "vwidth")); + dig.addRule(prefix + "/viewheight", new SetFieldRule(dig, "vheight")); + dig.addRule(prefix + "/base", new SetFieldRule(dig, "baseTileIds")); + + dig.addObjectCreate(prefix + "/objects", ArrayList.class.getName()); + dig.addObjectCreate(prefix + "/objects/object", + ObjectInfo.class.getName()); + dig.addSetNext(prefix + "/objects/object", "add", + Object.class.getName()); + + dig.addRule(prefix + "/objects/object", + new SetPropertyFieldsRule(dig)); + + dig.addRule(prefix + "/objects", new CallMethodSpecialRule(dig) { + public void parseAndSet (String bodyText, Object target) + throws Exception + { + ArrayList ilist = (ArrayList)target; + ArrayList ulist = new ArrayList(); + SimpleMisoSceneModel model = (SimpleMisoSceneModel) + digester.peek(1); + + // filter interesting and uninteresting into two lists + for (int ii = 0; ii < ilist.size(); ii++) { + ObjectInfo info = (ObjectInfo)ilist.get(ii); + if (!info.isInteresting()) { + ilist.remove(ii--); + ulist.add(info); + } + } + + // now populate the model + SimpleMisoSceneModel.populateObjects(model, ilist, ulist); + } + }); + } + + protected SimpleMisoSceneModel createMisoSceneModel () + { + return new SimpleMisoSceneModel(0, 0, 0, 0); + } +} diff --git a/src/java/com/threerings/miso/tools/xml/MisoSceneWriter.java b/src/java/com/threerings/miso/tools/xml/SimpleMisoSceneWriter.java similarity index 79% rename from src/java/com/threerings/miso/tools/xml/MisoSceneWriter.java rename to src/java/com/threerings/miso/tools/xml/SimpleMisoSceneWriter.java index 85fda03d7..503785c0d 100644 --- a/src/java/com/threerings/miso/tools/xml/MisoSceneWriter.java +++ b/src/java/com/threerings/miso/tools/xml/SimpleMisoSceneWriter.java @@ -1,5 +1,5 @@ // -// $Id: MisoSceneWriter.java,v 1.9 2003/01/31 23:10:46 mdb Exp $ +// $Id: SimpleMisoSceneWriter.java,v 1.1 2003/02/12 07:21:50 mdb Exp $ package com.threerings.miso.tools.xml; @@ -8,35 +8,36 @@ import org.xml.sax.helpers.AttributesImpl; import com.megginson.sax.DataWriter; import com.samskivert.util.StringUtil; +import com.threerings.tools.xml.NestableWriter; -import com.threerings.miso.data.MisoSceneModel; import com.threerings.miso.data.ObjectInfo; +import com.threerings.miso.data.SimpleMisoSceneModel; /** - * Generates an XML representation of a {@link MisoSceneModel}. + * Generates an XML representation of a {@link SimpleMisoSceneModel}. */ -public class MisoSceneWriter +public class SimpleMisoSceneWriter implements NestableWriter { - /** - * Writes the data for the supplied {@link MisoSceneModel} to the XML - * writer supplied. The writer will already be configured with the - * appropriate indentation level so that this writer can simply output - * its elements and allow the calling code to determine where in the - * greater scene description file the miso data should live. - */ - public void writeScene (MisoSceneModel model, DataWriter writer) + /** The element used to enclose scene models written with this + * writer. */ + public static final String OUTER_ELEMENT = "miso"; + + // documentation inherited from interface + public void write (Object object, DataWriter writer) throws SAXException { - writer.startElement("miso"); + SimpleMisoSceneModel model = (SimpleMisoSceneModel)object; + writer.startElement(OUTER_ELEMENT); writeSceneData(model, writer); - writer.endElement("miso"); + writer.endElement(OUTER_ELEMENT); } /** * Writes just the scene data which is handy for derived classes which * may wish to add their own scene data to the scene output. */ - protected void writeSceneData (MisoSceneModel model, DataWriter writer) + protected void writeSceneData (SimpleMisoSceneModel model, + DataWriter writer) throws SAXException { writer.dataElement("width", Integer.toString(model.width));