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=8c57e377a8b288dc124828bdfa617cd7c222c3e3;hp=b23bf5b4a3e1c30528a92e18d93b004d19ccb837;hb=59baa428fb2d9e7f0fe5423f4cea47f2d6245914;hpb=70ee733b25c56bed539b89ff5507ae0af842d68a 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 b23bf5b..8c57e37 100755 --- a/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java @@ -1,5 +1,5 @@ /* - * Sixth 3D engine. Copyright ©2012-2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * Sixth 3D engine. Copyright ©2012-2019, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu * * This program is free software; you can redistribute it and/or * modify it under the terms of version 3 of the GNU Lesser General Public License @@ -9,18 +9,17 @@ package eu.svjatoslav.sixth.e3d.gui; -import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardFocusStack; -import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController; import eu.svjatoslav.sixth.e3d.gui.humaninput.HIDInputTracker; +import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardFocusStack; import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection; import javax.swing.*; import java.awt.*; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; import java.util.Timer; +import java.util.concurrent.ConcurrentHashMap; /** * Java Swing GUI panel that contains canvas for 3D rendering. @@ -29,10 +28,10 @@ public class ViewPanel extends JPanel implements ComponentListener { private static final long serialVersionUID = 1683277888885045387L; public Color backgroundColor = Color.BLACK; private final HIDInputTracker HIDInputTracker = new HIDInputTracker(this); - private final KeyboardFocusStack keyboardFocusStack = new KeyboardFocusStack(this); + private final KeyboardFocusStack keyboardFocusStack; private final Avatar avatar = new Avatar(); private final ShapeCollection rootShapeCollection = new ShapeCollection(); - private final List viewRenderListeners = new ArrayList<>(); + private final Set viewRenderListeners = ConcurrentHashMap.newKeySet(); /** * Last time this view was updated. */ @@ -40,10 +39,6 @@ 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 can be changed at runtime. Also when nothing * changes in the view, then frames are not really repainted. @@ -54,10 +49,13 @@ public class ViewPanel extends JPanel implements ComponentListener { * immediately after frame got updated. */ private boolean viewRepaintNeeded = true; + public ViewPanel() { viewRenderListeners.add(avatar); viewRenderListeners.add(HIDInputTracker); + keyboardFocusStack = new KeyboardFocusStack(this); + initializePanelLayout(); setFrameRate(targetFPS); @@ -124,32 +122,6 @@ public class ViewPanel extends JPanel implements ComponentListener { return renderingContext; } - private void handleDetectedComponentMouseEvents() { - if (renderingContext.clickedItem != null) { - if (renderingContext.mouseClick.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; - } - } else { - // mouse click - renderingContext.clickedItem.mouseClicked(); - viewRepaintNeeded = true; - } - } else if (currentMouseOverComponent != null) { - currentMouseOverComponent.mouseExited(); - viewRepaintNeeded = true; - currentMouseOverComponent = null; - } - } - private void initializePanelLayout() { setFocusCycleRoot(true); setOpaque(true); @@ -160,9 +132,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(); rootShapeCollection.paint(this, renderingContext); @@ -178,12 +147,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. @@ -232,10 +195,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(); @@ -247,13 +207,29 @@ 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(); + viewRepaintNeeded = renderingContext.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.prepareForNewFrameRendering(); } private boolean notifyViewRenderListeners(int millisecondsPassedSinceLastUpdate) { @@ -274,4 +250,13 @@ public class ViewPanel extends JPanel implements ComponentListener { lastUpdateMillis = currentTime; return millisecondsPassedSinceLastUpdate; } + + public void addViewRenderListener(ViewRenderListener viewRenderListener) { + viewRenderListeners.add(viewRenderListener); + } + + public void removeViewRenderListener(ViewRenderListener viewRenderListener) { + viewRenderListeners.remove(viewRenderListener); + } + }