/** * Copyright 2014 * SMEdit https://github.com/StarMade/SMEdit * SMTools https://github.com/StarMade/SMTools * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. **/ package jo.sm.ui.lwjgl; import java.awt.Component; import java.awt.KeyEventDispatcher; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.HashSet; import java.util.Set; import javax.swing.JFrame; import jo.sm.data.SparseMatrix; import jo.sm.logic.GridLogic; import jo.sm.logic.StarMadeLogic; import jo.sm.ship.data.Block; import jo.vecmath.Point3f; import jo.vecmath.Point3i; import jo.vecmath.logic.Point3iLogic; public class LWJGLKeyEventDispatcher implements KeyEventDispatcher, KeyListener { private static final int PAN_XM = 'D'; private static final int PAN_XP = 'A'; private static final int PAN_YM = 'W'; private static final int PAN_YP = 'S'; private static final int PAN_ZM = 'Q'; private static final int PAN_ZP = 'E'; private static final int ROT_YM = 'J'; private static final int ROT_YP = 'L'; private static final int ROT_PM = 'I'; private static final int ROT_PP = 'K'; private static final int ROT_RM = 'U'; private static final int ROT_RP = 'O'; private static final int SELECTION_MOVE = 0; private static final int SELECTION_MOVE_UPPER = 0x40; private static final int SELECTION_MOVE_LOWER = 0x80; private static final int SELECTION_NUDGE = 0x200; private static final Set<Integer> PAN_KEYS = new HashSet<>(); static { PAN_KEYS.add(PAN_XM); PAN_KEYS.add(PAN_XP); PAN_KEYS.add(PAN_YM); PAN_KEYS.add(PAN_YP); PAN_KEYS.add(PAN_ZM); PAN_KEYS.add(PAN_ZP); } private static final Set<Integer> ROT_KEYS = new HashSet<>(); static { ROT_KEYS.add(ROT_YM); ROT_KEYS.add(ROT_YP); ROT_KEYS.add(ROT_PM); ROT_KEYS.add(ROT_PP); ROT_KEYS.add(ROT_RM); ROT_KEYS.add(ROT_RP); } private final LWJGLRenderPanel mPanel; public LWJGLKeyEventDispatcher(LWJGLRenderPanel panel) { mPanel = panel; } @Override public boolean dispatchKeyEvent(KeyEvent ev) { if (!isFocused()) { return false; } if (ev.getID() == KeyEvent.KEY_PRESSED) { doKeyDown(ev.getKeyCode(), ev.getModifiersEx()); } else if (ev.getID() == KeyEvent.KEY_RELEASED) { doKeyUp(ev.getKeyCode(), ev.getModifiersEx()); } return false; } public void doKeyDown(int keyCode, int keyMod) { if (PAN_KEYS.contains(keyCode)) { doPan(keyCode, keyMod); } else if (ROT_KEYS.contains(keyCode)) { doRot(keyCode, keyMod); } /* //System.out.println("code="+Integer.toHexString(keyCode)+", mod="+Integer.toHexString(keyMod)); Point3i lower = StarMadeLogic.getInstance().getSelectedLower(); Point3i upper = StarMadeLogic.getInstance().getSelectedUpper(); if ((lower != null) && (upper != null)) { normalize(lower, upper); if (keyMod == SELECTION_MOVE_UPPER) doMoveUpperSelection(keyCode, upper); else if (keyMod == SELECTION_MOVE_LOWER) doMoveLowerSelection(keyCode, lower); else if (keyMod == SELECTION_MOVE) doMoveSelection(keyCode, lower, upper); else if (keyMod == SELECTION_NUDGE) doNudgeSelection(keyCode, lower, upper); mPanel.updateTiles(); } else { doPan(keyCode, keyMod); } */ } private void normalize(Point3i lower, Point3i upper) { Point3i l = Point3iLogic.min(lower, upper); Point3i u = Point3iLogic.max(lower, upper); lower.set(l); upper.set(u); } private void doPan(int keyCode, int keyMod) { if (keyMod == 0) { Point3i delta = keyToDelta(keyCode, null); if (delta != null) { mPanel.moveCamera(delta); } } if (keyMod == KeyEvent.VK_SHIFT) { Point3i delta = keyToDelta(keyCode, null); if (delta != null) { mPanel.setLookAt(new Point3f(delta)); } } } private void doRot(int keyCode, int keyMod) { if (keyMod == 0) { Point3i delta = keyToRot(keyCode, null); if (delta != null) { mPanel.rotateCamera(delta); } } } private void doMoveUpperSelection(int keyCode, Point3i upper) { keyToDelta(keyCode, upper); } private void doMoveLowerSelection(int keyCode, Point3i lower) { keyToDelta(keyCode, lower); } private void doMoveSelection(int keyCode, Point3i lower, Point3i upper) { keyToDelta(keyCode, lower); keyToDelta(keyCode, upper); } private void doNudgeSelection(int keyCode, Point3i lower, Point3i upper) { mPanel.getUndoer().checkpoint(StarMadeLogic.getModel()); SparseMatrix<Block> clip = GridLogic.extract(StarMadeLogic.getModel(), lower, upper); GridLogic.delete(StarMadeLogic.getModel(), lower, upper); keyToDelta(keyCode, lower); keyToDelta(keyCode, upper); GridLogic.insert(StarMadeLogic.getModel(), clip, lower); } private Point3i keyToDelta(int keyCode, Point3i delta) { if (delta == null) { delta = new Point3i(); } if (keyCode == PAN_XP) { delta.x++; } else if (keyCode == PAN_XM) { delta.x--; } else if (keyCode == PAN_YP) { delta.y++; } else if (keyCode == PAN_YM) { delta.y--; } else if (keyCode == PAN_ZP) { delta.z++; } else if (keyCode == PAN_ZM) { delta.z--; } else { return null; } return delta; } private Point3i keyToRot(int keyCode, Point3i delta) { if (delta == null) { delta = new Point3i(); } if (keyCode == ROT_YP) { delta.x++; } else if (keyCode == ROT_YM) { delta.x--; } else if (keyCode == ROT_PP) { delta.y++; } else if (keyCode == ROT_PM) { delta.y--; } else if (keyCode == ROT_RP) { delta.z++; } else if (keyCode == ROT_RM) { delta.z--; } else { return null; } return delta; } public void doKeyUp(int keyCode, int keyMod) { } private boolean isFocused() { for (Component c = mPanel; c != null; c = c.getParent()) { if (c instanceof JFrame) { if (((JFrame) c).isActive()) { return true; } } } return false; } @Override public void keyPressed(KeyEvent e) { doKeyDown(e.getKeyCode(), e.getModifiers()); } @Override public void keyReleased(KeyEvent e) { doKeyUp(e.getKeyCode(), e.getModifiers()); } @Override public void keyTyped(KeyEvent e) { } }