Refactoring.
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / ViewPanel.java
index 87f0dd3..6fda153 100755 (executable)
@@ -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.*;
@@ -19,11 +22,17 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Timer;
 
+/**
+ * Java Swing GUI panel that contains canvas for 3D rendering.
+ */
 public class ViewPanel extends JPanel implements ComponentListener {
-
     private static final long serialVersionUID = 1683277888885045387L;
+    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();
     private final List<ViewRenderListener> viewRenderListeners = new ArrayList<>();
-    private final ViewContext context = new ViewContext(this);
     /**
      * Last time this view was updated.
      */
@@ -31,27 +40,47 @@ 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;
+    /**
+     * 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;
     public ViewPanel() {
-        viewRenderListeners.add(context.getAvatar());
-
-        // initialize input tracker
-        context.getUserInputTracker().bind(this);
-        viewRenderListeners.add(context.getUserInputTracker());
+        viewRenderListeners.add(avatar);
+        viewRenderListeners.add(userInputTracker);
 
         initializePanelLayout();
 
-        setFrameRate(targetFramerate);
+        setFrameRate(targetFPS);
 
         addComponentListener(this);
     }
 
+    public Avatar getAvatar() {
+        return avatar;
+    }
+
+    public KeyboardFocusTracker getKeyboardFocusTracker() {
+        return keyboardFocusTracker;
+    }
+
+    public ShapeCollection getRootShapeCollection() {
+        return rootShapeCollection;
+    }
+
+    public UserInputTracker getUserInputTracker() {
+        return userInputTracker;
+    }
+
     public void addViewUpdateListener(final ViewRenderListener listener) {
         viewRenderListeners.add(listener);
     }
@@ -68,16 +97,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 +135,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 +178,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 +191,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 +203,7 @@ public class ViewPanel extends JPanel implements ComponentListener {
             canvasUpdateTimer = null;
         }
 
-        targetFramerate = frameRate;
+        targetFPS = frameRate;
 
         if (frameRate > 0) {
             canvasUpdateTimer = new Timer();
@@ -209,7 +234,7 @@ public class ViewPanel extends JPanel implements ComponentListener {
      * graphics is needed.
      */
     public void updateView() {
-        if (renderingContext != null){
+        if (renderingContext != null) {
             renderingContext.mouseClick = null;
             renderingContext.clickedItem = null;
         }
@@ -229,16 +254,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;
         }