More work on loading scene groups.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@272 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: DisplayMisoSceneImpl.java,v 1.30 2001/08/16 18:05:16 shaper Exp $
|
// $Id: DisplayMisoSceneImpl.java,v 1.31 2001/08/16 22:05:01 shaper Exp $
|
||||||
|
|
||||||
package com.threerings.miso.scene;
|
package com.threerings.miso.scene;
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ public class MisoScene implements Scene
|
|||||||
// make sure it's in the location list and absent from any cluster
|
// make sure it's in the location list and absent from any cluster
|
||||||
updateLocation(portal, -1);
|
updateLocation(portal, -1);
|
||||||
|
|
||||||
// don't allow adding an portal more than once
|
// don't allow adding a portal more than once
|
||||||
if (_portals.contains(portal)) {
|
if (_portals.contains(portal)) {
|
||||||
Log.warning("Attempt to add already-existing portal " +
|
Log.warning("Attempt to add already-existing portal " +
|
||||||
"[portal=" + portal + "].");
|
"[portal=" + portal + "].");
|
||||||
@@ -163,7 +163,7 @@ public class MisoScene implements Scene
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the location object at the given full coordinates, or
|
* Return the location object at the given full coordinates, or
|
||||||
* null if no location is currently present.
|
* null if no location is currently present at that location.
|
||||||
*
|
*
|
||||||
* @param x the full x-position coordinate.
|
* @param x the full x-position coordinate.
|
||||||
* @param y the full y-position coordinate.
|
* @param y the full y-position coordinate.
|
||||||
@@ -182,7 +182,7 @@ public class MisoScene implements Scene
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the given location object from the location list, and
|
* Remove the given location object from the location list, and
|
||||||
* from any containing cluster. If the location is an portal, it
|
* from any containing cluster. If the location is a portal, it
|
||||||
* is removed from the portal list as well.
|
* is removed from the portal list as well.
|
||||||
*
|
*
|
||||||
* @param loc the location object.
|
* @param loc the location object.
|
||||||
@@ -203,6 +203,34 @@ public class MisoScene implements Scene
|
|||||||
_portals.remove(loc);
|
_portals.remove(loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the default entrance portal for this scene.
|
||||||
|
*
|
||||||
|
* @param entrance the entrance portal.
|
||||||
|
*/
|
||||||
|
public void setEntrance (Portal entrance)
|
||||||
|
{
|
||||||
|
_entrance = entrance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the portal with the given name, or null if the portal
|
||||||
|
* isn't found in the portal list.
|
||||||
|
*
|
||||||
|
* @param name the portal name.
|
||||||
|
*
|
||||||
|
* @return the portal object.
|
||||||
|
*/
|
||||||
|
public Portal getPortal (String name)
|
||||||
|
{
|
||||||
|
int size = _portals.size();
|
||||||
|
for (int ii = 0; ii < size; ii++) {
|
||||||
|
Portal portal = (Portal)_portals.get(ii);
|
||||||
|
if (portal.name.equals(name)) return portal;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the scene name.
|
* Return the scene name.
|
||||||
*/
|
*/
|
||||||
@@ -319,6 +347,9 @@ public class MisoScene implements Scene
|
|||||||
/** The unique scene id. */
|
/** The unique scene id. */
|
||||||
protected int _sid;
|
protected int _sid;
|
||||||
|
|
||||||
|
/** The default entrance portal. */
|
||||||
|
protected Portal _entrance;
|
||||||
|
|
||||||
/** The locations within the scene. */
|
/** The locations within the scene. */
|
||||||
protected ArrayList _locations;
|
protected ArrayList _locations;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: Portal.java,v 1.1 2001/08/16 18:05:17 shaper Exp $
|
// $Id: Portal.java,v 1.2 2001/08/16 22:05:01 shaper Exp $
|
||||||
|
|
||||||
package com.threerings.miso.scene;
|
package com.threerings.miso.scene;
|
||||||
|
|
||||||
@@ -13,6 +13,12 @@ public class Portal extends Location
|
|||||||
/** The portal name used for binding the portal to another scene. */
|
/** The portal name used for binding the portal to another scene. */
|
||||||
public String name;
|
public String name;
|
||||||
|
|
||||||
|
/** The destination scene id. */
|
||||||
|
public int sid;
|
||||||
|
|
||||||
|
/** The destination portal within the destination scene. */
|
||||||
|
public Portal dest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct an <code>Portal</code> object.
|
* Construct an <code>Portal</code> object.
|
||||||
*
|
*
|
||||||
@@ -23,6 +29,19 @@ public class Portal extends Location
|
|||||||
{
|
{
|
||||||
super(loc.x, loc.y, loc.orient);
|
super(loc.x, loc.y, loc.orient);
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
sid = MisoScene.SID_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the destination information for this portal.
|
||||||
|
*
|
||||||
|
* @param sid the scene id.
|
||||||
|
* @param dest the destination portal.
|
||||||
|
*/
|
||||||
|
public void setDestination (int sid, Portal dest)
|
||||||
|
{
|
||||||
|
this.sid = sid;
|
||||||
|
this.dest = dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -32,5 +51,7 @@ public class Portal extends Location
|
|||||||
{
|
{
|
||||||
super.toString(buf);
|
super.toString(buf);
|
||||||
buf.append(", name=").append(name);
|
buf.append(", name=").append(name);
|
||||||
|
buf.append(", sid=").append(sid);
|
||||||
|
buf.append(", dest=").append(dest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: XMLSceneGroupParser.java,v 1.1 2001/08/16 20:14:06 shaper Exp $
|
// $Id: XMLSceneGroupParser.java,v 1.2 2001/08/16 22:05:01 shaper Exp $
|
||||||
|
|
||||||
package com.threerings.miso.scene.xml;
|
package com.threerings.miso.scene.xml;
|
||||||
|
|
||||||
@@ -14,6 +14,7 @@ import com.samskivert.util.*;
|
|||||||
import com.samskivert.xml.XMLUtil;
|
import com.samskivert.xml.XMLUtil;
|
||||||
import com.threerings.miso.Log;
|
import com.threerings.miso.Log;
|
||||||
import com.threerings.miso.scene.*;
|
import com.threerings.miso.scene.*;
|
||||||
|
import com.threerings.whirled.data.Scene;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses an XML scene group description file, loads the referenced
|
* Parses an XML scene group description file, loads the referenced
|
||||||
@@ -29,6 +30,26 @@ public class XMLSceneGroupParser extends DefaultHandler
|
|||||||
String qName, Attributes attributes)
|
String qName, Attributes attributes)
|
||||||
{
|
{
|
||||||
_tag = qName;
|
_tag = qName;
|
||||||
|
|
||||||
|
if (_tag.equals("scene")) {
|
||||||
|
// construct a new scene info object
|
||||||
|
_info.curscene = new SceneInfo(attributes.getValue("src"));
|
||||||
|
|
||||||
|
// add it to the list of scene info objects
|
||||||
|
_info.sceneinfo.add(_info.curscene);
|
||||||
|
|
||||||
|
} else if (_tag.equals("portal")) {
|
||||||
|
// pull out the portal data
|
||||||
|
String src = attributes.getValue("src");
|
||||||
|
String destScene = attributes.getValue("destScene");
|
||||||
|
String dest = attributes.getValue("dest");
|
||||||
|
|
||||||
|
// construct a new portal info object
|
||||||
|
PortalInfo pinfo = new PortalInfo(src, destScene, dest);
|
||||||
|
|
||||||
|
// add it to the current scene's list of portal info objects
|
||||||
|
_info.curscene.portals.add(pinfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void endElement (String uri, String localName, String qName)
|
public void endElement (String uri, String localName, String qName)
|
||||||
@@ -36,6 +57,24 @@ public class XMLSceneGroupParser extends DefaultHandler
|
|||||||
// we know we've received the entirety of the character data
|
// we know we've received the entirety of the character data
|
||||||
// for the elements we're tracking at this point, so proceed
|
// for the elements we're tracking at this point, so proceed
|
||||||
// with saving off element data for later use.
|
// with saving off element data for later use.
|
||||||
|
String str = _chars.toString();
|
||||||
|
|
||||||
|
if (qName.equals("name")) {
|
||||||
|
_info.curscene.name = str;
|
||||||
|
|
||||||
|
} else if (qName.equals("entrance")) {
|
||||||
|
_info.curscene.entrance = str;
|
||||||
|
|
||||||
|
} else if (qName.equals("scene")) {
|
||||||
|
// TODO: load scene from scene repository and set
|
||||||
|
// _info.curscene.scene to the resulting scene object
|
||||||
|
|
||||||
|
} else if (qName.equals("scenegroup")) {
|
||||||
|
// now that we've obtained all scene info and fully loaded
|
||||||
|
// the associated scene objects, resolve bindings between
|
||||||
|
// all scenes in the group.
|
||||||
|
_info.resolveBindings();
|
||||||
|
}
|
||||||
|
|
||||||
// note that we're not within a tag to avoid considering any
|
// note that we're not within a tag to avoid considering any
|
||||||
// characters during this quiescent time
|
// characters during this quiescent time
|
||||||
@@ -73,12 +112,13 @@ public class XMLSceneGroupParser extends DefaultHandler
|
|||||||
|
|
||||||
// prepare temporary data storage for parsing
|
// prepare temporary data storage for parsing
|
||||||
_chars = new StringBuffer();
|
_chars = new StringBuffer();
|
||||||
|
_info = new SceneGroupInfo();
|
||||||
|
|
||||||
// read the XML input stream and construct all scene objects
|
// read the XML input stream and construct all scene objects
|
||||||
XMLUtil.parse(this, bis);
|
XMLUtil.parse(this, bis);
|
||||||
|
|
||||||
// return the final list of scene objects
|
// return the final list of scene objects
|
||||||
return _info.scenes;
|
return _info.getScenes();
|
||||||
|
|
||||||
} catch (ParserConfigurationException pce) {
|
} catch (ParserConfigurationException pce) {
|
||||||
throw new IOException(pce.toString());
|
throw new IOException(pce.toString());
|
||||||
@@ -107,14 +147,112 @@ public class XMLSceneGroupParser extends DefaultHandler
|
|||||||
*/
|
*/
|
||||||
class SceneGroupInfo
|
class SceneGroupInfo
|
||||||
{
|
{
|
||||||
/** The list of scenes constructed once parsing is complete. */
|
|
||||||
public ArrayList scenes;
|
|
||||||
|
|
||||||
/** The scene info for all scenes described in the group. */
|
/** The scene info for all scenes described in the group. */
|
||||||
public ArrayList sceneinfo;
|
public ArrayList sceneinfo;
|
||||||
|
|
||||||
/** The current scene info. */
|
/** The current scene info. */
|
||||||
public SceneInfo curscene;
|
public SceneInfo curscene;
|
||||||
|
|
||||||
|
public SceneGroupInfo ()
|
||||||
|
{
|
||||||
|
sceneinfo = new ArrayList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a list of the scene objects contained within all
|
||||||
|
* scene info objects. Intended to be called once all parsing
|
||||||
|
* and resolving of portal bindings has been completed.
|
||||||
|
*/
|
||||||
|
public List getScenes ()
|
||||||
|
{
|
||||||
|
ArrayList scenes = new ArrayList();
|
||||||
|
int size = sceneinfo.size();
|
||||||
|
for (int ii = 0; ii < size; ii++) {
|
||||||
|
scenes.add(((SceneInfo)sceneinfo.get(ii)).scene);
|
||||||
|
}
|
||||||
|
return scenes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the scene object associated with the named scene
|
||||||
|
* info object.
|
||||||
|
*
|
||||||
|
* @param name the scene info name.
|
||||||
|
*
|
||||||
|
* @return the scene object or null if the scene info object
|
||||||
|
* isn't found or has no scene object.
|
||||||
|
*/
|
||||||
|
public MisoScene getScene (String name)
|
||||||
|
{
|
||||||
|
int size = sceneinfo.size();
|
||||||
|
for (int ii = 0; ii < size; ii++) {
|
||||||
|
SceneInfo sinfo = (SceneInfo)sceneinfo.get(ii);
|
||||||
|
if (sinfo.name.equals(name)) return sinfo.scene;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve portal bindings and set entrance portal for all scenes.
|
||||||
|
*/
|
||||||
|
public void resolveBindings ()
|
||||||
|
{
|
||||||
|
int size = sceneinfo.size();
|
||||||
|
for (int ii = 0; ii < size; ii++) {
|
||||||
|
// retrieve the next scene info object
|
||||||
|
SceneInfo sinfo = (SceneInfo)sceneinfo.get(ii);
|
||||||
|
|
||||||
|
int psize = sinfo.portals.size();
|
||||||
|
for (int jj = 0; jj < psize; jj++) {
|
||||||
|
// retrieve the next portal info object
|
||||||
|
PortalInfo pinfo = (PortalInfo)sinfo.portals.get(jj);
|
||||||
|
|
||||||
|
// resolve the portal binding
|
||||||
|
resolvePortal(sinfo, pinfo);
|
||||||
|
|
||||||
|
// set the entrance portal
|
||||||
|
Portal entrance = sinfo.scene.getPortal(sinfo.entrance);
|
||||||
|
sinfo.scene.setEntrance(entrance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve the binding for the portal in the given scene.
|
||||||
|
*
|
||||||
|
* @param sinfo the scene info.
|
||||||
|
* @param pinfo the portal info.
|
||||||
|
*/
|
||||||
|
protected void resolvePortal (SceneInfo sinfo, PortalInfo pinfo)
|
||||||
|
{
|
||||||
|
// get the source portal object
|
||||||
|
Portal src = sinfo.scene.getPortal(pinfo.src);
|
||||||
|
if (src == null) {
|
||||||
|
Log.warning(
|
||||||
|
"Missing source portal [scene=" + sinfo.name +
|
||||||
|
", pinfo=" + pinfo + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the destination scene
|
||||||
|
MisoScene destScene = getScene(pinfo.destScene);
|
||||||
|
if (destScene == null) {
|
||||||
|
Log.warning(
|
||||||
|
"Missing destination scene [scene=" + sinfo.name +
|
||||||
|
", pinfo=" + pinfo + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the destination portal object
|
||||||
|
Portal dest = destScene.getPortal(pinfo.dest);
|
||||||
|
if (dest == null) {
|
||||||
|
Log.warning(
|
||||||
|
"Missing destination portal [scene=" + sinfo.name +
|
||||||
|
", pinfo=" + pinfo + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
// update source portal with full destination information
|
||||||
|
src.setDestination(destScene.getId(), dest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -134,9 +272,13 @@ public class XMLSceneGroupParser extends DefaultHandler
|
|||||||
/** The list of portal info objects describing portal bindings. */
|
/** The list of portal info objects describing portal bindings. */
|
||||||
public ArrayList portals;
|
public ArrayList portals;
|
||||||
|
|
||||||
|
/** The scene object obtained from the scene repository. */
|
||||||
|
public MisoScene scene;
|
||||||
|
|
||||||
public SceneInfo (String src)
|
public SceneInfo (String src)
|
||||||
{
|
{
|
||||||
this.src = src;
|
this.src = src;
|
||||||
|
portals = new ArrayList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,5 +302,14 @@ public class XMLSceneGroupParser extends DefaultHandler
|
|||||||
this.destScene = destScene;
|
this.destScene = destScene;
|
||||||
this.dest = dest;
|
this.dest = dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String toString ()
|
||||||
|
{
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
buf.append("[src=").append(src);
|
||||||
|
buf.append(", dest=").append(dest);
|
||||||
|
buf.append(", destScene=").append(destScene);
|
||||||
|
return buf.append("]").toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user