Fringe configuration class and supporting classes to read in the xml
specification file and turn it into a serializable object. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1181 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -0,0 +1,90 @@
|
|||||||
|
//
|
||||||
|
// $Id: FringeConfiguration.java,v 1.1 2002/04/03 22:52:44 ray Exp $
|
||||||
|
|
||||||
|
package com.threerings.miso.scene;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import com.samskivert.util.HashIntMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to manage data about which base tilesets fringe on which others
|
||||||
|
* and how they fringe.
|
||||||
|
*/
|
||||||
|
public class FringeConfiguration implements Serializable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The path (relative to the resource directory) at which the fringe
|
||||||
|
* configuration should be loaded and stored.
|
||||||
|
*/
|
||||||
|
public static final String CONFIG_PATH = "config/miso/scene/fringeconf.dat";
|
||||||
|
|
||||||
|
public static class FringeRecord implements Serializable
|
||||||
|
{
|
||||||
|
/** The tileset id of the base tileset to which this applies. */
|
||||||
|
public int base_tsid;
|
||||||
|
|
||||||
|
/** The fringe priority of this base tileset. */
|
||||||
|
public int priority;
|
||||||
|
|
||||||
|
/** A list of the possible tilesets that can be used for fringing. */
|
||||||
|
public ArrayList tilesets = new ArrayList();
|
||||||
|
|
||||||
|
/** Used when parsing the tilesets definitions. */
|
||||||
|
public void addTileset (FringeTileSetRecord record)
|
||||||
|
{
|
||||||
|
tilesets.add(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to parse the tileset fringe definitions.
|
||||||
|
*/
|
||||||
|
public static class FringeTileSetRecord implements Serializable
|
||||||
|
{
|
||||||
|
/** The tileset id of the fringe tileset. */
|
||||||
|
public int fringe_tsid;
|
||||||
|
|
||||||
|
/** Is this a mask? */
|
||||||
|
public boolean mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a parsed FringeRecord to this instance. This is used when parsing
|
||||||
|
* the fringerecords from xml.
|
||||||
|
*/
|
||||||
|
public void addFringeRecord (FringeRecord frec)
|
||||||
|
{
|
||||||
|
_frecs.put(frec.base_tsid, frec);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does the first tileset fringe upon the second?
|
||||||
|
*/
|
||||||
|
public boolean fringesOn (int first, int second)
|
||||||
|
{
|
||||||
|
FringeRecord f1 = (FringeRecord) _frecs.get(first);
|
||||||
|
|
||||||
|
// we better have a fringe record for the first
|
||||||
|
if (null != f1) {
|
||||||
|
|
||||||
|
// it had better have some tilesets defined
|
||||||
|
if (f1.tilesets.size() > 0) {
|
||||||
|
|
||||||
|
FringeRecord f2 = (FringeRecord) _frecs.get(second);
|
||||||
|
|
||||||
|
// and we only fringe if second doesn't exist or has a lower
|
||||||
|
// priority
|
||||||
|
if ((null == f2) || (f1.priority > f2.priority)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The mapping from base tileset id to fringerecord. */
|
||||||
|
protected HashIntMap _frecs = new HashIntMap();
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
//
|
||||||
|
// $Id: CompileFringeConfigurationTask.java,v 1.1 2002/04/03 22:52:44 ray Exp $
|
||||||
|
|
||||||
|
package com.threerings.miso.scene.tools;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import org.apache.tools.ant.BuildException;
|
||||||
|
import org.apache.tools.ant.Task;
|
||||||
|
|
||||||
|
import com.samskivert.io.PersistenceException;
|
||||||
|
|
||||||
|
import com.threerings.miso.scene.tools.xml.FringeConfigurationParser;
|
||||||
|
import com.threerings.media.tile.tools.MapFileTileSetIDBroker;
|
||||||
|
import com.threerings.util.CompiledConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile fringe configuration.
|
||||||
|
*/
|
||||||
|
public class CompileFringeConfigurationTask extends Task
|
||||||
|
{
|
||||||
|
public void setTileSetMap (File tsetmap)
|
||||||
|
{
|
||||||
|
_tsetmap = tsetmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFringeDef (File fringedef)
|
||||||
|
{
|
||||||
|
_fringedef = fringedef;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTarget (File target)
|
||||||
|
{
|
||||||
|
_target = target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute () throws BuildException
|
||||||
|
{
|
||||||
|
// make sure the source file exists
|
||||||
|
if (!_fringedef.exists()) {
|
||||||
|
throw new BuildException("Fringe definition file not found " +
|
||||||
|
"[path=" + _fringedef.getPath() + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
// set up the tileid broker
|
||||||
|
MapFileTileSetIDBroker broker;
|
||||||
|
try {
|
||||||
|
broker = new MapFileTileSetIDBroker(_tsetmap);
|
||||||
|
} catch (PersistenceException pe) {
|
||||||
|
throw new BuildException("Couldn't set up tileset mapping " +
|
||||||
|
"[path=" + _tsetmap.getPath() +
|
||||||
|
", error=" + pe.getCause() + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
FringeConfigurationParser parser = new FringeConfigurationParser(
|
||||||
|
broker);
|
||||||
|
Serializable config;
|
||||||
|
try {
|
||||||
|
config = parser.parseConfig(_fringedef);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new BuildException("Failure parsing config definition", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// and write it on out
|
||||||
|
CompiledConfig.saveConfig(_target, config);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new BuildException("Failure writing serialized config", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected File _tsetmap;
|
||||||
|
protected File _fringedef;
|
||||||
|
protected File _target;
|
||||||
|
}
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
//
|
||||||
|
// $Id: FringeConfigurationParser.java,v 1.1 2002/04/03 22:52:44 ray Exp $
|
||||||
|
|
||||||
|
package com.threerings.miso.scene.tools.xml;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.apache.commons.digester.Digester;
|
||||||
|
import org.apache.commons.digester.Rule;
|
||||||
|
|
||||||
|
import com.samskivert.util.StringUtil;
|
||||||
|
import com.samskivert.xml.SetPropertyFieldsRule;
|
||||||
|
|
||||||
|
import com.threerings.tools.xml.CompiledConfigParser;
|
||||||
|
|
||||||
|
import com.threerings.miso.Log;
|
||||||
|
import com.threerings.miso.scene.FringeConfiguration;
|
||||||
|
import com.threerings.miso.scene.FringeConfiguration.FringeRecord;
|
||||||
|
import com.threerings.miso.scene.FringeConfiguration.FringeTileSetRecord;
|
||||||
|
|
||||||
|
import com.threerings.media.tile.TileSetIDBroker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses fringe config definitions.
|
||||||
|
*/
|
||||||
|
public class FringeConfigurationParser extends CompiledConfigParser
|
||||||
|
{
|
||||||
|
public FringeConfigurationParser (TileSetIDBroker broker)
|
||||||
|
{
|
||||||
|
_idBroker = broker;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
protected Serializable createConfigObject ()
|
||||||
|
{
|
||||||
|
return new FringeConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentation inherited
|
||||||
|
protected void addRules (Digester digest)
|
||||||
|
{
|
||||||
|
// configure top-level constraints
|
||||||
|
String prefix = "fringes";
|
||||||
|
digest.addRule(prefix, new SetPropertyFieldsRule(digest));
|
||||||
|
|
||||||
|
// create and configure fringe config instances
|
||||||
|
prefix += "/base";
|
||||||
|
digest.addObjectCreate(prefix, FringeRecord.class.getName());
|
||||||
|
digest.addSetNext(
|
||||||
|
prefix, "addFringeRecord", FringeRecord.class.getName());
|
||||||
|
digest.addRule(prefix, new Rule(digest) {
|
||||||
|
// parse the fringe record, converting tileset names to tileset
|
||||||
|
// ids
|
||||||
|
public void begin (Attributes attrs)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
FringeRecord frec = (FringeRecord) digester.peek();
|
||||||
|
|
||||||
|
for (int ii=0; ii < attrs.getLength(); ii++) {
|
||||||
|
String name = attrs.getLocalName(ii);
|
||||||
|
if (StringUtil.blank(name)) {
|
||||||
|
name = attrs.getQName(ii);
|
||||||
|
}
|
||||||
|
String value = attrs.getValue(ii);
|
||||||
|
|
||||||
|
if ("name".equals(name)) {
|
||||||
|
if (_idBroker.tileSetMapped(value)) {
|
||||||
|
frec.base_tsid = _idBroker.getTileSetID(value);
|
||||||
|
} else {
|
||||||
|
Log.warning("Skipping unknown base " +
|
||||||
|
"tileset [name=" + value + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ("priority".equals(name)) {
|
||||||
|
frec.priority = Integer.parseInt(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// create the tileset records in each fringe record
|
||||||
|
prefix += "/tileset";
|
||||||
|
digest.addObjectCreate(prefix, FringeTileSetRecord.class.getName());
|
||||||
|
digest.addSetNext(
|
||||||
|
prefix, "addTileset", FringeTileSetRecord.class.getName());
|
||||||
|
digest.addRule(prefix, new Rule(digest) {
|
||||||
|
// parse the fringe tilesetrecord, converting tileset names to ids
|
||||||
|
public void begin (Attributes attrs)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
FringeTileSetRecord f = (FringeTileSetRecord) digester.peek();
|
||||||
|
|
||||||
|
for (int ii=0; ii < attrs.getLength(); ii++) {
|
||||||
|
String name = attrs.getLocalName(ii);
|
||||||
|
if (StringUtil.blank(name)) {
|
||||||
|
name = attrs.getQName(ii);
|
||||||
|
}
|
||||||
|
String value = attrs.getValue(ii);
|
||||||
|
|
||||||
|
if ("name".equals(name)) {
|
||||||
|
if (_idBroker.tileSetMapped(value)) {
|
||||||
|
f.fringe_tsid = _idBroker.getTileSetID(value);
|
||||||
|
} else {
|
||||||
|
Log.warning("Skipping unknown fringe " +
|
||||||
|
"tileset [name=" + value + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ("mask".equals(name)) {
|
||||||
|
f.mask = Boolean.getBoolean(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TileSetIDBroker _idBroker;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user