Optimized frame repainting. Fixed mouse click processing.
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / ViewPanel.java
index ea55a31..84d4529 100755 (executable)
@@ -127,27 +127,23 @@ public class ViewPanel extends JPanel implements ComponentListener {
     }
 
     private void handleDetectedComponentMouseEvents() {
-        if (renderingContext.clickedItem != null) {
-            if (renderingContext.mouseClick.button == 0) {
+        if (renderingContext.objectUnderMouse != null) {
+            if (renderingContext.mouseEvent.button == 0) {
                 // mouse over
                 if (currentMouseOverComponent == null) {
-                    currentMouseOverComponent = renderingContext.clickedItem;
-                    currentMouseOverComponent.mouseEntered();
-                    viewRepaintNeeded = true;
-                } else if (currentMouseOverComponent != renderingContext.clickedItem) {
-                    currentMouseOverComponent.mouseExited();
-                    currentMouseOverComponent = renderingContext.clickedItem;
-                    currentMouseOverComponent.mouseEntered();
-                    viewRepaintNeeded = true;
+                    currentMouseOverComponent = renderingContext.objectUnderMouse;
+                    viewRepaintNeeded |= currentMouseOverComponent.mouseEntered();
+                } else if (currentMouseOverComponent != renderingContext.objectUnderMouse) {
+                    viewRepaintNeeded |= currentMouseOverComponent.mouseExited();
+                    currentMouseOverComponent = renderingContext.objectUnderMouse;
+                    viewRepaintNeeded |= currentMouseOverComponent.mouseEntered();
                 }
             } else {
                 // mouse click
-                renderingContext.clickedItem.mouseClicked();
-                viewRepaintNeeded = true;
+                viewRepaintNeeded |= renderingContext.objectUnderMouse.mouseClicked();
             }
         } else if (currentMouseOverComponent != null) {
-            currentMouseOverComponent.mouseExited();
-            viewRepaintNeeded = true;
+            viewRepaintNeeded |= currentMouseOverComponent.mouseExited();
             currentMouseOverComponent = null;
         }
     }
@@ -162,8 +158,6 @@ public class ViewPanel extends JPanel implements ComponentListener {
     }
 
     private void renderFrame() {
-        if (isNewRenderingContextNeeded())
-            renderingContext = new RenderingContext(getWidth(), getHeight());
 
         // paint root geometry collection to the offscreen render buffer
         clearCanvas();
@@ -180,12 +174,6 @@ public class ViewPanel extends JPanel implements ComponentListener {
         renderingContext.graphics.fillRect(0, 0, getWidth(), getHeight());
     }
 
-    private boolean isNewRenderingContextNeeded() {
-        return (renderingContext == null)
-                || (renderingContext.width != getWidth())
-                || (renderingContext.height != getHeight());
-    }
-
     /**
      * Calling this methods tells 3D engine that current 3D view needs to be
      * repainted on first opportunity.
@@ -234,10 +222,7 @@ public class ViewPanel extends JPanel implements ComponentListener {
      * graphics is needed.
      */
     void updateView() {
-        if (renderingContext != null) {
-            renderingContext.mouseClick = null;
-            renderingContext.clickedItem = null;
-        }
+        maintainRenderingContext();
 
         final int millisecondsPassedSinceLastUpdate = getMillisecondsPassedSinceLastUpdate();
 
@@ -249,13 +234,30 @@ public class ViewPanel extends JPanel implements ComponentListener {
         }
 
         // abort rendering if window size is invalid
-        if ((getWidth() <= 0) || (getHeight() <= 0))
-            renderFrame = false;
-
-        if (renderFrame) {
+        if ((getWidth() > 0) && (getHeight() > 0) && renderFrame) {
             renderFrame();
             handleDetectedComponentMouseEvents();
         }
+
+    }
+
+    private void maintainRenderingContext() {
+        int panelWidth = getWidth();
+        int panelHeight = getHeight();
+
+        if (panelWidth <= 0 || panelHeight <=0){
+            renderingContext = null;
+            return;
+        }
+
+        if ((renderingContext == null)
+                || (renderingContext.width != panelWidth)
+                || (renderingContext.height != panelHeight)) {
+            renderingContext = new RenderingContext(panelWidth, panelHeight);
+        }
+
+        renderingContext.mouseEvent = null;
+        renderingContext.objectUnderMouse = null;
     }
 
     private boolean notifyViewRenderListeners(int millisecondsPassedSinceLastUpdate) {