938445071e
list of objects, they can overlap (I think that objects added to a scene later will be rendered before objects added earlier which ends up feeling natural in the editor); no longer are objects ignored when their footprint lies outside the scene bounds. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1302 542714f4-19e9-0310-aa3c-eee0fc999fb1
248 lines
7.8 KiB
Java
248 lines
7.8 KiB
Java
//
|
|
// $Id: EditableMisoSceneImpl.java,v 1.17 2002/04/27 18:41:14 mdb Exp $
|
|
|
|
package com.threerings.miso.scene.tools;
|
|
|
|
import java.awt.Point;
|
|
import java.awt.Rectangle;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.Random;
|
|
|
|
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.AutoFringer;
|
|
import com.threerings.miso.tile.BaseTile;
|
|
import com.threerings.miso.tile.BaseTileSet;
|
|
import com.threerings.miso.tile.MisoTileManager;
|
|
|
|
import com.threerings.miso.scene.DisplayMisoSceneImpl;
|
|
import com.threerings.miso.scene.MisoSceneModel;
|
|
import com.threerings.miso.scene.util.IsoUtil;
|
|
|
|
/**
|
|
* 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.
|
|
*
|
|
* @exception NoSuchTileException thrown if the model references a
|
|
* tile which is not available via the supplied tile manager.
|
|
*/
|
|
public EditableMisoSceneImpl (MisoSceneModel model, MisoTileManager tmgr)
|
|
throws NoSuchTileException, NoSuchTileSetException
|
|
{
|
|
super(model, tmgr);
|
|
_fringer = tmgr.getAutoFringer();
|
|
}
|
|
|
|
/**
|
|
* 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.baseTileIds[_model.width*y + x] =
|
|
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.baseTileIds[_model.width*y + x] = fqTileId;
|
|
_fringer.fringe(_model, _fringe, new Rectangle(x, y, 1, 1), _rando);
|
|
}
|
|
|
|
// documentation inherited
|
|
public void setFringeTile (int x, int y, Tile tile, int fqTileId)
|
|
{
|
|
_fringe.setTile(x, y, tile);
|
|
// update the model as well
|
|
_model.fringeTileIds[_model.width*y + x] = fqTileId;
|
|
}
|
|
|
|
// documentation inherited
|
|
public void addObjectTile (ObjectTile tile, int x, int y, int fqTileId)
|
|
{
|
|
// add the tile to the list
|
|
_objects.add(tile);
|
|
_coords.put(tile, new Point(x, y));
|
|
_objectTileIds.put(tile, new Integer(fqTileId));
|
|
|
|
// toggle the "covered" flag on in all base tiles below this
|
|
// object tile
|
|
setObjectTileFootprint(tile, x, y, true);
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public void setObjectAction (ObjectTile tile, String action)
|
|
{
|
|
_actions.put(tile, action);
|
|
}
|
|
|
|
// 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 void clearFringeTile (int x, int y)
|
|
{
|
|
_fringe.setTile(x, y, null);
|
|
// clear it out in the model
|
|
_model.fringeTileIds[_model.width*y + x] = 0;
|
|
}
|
|
|
|
// documentation inherited
|
|
public void removeObjectTile (ObjectTile tile)
|
|
{
|
|
// remove the tile from the list and tables
|
|
_objects.remove(tile);
|
|
_actions.remove(tile);
|
|
_objectTileIds.remove(tile);
|
|
|
|
Point p = (Point)_coords.remove(tile);
|
|
if (p != null) {
|
|
// toggle the "covered" flag off on the base tiles in this
|
|
// object tile's footprint
|
|
setObjectTileFootprint(tile, p.x, p.y, false);
|
|
}
|
|
}
|
|
|
|
// documentation inherited from interface
|
|
public void clearObjectAction (ObjectTile tile)
|
|
{
|
|
_actions.remove(tile);
|
|
}
|
|
|
|
// documentation inherited
|
|
public MisoSceneModel getMisoSceneModel ()
|
|
{
|
|
// we need to flush the object layer to the model prior to
|
|
// returning it
|
|
int ocount = _objects.size();
|
|
int[] otids = new int[ocount*3];
|
|
String[] actions = new String[ocount];
|
|
|
|
for (int ii = 0; ii < ocount; ii++) {
|
|
ObjectTile tile = (ObjectTile)_objects.get(ii);
|
|
Point coords = (Point)_coords.get(tile);
|
|
otids[3*ii] = coords.x;
|
|
otids[3*ii+1] = coords.y;
|
|
otids[3*ii+2] = ((Integer)_objectTileIds.get(tile)).intValue();
|
|
actions[ii] = (String)_actions.get(tile);
|
|
}
|
|
|
|
// stuff the new arrays into the model
|
|
_model.objectTileIds = otids;
|
|
_model.objectActions = actions;
|
|
|
|
// and we're ready to roll
|
|
return _model;
|
|
}
|
|
|
|
// documentation inherited
|
|
protected ObjectTile expandObject (
|
|
int col, int row, int tsid, int tid, int fqTid, String action)
|
|
throws NoSuchTileException, NoSuchTileSetException
|
|
{
|
|
// do the actual object creation
|
|
ObjectTile tile = super.expandObject(
|
|
col, row, tsid, tid, fqTid, action);
|
|
|
|
// make sure our array is created (we have to do this specially
|
|
// here because this method is called before our constructor is
|
|
// called; yay Java!)
|
|
if (_objectTileIds == null) {
|
|
_objectTileIds = new HashMap();
|
|
}
|
|
|
|
// we need this to track object layer mods
|
|
_objectTileIds.put(tile, new Integer(fqTid));
|
|
|
|
// pass on the objecty goodness
|
|
return tile;
|
|
}
|
|
|
|
/** Where we keep track of object tile ids. */
|
|
protected HashMap _objectTileIds = new HashMap();
|
|
|
|
/** The default tileset with which to fill the base layer. */
|
|
protected BaseTileSet _defaultBaseTileSet;
|
|
|
|
/** The tileset id of the default base tileset. */
|
|
protected int _defaultBaseTileSetId;
|
|
|
|
/** The autofringer. */
|
|
protected AutoFringer _fringer;
|
|
|
|
/** A random number generator for filling random base tiles and fringes. */
|
|
protected Random _rando = new Random();
|
|
}
|