Check if a block was the last visible one we were waiting on even if it was abandoned before it was resolved. The view location can change before resolution completes.

git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@506 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
Charlie Groves
2008-05-23 23:49:38 +00:00
parent dce34521a3
commit 3b86bbe9cc
@@ -370,7 +370,7 @@ public class MisoScenePanel extends VirtualMediaPanel
"->" + (usage[2] / 1024) + "k" + "]."); "->" + (usage[2] / 1024) + "k" + "].");
} }
// documentation inherited @Override
public void addNotify () public void addNotify ()
{ {
super.addNotify(); super.addNotify();
@@ -384,7 +384,7 @@ public class MisoScenePanel extends VirtualMediaPanel
} }
} }
// documentation inherited @Override
public void removeNotify () public void removeNotify ()
{ {
super.removeNotify(); super.removeNotify();
@@ -669,13 +669,13 @@ public class MisoScenePanel extends VirtualMediaPanel
return false; return false;
} }
// documentation inherited from interface @Override
public Rectangle getViewBounds () public Rectangle getViewBounds ()
{ {
return _vbounds; return _vbounds;
} }
// documentation inherited from interface @Override
public Component getComponent () public Component getComponent ()
{ {
return this; return this;
@@ -696,7 +696,7 @@ public class MisoScenePanel extends VirtualMediaPanel
_activeMenu = null; _activeMenu = null;
} }
// documentation inherited @Override
public void setBounds (int x, int y, int width, int height) public void setBounds (int x, int y, int width, int height)
{ {
super.setBounds(x, y, width, height); super.setBounds(x, y, width, height);
@@ -719,7 +719,7 @@ public class MisoScenePanel extends VirtualMediaPanel
} }
} }
// documentation inherited @Override
protected void viewLocationDidChange (int dx, int dy) protected void viewLocationDidChange (int dx, int dy)
{ {
super.viewLocationDidChange(dx, dy); super.viewLocationDidChange(dx, dy);
@@ -739,10 +739,11 @@ public class MisoScenePanel extends VirtualMediaPanel
_ulpos.setLocation(_tcoords); _ulpos.setLocation(_tcoords);
if (rethink() > 0) { if (rethink() > 0) {
_delayRepaint = mightDelayPaint; _delayRepaint = mightDelayPaint;
Log.info("Delaying repaint... " + Log.info("Got new pending blocks " +
"[need=" + _visiBlocks.size() + "[need=" + _visiBlocks.size() +
", of=" + _pendingBlocks + ", of=" + _pendingBlocks +
", view=" + StringUtil.toString(_vbounds) + "]."); ", view=" + StringUtil.toString(_vbounds) +
", delay=" + _delayRepaint + "].");
} }
} }
} }
@@ -807,8 +808,8 @@ public class MisoScenePanel extends VirtualMediaPanel
// prune any blocks that are no longer influential // prune any blocks that are no longer influential
Point key = new Point(); Point key = new Point();
for (Iterator iter = _blocks.values().iterator(); iter.hasNext(); ) { for (Iterator<SceneBlock> iter = _blocks.values().iterator(); iter.hasNext(); ) {
SceneBlock block = (SceneBlock)iter.next(); SceneBlock block = iter.next();
key.x = block.getBounds().x; key.x = block.getBounds().x;
key.y = block.getBounds().y; key.y = block.getBounds().y;
if (!_rethinkOp.blocks.contains(key)) { if (!_rethinkOp.blocks.contains(key)) {
@@ -820,8 +821,7 @@ public class MisoScenePanel extends VirtualMediaPanel
} }
} }
for (Iterator iter = _rethinkOp.blocks.iterator(); iter.hasNext(); ) { for (Point origin : _rethinkOp.blocks) {
Point origin = (Point)iter.next();
int bx = MathUtil.floorDiv(origin.x, _metrics.blockwid); int bx = MathUtil.floorDiv(origin.x, _metrics.blockwid);
int by = MathUtil.floorDiv(origin.y, _metrics.blockhei); int by = MathUtil.floorDiv(origin.y, _metrics.blockhei);
int bkey = compose(bx, by); int bkey = compose(bx, by);
@@ -909,10 +909,8 @@ public class MisoScenePanel extends VirtualMediaPanel
if (_dpanel != null) { if (_dpanel != null) {
_dpanel.blockCleared(block); _dpanel.blockCleared(block);
} }
// Clear out waiting for the block since it is no longer resolving. blockFinished(block);
_pendingBlocks--;
_visiBlocks.remove(block);
} }
/** /**
@@ -936,12 +934,17 @@ public class MisoScenePanel extends VirtualMediaPanel
_remgr.invalidateRegion(sbounds); _remgr.invalidateRegion(sbounds);
} }
} }
blockFinished(block);
}
/**
* Called whenever a block is done resolving, whether it was successfully resolved or if it
* was abandoned.
*/
protected void blockFinished (SceneBlock block)
{
--_pendingBlocks; --_pendingBlocks;
// if (_pendingBlocks == 0) {
// Log.info("Finished resolving pending blocks " +
// "[view=" + StringUtil.toString(_vbounds) + "].");
// reportMemoryUsage();
// }
// once all the visible pending blocks have completed their // once all the visible pending blocks have completed their
// resolution, recompute our visible object set and show ourselves // resolution, recompute our visible object set and show ourselves
@@ -1202,7 +1205,7 @@ public class MisoScenePanel extends VirtualMediaPanel
} }
} }
// documentation inherited @Override
public void paint (Graphics g) public void paint (Graphics g)
{ {
if (_delayRepaint) { if (_delayRepaint) {
@@ -1210,8 +1213,8 @@ public class MisoScenePanel extends VirtualMediaPanel
} }
super.paint(g); super.paint(g);
} }
// documentation inherited @Override
protected void paintInFront (Graphics2D gfx, Rectangle dirty) protected void paintInFront (Graphics2D gfx, Rectangle dirty)
{ {
super.paintInFront(gfx, dirty); super.paintInFront(gfx, dirty);
@@ -1223,7 +1226,7 @@ public class MisoScenePanel extends VirtualMediaPanel
} }
} }
// documentation inherited @Override
protected void paintBetween (Graphics2D gfx, Rectangle dirty) protected void paintBetween (Graphics2D gfx, Rectangle dirty)
{ {
// render any intersecting tiles // render any intersecting tiles
@@ -1249,6 +1252,7 @@ public class MisoScenePanel extends VirtualMediaPanel
* we intersperse them with objects in our scene and need to manage * we intersperse them with objects in our scene and need to manage
* their z-order. * their z-order.
*/ */
@Override
protected void paintBits (Graphics2D gfx, int layer, Rectangle dirty) protected void paintBits (Graphics2D gfx, int layer, Rectangle dirty)
{ {
_animmgr.paint(gfx, layer, dirty); _animmgr.paint(gfx, layer, dirty);
@@ -1595,7 +1599,7 @@ public class MisoScenePanel extends VirtualMediaPanel
/** Used by {@link #rethink}. */ /** Used by {@link #rethink}. */
protected class RethinkOp implements TileOp protected class RethinkOp implements TileOp
{ {
public Set blocks = Sets.newHashSet(); public Set<Point> blocks = Sets.newHashSet();
public void apply (int tx, int ty, Rectangle tbounds) { public void apply (int tx, int ty, Rectangle tbounds) {
_key.x = MathUtil.floorDiv(tx, _metrics.blockwid) * _key.x = MathUtil.floorDiv(tx, _metrics.blockwid) *