X-Git-Url: http://www2.svjatoslav.eu/gitweb/?p=sixth-3d.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Fgui%2FViewPanel.java;h=f38d3c04222a2d5cf5f5700a149263918f9d5447;hp=87f0dd39fefedae9976b0b54e46ad2e7822e9fa9;hb=8bceefbdb7316557ee77902cc6ac216f5c1ff160;hpb=96f76bab30b47db83a1c9061b8916c69657f1e13 diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java b/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java index 87f0dd3..f38d3c0 100755 --- a/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java @@ -9,7 +9,10 @@ package eu.svjatoslav.sixth.e3d.gui; +import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardFocusTracker; import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController; +import eu.svjatoslav.sixth.e3d.gui.humaninput.UserInputTracker; +import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection; import javax.swing.*; import java.awt.*; @@ -20,10 +23,34 @@ import java.util.List; import java.util.Timer; public class ViewPanel extends JPanel implements ComponentListener { + private final UserInputTracker userInputTracker = new UserInputTracker(this); + + private final KeyboardFocusTracker keyboardFocusTracker = new KeyboardFocusTracker( + this); + + private final Avatar avatar = new Avatar(); + + private final ShapeCollection rootShapeCollection = new ShapeCollection(); + + + public Avatar getAvatar() { + return avatar; + } + + public KeyboardFocusTracker getKeyboardFocusTracker() { + return keyboardFocusTracker; + } + + public ShapeCollection getRootShapeCollection() { + return rootShapeCollection; + } + + public UserInputTracker getUserInputTracker() { + return userInputTracker; + } private static final long serialVersionUID = 1683277888885045387L; private final List viewRenderListeners = new ArrayList<>(); - private final ViewContext context = new ViewContext(this); /** * Last time this view was updated. */ @@ -31,23 +58,31 @@ public class ViewPanel extends JPanel implements ComponentListener { private Timer canvasUpdateTimer; private ViewUpdateTimerTask canvasUpdateTimerTask; private RenderingContext renderingContext = null; + + /** + * UI component that mouse is currently hovering over. + */ private MouseInteractionController currentMouseOverComponent; + /** - * Currently target FPS for this view. It might change at runtime. + * Currently target FPS for this view. It can be changed at runtime. Also when nothing + * changes in the view, then frames are not really repainted. */ - private int targetFramerate = 30; - private boolean repaintDuringNextViewUpdate = true; + private int targetFPS = 30; - public ViewPanel() { - viewRenderListeners.add(context.getAvatar()); + /** + * Set to true if it is known than next frame reeds to be painted. Flag is cleared + * immediately after frame got updated. + */ + private boolean viewRepaintNeeded = true; - // initialize input tracker - context.getUserInputTracker().bind(this); - viewRenderListeners.add(context.getUserInputTracker()); + public ViewPanel() { + viewRenderListeners.add(avatar); + viewRenderListeners.add(userInputTracker); initializePanelLayout(); - setFrameRate(targetFramerate); + setFrameRate(targetFPS); addComponentListener(this); } @@ -68,16 +103,12 @@ public class ViewPanel extends JPanel implements ComponentListener { @Override public void componentResized(final ComponentEvent e) { - repaintDuringNextViewUpdate = true; + viewRepaintNeeded = true; } @Override public void componentShown(final ComponentEvent e) { - repaintDuringNextViewUpdate = true; - } - - public ViewContext getContext() { - return context; + viewRepaintNeeded = true; } @Override @@ -110,21 +141,21 @@ public class ViewPanel extends JPanel implements ComponentListener { if (currentMouseOverComponent == null) { currentMouseOverComponent = renderingContext.clickedItem; currentMouseOverComponent.mouseEntered(); - repaintDuringNextViewUpdate = true; + viewRepaintNeeded = true; } else if (currentMouseOverComponent != renderingContext.clickedItem) { currentMouseOverComponent.mouseExited(); currentMouseOverComponent = renderingContext.clickedItem; currentMouseOverComponent.mouseEntered(); - repaintDuringNextViewUpdate = true; + viewRepaintNeeded = true; } } else { // mouse click renderingContext.clickedItem.mouseClicked(); - repaintDuringNextViewUpdate = true; + viewRepaintNeeded = true; } } else if (currentMouseOverComponent != null) { currentMouseOverComponent.mouseExited(); - repaintDuringNextViewUpdate = true; + viewRepaintNeeded = true; currentMouseOverComponent = null; } } @@ -153,7 +184,7 @@ public class ViewPanel extends JPanel implements ComponentListener { } // paint root geometry collection to the offscreen render buffer - context.getRootShapeCollection().paint(context, renderingContext); + rootShapeCollection.paint(this, renderingContext); // draw rendered offscreen image to visible screen final Graphics graphics = getGraphics(); @@ -166,7 +197,7 @@ public class ViewPanel extends JPanel implements ComponentListener { * repainted on first opportunity. */ public void repaintDuringNextViewUpdate() { - repaintDuringNextViewUpdate = true; + viewRepaintNeeded = true; } public void setFrameRate(final int frameRate) { @@ -178,7 +209,7 @@ public class ViewPanel extends JPanel implements ComponentListener { canvasUpdateTimer = null; } - targetFramerate = frameRate; + targetFPS = frameRate; if (frameRate > 0) { canvasUpdateTimer = new Timer(); @@ -229,16 +260,15 @@ public class ViewPanel extends JPanel implements ComponentListener { boolean reRenderFrame = false; for (final ViewRenderListener listener : viewRenderListeners) - if (listener.beforeRender(context, - millisecondsPassedSinceLastUpdate)) + if (listener.beforeRender(this, millisecondsPassedSinceLastUpdate)) reRenderFrame = true; // abort rendering if window size is invalid if ((getWidth() <= 0) || (getHeight() <= 0)) return; - if (repaintDuringNextViewUpdate) { - repaintDuringNextViewUpdate = false; + if (viewRepaintNeeded) { + viewRepaintNeeded = false; reRenderFrame = true; }