Use BaseTile objects to contain fringe tile info, mark them as impassible
if they are fringed on by any SPECIFIED tileId (ie, not the default tileId) that is impassible. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2852 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: MisoScenePanel.java,v 1.51 2003/10/15 23:20:40 mdb Exp $
|
// $Id: MisoScenePanel.java,v 1.52 2003/11/12 23:05:40 ray Exp $
|
||||||
|
|
||||||
package com.threerings.miso.client;
|
package com.threerings.miso.client;
|
||||||
|
|
||||||
@@ -1403,14 +1403,14 @@ public class MisoScenePanel extends VirtualMediaPanel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the fringe tile for the specified tile coordinate. */
|
/** Returns the fringe tile for the specified tile coordinate. */
|
||||||
protected Tile getFringeTile (int tx, int ty)
|
protected BaseTile getFringeTile (int tx, int ty)
|
||||||
{
|
{
|
||||||
SceneBlock block = getBlock(tx, ty);
|
SceneBlock block = getBlock(tx, ty);
|
||||||
return (block == null) ? null : block.getFringeTile(tx, ty);
|
return (block == null) ? null : block.getFringeTile(tx, ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Computes the fringe tile for the specified coordinate. */
|
/** Computes the fringe tile for the specified coordinate. */
|
||||||
protected Tile computeFringeTile (int tx, int ty)
|
protected BaseTile computeFringeTile (int tx, int ty)
|
||||||
{
|
{
|
||||||
return _ctx.getTileManager().getAutoFringer().getFringeTile(
|
return _ctx.getTileManager().getAutoFringer().getFringeTile(
|
||||||
_model, tx, ty, _masks);
|
_model, tx, ty, _masks);
|
||||||
@@ -1462,11 +1462,6 @@ public class MisoScenePanel extends VirtualMediaPanel
|
|||||||
tile.paint(_gfx, tbounds.x, tbounds.y);
|
tile.paint(_gfx, tbounds.x, tbounds.y);
|
||||||
passable = ((BaseTile)tile).isPassable();
|
passable = ((BaseTile)tile).isPassable();
|
||||||
|
|
||||||
// highlight impassable tiles
|
|
||||||
if (_traverseDebug.getValue() && !passable) {
|
|
||||||
fillTile(_gfx, tx, ty, Color.yellow);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// draw black where there are no tiles
|
// draw black where there are no tiles
|
||||||
Polygon poly = MisoUtil.getTilePolygon(_metrics, tx, ty);
|
Polygon poly = MisoUtil.getTilePolygon(_metrics, tx, ty);
|
||||||
@@ -1476,12 +1471,19 @@ public class MisoScenePanel extends VirtualMediaPanel
|
|||||||
|
|
||||||
if ((tile = getFringeTile(tx, ty)) != null) {
|
if ((tile = getFringeTile(tx, ty)) != null) {
|
||||||
tile.paint(_gfx, tbounds.x, tbounds.y);
|
tile.paint(_gfx, tbounds.x, tbounds.y);
|
||||||
|
passable = passable && ((BaseTile)tile).isPassable();
|
||||||
}
|
}
|
||||||
|
|
||||||
// highlight passable non-traversable tiles
|
// highlight impassable tiles
|
||||||
if (_traverseDebug.getValue() && passable &&
|
if (_traverseDebug.getValue()) {
|
||||||
!canTraverse(null, tx, ty)) {
|
if (!passable) {
|
||||||
fillTile(_gfx, tx, ty, Color.green);
|
// highlight tiles blocked by base or fringe in yellow
|
||||||
|
fillTile(_gfx, tx, ty, Color.yellow);
|
||||||
|
|
||||||
|
} else if (!canTraverse(null, tx, ty)) {
|
||||||
|
// highlight passable non-traversable tiles in green
|
||||||
|
fillTile(_gfx, tx, ty, Color.green);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (ArrayIndexOutOfBoundsException e) {
|
} catch (ArrayIndexOutOfBoundsException e) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: SceneBlock.java,v 1.21 2003/10/29 01:42:37 mdb Exp $
|
// $Id: SceneBlock.java,v 1.22 2003/11/12 23:05:40 ray Exp $
|
||||||
|
|
||||||
package com.threerings.miso.client;
|
package com.threerings.miso.client;
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ public class SceneBlock
|
|||||||
_panel = panel;
|
_panel = panel;
|
||||||
_bounds = new Rectangle(tx, ty, width, height);
|
_bounds = new Rectangle(tx, ty, width, height);
|
||||||
_base = new BaseTile[width*height];
|
_base = new BaseTile[width*height];
|
||||||
_fringe = new Tile[width*height];
|
_fringe = new BaseTile[width*height];
|
||||||
_covered = new boolean[width*height];
|
_covered = new boolean[width*height];
|
||||||
|
|
||||||
// compute our screen-coordinate footprint polygon
|
// compute our screen-coordinate footprint polygon
|
||||||
@@ -252,7 +252,7 @@ public class SceneBlock
|
|||||||
* Returns the fringe tile at the specified coordinates or null if
|
* Returns the fringe tile at the specified coordinates or null if
|
||||||
* there's no tile at said coordinates.
|
* there's no tile at said coordinates.
|
||||||
*/
|
*/
|
||||||
public Tile getFringeTile (int tx, int ty)
|
public BaseTile getFringeTile (int tx, int ty)
|
||||||
{
|
{
|
||||||
return _fringe[index(tx, ty)];
|
return _fringe[index(tx, ty)];
|
||||||
}
|
}
|
||||||
@@ -367,8 +367,20 @@ public class SceneBlock
|
|||||||
*/
|
*/
|
||||||
public boolean canTraverse (Object traverser, int tx, int ty)
|
public boolean canTraverse (Object traverser, int tx, int ty)
|
||||||
{
|
{
|
||||||
|
if (_covered[index(tx, ty)]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
BaseTile base = getBaseTile(tx, ty);
|
BaseTile base = getBaseTile(tx, ty);
|
||||||
return !_covered[index(tx, ty)] && (base != null && base.isPassable());
|
if ((base == null) || !base.isPassable()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseTile fringe = getFringeTile(tx, ty);
|
||||||
|
if (fringe != null) {
|
||||||
|
return fringe.isPassable();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -551,7 +563,7 @@ public class SceneBlock
|
|||||||
protected BaseTile[] _base;
|
protected BaseTile[] _base;
|
||||||
|
|
||||||
/** Our fringe tiles. */
|
/** Our fringe tiles. */
|
||||||
protected Tile[] _fringe;
|
protected BaseTile[] _fringe;
|
||||||
|
|
||||||
/** Indicates whether our tiles are covered by an object. */
|
/** Indicates whether our tiles are covered by an object. */
|
||||||
protected boolean[] _covered;
|
protected boolean[] _covered;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: AutoFringer.java,v 1.25 2003/05/31 00:56:38 mdb Exp $
|
// $Id: AutoFringer.java,v 1.26 2003/11/12 23:05:41 ray Exp $
|
||||||
|
|
||||||
package com.threerings.miso.tile;
|
package com.threerings.miso.tile;
|
||||||
|
|
||||||
@@ -57,14 +57,15 @@ public class AutoFringer
|
|||||||
* Compute and return the fringe tile to be inserted at the specified
|
* Compute and return the fringe tile to be inserted at the specified
|
||||||
* location.
|
* location.
|
||||||
*/
|
*/
|
||||||
public Tile getFringeTile (MisoSceneModel scene, int col, int row,
|
public BaseTile getFringeTile (MisoSceneModel scene, int col, int row,
|
||||||
HashMap masks)
|
HashMap masks)
|
||||||
{
|
{
|
||||||
// get the tileset id of the base tile we are considering
|
// get the tileset id of the base tile we are considering
|
||||||
int underset = scene.getBaseTileId(col, row) >> 16;
|
int underset = scene.getBaseTileId(col, row) >> 16;
|
||||||
|
|
||||||
// start with a clean temporary fringer map
|
// start with a clean temporary fringer map
|
||||||
_fringers.clear();
|
_fringers.clear();
|
||||||
|
boolean passable = true;
|
||||||
|
|
||||||
// walk through our influence tiles
|
// walk through our influence tiles
|
||||||
for (int y = row - 1, maxy = row + 2; y < maxy; y++) {
|
for (int y = row - 1, maxy = row + 2; y < maxy; y++) {
|
||||||
@@ -93,6 +94,20 @@ public class AutoFringer
|
|||||||
|
|
||||||
// now turn on the appropriate fringebits
|
// now turn on the appropriate fringebits
|
||||||
fringer.bits |= FLAGMATRIX[y - row + 1][x - col + 1];
|
fringer.bits |= FLAGMATRIX[y - row + 1][x - col + 1];
|
||||||
|
|
||||||
|
// and see if this base tile kills passability
|
||||||
|
if (passable) {
|
||||||
|
if (btid > 0) {
|
||||||
|
try {
|
||||||
|
BaseTile bt = (BaseTile) _tmgr.getTile(btid);
|
||||||
|
passable = bt.isPassable();
|
||||||
|
} catch (NoSuchTileSetException nstse) {
|
||||||
|
Log.warning("Autofringer couldn't find a base " +
|
||||||
|
"set while attempting to figure passability " +
|
||||||
|
"[error=" + nstse + "].");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,14 +126,17 @@ public class AutoFringer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return composeFringeTile(frecs, masks, MisoUtil.getTileHash(col, row));
|
BaseTile frTile = new BaseTile();
|
||||||
|
frTile.setPassable(passable);
|
||||||
|
composeFringeTile(frTile, frecs, masks, MisoUtil.getTileHash(col, row));
|
||||||
|
return frTile;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compose a FringeTile out of the various fringe images needed.
|
* Compose a FringeTile out of the various fringe images needed.
|
||||||
*/
|
*/
|
||||||
protected Tile composeFringeTile (
|
protected void composeFringeTile (
|
||||||
FringerRec[] fringers, HashMap masks, int hashValue)
|
Tile frTile, FringerRec[] fringers, HashMap masks, int hashValue)
|
||||||
{
|
{
|
||||||
// sort the array so that higher priority fringers get drawn first
|
// sort the array so that higher priority fringers get drawn first
|
||||||
QuickSort.sort(fringers);
|
QuickSort.sort(fringers);
|
||||||
@@ -140,9 +158,7 @@ public class AutoFringer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Tile tile = new Tile();
|
frTile.setImage(new BufferedMirage(ftimg));
|
||||||
tile.setImage(new BufferedMirage(ftimg));
|
|
||||||
return tile;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user