From d0ec219c0ed621e919c17186dd8b8778667fb7d0 Mon Sep 17 00:00:00 2001 From: kimxilxyong Date: Sat, 11 Jun 2011 06:47:50 +0000 Subject: [PATCH] Android: added pressure to TouchEvent, fixed trigger handling git-svn-id: http://jmonkeyengine.googlecode.com/svn/trunk@7577 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- engine/src/core/com/jme3/input/InputManager.java | 31 ++++++++++++++++++---- .../core/com/jme3/input/controls/TouchTrigger.java | 6 ++++- .../src/core/com/jme3/input/event/TouchEvent.java | 26 +++++++++--------- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/engine/src/core/com/jme3/input/InputManager.java b/engine/src/core/com/jme3/input/InputManager.java index e3b7a02ae..324aa268a 100644 --- a/engine/src/core/com/jme3/input/InputManager.java +++ b/engine/src/core/com/jme3/input/InputManager.java @@ -40,6 +40,7 @@ import com.jme3.input.controls.KeyTrigger; import com.jme3.input.controls.MouseAxisTrigger; import com.jme3.input.controls.MouseButtonTrigger; import com.jme3.input.controls.TouchListener; +import com.jme3.input.controls.TouchTrigger; import com.jme3.input.controls.Trigger; import com.jme3.input.event.InputEvent; import com.jme3.input.event.JoyAxisEvent; @@ -606,6 +607,11 @@ public class InputManager implements RawInputListener { } else { assert false; } + // larynx, 2011.06.10 - flag event as reusable because + // the android input uses a non-allocating ringbuffer which + // needs to know when the event is not anymore in inputQueue + // and therefor can be reused. + event.setConsumed(); } inputQueue.clear(); @@ -645,17 +651,32 @@ public class InputManager implements RawInputListener { /** * Dispatches touch events to touch listeners - * @param evt + * @param evt The touch event to be dispatched to all onTouch listeners */ - public void onTouchEventQueued(TouchEvent evt) { - for (Mapping mapping : mappings.values()) { - for (InputListener listener : mapping.listeners) { + public void onTouchEventQueued(TouchEvent evt) { + ArrayList maps = bindings.get(TouchTrigger.getHash()); + if (maps == null) { + return; + } + + int size = maps.size(); + for (int i = size - 1; i >= 0; i--) { + Mapping mapping = maps.get(i); + ArrayList listeners = mapping.listeners; + int listenerSize = listeners.size(); + for (int j = listenerSize - 1; j >= 0; j--) { + InputListener listener = listeners.get(j); if (listener instanceof TouchListener) { ((TouchListener) listener).onTouch(mapping.name, evt, frameTPF); } } - } + } } + + /** + * Receives the touch events from the touch hardware via the input interface + * @param evt The touch Event received + */ @Override public void onTouchEvent(TouchEvent evt) { if (!eventsPermitted) { diff --git a/engine/src/core/com/jme3/input/controls/TouchTrigger.java b/engine/src/core/com/jme3/input/controls/TouchTrigger.java index 494b0a3b9..21ebf0ac2 100644 --- a/engine/src/core/com/jme3/input/controls/TouchTrigger.java +++ b/engine/src/core/com/jme3/input/controls/TouchTrigger.java @@ -40,11 +40,15 @@ public class TouchTrigger implements Trigger { @Override public int hashCode(){ - return 0xfedcba98; + return getHash(); } @Override public String getName() { return "TouchInput"; } + + public static int getHash() { + return 0xfedcba98; + } } diff --git a/engine/src/core/com/jme3/input/event/TouchEvent.java b/engine/src/core/com/jme3/input/event/TouchEvent.java index d3773f1d6..1df0efeeb 100644 --- a/engine/src/core/com/jme3/input/event/TouchEvent.java +++ b/engine/src/core/com/jme3/input/event/TouchEvent.java @@ -38,24 +38,23 @@ import com.jme3.math.Vector2f; /** * TouchEvent represents a single event from multi-touch input devices * @author larynx - * */ public class TouchEvent extends InputEvent { public static enum Type { /** - * Touch down event, fields: posX, posY + * Touch down event, fields: posX, posY, pressure */ DOWN, /** - * Move/Drag event, fields: posX, posY, deltaX, deltaY + * Move/Drag event, fields: posX, posY, deltaX, deltaY, pressure */ MOVE, /** - * Touch up event, fields: posX, posY + * Touch up event, fields: posX, posY, pressure */ UP, @@ -111,6 +110,7 @@ public class TouchEvent extends InputEvent private float posY; private float deltaX; private float deltaY; + private float pressure; // Used only with KEY* events private int keyCode; @@ -132,11 +132,7 @@ public class TouchEvent extends InputEvent public void set(Type type) { - this.type = type; - this.posX = 0f; - this.posY = 0f; - this.deltaX = 0f; - this.deltaY = 0f; + set(type, 0f, 0f, 0f, 0f); } public void set(Type type, float x, float y, float deltax, float deltay) @@ -146,6 +142,7 @@ public class TouchEvent extends InputEvent this.posY = y; this.deltaX = deltax; this.deltaY = deltay; + consumed = false; } @@ -173,10 +170,15 @@ public class TouchEvent extends InputEvent { return deltaY; } - - public Vector2f getDelta() + + public float getPressure() + { + return pressure; + } + + public void setPressure(float pressure) { - return new Vector2f(deltaX,deltaY); + this.pressure = pressure; } public int getPointerId() -- 2.11.0