git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9944 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
c9c1ae1cae
commit
54c7447efa
@ -0,0 +1,605 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.jme3.input.jogl; |
||||||
|
|
||||||
|
import com.jme3.input.KeyInput; |
||||||
|
import com.jme3.input.RawInputListener; |
||||||
|
import com.jme3.input.event.KeyInputEvent; |
||||||
|
import com.jogamp.newt.event.KeyEvent; |
||||||
|
import com.jogamp.newt.event.KeyListener; |
||||||
|
import com.jogamp.newt.opengl.GLWindow; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.BitSet; |
||||||
|
import java.util.logging.Level; |
||||||
|
import java.util.logging.Logger; |
||||||
|
|
||||||
|
public class NewtKeyInput implements KeyInput, KeyListener { |
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(NewtKeyInput.class.getName()); |
||||||
|
|
||||||
|
private final ArrayList<KeyInputEvent> eventQueue = new ArrayList<KeyInputEvent>(); |
||||||
|
private RawInputListener listener; |
||||||
|
private GLWindow component; |
||||||
|
private BitSet keyStateSet = new BitSet(0xFF); |
||||||
|
|
||||||
|
public NewtKeyInput() { |
||||||
|
} |
||||||
|
|
||||||
|
public void initialize() { |
||||||
|
} |
||||||
|
|
||||||
|
public void destroy() { |
||||||
|
} |
||||||
|
|
||||||
|
public void setInputSource(GLWindow comp){ |
||||||
|
synchronized (eventQueue){ |
||||||
|
if (component != null){ |
||||||
|
component.removeKeyListener(this); |
||||||
|
eventQueue.clear(); |
||||||
|
keyStateSet.clear(); |
||||||
|
} |
||||||
|
component = comp; |
||||||
|
component.addKeyListener(this); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public long getInputTimeNanos() { |
||||||
|
return System.nanoTime(); |
||||||
|
} |
||||||
|
|
||||||
|
public void update() { |
||||||
|
synchronized (eventQueue){ |
||||||
|
// flush events to listener
|
||||||
|
for (int i = 0; i < eventQueue.size(); i++){ |
||||||
|
listener.onKeyEvent(eventQueue.get(i)); |
||||||
|
} |
||||||
|
eventQueue.clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isInitialized() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public void setInputListener(RawInputListener listener) { |
||||||
|
this.listener = listener; |
||||||
|
} |
||||||
|
|
||||||
|
public void keyTyped(KeyEvent evt) { |
||||||
|
// key code is zero for typed events
|
||||||
|
} |
||||||
|
|
||||||
|
public void keyPressed(KeyEvent evt) { |
||||||
|
int code = convertAwtKey(evt.getKeyCode()); |
||||||
|
|
||||||
|
// Check if key was already pressed
|
||||||
|
if (!keyStateSet.get(code)){ |
||||||
|
keyStateSet.set(code); |
||||||
|
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), true, false); |
||||||
|
keyEvent.setTime(evt.getWhen()); |
||||||
|
synchronized (eventQueue){ |
||||||
|
eventQueue.add(keyEvent); |
||||||
|
} |
||||||
|
System.out.println(evt); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void keyReleased(KeyEvent evt) { |
||||||
|
int code = convertAwtKey(evt.getKeyCode()); |
||||||
|
|
||||||
|
// Check if key was already released
|
||||||
|
if (keyStateSet.get(code)) { |
||||||
|
keyStateSet.clear(code); |
||||||
|
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), false, false); |
||||||
|
keyEvent.setTime(evt.getWhen()); |
||||||
|
synchronized (eventQueue){ |
||||||
|
eventQueue.add(keyEvent); |
||||||
|
} |
||||||
|
System.out.println(evt); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <code>convertJmeCode</code> converts KeyInput key codes to AWT key codes. |
||||||
|
* |
||||||
|
* @param key jme KeyInput key code |
||||||
|
* @return awt KeyEvent key code |
||||||
|
*/ |
||||||
|
public static int convertJmeCode( int key ) { |
||||||
|
switch ( key ) { |
||||||
|
case KEY_ESCAPE: |
||||||
|
return KeyEvent.VK_ESCAPE; |
||||||
|
case KEY_1: |
||||||
|
return KeyEvent.VK_1; |
||||||
|
case KEY_2: |
||||||
|
return KeyEvent.VK_2; |
||||||
|
case KEY_3: |
||||||
|
return KeyEvent.VK_3; |
||||||
|
case KEY_4: |
||||||
|
return KeyEvent.VK_4; |
||||||
|
case KEY_5: |
||||||
|
return KeyEvent.VK_5; |
||||||
|
case KEY_6: |
||||||
|
return KeyEvent.VK_6; |
||||||
|
case KEY_7: |
||||||
|
return KeyEvent.VK_7; |
||||||
|
case KEY_8: |
||||||
|
return KeyEvent.VK_8; |
||||||
|
case KEY_9: |
||||||
|
return KeyEvent.VK_9; |
||||||
|
case KEY_0: |
||||||
|
return KeyEvent.VK_0; |
||||||
|
case KEY_MINUS: |
||||||
|
return KeyEvent.VK_MINUS; |
||||||
|
case KEY_EQUALS: |
||||||
|
return KeyEvent.VK_EQUALS; |
||||||
|
case KEY_BACK: |
||||||
|
return KeyEvent.VK_BACK_SPACE; |
||||||
|
case KEY_TAB: |
||||||
|
return KeyEvent.VK_TAB; |
||||||
|
case KEY_Q: |
||||||
|
return KeyEvent.VK_Q; |
||||||
|
case KEY_W: |
||||||
|
return KeyEvent.VK_W; |
||||||
|
case KEY_E: |
||||||
|
return KeyEvent.VK_E; |
||||||
|
case KEY_R: |
||||||
|
return KeyEvent.VK_R; |
||||||
|
case KEY_T: |
||||||
|
return KeyEvent.VK_T; |
||||||
|
case KEY_Y: |
||||||
|
return KeyEvent.VK_Y; |
||||||
|
case KEY_U: |
||||||
|
return KeyEvent.VK_U; |
||||||
|
case KEY_I: |
||||||
|
return KeyEvent.VK_I; |
||||||
|
case KEY_O: |
||||||
|
return KeyEvent.VK_O; |
||||||
|
case KEY_P: |
||||||
|
return KeyEvent.VK_P; |
||||||
|
case KEY_LBRACKET: |
||||||
|
return KeyEvent.VK_OPEN_BRACKET; |
||||||
|
case KEY_RBRACKET: |
||||||
|
return KeyEvent.VK_CLOSE_BRACKET; |
||||||
|
case KEY_RETURN: |
||||||
|
return KeyEvent.VK_ENTER; |
||||||
|
case KEY_LCONTROL: |
||||||
|
return KeyEvent.VK_CONTROL; |
||||||
|
case KEY_A: |
||||||
|
return KeyEvent.VK_A; |
||||||
|
case KEY_S: |
||||||
|
return KeyEvent.VK_S; |
||||||
|
case KEY_D: |
||||||
|
return KeyEvent.VK_D; |
||||||
|
case KEY_F: |
||||||
|
return KeyEvent.VK_F; |
||||||
|
case KEY_G: |
||||||
|
return KeyEvent.VK_G; |
||||||
|
case KEY_H: |
||||||
|
return KeyEvent.VK_H; |
||||||
|
case KEY_J: |
||||||
|
return KeyEvent.VK_J; |
||||||
|
case KEY_K: |
||||||
|
return KeyEvent.VK_K; |
||||||
|
case KEY_L: |
||||||
|
return KeyEvent.VK_L; |
||||||
|
case KEY_SEMICOLON: |
||||||
|
return KeyEvent.VK_SEMICOLON; |
||||||
|
case KEY_APOSTROPHE: |
||||||
|
return KeyEvent.VK_QUOTE; |
||||||
|
case KEY_GRAVE: |
||||||
|
return KeyEvent.VK_DEAD_GRAVE; |
||||||
|
case KEY_LSHIFT: |
||||||
|
return KeyEvent.VK_SHIFT; |
||||||
|
case KEY_BACKSLASH: |
||||||
|
return KeyEvent.VK_BACK_SLASH; |
||||||
|
case KEY_Z: |
||||||
|
return KeyEvent.VK_Z; |
||||||
|
case KEY_X: |
||||||
|
return KeyEvent.VK_X; |
||||||
|
case KEY_C: |
||||||
|
return KeyEvent.VK_C; |
||||||
|
case KEY_V: |
||||||
|
return KeyEvent.VK_V; |
||||||
|
case KEY_B: |
||||||
|
return KeyEvent.VK_B; |
||||||
|
case KEY_N: |
||||||
|
return KeyEvent.VK_N; |
||||||
|
case KEY_M: |
||||||
|
return KeyEvent.VK_M; |
||||||
|
case KEY_COMMA: |
||||||
|
return KeyEvent.VK_COMMA; |
||||||
|
case KEY_PERIOD: |
||||||
|
return KeyEvent.VK_PERIOD; |
||||||
|
case KEY_SLASH: |
||||||
|
return KeyEvent.VK_SLASH; |
||||||
|
case KEY_RSHIFT: |
||||||
|
return KeyEvent.VK_SHIFT; |
||||||
|
case KEY_MULTIPLY: |
||||||
|
return KeyEvent.VK_MULTIPLY; |
||||||
|
case KEY_SPACE: |
||||||
|
return KeyEvent.VK_SPACE; |
||||||
|
case KEY_CAPITAL: |
||||||
|
return KeyEvent.VK_CAPS_LOCK; |
||||||
|
case KEY_F1: |
||||||
|
return KeyEvent.VK_F1; |
||||||
|
case KEY_F2: |
||||||
|
return KeyEvent.VK_F2; |
||||||
|
case KEY_F3: |
||||||
|
return KeyEvent.VK_F3; |
||||||
|
case KEY_F4: |
||||||
|
return KeyEvent.VK_F4; |
||||||
|
case KEY_F5: |
||||||
|
return KeyEvent.VK_F5; |
||||||
|
case KEY_F6: |
||||||
|
return KeyEvent.VK_F6; |
||||||
|
case KEY_F7: |
||||||
|
return KeyEvent.VK_F7; |
||||||
|
case KEY_F8: |
||||||
|
return KeyEvent.VK_F8; |
||||||
|
case KEY_F9: |
||||||
|
return KeyEvent.VK_F9; |
||||||
|
case KEY_F10: |
||||||
|
return KeyEvent.VK_F10; |
||||||
|
case KEY_NUMLOCK: |
||||||
|
return KeyEvent.VK_NUM_LOCK; |
||||||
|
case KEY_SCROLL: |
||||||
|
return KeyEvent.VK_SCROLL_LOCK; |
||||||
|
case KEY_NUMPAD7: |
||||||
|
return KeyEvent.VK_NUMPAD7; |
||||||
|
case KEY_NUMPAD8: |
||||||
|
return KeyEvent.VK_NUMPAD8; |
||||||
|
case KEY_NUMPAD9: |
||||||
|
return KeyEvent.VK_NUMPAD9; |
||||||
|
case KEY_SUBTRACT: |
||||||
|
return KeyEvent.VK_SUBTRACT; |
||||||
|
case KEY_NUMPAD4: |
||||||
|
return KeyEvent.VK_NUMPAD4; |
||||||
|
case KEY_NUMPAD5: |
||||||
|
return KeyEvent.VK_NUMPAD5; |
||||||
|
case KEY_NUMPAD6: |
||||||
|
return KeyEvent.VK_NUMPAD6; |
||||||
|
case KEY_ADD: |
||||||
|
return KeyEvent.VK_ADD; |
||||||
|
case KEY_NUMPAD1: |
||||||
|
return KeyEvent.VK_NUMPAD1; |
||||||
|
case KEY_NUMPAD2: |
||||||
|
return KeyEvent.VK_NUMPAD2; |
||||||
|
case KEY_NUMPAD3: |
||||||
|
return KeyEvent.VK_NUMPAD3; |
||||||
|
case KEY_NUMPAD0: |
||||||
|
return KeyEvent.VK_NUMPAD0; |
||||||
|
case KEY_DECIMAL: |
||||||
|
return KeyEvent.VK_DECIMAL; |
||||||
|
case KEY_F11: |
||||||
|
return KeyEvent.VK_F11; |
||||||
|
case KEY_F12: |
||||||
|
return KeyEvent.VK_F12; |
||||||
|
case KEY_F13: |
||||||
|
return KeyEvent.VK_F13; |
||||||
|
case KEY_F14: |
||||||
|
return KeyEvent.VK_F14; |
||||||
|
case KEY_F15: |
||||||
|
return KeyEvent.VK_F15; |
||||||
|
case KEY_KANA: |
||||||
|
return KeyEvent.VK_KANA; |
||||||
|
case KEY_CONVERT: |
||||||
|
return KeyEvent.VK_CONVERT; |
||||||
|
case KEY_NOCONVERT: |
||||||
|
return KeyEvent.VK_NONCONVERT; |
||||||
|
case KEY_NUMPADEQUALS: |
||||||
|
return KeyEvent.VK_EQUALS; |
||||||
|
case KEY_CIRCUMFLEX: |
||||||
|
return KeyEvent.VK_CIRCUMFLEX; |
||||||
|
case KEY_AT: |
||||||
|
return KeyEvent.VK_AT; |
||||||
|
case KEY_COLON: |
||||||
|
return KeyEvent.VK_COLON; |
||||||
|
case KEY_UNDERLINE: |
||||||
|
return KeyEvent.VK_UNDERSCORE; |
||||||
|
case KEY_STOP: |
||||||
|
return KeyEvent.VK_STOP; |
||||||
|
case KEY_NUMPADENTER: |
||||||
|
return KeyEvent.VK_ENTER; |
||||||
|
case KEY_RCONTROL: |
||||||
|
return KeyEvent.VK_CONTROL; |
||||||
|
case KEY_NUMPADCOMMA: |
||||||
|
return KeyEvent.VK_COMMA; |
||||||
|
case KEY_DIVIDE: |
||||||
|
return KeyEvent.VK_DIVIDE; |
||||||
|
case KEY_PAUSE: |
||||||
|
return KeyEvent.VK_PAUSE; |
||||||
|
case KEY_HOME: |
||||||
|
return KeyEvent.VK_HOME; |
||||||
|
case KEY_UP: |
||||||
|
return KeyEvent.VK_UP; |
||||||
|
case KEY_PRIOR: |
||||||
|
return KeyEvent.VK_PAGE_UP; |
||||||
|
case KEY_LEFT: |
||||||
|
return KeyEvent.VK_LEFT; |
||||||
|
case KEY_RIGHT: |
||||||
|
return KeyEvent.VK_RIGHT; |
||||||
|
case KEY_END: |
||||||
|
return KeyEvent.VK_END; |
||||||
|
case KEY_DOWN: |
||||||
|
return KeyEvent.VK_DOWN; |
||||||
|
case KEY_NEXT: |
||||||
|
return KeyEvent.VK_PAGE_DOWN; |
||||||
|
case KEY_INSERT: |
||||||
|
return KeyEvent.VK_INSERT; |
||||||
|
case KEY_DELETE: |
||||||
|
return KeyEvent.VK_DELETE; |
||||||
|
case KEY_LMENU: |
||||||
|
return KeyEvent.VK_ALT; //todo: location left
|
||||||
|
case KEY_RMENU: |
||||||
|
return KeyEvent.VK_ALT; //todo: location right
|
||||||
|
} |
||||||
|
logger.log(Level.WARNING, "unsupported key:{0}", key); |
||||||
|
return 0x10000 + key; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* <code>convertAwtKey</code> converts AWT key codes to KeyInput key codes. |
||||||
|
* |
||||||
|
* @param key awt KeyEvent key code |
||||||
|
* @return jme KeyInput key code |
||||||
|
*/ |
||||||
|
public static int convertAwtKey(int key) { |
||||||
|
switch ( key ) { |
||||||
|
case KeyEvent.VK_ESCAPE: |
||||||
|
return KEY_ESCAPE; |
||||||
|
case KeyEvent.VK_1: |
||||||
|
return KEY_1; |
||||||
|
case KeyEvent.VK_2: |
||||||
|
return KEY_2; |
||||||
|
case KeyEvent.VK_3: |
||||||
|
return KEY_3; |
||||||
|
case KeyEvent.VK_4: |
||||||
|
return KEY_4; |
||||||
|
case KeyEvent.VK_5: |
||||||
|
return KEY_5; |
||||||
|
case KeyEvent.VK_6: |
||||||
|
return KEY_6; |
||||||
|
case KeyEvent.VK_7: |
||||||
|
return KEY_7; |
||||||
|
case KeyEvent.VK_8: |
||||||
|
return KEY_8; |
||||||
|
case KeyEvent.VK_9: |
||||||
|
return KEY_9; |
||||||
|
case KeyEvent.VK_0: |
||||||
|
return KEY_0; |
||||||
|
case KeyEvent.VK_MINUS: |
||||||
|
return KEY_MINUS; |
||||||
|
case KeyEvent.VK_EQUALS: |
||||||
|
return KEY_EQUALS; |
||||||
|
case KeyEvent.VK_BACK_SPACE: |
||||||
|
return KEY_BACK; |
||||||
|
case KeyEvent.VK_TAB: |
||||||
|
return KEY_TAB; |
||||||
|
case KeyEvent.VK_Q: |
||||||
|
return KEY_Q; |
||||||
|
case KeyEvent.VK_W: |
||||||
|
return KEY_W; |
||||||
|
case KeyEvent.VK_E: |
||||||
|
return KEY_E; |
||||||
|
case KeyEvent.VK_R: |
||||||
|
return KEY_R; |
||||||
|
case KeyEvent.VK_T: |
||||||
|
return KEY_T; |
||||||
|
case KeyEvent.VK_Y: |
||||||
|
return KEY_Y; |
||||||
|
case KeyEvent.VK_U: |
||||||
|
return KEY_U; |
||||||
|
case KeyEvent.VK_I: |
||||||
|
return KEY_I; |
||||||
|
case KeyEvent.VK_O: |
||||||
|
return KEY_O; |
||||||
|
case KeyEvent.VK_P: |
||||||
|
return KEY_P; |
||||||
|
case KeyEvent.VK_OPEN_BRACKET: |
||||||
|
return KEY_LBRACKET; |
||||||
|
case KeyEvent.VK_CLOSE_BRACKET: |
||||||
|
return KEY_RBRACKET; |
||||||
|
case KeyEvent.VK_ENTER: |
||||||
|
return KEY_RETURN; |
||||||
|
case KeyEvent.VK_CONTROL: |
||||||
|
return KEY_LCONTROL; |
||||||
|
case KeyEvent.VK_A: |
||||||
|
return KEY_A; |
||||||
|
case KeyEvent.VK_S: |
||||||
|
return KEY_S; |
||||||
|
case KeyEvent.VK_D: |
||||||
|
return KEY_D; |
||||||
|
case KeyEvent.VK_F: |
||||||
|
return KEY_F; |
||||||
|
case KeyEvent.VK_G: |
||||||
|
return KEY_G; |
||||||
|
case KeyEvent.VK_H: |
||||||
|
return KEY_H; |
||||||
|
case KeyEvent.VK_J: |
||||||
|
return KEY_J; |
||||||
|
case KeyEvent.VK_K: |
||||||
|
return KEY_K; |
||||||
|
case KeyEvent.VK_L: |
||||||
|
return KEY_L; |
||||||
|
case KeyEvent.VK_SEMICOLON: |
||||||
|
return KEY_SEMICOLON; |
||||||
|
case KeyEvent.VK_QUOTE: |
||||||
|
return KEY_APOSTROPHE; |
||||||
|
case KeyEvent.VK_DEAD_GRAVE: |
||||||
|
return KEY_GRAVE; |
||||||
|
case KeyEvent.VK_SHIFT: |
||||||
|
return KEY_LSHIFT; |
||||||
|
case KeyEvent.VK_BACK_SLASH: |
||||||
|
return KEY_BACKSLASH; |
||||||
|
case KeyEvent.VK_Z: |
||||||
|
return KEY_Z; |
||||||
|
case KeyEvent.VK_X: |
||||||
|
return KEY_X; |
||||||
|
case KeyEvent.VK_C: |
||||||
|
return KEY_C; |
||||||
|
case KeyEvent.VK_V: |
||||||
|
return KEY_V; |
||||||
|
case KeyEvent.VK_B: |
||||||
|
return KEY_B; |
||||||
|
case KeyEvent.VK_N: |
||||||
|
return KEY_N; |
||||||
|
case KeyEvent.VK_M: |
||||||
|
return KEY_M; |
||||||
|
case KeyEvent.VK_COMMA: |
||||||
|
return KEY_COMMA; |
||||||
|
case KeyEvent.VK_PERIOD: |
||||||
|
return KEY_PERIOD; |
||||||
|
case KeyEvent.VK_SLASH: |
||||||
|
return KEY_SLASH; |
||||||
|
case KeyEvent.VK_MULTIPLY: |
||||||
|
return KEY_MULTIPLY; |
||||||
|
case KeyEvent.VK_SPACE: |
||||||
|
return KEY_SPACE; |
||||||
|
case KeyEvent.VK_CAPS_LOCK: |
||||||
|
return KEY_CAPITAL; |
||||||
|
case KeyEvent.VK_F1: |
||||||
|
return KEY_F1; |
||||||
|
case KeyEvent.VK_F2: |
||||||
|
return KEY_F2; |
||||||
|
case KeyEvent.VK_F3: |
||||||
|
return KEY_F3; |
||||||
|
case KeyEvent.VK_F4: |
||||||
|
return KEY_F4; |
||||||
|
case KeyEvent.VK_F5: |
||||||
|
return KEY_F5; |
||||||
|
case KeyEvent.VK_F6: |
||||||
|
return KEY_F6; |
||||||
|
case KeyEvent.VK_F7: |
||||||
|
return KEY_F7; |
||||||
|
case KeyEvent.VK_F8: |
||||||
|
return KEY_F8; |
||||||
|
case KeyEvent.VK_F9: |
||||||
|
return KEY_F9; |
||||||
|
case KeyEvent.VK_F10: |
||||||
|
return KEY_F10; |
||||||
|
case KeyEvent.VK_NUM_LOCK: |
||||||
|
return KEY_NUMLOCK; |
||||||
|
case KeyEvent.VK_SCROLL_LOCK: |
||||||
|
return KEY_SCROLL; |
||||||
|
case KeyEvent.VK_NUMPAD7: |
||||||
|
return KEY_NUMPAD7; |
||||||
|
case KeyEvent.VK_NUMPAD8: |
||||||
|
return KEY_NUMPAD8; |
||||||
|
case KeyEvent.VK_NUMPAD9: |
||||||
|
return KEY_NUMPAD9; |
||||||
|
case KeyEvent.VK_SUBTRACT: |
||||||
|
return KEY_SUBTRACT; |
||||||
|
case KeyEvent.VK_NUMPAD4: |
||||||
|
return KEY_NUMPAD4; |
||||||
|
case KeyEvent.VK_NUMPAD5: |
||||||
|
return KEY_NUMPAD5; |
||||||
|
case KeyEvent.VK_NUMPAD6: |
||||||
|
return KEY_NUMPAD6; |
||||||
|
case KeyEvent.VK_ADD: |
||||||
|
return KEY_ADD; |
||||||
|
case KeyEvent.VK_NUMPAD1: |
||||||
|
return KEY_NUMPAD1; |
||||||
|
case KeyEvent.VK_NUMPAD2: |
||||||
|
return KEY_NUMPAD2; |
||||||
|
case KeyEvent.VK_NUMPAD3: |
||||||
|
return KEY_NUMPAD3; |
||||||
|
case KeyEvent.VK_NUMPAD0: |
||||||
|
return KEY_NUMPAD0; |
||||||
|
case KeyEvent.VK_DECIMAL: |
||||||
|
return KEY_DECIMAL; |
||||||
|
case KeyEvent.VK_F11: |
||||||
|
return KEY_F11; |
||||||
|
case KeyEvent.VK_F12: |
||||||
|
return KEY_F12; |
||||||
|
case KeyEvent.VK_F13: |
||||||
|
return KEY_F13; |
||||||
|
case KeyEvent.VK_F14: |
||||||
|
return KEY_F14; |
||||||
|
case KeyEvent.VK_F15: |
||||||
|
return KEY_F15; |
||||||
|
case KeyEvent.VK_KANA: |
||||||
|
return KEY_KANA; |
||||||
|
case KeyEvent.VK_CONVERT: |
||||||
|
return KEY_CONVERT; |
||||||
|
case KeyEvent.VK_NONCONVERT: |
||||||
|
return KEY_NOCONVERT; |
||||||
|
case KeyEvent.VK_CIRCUMFLEX: |
||||||
|
return KEY_CIRCUMFLEX; |
||||||
|
case KeyEvent.VK_AT: |
||||||
|
return KEY_AT; |
||||||
|
case KeyEvent.VK_COLON: |
||||||
|
return KEY_COLON; |
||||||
|
case KeyEvent.VK_UNDERSCORE: |
||||||
|
return KEY_UNDERLINE; |
||||||
|
case KeyEvent.VK_STOP: |
||||||
|
return KEY_STOP; |
||||||
|
case KeyEvent.VK_DIVIDE: |
||||||
|
return KEY_DIVIDE; |
||||||
|
case KeyEvent.VK_PAUSE: |
||||||
|
return KEY_PAUSE; |
||||||
|
case KeyEvent.VK_HOME: |
||||||
|
return KEY_HOME; |
||||||
|
case KeyEvent.VK_UP: |
||||||
|
return KEY_UP; |
||||||
|
case KeyEvent.VK_PAGE_UP: |
||||||
|
return KEY_PRIOR; |
||||||
|
case KeyEvent.VK_LEFT: |
||||||
|
return KEY_LEFT; |
||||||
|
case KeyEvent.VK_RIGHT: |
||||||
|
return KEY_RIGHT; |
||||||
|
case KeyEvent.VK_END: |
||||||
|
return KEY_END; |
||||||
|
case KeyEvent.VK_DOWN: |
||||||
|
return KEY_DOWN; |
||||||
|
case KeyEvent.VK_PAGE_DOWN: |
||||||
|
return KEY_NEXT; |
||||||
|
case KeyEvent.VK_INSERT: |
||||||
|
return KEY_INSERT; |
||||||
|
case KeyEvent.VK_DELETE: |
||||||
|
return KEY_DELETE; |
||||||
|
case KeyEvent.VK_ALT: |
||||||
|
return KEY_LMENU; //Left vs. Right need to improve
|
||||||
|
case KeyEvent.VK_META: |
||||||
|
return KEY_RCONTROL; |
||||||
|
|
||||||
|
} |
||||||
|
logger.log( Level.WARNING, "unsupported key:{0}", key); |
||||||
|
if ( key >= 0x10000 ) { |
||||||
|
return key - 0x10000; |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,286 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.jme3.input.jogl; |
||||||
|
|
||||||
|
import com.jme3.cursors.plugins.JmeCursor; |
||||||
|
import com.jme3.input.MouseInput; |
||||||
|
import com.jme3.input.RawInputListener; |
||||||
|
import com.jme3.input.awt.AwtMouseInput; |
||||||
|
import com.jme3.input.event.MouseButtonEvent; |
||||||
|
import com.jme3.input.event.MouseMotionEvent; |
||||||
|
import com.jogamp.newt.event.MouseEvent; |
||||||
|
import com.jogamp.newt.event.MouseListener; |
||||||
|
import com.jogamp.newt.opengl.GLWindow; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.logging.Level; |
||||||
|
import java.util.logging.Logger; |
||||||
|
import javax.media.nativewindow.util.Point; |
||||||
|
|
||||||
|
public class NewtMouseInput implements MouseInput, MouseListener { |
||||||
|
|
||||||
|
public static int WHEEL_AMP = 40; // arbitrary... Java's mouse wheel seems to report something a lot lower than lwjgl's
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(AwtMouseInput.class.getName()); |
||||||
|
|
||||||
|
private boolean visible = true; |
||||||
|
|
||||||
|
private RawInputListener listener; |
||||||
|
|
||||||
|
private GLWindow component; |
||||||
|
|
||||||
|
private final ArrayList<MouseButtonEvent> eventQueue = new ArrayList<MouseButtonEvent>(); |
||||||
|
private final ArrayList<MouseButtonEvent> eventQueueCopy = new ArrayList<MouseButtonEvent>(); |
||||||
|
|
||||||
|
private int lastEventX; |
||||||
|
private int lastEventY; |
||||||
|
private int lastEventWheel; |
||||||
|
|
||||||
|
private int wheelPos; |
||||||
|
private Point location; |
||||||
|
private Point centerLocation; |
||||||
|
private Point centerLocationOnScreen; |
||||||
|
private Point lastKnownLocation; |
||||||
|
private boolean isRecentering; |
||||||
|
private boolean cursorMoved; |
||||||
|
private int eventsSinceRecenter; |
||||||
|
|
||||||
|
public NewtMouseInput() { |
||||||
|
location = new Point(); |
||||||
|
centerLocation = new Point(); |
||||||
|
centerLocationOnScreen = new Point(); |
||||||
|
lastKnownLocation = new Point(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setInputSource(GLWindow comp) { |
||||||
|
if (component != null) { |
||||||
|
component.removeMouseListener(this); |
||||||
|
|
||||||
|
eventQueue.clear(); |
||||||
|
|
||||||
|
wheelPos = 0; |
||||||
|
isRecentering = false; |
||||||
|
eventsSinceRecenter = 0; |
||||||
|
lastEventX = 0; |
||||||
|
lastEventY = 0; |
||||||
|
lastEventWheel = 0; |
||||||
|
location = new Point(); |
||||||
|
centerLocation = new Point(); |
||||||
|
centerLocationOnScreen = new Point(); |
||||||
|
lastKnownLocation = new Point(); |
||||||
|
} |
||||||
|
|
||||||
|
component = comp; |
||||||
|
component.addMouseListener(this); |
||||||
|
} |
||||||
|
|
||||||
|
public void initialize() { |
||||||
|
} |
||||||
|
|
||||||
|
public void destroy() { |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isInitialized() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public void setInputListener(RawInputListener listener) { |
||||||
|
this.listener = listener; |
||||||
|
} |
||||||
|
|
||||||
|
public long getInputTimeNanos() { |
||||||
|
return System.nanoTime(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCursorVisible(boolean visible) { |
||||||
|
if (this.visible != visible) { |
||||||
|
lastKnownLocation.setX(0); |
||||||
|
lastKnownLocation.setY(0); |
||||||
|
|
||||||
|
this.visible = visible; |
||||||
|
component.setPointerVisible(visible); |
||||||
|
if (!visible) { |
||||||
|
recenterMouse(component); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void update() { |
||||||
|
if (cursorMoved) { |
||||||
|
int newX = location.getX(); |
||||||
|
int newY = location.getY(); |
||||||
|
int newWheel = wheelPos; |
||||||
|
|
||||||
|
// invert DY
|
||||||
|
int actualX = lastKnownLocation.getX(); |
||||||
|
int actualY = component.getHeight() - lastKnownLocation.getY(); |
||||||
|
MouseMotionEvent evt = new MouseMotionEvent(actualX, actualY, |
||||||
|
newX - lastEventX, |
||||||
|
lastEventY - newY, |
||||||
|
wheelPos, lastEventWheel - wheelPos); |
||||||
|
listener.onMouseMotionEvent(evt); |
||||||
|
|
||||||
|
lastEventX = newX; |
||||||
|
lastEventY = newY; |
||||||
|
lastEventWheel = newWheel; |
||||||
|
|
||||||
|
cursorMoved = false; |
||||||
|
} |
||||||
|
|
||||||
|
synchronized (eventQueue) { |
||||||
|
eventQueueCopy.clear(); |
||||||
|
eventQueueCopy.addAll(eventQueue); |
||||||
|
eventQueue.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
int size = eventQueueCopy.size(); |
||||||
|
for (int i = 0; i < size; i++) { |
||||||
|
listener.onMouseButtonEvent(eventQueueCopy.get(i)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public int getButtonCount() { |
||||||
|
return 3; |
||||||
|
} |
||||||
|
|
||||||
|
public void mouseClicked(MouseEvent awtEvt) { |
||||||
|
// MouseButtonEvent evt = new MouseButtonEvent(getJMEButtonIndex(arg0), false);
|
||||||
|
// listener.onMouseButtonEvent(evt);
|
||||||
|
} |
||||||
|
|
||||||
|
public void mousePressed(MouseEvent awtEvt) { |
||||||
|
MouseButtonEvent evt = new MouseButtonEvent(getJMEButtonIndex(awtEvt), true, awtEvt.getX(), awtEvt.getY()); |
||||||
|
evt.setTime(awtEvt.getWhen()); |
||||||
|
synchronized (eventQueue) { |
||||||
|
eventQueue.add(evt); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void mouseReleased(MouseEvent awtEvt) { |
||||||
|
MouseButtonEvent evt = new MouseButtonEvent(getJMEButtonIndex(awtEvt), false, awtEvt.getX(), awtEvt.getY()); |
||||||
|
evt.setTime(awtEvt.getWhen()); |
||||||
|
synchronized (eventQueue) { |
||||||
|
eventQueue.add(evt); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void mouseEntered(MouseEvent awtEvt) { |
||||||
|
if (!visible) { |
||||||
|
recenterMouse(component); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void mouseExited(MouseEvent awtEvt) { |
||||||
|
if (!visible) { |
||||||
|
recenterMouse(component); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void mouseWheelMoved(MouseEvent awtEvt) { |
||||||
|
//FIXME not sure this is the right way to handle this case
|
||||||
|
int dwheel = awtEvt.getWheelRotation(); |
||||||
|
wheelPos += dwheel * WHEEL_AMP; |
||||||
|
cursorMoved = true; |
||||||
|
} |
||||||
|
|
||||||
|
public void mouseDragged(MouseEvent awtEvt) { |
||||||
|
mouseMoved(awtEvt); |
||||||
|
} |
||||||
|
|
||||||
|
public void mouseMoved(MouseEvent awtEvt) { |
||||||
|
if (isRecentering) { |
||||||
|
// MHenze (cylab) Fix Issue 35:
|
||||||
|
// As long as the MouseInput is in recentering mode, nothing is done until the mouse is entered in the component
|
||||||
|
// by the events generated by the robot. If this happens, the last known location is resetted.
|
||||||
|
if ((centerLocation.getX() == awtEvt.getX() && centerLocation.getY() == awtEvt.getY()) || eventsSinceRecenter++ == 5) { |
||||||
|
lastKnownLocation.setX(awtEvt.getX()); |
||||||
|
lastKnownLocation.setY(awtEvt.getY()); |
||||||
|
isRecentering = false; |
||||||
|
} |
||||||
|
} else { |
||||||
|
// MHenze (cylab) Fix Issue 35:
|
||||||
|
// Compute the delta and absolute coordinates and recenter the mouse if necessary
|
||||||
|
int dx = awtEvt.getX() - lastKnownLocation.getX(); |
||||||
|
int dy = awtEvt.getY() - lastKnownLocation.getY(); |
||||||
|
location.setX(location.getX() + dx); |
||||||
|
location.setY(location.getY() + dy); |
||||||
|
if (!visible) { |
||||||
|
recenterMouse(component); |
||||||
|
} |
||||||
|
lastKnownLocation.setX(awtEvt.getX()); |
||||||
|
lastKnownLocation.setY(awtEvt.getY()); |
||||||
|
|
||||||
|
cursorMoved = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// MHenze (cylab) Fix Issue 35: A method to generate recenter the mouse to allow the InputSystem to "grab" the mouse
|
||||||
|
private void recenterMouse(final GLWindow component) { |
||||||
|
eventsSinceRecenter = 0; |
||||||
|
isRecentering = true; |
||||||
|
centerLocation.setX(component.getWidth() / 2); |
||||||
|
centerLocation.setY(component.getHeight() / 2); |
||||||
|
centerLocationOnScreen.setX(centerLocation.getX()); |
||||||
|
centerLocationOnScreen.setY(centerLocation.getY()); |
||||||
|
|
||||||
|
component.warpPointer(centerLocationOnScreen.getX(), centerLocationOnScreen.getY()); |
||||||
|
} |
||||||
|
|
||||||
|
private int getJMEButtonIndex(MouseEvent awtEvt) { |
||||||
|
int index; |
||||||
|
switch (awtEvt.getButton()) { |
||||||
|
default: |
||||||
|
case MouseEvent.BUTTON1: //left
|
||||||
|
index = MouseInput.BUTTON_LEFT; |
||||||
|
break; |
||||||
|
case MouseEvent.BUTTON2: //middle
|
||||||
|
index = MouseInput.BUTTON_MIDDLE; |
||||||
|
break; |
||||||
|
case MouseEvent.BUTTON3: //right
|
||||||
|
index = MouseInput.BUTTON_RIGHT; |
||||||
|
break; |
||||||
|
case MouseEvent.BUTTON4: |
||||||
|
case MouseEvent.BUTTON5: |
||||||
|
case MouseEvent.BUTTON6: |
||||||
|
case MouseEvent.BUTTON7: |
||||||
|
case MouseEvent.BUTTON8: |
||||||
|
case MouseEvent.BUTTON9: |
||||||
|
//FIXME
|
||||||
|
index = 0; |
||||||
|
break; |
||||||
|
} |
||||||
|
return index; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNativeCursor(JmeCursor cursor) { |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue