Major low-level rendering rethink.

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1287 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2002-04-23 01:18:17 +00:00
parent cc6a9d00ef
commit 0bde11ee81
5 changed files with 148 additions and 224 deletions
@@ -1,11 +1,13 @@
// //
// $Id: BuilderPanel.java,v 1.5 2001/11/27 08:09:35 mdb Exp $ // $Id: BuilderPanel.java,v 1.6 2002/04/23 01:17:28 mdb Exp $
package com.threerings.cast.builder; package com.threerings.cast.builder;
import javax.swing.*; import javax.swing.*;
import com.samskivert.swing.*; import com.samskivert.swing.*;
import com.threerings.media.FrameManager;
import com.threerings.cast.CharacterManager; import com.threerings.cast.CharacterManager;
import com.threerings.cast.ComponentRepository; import com.threerings.cast.ComponentRepository;
@@ -19,7 +21,8 @@ public class BuilderPanel extends JPanel
/** /**
* Constructs the builder panel. * Constructs the builder panel.
*/ */
public BuilderPanel (CharacterManager charmgr, ComponentRepository crepo) public BuilderPanel (FrameManager framemgr, CharacterManager charmgr,
ComponentRepository crepo)
{ {
setLayout(new VGroupLayout()); setLayout(new VGroupLayout());
@@ -35,7 +38,7 @@ public class BuilderPanel extends JPanel
// create the component selection and sprite display panels // create the component selection and sprite display panels
JPanel sub = new JPanel(gl); JPanel sub = new JPanel(gl);
sub.add(new ComponentPanel(model)); sub.add(new ComponentPanel(model));
sub.add(new SpritePanel(charmgr, model)); sub.add(new SpritePanel(framemgr, charmgr, model));
add(sub); add(sub);
} }
} }
@@ -1,5 +1,5 @@
// //
// $Id: SpritePanel.java,v 1.12 2002/03/16 03:15:04 shaper Exp $ // $Id: SpritePanel.java,v 1.13 2002/04/23 01:17:28 mdb Exp $
package com.threerings.cast.builder; package com.threerings.cast.builder;
@@ -11,9 +11,8 @@ import java.awt.Rectangle;
import java.util.List; import java.util.List;
import com.threerings.media.animation.AnimatedPanel; import com.threerings.media.FrameManager;
import com.threerings.media.animation.AnimationManager; import com.threerings.media.MediaPanel;
import com.threerings.media.sprite.SpriteManager;
import com.threerings.util.DirectionCodes; import com.threerings.util.DirectionCodes;
@@ -27,29 +26,28 @@ import com.threerings.cast.StandardActions;
* The sprite panel displays a character sprite centered in the panel * The sprite panel displays a character sprite centered in the panel
* suitable for user perusal. * suitable for user perusal.
*/ */
public class SpritePanel extends AnimatedPanel public class SpritePanel extends MediaPanel
implements DirectionCodes, BuilderModelListener implements DirectionCodes, BuilderModelListener
{ {
/** /**
* Constructs the sprite panel. * Constructs the sprite panel.
*/ */
public SpritePanel (CharacterManager charmgr, BuilderModel model) public SpritePanel (FrameManager framemgr, CharacterManager charmgr,
BuilderModel model)
{ {
super(framemgr);
// save off references // save off references
_charmgr = charmgr; _charmgr = charmgr;
_model = model; _model = model;
// create managers
_spritemgr = new SpriteManager();
_animmgr = new AnimationManager(_spritemgr, this);
// listen to the builder model so that we can update the // listen to the builder model so that we can update the
// sprite when a new component is selected // sprite when a new component is selected
_model.addListener(this); _model.addListener(this);
} }
// documentation inherited // documentation inherited
protected void render (Graphics2D gfx, List invalidRects) protected void paintMiddle (Graphics2D gfx, List invalidRects)
{ {
// clear the background // clear the background
gfx.setColor(Color.lightGray); gfx.setColor(Color.lightGray);
@@ -122,12 +120,6 @@ public class SpritePanel extends AnimatedPanel
/** The sprite displayed by the panel. */ /** The sprite displayed by the panel. */
protected CharacterSprite _sprite; protected CharacterSprite _sprite;
/** The animation manager. */
protected AnimationManager _animmgr;
/** The sprite manager. */
protected SpriteManager _spritemgr;
/** The character manager. */ /** The character manager. */
protected CharacterManager _charmgr; protected CharacterManager _charmgr;
@@ -1,5 +1,5 @@
// //
// $Id: IsoSceneView.java,v 1.105 2002/04/02 01:06:46 mdb Exp $ // $Id: IsoSceneView.java,v 1.106 2002/04/23 01:18:17 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -24,7 +24,8 @@ import java.util.List;
import com.samskivert.util.StringUtil; import com.samskivert.util.StringUtil;
import com.samskivert.util.HashIntMap; import com.samskivert.util.HashIntMap;
import com.threerings.media.animation.AnimationManager; import com.threerings.media.RegionManager;
import com.threerings.media.sprite.Path; import com.threerings.media.sprite.Path;
import com.threerings.media.sprite.SpriteManager; import com.threerings.media.sprite.SpriteManager;
@@ -64,17 +65,18 @@ public class IsoSceneView implements SceneView
/** /**
* Constructs an iso scene view. * Constructs an iso scene view.
* *
* @param animmgr the animation manager.
* @param spritemgr the sprite manager. * @param spritemgr the sprite manager.
* @param model the data model. * @param model the data model.
* @param remgr the region manager that is collecting invalid regions
* for this view.
*/ */
public IsoSceneView (AnimationManager animmgr, SpriteManager spritemgr, public IsoSceneView (SpriteManager spritemgr, IsoSceneViewModel model,
IsoSceneViewModel model) RegionManager remgr)
{ {
// save off references // save off references
_animmgr = animmgr;
_spritemgr = spritemgr; _spritemgr = spritemgr;
_model = model; _model = model;
_remgr = remgr;
// create our polygon arrays, these will be populated with the // create our polygon arrays, these will be populated with the
// tile polygons as they are requested // tile polygons as they are requested
@@ -111,9 +113,6 @@ public class IsoSceneView implements SceneView
{ {
_scene = scene; _scene = scene;
// clear all dirty lists and tile array
clearDirtyRegions();
// obtain a list of the objects in the scene and generate records // obtain a list of the objects in the scene and generate records
// for each of them that contain precomputed metrics // for each of them that contain precomputed metrics
prepareObjectList(); prepareObjectList();
@@ -122,6 +121,14 @@ public class IsoSceneView implements SceneView
invalidate(); invalidate();
} }
/**
* Invalidate the entire visible scene view.
*/
public void invalidate ()
{
_remgr.invalidateRegion(_model.bounds);
}
// documentation inherited from interface // documentation inherited from interface
public void viewWillScroll (int dx, int dy) public void viewWillScroll (int dx, int dy)
{ {
@@ -155,44 +162,48 @@ public class IsoSceneView implements SceneView
} }
// documentation inherited from interface // documentation inherited from interface
public void paint (Graphics2D gfx, List invalidRects) public void paint (Graphics2D gfx, Rectangle[] dirtyRects)
{ {
if (_scene == null) { if (_scene == null) {
Log.warning("Scene view painted with null scene."); Log.warning("Scene view painted with null scene.");
return; return;
} }
// invalidate the invalid rectangles // Log.info("Rendering: " + StringUtil.toString(dirtyRects) +
int rsize = invalidRects.size(); // ", clip: " + StringUtil.toString(gfx.getClip()));
for (int ii = 0; ii < rsize; ii++) {
invalidateRect((Rectangle)invalidRects.get(ii)); // // invalidate the invalid rectangles
} // int rsize = dirtyRects.length;
// for (int ii = 0; ii < rsize; ii++) {
// invalidateRect(dirtyRects[ii]);
// }
// translate according to our scroll parameters // translate according to our scroll parameters
gfx.translate(-_xoff, -_yoff); gfx.translate(-_xoff, -_yoff);
// render the scrolling part of the scene // render the scrolling part of the scene
renderScrollingScene(gfx); int rcount = dirtyRects.length;
for (int ii = 0; ii < rcount; ii++) {
// draw tile coordinates Rectangle rect = dirtyRects[ii];
if (_model.showCoords) { rect.translate(_xoff, _yoff);
paintCoordinates(gfx); Shape oclip = gfx.getClip();
gfx.clipRect(rect.x, rect.y, rect.width, rect.height);
renderScrollingScene(gfx, rect);
gfx.setClip(oclip);
rect.translate(-_xoff, -_yoff);
} }
// untranslate according to our scroll parameters // untranslate according to our scroll parameters
gfx.translate(_xoff, _yoff); gfx.translate(_xoff, _yoff);
// render the fixed part of the scene // render the fixed part of the scene
renderFixedScene(gfx); for (int ii = 0; ii < rcount; ii++) {
Rectangle rect = dirtyRects[ii];
// draw frames of dirty tiles and rectangles Shape oclip = gfx.getClip();
// drawDirtyRegions(gfx); gfx.clipRect(rect.x, rect.y, rect.width, rect.height);
renderFixedScene(gfx, rect);
// render any animations gfx.setClip(oclip);
_animmgr.renderAnimations(gfx, AnimationManager.ALL); }
// clear out the dirty tiles and rectangles
clearDirtyRegions();
// draw sprite paths // draw sprite paths
if (_model.showPaths) { if (_model.showPaths) {
@@ -264,73 +275,19 @@ public class IsoSceneView implements SceneView
// nothing for now // nothing for now
} }
/**
* Invalidate the entire visible scene view.
*/
protected void invalidate ()
{
invalidateRect(_model.bounds);
}
/**
* Clears the dirty rectangles and items lists, and the array of
* dirty tiles.
*/
protected void clearDirtyRegions ()
{
_dirtyRects.clear();
_dirtyItems.clear();
_numDirty = 0;
for (int xx = 0; xx < _model.scenewid; xx++) {
Arrays.fill(_dirty[xx], false);
}
}
/**
* Draws highlights around the dirty tiles and rectangles.
*/
protected void drawDirtyRegions (Graphics2D gfx)
{
// draw the dirty tiles
gfx.setColor(Color.cyan);
for (int xx = 0; xx < _model.scenewid; xx++) {
for (int yy = 0; yy < _model.scenehei; yy++) {
if (_dirty[xx][yy]) {
gfx.draw(getTilePoly(xx, yy));
}
}
}
// draw the dirty rectangles
Stroke ostroke = gfx.getStroke();
gfx.setStroke(DIRTY_RECT_STROKE);
gfx.setColor(Color.red);
int size = _dirtyRects.size();
for (int ii = 0; ii < size; ii++) {
Rectangle rect = (Rectangle)_dirtyRects.get(ii);
gfx.draw(rect);
}
gfx.setStroke(ostroke);
// draw the dirty item rectangles
gfx.setColor(Color.yellow);
size = _dirtyItems.size();
for (int ii = 0; ii < size; ii++) {
Rectangle rect = _dirtyItems.get(ii).dirtyRect;
gfx.draw(rect);
}
}
/** /**
* Renders the scrolling part of the scene to the given graphics * Renders the scrolling part of the scene to the given graphics
* context. * context.
* *
* @param gfx the graphics context. * @param gfx the graphics context.
*/ */
protected void renderScrollingScene (Graphics2D gfx) protected void renderScrollingScene (Graphics2D gfx, Rectangle clip)
{ {
renderTiles(gfx); // render any intersecting tiles
renderBaseDecorations(gfx); renderTiles(gfx, clip);
// render anything that goes on top of the tiles
renderBaseDecorations(gfx, clip);
} }
/** /**
@@ -339,21 +296,32 @@ public class IsoSceneView implements SceneView
* *
* @param gfx the graphics context. * @param gfx the graphics context.
*/ */
protected void renderFixedScene (Graphics2D gfx) protected void renderFixedScene (Graphics2D gfx, Rectangle clip)
{ {
renderDirtyItems(gfx); renderDirtyItems(gfx, clip);
} }
/** /**
* Renders the base and fringe layer tiles to the given graphics * Renders the base and fringe layer tiles that intersect the
* context. * specified clipping rectangle.
*/ */
protected void renderTiles (Graphics2D gfx) protected void renderTiles (Graphics2D gfx, Rectangle clip)
{ {
// render the base and fringe layers FontMetrics fm = gfx.getFontMetrics(_font);
int fhei = fm.getAscent();
int cx = _model.tilehwid, cy = _model.tilehhei;
if (_model.showCoords) {
gfx.setFont(_font);
gfx.setColor(Color.white);
}
for (int yy = 0; yy < _model.scenehei; yy++) { for (int yy = 0; yy < _model.scenehei; yy++) {
for (int xx = 0; xx < _model.scenewid; xx++) { for (int xx = 0; xx < _model.scenewid; xx++) {
if (!_dirty[xx][yy]) { Polygon tpoly = getTilePoly(xx, yy);
// skip non-intersecting tiles
if (!tpoly.intersects(clip)) {
continue; continue;
} }
@@ -363,15 +331,30 @@ public class IsoSceneView implements SceneView
// draw the base and fringe tile images // draw the base and fringe tile images
Tile tile; Tile tile;
if ((tile = _scene.getBaseTile(tx, ty)) != null) { if ((tile = _scene.getBaseTile(tx, ty)) != null) {
tile.paint(gfx, getTilePoly(xx, yy)); tile.paint(gfx, tpoly);
} }
if ((tile = _scene.getFringeTile(tx, ty)) != null) { if ((tile = _scene.getFringeTile(tx, ty)) != null) {
tile.paint(gfx, getTilePoly(xx, yy)); tile.paint(gfx, tpoly);
} }
// if we're showing coordinates, outline the tiles as well // if we're showing coordinates, do that
if (_model.showCoords) { if (_model.showCoords) {
gfx.draw(getTilePoly(xx, yy)); // outline the tile
gfx.draw(tpoly);
// get the top-left screen coordinates of the tile
Rectangle bounds = tpoly.getBounds();
int sx = bounds.x, sy = bounds.y;
// draw x-coordinate
String str = String.valueOf(xx + _tiledx);
int xpos = sx + cx - (fm.stringWidth(str) / 2);
gfx.drawString(str, xpos, sy + cy);
// draw y-coordinate
str = String.valueOf(yy + _tiledy);
xpos = sx + cx - (fm.stringWidth(str) / 2);
gfx.drawString(str, xpos, sy + cy + fhei);
} }
} }
} }
@@ -382,7 +365,7 @@ public class IsoSceneView implements SceneView
* tiles have been rendered but before anything else has been rendered * tiles have been rendered but before anything else has been rendered
* (so that whatever is painted appears to be on the ground). * (so that whatever is painted appears to be on the ground).
*/ */
protected void renderBaseDecorations (Graphics2D gfx) protected void renderBaseDecorations (Graphics2D gfx, Rectangle clip)
{ {
// nothing for now // nothing for now
} }
@@ -391,10 +374,11 @@ public class IsoSceneView implements SceneView
* Renders the dirty sprites and objects in the scene to the given * Renders the dirty sprites and objects in the scene to the given
* graphics context. * graphics context.
*/ */
protected void renderDirtyItems (Graphics2D gfx) protected void renderDirtyItems (Graphics2D gfx, Rectangle clip)
{ {
// Log.info("renderDirtyItems [rects=" + _dirtyRects.size() + invalidateItems(clip);
// ", items=" + _dirtyItems.size() + "].");
// Log.info("renderDirtyItems [items=" + _dirtyItems.size() + "].");
// sort the dirty sprites and objects visually back-to-front // sort the dirty sprites and objects visually back-to-front
DirtyItem items[] = _dirtyItems.sort(); DirtyItem items[] = _dirtyItems.sort();
@@ -402,47 +386,10 @@ public class IsoSceneView implements SceneView
// render each item clipping to its dirty rectangle // render each item clipping to its dirty rectangle
for (int ii = 0; ii < items.length; ii++) { for (int ii = 0; ii < items.length; ii++) {
items[ii].paint(gfx, items[ii].dirtyRect); items[ii].paint(gfx, items[ii].dirtyRect);
// Log.info("Painting item [item=" + items[ii] + "]."); // Log.info("Painting item [item=" + items[ii] + "].");
} }
}
/** _dirtyItems.clear();
* Paints tile coordinate numbers on all dirty tiles.
*
* @param gfx the graphics context.
*/
protected void paintCoordinates (Graphics2D gfx)
{
FontMetrics fm = gfx.getFontMetrics(_font);
gfx.setFont(_font);
gfx.setColor(Color.white);
int cx = _model.tilehwid, cy = _model.tilehhei;
int fhei = fm.getAscent();
for (int yy = 0; yy < _model.scenehei; yy++) {
for (int xx = 0; xx < _model.scenewid; xx++) {
// if the tile's not dirty, don't paint the coordinates
if (!_dirty[xx][yy]) {
continue;
}
// get the top-left screen coordinates of the tile
Rectangle bounds = getTilePoly(xx, yy).getBounds();
int sx = bounds.x, sy = bounds.y;
// draw x-coordinate
String str = String.valueOf(xx + _tiledx);
int xpos = sx + cx - (fm.stringWidth(str) / 2);
gfx.drawString(str, xpos, sy + cy);
// draw y-coordinate
str = String.valueOf(yy + _tiledy);
xpos = sx + cx - (fm.stringWidth(str) / 2);
gfx.drawString(str, xpos, sy + cy + fhei);
}
}
} }
/** /**
@@ -513,23 +460,6 @@ public class IsoSceneView implements SceneView
return poly; return poly;
} }
/**
* Invalidates the specified rectangle in preparation for
* rendering. Items that overlap the rectangle as well as tiles that
* overlap the rectangle will be marked as needing to be rerendered.
*/
protected void invalidateRect (Rectangle rect)
{
// dirty the tiles impacted by this rectangle
Rectangle tileBounds = invalidateScreenRect(rect);
// dirty any sprites or objects impacted by this rectangle
invalidateItems(tileBounds);
// save the rectangle for potential display later
_dirtyRects.add(rect);
}
/** /**
* Invalidates the given rectangle in screen pixel coordinates in the * Invalidates the given rectangle in screen pixel coordinates in the
* view. Returns a rectangle that bounds all tiles that were dirtied. * view. Returns a rectangle that bounds all tiles that were dirtied.
@@ -927,12 +857,12 @@ public class IsoSceneView implements SceneView
/** The sprite manager. */ /** The sprite manager. */
protected SpriteManager _spritemgr; protected SpriteManager _spritemgr;
/** The animation manager. */
protected AnimationManager _animmgr;
/** The scene view model data. */ /** The scene view model data. */
protected IsoSceneViewModel _model; protected IsoSceneViewModel _model;
/** Our region manager. */
protected RegionManager _remgr;
/** The scene to be displayed. */ /** The scene to be displayed. */
protected DisplayMisoScene _scene; protected DisplayMisoScene _scene;
@@ -955,9 +885,6 @@ public class IsoSceneView implements SceneView
/** The number of dirty tiles. */ /** The number of dirty tiles. */
protected int _numDirty; protected int _numDirty;
/** The dirty rectangles that need to be re-painted. */
protected ArrayList _dirtyRects = new ArrayList();
/** The dirty sprites and objects that need to be re-painted. */ /** The dirty sprites and objects that need to be re-painted. */
protected DirtyItemList _dirtyItems = new DirtyItemList(); protected DirtyItemList _dirtyItems = new DirtyItemList();
@@ -1,5 +1,5 @@
// //
// $Id: SceneView.java,v 1.26 2002/02/19 05:03:17 mdb Exp $ // $Id: SceneView.java,v 1.27 2002/04/23 01:18:17 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
@@ -7,7 +7,6 @@ import java.awt.Graphics2D;
import java.awt.Point; import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.List;
import com.threerings.media.sprite.Path; import com.threerings.media.sprite.Path;
@@ -33,7 +32,7 @@ public interface SceneView
* @param gfx the graphics context. * @param gfx the graphics context.
* @param invalidRects the list of invalid regions to be repainted. * @param invalidRects the list of invalid regions to be repainted.
*/ */
public void paint (Graphics2D gfx, List invalidRects); public void paint (Graphics2D gfx, Rectangle[] invalidRects);
/** /**
* Sets the scene that we're rendering. * Sets the scene that we're rendering.
@@ -1,11 +1,12 @@
// //
// $Id: SceneViewPanel.java,v 1.38 2002/04/15 23:10:40 mdb Exp $ // $Id: SceneViewPanel.java,v 1.39 2002/04/23 01:18:17 mdb Exp $
package com.threerings.miso.scene; package com.threerings.miso.scene;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
@@ -13,8 +14,10 @@ import java.awt.event.MouseMotionAdapter;
import java.util.List; import java.util.List;
import com.threerings.media.animation.AnimatedPanel; import com.threerings.media.FrameManager;
import com.threerings.media.animation.AnimationManager; import com.threerings.media.MediaPanel;
import com.threerings.media.sprite.Sprite;
import com.threerings.media.sprite.SpriteManager; import com.threerings.media.sprite.SpriteManager;
import com.threerings.miso.Log; import com.threerings.miso.Log;
@@ -25,14 +28,19 @@ import com.threerings.miso.scene.util.IsoUtil;
* SceneView}, rendering it to the screen, and handling view-related * SceneView}, rendering it to the screen, and handling view-related
* UI events. * UI events.
*/ */
public class SceneViewPanel extends AnimatedPanel public class SceneViewPanel extends MediaPanel
implements IsoSceneViewModelListener implements IsoSceneViewModelListener
{ {
/** /**
* Constructs the scene view panel with the supplied view model. * Constructs the scene view panel with the supplied view model.
*/ */
public SceneViewPanel (IsoSceneViewModel model) public SceneViewPanel (FrameManager framemgr, IsoSceneViewModel model)
{ {
super(framemgr);
// we're going to want to be opaque
setOpaque(true);
// create the data model for the scene view // create the data model for the scene view
_viewmodel = model; _viewmodel = model;
@@ -41,7 +49,7 @@ public class SceneViewPanel extends AnimatedPanel
_viewmodel.addListener(this); _viewmodel.addListener(this);
// create the scene view // create the scene view
_view = newSceneView(_animmgr, _spritemgr, _viewmodel); _view = newSceneView(_spritemgr, _viewmodel);
// listen to mouse... // listen to mouse...
addMouseListener(new MouseAdapter() { addMouseListener(new MouseAdapter() {
@@ -78,9 +86,9 @@ public class SceneViewPanel extends AnimatedPanel
* Constructs the underlying scene view implementation. * Constructs the underlying scene view implementation.
*/ */
protected SceneView newSceneView ( protected SceneView newSceneView (
AnimationManager amgr, SpriteManager smgr, IsoSceneViewModel model) SpriteManager smgr, IsoSceneViewModel model)
{ {
return new IsoSceneView(amgr, smgr, model); return new IsoSceneView(smgr, model, _remgr);
} }
/** /**
@@ -100,29 +108,24 @@ public class SceneViewPanel extends AnimatedPanel
} }
/** /**
* Adds the supplied sprite to the scene. * Adds the supplied sprite to the scene, setting up its scene
* coordinates if it is a {@link MisoCharacterSprite}.
*/ */
public void addSprite (MisoCharacterSprite sprite) public void addSprite (Sprite sprite)
{ {
// set up the sprite's tile coordinates if (sprite instanceof MisoCharacterSprite) {
IsoUtil.setSpriteSceneLocation(_viewmodel, sprite); // set up the sprite's tile coordinates
IsoUtil.setSpriteSceneLocation(
_viewmodel, (MisoCharacterSprite)sprite);
}
// and add it to the sprite manager super.addSprite(sprite);
_spritemgr.addSprite(sprite);
}
/**
* Removes the supplied sprite from the screen.
*/
public void removeSprite (MisoCharacterSprite sprite)
{
_spritemgr.removeSprite(sprite);
} }
/** /**
* If we're scrolling, we need to pass the word on to our scene view. * If we're scrolling, we need to pass the word on to our scene view.
*/ */
protected void viewWillScroll (int dx, int dy, long now, List invalidRects) protected void viewWillScroll (int dx, int dy, long now)
{ {
_view.viewWillScroll(dx, dy); _view.viewWillScroll(dx, dy);
} }
@@ -159,23 +162,23 @@ public class SceneViewPanel extends AnimatedPanel
} }
// documentation inherited // documentation inherited
protected void render (Graphics2D gfx, List invalidRects) protected void paintBetween (Graphics2D gfx, Rectangle[] dirtyRects)
{ {
// render the view // render the isometric view
_view.paint(gfx, invalidRects); _view.paint(gfx, dirtyRects);
// give derived classes a chance to render on top of the view
renderOnView(gfx, invalidRects);
} }
/** /**
* Provides an opportunity for derived classes to render things while * We don't want sprites rendered using the standard mechanism because
* under the influence of the proper coordinate translations. This is * we intersperse them with objects in our scene and need to manage
* called after the view is rendered, so things drawn here appear on * their z-order.
* top of the scene view.
*/ */
protected void renderOnView (Graphics2D gfx, List invalidRects) protected void paintBits (Graphics2D gfx, int layer, Rectangle clip)
{ {
Shape oclip = gfx.getClip();
gfx.setClip(clip);
_animmgr.renderAnimations(gfx, layer, clip);
gfx.setClip(oclip);
} }
/** /**