X-Git-Url: http://www2.svjatoslav.eu/gitweb/?p=sixth-3d.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Fgui%2Fhumaninput%2FUserInputTracker.java;h=306069137ce977419207cfce36e877fd55d0ec04;hp=1dd6f7a3f54a1a9349ea68dde8e86277e0125c65;hb=afdebf8f4f532ed5b456040c6c481f3cfbf8d236;hpb=96f76bab30b47db83a1c9061b8916c69657f1e13 diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/gui/humaninput/UserInputTracker.java b/src/main/java/eu/svjatoslav/sixth/e3d/gui/humaninput/UserInputTracker.java index 1dd6f7a..3060691 100755 --- a/src/main/java/eu/svjatoslav/sixth/e3d/gui/humaninput/UserInputTracker.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/gui/humaninput/UserInputTracker.java @@ -12,7 +12,6 @@ package eu.svjatoslav.sixth.e3d.gui.humaninput; import eu.svjatoslav.sixth.e3d.geometry.Point2D; import eu.svjatoslav.sixth.e3d.gui.Avatar; import eu.svjatoslav.sixth.e3d.gui.ViewPanel; -import eu.svjatoslav.sixth.e3d.gui.ViewContext; import eu.svjatoslav.sixth.e3d.gui.ViewRenderListener; import javax.swing.*; @@ -22,8 +21,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class UserInputTracker - implements MouseMotionListener, KeyListener, MouseListener, MouseWheelListener, ViewRenderListener { +public class UserInputTracker implements + MouseMotionListener, KeyListener, MouseListener, MouseWheelListener, ViewRenderListener { /** *
@@ -39,34 +38,31 @@ public class UserInputTracker private int wheelMovedDirection = 0; private Point2D mouseDraggedDirection = new Point2D(); private Point2D oldMouseCoordinatesWhenDragging; - private ViewContext viewContext; + private ViewPanel viewPanel; private Point2D currentMouseLocation; private boolean mouseMoved; private boolean mouseWithinWindow = false; - public UserInputTracker(final ViewContext viewContext) { - this.viewContext = viewContext; + public UserInputTracker(final ViewPanel viewPanel) { + this.viewPanel = viewPanel; + bind(viewPanel); } /** * {@inheritDoc} */ @Override - public boolean beforeRender(final ViewContext viewContext, final int millisecondsSinceLastFrame) { + public boolean beforeRender(final ViewPanel viewPanel, final int millisecondsSinceLastFrame) { - boolean viewUpdateNeeded = handleDetectedMouseClicks(viewContext.getViewPanel()); - - viewUpdateNeeded |= handleDetectedKeyEvents(); - - viewContext.getKeyboardFocusTracker().getCurrentFocusOwner().beforeRender(viewContext, - millisecondsSinceLastFrame); - - viewUpdateNeeded |= trackMouse(); + boolean viewUpdateNeeded = handleKeyboardEvents(); + viewUpdateNeeded |= handleMouseClicksAndHover(viewPanel); + viewUpdateNeeded |= handleMouseDragging(); + viewUpdateNeeded |= handleMouseVerticalScrolling(); return viewUpdateNeeded; } - public void bind(final JPanel panel) { + private void bind(final JPanel panel) { panel.addMouseMotionListener(this); panel.addKeyListener(this); @@ -76,56 +72,81 @@ public class UserInputTracker panel.addMouseWheelListener(this); } - private boolean handleDetectedKeyEvents() { - boolean keyEventsHandled = false; + /** + * @returntrue
if view needs to be repainted. + */ + private boolean handleKeyboardEvents() { + final UserInputHandler currentFocusOwner = viewPanel.getKeyboardFocusTracker().getCurrentFocusOwner(); + ArrayListunprocessedKeyboardEvents = getUnprocessedKeyboardEvents(); - final UserInputHandler currentFocusOwner = viewContext.getKeyboardFocusTracker().getCurrentFocusOwner(); + return currentFocusOwner == null ? false : + forwardKeyboardEventsToFocusOwner(currentFocusOwner, unprocessedKeyboardEvents); + } + private ArrayList getUnprocessedKeyboardEvents() { synchronized (detectedKeyEvents) { - if (currentFocusOwner == null) { - detectedKeyEvents.clear(); - return false; - } - - while (!detectedKeyEvents.isEmpty()) { - final KeyEvent keyEvent = detectedKeyEvents.remove(0); - - switch (keyEvent.getID()) { - case KeyEvent.KEY_PRESSED: - currentFocusOwner.keyPressed(keyEvent, viewContext); - keyEventsHandled = true; - break; - - case KeyEvent.KEY_RELEASED: - currentFocusOwner.keyReleased(keyEvent, viewContext); - keyEventsHandled = true; - break; - } - } + ArrayList result = new ArrayList<>(detectedKeyEvents); + detectedKeyEvents.clear(); + return result; } + } - return keyEventsHandled; + /** + * @return true
if view update is needed. + */ + private boolean forwardKeyboardEventsToFocusOwner( + UserInputHandler currentFocusOwner, ArrayListkeyEvents) { + boolean viewUpdateNeeded = false; + + for (KeyEvent keyEvent : keyEvents) + viewUpdateNeeded |= processKeyEvent(currentFocusOwner, keyEvent); + + return viewUpdateNeeded; + } + + private boolean processKeyEvent(UserInputHandler currentFocusOwner, KeyEvent keyEvent) { + switch (keyEvent.getID()) { + case KeyEvent.KEY_PRESSED: + return currentFocusOwner.keyPressed(keyEvent, viewPanel); + + case KeyEvent.KEY_RELEASED: + return currentFocusOwner.keyReleased(keyEvent, viewPanel); + } + return false; } /** * @return true
if view needs to be repainted. */ - private synchronized boolean handleDetectedMouseClicks(final ViewPanel viewPanel) { - if (detectedMouseClicks.isEmpty()) { + private synchronized boolean handleMouseClicksAndHover(final ViewPanel viewPanel) { + MouseClick unprocessedMouseClick = findUnprocessedMouseClick(); + + if (unprocessedMouseClick != null) { + viewPanel.getRenderingContext().mouseClick = unprocessedMouseClick; + return false; + } else + return handleMouseHovering(viewPanel); + } - if (currentMouseLocation != null) - viewPanel.getRenderingContext().mouseClick = new MouseClick(currentMouseLocation, 0); + private MouseClick findUnprocessedMouseClick() { + synchronized (detectedMouseClicks) { + if (detectedMouseClicks.isEmpty()) + return null; - if (mouseMoved) { - mouseMoved = false; - return true; - } else - return false; + return detectedMouseClicks.remove(0); } + } - viewPanel.getRenderingContext().mouseClick = detectedMouseClicks.remove(0); + private boolean handleMouseHovering(ViewPanel viewPanel) { + if (currentMouseLocation != null) + // mouse click with button 0 amounts to mouse hovering event + viewPanel.getRenderingContext().mouseClick = new MouseClick(currentMouseLocation, 0); - return true; + if (mouseMoved) { + mouseMoved = false; + return true; + } else + return false; } boolean isKeyPressed(final int keyCode) { @@ -137,7 +158,6 @@ public class UserInputTracker synchronized (detectedKeyEvents) { pressedKeysToPressedTimeMap.put(evt.getKeyCode(), System.currentTimeMillis()); detectedKeyEvents.add(evt); - viewContext.getViewPanel().repaintDuringNextViewUpdate(); } } @@ -146,7 +166,6 @@ public class UserInputTracker synchronized (detectedKeyEvents) { pressedKeysToPressedTimeMap.remove(evt.getKeyCode()); detectedKeyEvents.add(evt); - viewContext.getViewPanel().repaintDuringNextViewUpdate(); } } @@ -207,31 +226,25 @@ public class UserInputTracker } /** - * Interpret mouse movement + * @returntrue
if view needs to be repainted. */ - private boolean trackMouse() { - final Avatar avatar = viewContext.getAvatar(); - trackDragging(avatar); - trackVerticalScrolling(avatar); - - boolean repaintNeeded = !mouseDraggedDirection.isZero() || (wheelMovedDirection != 0); - - // reset movement counters - wheelMovedDirection = 0; - mouseDraggedDirection.zero(); - - return repaintNeeded; - } - - private void trackVerticalScrolling(Avatar avatar) { + private boolean handleMouseVerticalScrolling() { + final Avatar avatar = viewPanel.getAvatar(); final double actualAcceleration = 50 * avatar.avatarAcceleration * (1 + (avatar.getMovementSpeed() / 10)); avatar.getMovementVector().y += (wheelMovedDirection * actualAcceleration); avatar.enforceSpeedLimit(); + boolean repaintNeeded = wheelMovedDirection != 0; + wheelMovedDirection = 0; + return repaintNeeded; } - private void trackDragging(Avatar avatar) { + /** + * @returntrue
if view needs to be repainted. + */ + private boolean handleMouseDragging() { // TODO: need to detect whether user moved mouse or touch screen + final Avatar avatar = viewPanel.getAvatar(); // for mouse avatar.setAngleXZ(avatar.getAngleXZ() - ((float) mouseDraggedDirection.x / 50)); avatar.setAngleYZ(avatar.getAngleYZ() - ((float) mouseDraggedDirection.y / 50)); @@ -241,6 +254,10 @@ public class UserInputTracker // mouseDraggedDirection.x / 50)); // avatar.setAngleYZ(avatar.getAngleYZ() + ((float) // mouseDraggedDirection.y / 50)); + + boolean viewUpdateNeeded = !mouseDraggedDirection.isZero(); + mouseDraggedDirection.zero(); + return viewUpdateNeeded; } }