From c09986bab06b634f8f209617726c8b098d3a2942 Mon Sep 17 00:00:00 2001 From: Walter Korman Date: Mon, 6 Aug 2001 18:57:39 +0000 Subject: [PATCH] Altered animation manager to separate construction from the start of actual animation so that animating components can call AnimationManager.start() when they know they're fully laid out and ready to be regularly re-painted. Return desired dimensions based on requested scene bounds in SceneViewPanel. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@186 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../media/sprite/AnimationManager.java | 24 +++++++++++++++++-- .../threerings/miso/client/IsoSceneView.java | 4 +++- .../miso/client/SceneViewPanel.java | 11 ++++++++- .../threerings/miso/viewer/ViewerFrame.java | 8 ++++--- .../miso/viewer/ViewerSceneViewPanel.java | 18 ++++++++++---- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/java/com/threerings/media/sprite/AnimationManager.java b/src/java/com/threerings/media/sprite/AnimationManager.java index 0e42c1c67..e6726da43 100644 --- a/src/java/com/threerings/media/sprite/AnimationManager.java +++ b/src/java/com/threerings/media/sprite/AnimationManager.java @@ -1,5 +1,5 @@ // -// $Id: AnimationManager.java,v 1.6 2001/08/04 01:41:02 shaper Exp $ +// $Id: AnimationManager.java,v 1.7 2001/08/06 18:57:39 shaper Exp $ package com.threerings.miso.sprite; @@ -40,7 +40,18 @@ public class AnimationManager implements Interval, PerformanceObserver tick(); } }; + } + /** + * This method should be called by the component the animation + * manager is animating after it's been fully laid out within its + * container(s); typically, after Component.doLayout() + * has been called. The animation manager will then register + * itself with the IntervalManager to effect its + * periodic repainting of the target component. + */ + public void start () + { // register to monitor the refresh action PerformanceMonitor.register(this, "refresh", 1000); @@ -48,12 +59,21 @@ public class AnimationManager implements Interval, PerformanceObserver IntervalManager.register(this, REFRESH_INTERVAL, null, true); } + /** + * Called by our interval when we'd like to begin a tick. Returns + * whether we're already ticking, and notes that we've requested + * another tick. + */ protected synchronized boolean requestTick () { if (_ticking++ > 0) return false; return true; } + /** + * Called by the tick task when it's finished with a tick. + * Returns whether a new tick task should be created immediately. + */ protected synchronized boolean finishedTick () { if (--_ticking > 0) { @@ -82,7 +102,7 @@ public class AnimationManager implements Interval, PerformanceObserver _view.invalidateRects(rects); // update frame-rate information - //PerformanceMonitor.tick(AnimationManager.this, "refresh"); + PerformanceMonitor.tick(AnimationManager.this, "refresh"); // refresh the display _target.paintImmediately(_target.getBounds()); diff --git a/src/java/com/threerings/miso/client/IsoSceneView.java b/src/java/com/threerings/miso/client/IsoSceneView.java index 4dfd85839..d0ea40cd0 100644 --- a/src/java/com/threerings/miso/client/IsoSceneView.java +++ b/src/java/com/threerings/miso/client/IsoSceneView.java @@ -1,5 +1,5 @@ // -// $Id: IsoSceneView.java,v 1.25 2001/08/04 00:22:19 shaper Exp $ +// $Id: IsoSceneView.java,v 1.26 2001/08/06 18:57:39 shaper Exp $ package com.threerings.miso.scene; @@ -51,6 +51,8 @@ public class IsoSceneView implements EditableSceneView */ public void paint (Graphics g) { + if (_scene == null) return; + Graphics2D gfx = (Graphics2D)g; // clip the drawing region to our desired bounds since we diff --git a/src/java/com/threerings/miso/client/SceneViewPanel.java b/src/java/com/threerings/miso/client/SceneViewPanel.java index 2c3db7247..6af9e80c2 100644 --- a/src/java/com/threerings/miso/client/SceneViewPanel.java +++ b/src/java/com/threerings/miso/client/SceneViewPanel.java @@ -1,5 +1,5 @@ // -// $Id: SceneViewPanel.java,v 1.1 2001/08/04 01:41:02 shaper Exp $ +// $Id: SceneViewPanel.java,v 1.2 2001/08/06 18:57:39 shaper Exp $ package com.threerings.miso.scene; @@ -52,6 +52,15 @@ public class SceneViewPanel extends JPanel _view.paint(g); } + /** + * Return the desired size for the panel based on the requested + * and calculated bounds of the scene view. + */ + public Dimension getPreferredSize () + { + return (_smodel == null) ? super.getPreferredSize() : _smodel.bounds; + } + /** Tile width in pixels. */ protected static final int TWIDTH = 64; diff --git a/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java b/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java index d87568aa6..f0a5a509c 100644 --- a/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java +++ b/tests/src/java/com/threerings/miso/viewer/ViewerFrame.java @@ -1,5 +1,5 @@ // -// $Id: ViewerFrame.java,v 1.7 2001/08/04 01:41:02 shaper Exp $ +// $Id: ViewerFrame.java,v 1.8 2001/08/06 18:57:39 shaper Exp $ package com.threerings.miso.viewer; @@ -50,13 +50,15 @@ class ViewerFrame extends JFrame implements WindowListener gl.setOffAxisPolicy(GroupLayout.STRETCH); top.setLayout(gl); + top.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + // set up the scene view panel with a default scene ViewerSceneViewPanel svpanel = new ViewerSceneViewPanel(_ctx, spritemgr, sprite); - top.add(svpanel, GroupLayout.FIXED); + top.add(svpanel); // add the scene view panel - getContentPane().add(svpanel, BorderLayout.CENTER); + getContentPane().add(top, BorderLayout.CENTER); } /** WindowListener interface methods */ diff --git a/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java b/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java index 4f156c3f9..3d9728357 100644 --- a/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java +++ b/tests/src/java/com/threerings/miso/viewer/ViewerSceneViewPanel.java @@ -1,5 +1,5 @@ // -// $Id: ViewerSceneViewPanel.java,v 1.1 2001/08/04 01:41:02 shaper Exp $ +// $Id: ViewerSceneViewPanel.java,v 1.2 2001/08/06 18:57:39 shaper Exp $ package com.threerings.miso.viewer; @@ -31,8 +31,7 @@ public class ViewerSceneViewPanel extends SceneViewPanel _sprite = sprite; // create an animation manager for this panel - AnimationManager animmgr = - new AnimationManager(spritemgr, this, _view); + _animmgr = new AnimationManager(spritemgr, this, _view); // listen to the desired events addMouseListener(this); @@ -40,8 +39,6 @@ public class ViewerSceneViewPanel extends SceneViewPanel // load up the initial scene prepareStartingScene(); - - PerformanceMonitor.register(this, "paint", 1000); } /** @@ -71,6 +68,14 @@ public class ViewerSceneViewPanel extends SceneViewPanel Log.info(name + " [ticks=" + ticks + "]."); } + public void doLayout () + { + super.doLayout(); + + // now that we've been fully laid out, start animating + _animmgr.start(); + } + /** MouseListener interface methods */ public void mousePressed (MouseEvent e) @@ -104,6 +109,9 @@ public class ViewerSceneViewPanel extends SceneViewPanel /** The default scene to load and display. */ protected static final String DEF_SCENE = "rsrc/scenes/default.xml"; + /** The animation manager. */ + AnimationManager _animmgr; + /** The sprite we're manipulating within the view. */ protected Sprite _sprite;