Ensure that any media inserted between the call to tick() and the call to
renderAllMedia() is ticked in all circumstances and ticked exactly once. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2411 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: AbstractMediaManager.java,v 1.7 2003/01/18 22:25:30 mdb Exp $
|
// $Id: AbstractMediaManager.java,v 1.8 2003/04/15 21:27:22 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.media;
|
package com.threerings.media;
|
||||||
|
|
||||||
@@ -50,6 +50,9 @@ public abstract class AbstractMediaManager
|
|||||||
*/
|
*/
|
||||||
public void renderMedia (Graphics2D gfx, int layer, Shape clip)
|
public void renderMedia (Graphics2D gfx, int layer, Shape clip)
|
||||||
{
|
{
|
||||||
|
// now that we're rendering, we can safely clear this; see tick()
|
||||||
|
_tickStamp = 0;
|
||||||
|
|
||||||
for (int ii = 0, nn = _media.size(); ii < nn; ii++) {
|
for (int ii = 0, nn = _media.size(); ii < nn; ii++) {
|
||||||
AbstractMedia media = (AbstractMedia)_media.get(ii);
|
AbstractMedia media = (AbstractMedia)_media.get(ii);
|
||||||
int order = media.getRenderOrder();
|
int order = media.getRenderOrder();
|
||||||
@@ -78,7 +81,9 @@ public abstract class AbstractMediaManager
|
|||||||
_tickStamp = tickStamp;
|
_tickStamp = tickStamp;
|
||||||
tickAllMedia(tickStamp);
|
tickAllMedia(tickStamp);
|
||||||
dispatchNotifications();
|
dispatchNotifications();
|
||||||
_tickStamp = 0;
|
// we clear our tick stamp when we've been painted, this lets us
|
||||||
|
// handle situations when yet more media is slipped in between our
|
||||||
|
// being ticked and our being painted
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -139,11 +144,23 @@ public abstract class AbstractMediaManager
|
|||||||
media.init(this);
|
media.init(this);
|
||||||
int ipos = _media.insertSorted(media, RENDER_ORDER);
|
int ipos = _media.insertSorted(media, RENDER_ORDER);
|
||||||
|
|
||||||
// if we're ticking, we need to adjust _tickpos and also tick this
|
// if we've started our tick but have not yet painted our media,
|
||||||
// media if it was inserted behind our current tick position
|
// we need to take care that this newly added media will be ticked
|
||||||
if (ipos <= _tickpos) {
|
// before our upcoming render
|
||||||
_tickpos++;
|
if (_tickStamp > 0L) {
|
||||||
media.tick(_tickStamp);
|
if (_tickpos == -1) {
|
||||||
|
// if we're done with our own call to tick(), we
|
||||||
|
// definitely need to tick this new media
|
||||||
|
media.tick(_tickStamp);
|
||||||
|
} else if (ipos <= _tickpos) {
|
||||||
|
// otherwise, we're in the middle of our call to tick()
|
||||||
|
// and we only need to tick this guy if he's being
|
||||||
|
// inserted before our current tick position (if he's
|
||||||
|
// inserted after our current position, we'll get to him
|
||||||
|
// as part of this tick iteration)
|
||||||
|
_tickpos++;
|
||||||
|
media.tick(_tickStamp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user