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=b23bf5b4a3e1c30528a92e18d93b004d19ccb837;hp=6fda15390ba653fd1b704a1ab7ba7ce30f4e8404;hb=70ee733b25c56bed539b89ff5507ae0af842d68a;hpb=afdebf8f4f532ed5b456040c6c481f3cfbf8d236 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 6fda153..b23bf5b 100755 --- a/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/gui/ViewPanel.java @@ -9,9 +9,9 @@ package eu.svjatoslav.sixth.e3d.gui; -import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardFocusTracker; +import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardFocusStack; import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController; -import eu.svjatoslav.sixth.e3d.gui.humaninput.UserInputTracker; +import eu.svjatoslav.sixth.e3d.gui.humaninput.HIDInputTracker; import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection; import javax.swing.*; @@ -27,9 +27,9 @@ import java.util.Timer; */ 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); + public Color backgroundColor = Color.BLACK; + private final HIDInputTracker HIDInputTracker = new HIDInputTracker(this); + private final KeyboardFocusStack keyboardFocusStack = new KeyboardFocusStack(this); private final Avatar avatar = new Avatar(); private final ShapeCollection rootShapeCollection = new ShapeCollection(); private final List viewRenderListeners = new ArrayList<>(); @@ -56,7 +56,7 @@ public class ViewPanel extends JPanel implements ComponentListener { private boolean viewRepaintNeeded = true; public ViewPanel() { viewRenderListeners.add(avatar); - viewRenderListeners.add(userInputTracker); + viewRenderListeners.add(HIDInputTracker); initializePanelLayout(); @@ -69,16 +69,16 @@ public class ViewPanel extends JPanel implements ComponentListener { return avatar; } - public KeyboardFocusTracker getKeyboardFocusTracker() { - return keyboardFocusTracker; + public KeyboardFocusStack getKeyboardFocusStack() { + return keyboardFocusStack; } public ShapeCollection getRootShapeCollection() { return rootShapeCollection; } - public UserInputTracker getUserInputTracker() { - return userInputTracker; + public HIDInputTracker getHIDInputTracker() { + return HIDInputTracker; } public void addViewUpdateListener(final ViewRenderListener listener) { @@ -120,10 +120,6 @@ public class ViewPanel extends JPanel implements ComponentListener { return new java.awt.Dimension(640, 480); } - public RenderingContext getRenderBuffer() { - return renderingContext; - } - public RenderingContext getRenderingContext() { return renderingContext; } @@ -163,29 +159,31 @@ public class ViewPanel extends JPanel implements ComponentListener { requestFocusInWindow(); } - public void renderFrame() { - // build new render buffer if needed, this happens when window was just - // created or resized - if ((renderingContext == null) - || (renderingContext.width != getWidth()) - || (renderingContext.height != getHeight())) + private void renderFrame() { + if (isNewRenderingContextNeeded()) renderingContext = new RenderingContext(getWidth(), getHeight()); - // clear drawing area - { - renderingContext.graphics.setColor(Color.BLACK); - renderingContext.graphics.fillRect(0, 0, getWidth(), getHeight()); - } - // paint root geometry collection to the offscreen render buffer + clearCanvas(); rootShapeCollection.paint(this, renderingContext); - // draw rendered offscreen image to visible screen + // draw rendered offscreen buffer to visible screen final Graphics graphics = getGraphics(); if (graphics != null) graphics.drawImage(renderingContext.bufferedImage, 0, 0, null); } + private void clearCanvas() { + renderingContext.graphics.setColor(backgroundColor); + 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. @@ -233,42 +231,47 @@ public class ViewPanel extends JPanel implements ComponentListener { * It tells view to update itself. View can decide if actual re-rendering of * graphics is needed. */ - public void updateView() { + void updateView() { if (renderingContext != null) { renderingContext.mouseClick = null; renderingContext.clickedItem = null; } - // compute time passed since last view update - final long currentTime = System.currentTimeMillis(); + final int millisecondsPassedSinceLastUpdate = getMillisecondsPassedSinceLastUpdate(); - if (lastUpdateMillis == 0) { - lastUpdateMillis = currentTime; - return; + boolean renderFrame = notifyViewRenderListeners(millisecondsPassedSinceLastUpdate); + + if (viewRepaintNeeded) { + viewRepaintNeeded = false; + renderFrame = true; } - final int millisecondsPassedSinceLastUpdate = (int) (currentTime - lastUpdateMillis); - lastUpdateMillis = currentTime; + // abort rendering if window size is invalid + if ((getWidth() <= 0) || (getHeight() <= 0)) + renderFrame = false; - // notify update listeners - boolean reRenderFrame = false; + if (renderFrame) { + renderFrame(); + handleDetectedComponentMouseEvents(); + } + } + private boolean notifyViewRenderListeners(int millisecondsPassedSinceLastUpdate) { + boolean reRenderFrame = false; for (final ViewRenderListener listener : viewRenderListeners) if (listener.beforeRender(this, millisecondsPassedSinceLastUpdate)) reRenderFrame = true; + return reRenderFrame; + } - // abort rendering if window size is invalid - if ((getWidth() <= 0) || (getHeight() <= 0)) - return; + private int getMillisecondsPassedSinceLastUpdate() { + final long currentTime = System.currentTimeMillis(); - if (viewRepaintNeeded) { - viewRepaintNeeded = false; - reRenderFrame = true; - } + if (lastUpdateMillis == 0) + lastUpdateMillis = currentTime; - if (reRenderFrame) { - renderFrame(); - handleDetectedComponentMouseEvents(); - } + final int millisecondsPassedSinceLastUpdate = (int) (currentTime - lastUpdateMillis); + lastUpdateMillis = currentTime; + return millisecondsPassedSinceLastUpdate; } }