192 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
		
		
			
		
	
	
			192 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
|  | /*
 | ||
|  |  * 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.ios;
 | ||
|  | 
 | ||
|  | import com.jme3.input.event.InputEvent;
 | ||
|  | import com.jme3.input.event.MouseButtonEvent;
 | ||
|  | import com.jme3.input.event.MouseMotionEvent;
 | ||
|  | import com.jme3.input.event.TouchEvent;
 | ||
|  | import static com.jme3.input.event.TouchEvent.Type.DOWN;
 | ||
|  | import static com.jme3.input.event.TouchEvent.Type.MOVE;
 | ||
|  | import static com.jme3.input.event.TouchEvent.Type.UP;
 | ||
|  | import com.jme3.math.Vector2f;
 | ||
|  | import java.util.HashMap;
 | ||
|  | import java.util.logging.Level;
 | ||
|  | import java.util.logging.Logger;
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * AndroidTouchHandler is the base class that receives touch inputs from the 
 | ||
|  |  * Android system and creates the TouchEvents for jME.  This class is designed
 | ||
|  |  * to handle the base touch events for Android rev 9 (Android 2.3).  This is
 | ||
|  |  * extended by other classes to add features that were introducted after
 | ||
|  |  * Android rev 9.
 | ||
|  |  * 
 | ||
|  |  * @author iwgeric
 | ||
|  |  */
 | ||
|  | public class IosTouchHandler {
 | ||
|  |     private static final Logger logger = Logger.getLogger(IosTouchHandler.class.getName());
 | ||
|  |     
 | ||
|  |     final private HashMap<Integer, Vector2f> lastPositions = new HashMap<Integer, Vector2f>();
 | ||
|  | 
 | ||
|  |     protected int numPointers = 1;
 | ||
|  |     
 | ||
|  |     protected IosInputHandler iosInput;
 | ||
|  | 
 | ||
|  |     public IosTouchHandler(IosInputHandler iosInput) {
 | ||
|  |         this.iosInput = iosInput;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public void initialize() {
 | ||
|  |     }
 | ||
|  |     
 | ||
|  |     public void destroy() {
 | ||
|  |     }
 | ||
|  |     
 | ||
|  |     public void actionDown(int pointerId, long time, float x, float y) {
 | ||
|  |         logger.log(Level.FINE, "Inject input pointer: {0}, time: {1}, x: {2}, y: {3}", 
 | ||
|  |                 new Object[]{pointerId, time, x, y});
 | ||
|  |         float jmeX = iosInput.getJmeX(x);
 | ||
|  |         float jmeY = iosInput.invertY(iosInput.getJmeY(y));
 | ||
|  |         TouchEvent touch = iosInput.getFreeTouchEvent();
 | ||
|  |         touch.set(TouchEvent.Type.DOWN, jmeX, jmeY, 0, 0);
 | ||
|  |         touch.setPointerId(pointerId);//TODO: pointer ID
 | ||
|  |         touch.setTime(time);
 | ||
|  |         touch.setPressure(1.0f);
 | ||
|  |         //touch.setPressure(event.getPressure(pointerIndex)); //TODO: preassure
 | ||
|  | 
 | ||
|  |         lastPositions.put(pointerId, new Vector2f(jmeX, jmeY));
 | ||
|  | 
 | ||
|  |         processEvent(touch);
 | ||
|  |     }
 | ||
|  |     
 | ||
|  |     public void actionUp(int pointerId, long time, float x, float y) {
 | ||
|  |         float jmeX = iosInput.getJmeX(x);
 | ||
|  |         float jmeY = iosInput.invertY(iosInput.getJmeY(y));
 | ||
|  |         TouchEvent touch = iosInput.getFreeTouchEvent();
 | ||
|  |         touch.set(TouchEvent.Type.UP, jmeX, jmeY, 0, 0);
 | ||
|  |         touch.setPointerId(pointerId);//TODO: pointer ID
 | ||
|  |         touch.setTime(time);
 | ||
|  |         touch.setPressure(1.0f);
 | ||
|  |         //touch.setPressure(event.getPressure(pointerIndex)); //TODO: preassure
 | ||
|  |         lastPositions.remove(pointerId);
 | ||
|  | 
 | ||
|  |         processEvent(touch);
 | ||
|  |     }
 | ||
|  |     
 | ||
|  |     public void actionMove(int pointerId, long time, float x, float y) {
 | ||
|  |         float jmeX = iosInput.getJmeX(x);
 | ||
|  |         float jmeY = iosInput.invertY(iosInput.getJmeY(y));
 | ||
|  |         Vector2f lastPos = lastPositions.get(pointerId);
 | ||
|  |         if (lastPos == null) {
 | ||
|  |             lastPos = new Vector2f(jmeX, jmeY);
 | ||
|  |             lastPositions.put(pointerId, lastPos);
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         float dX = jmeX - lastPos.x;
 | ||
|  |         float dY = jmeY - lastPos.y;
 | ||
|  |         if (dX != 0 || dY != 0) {
 | ||
|  |             TouchEvent touch = iosInput.getFreeTouchEvent();
 | ||
|  |             touch.set(TouchEvent.Type.MOVE, jmeX, jmeY, dX, dY);
 | ||
|  |             touch.setPointerId(pointerId);
 | ||
|  |             touch.setTime(time);
 | ||
|  |             touch.setPressure(1.0f);
 | ||
|  |             //touch.setPressure(event.getPressure(p));
 | ||
|  |             lastPos.set(jmeX, jmeY);
 | ||
|  | 
 | ||
|  |             processEvent(touch);
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     protected void processEvent(TouchEvent event) {
 | ||
|  |         // Add the touch event
 | ||
|  |         iosInput.addEvent(event);
 | ||
|  |         // MouseEvents do not support multi-touch, so only evaluate 1 finger pointer events
 | ||
|  |         if (iosInput.isSimulateMouse() && numPointers == 1) {
 | ||
|  |             InputEvent mouseEvent = generateMouseEvent(event);
 | ||
|  |             if (mouseEvent != null) {
 | ||
|  |                 // Add the mouse event
 | ||
|  |                 iosInput.addEvent(mouseEvent);
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     // TODO: Ring Buffer for mouse events?
 | ||
|  |     protected InputEvent generateMouseEvent(TouchEvent event) {
 | ||
|  |         InputEvent inputEvent = null;
 | ||
|  |         int newX;
 | ||
|  |         int newY;
 | ||
|  |         int newDX;
 | ||
|  |         int newDY;
 | ||
|  | 
 | ||
|  |         if (iosInput.isMouseEventsInvertX()) {
 | ||
|  |             newX = (int) (iosInput.invertX(event.getX()));
 | ||
|  |             newDX = (int)event.getDeltaX() * -1;
 | ||
|  |         } else {
 | ||
|  |             newX = (int) event.getX();
 | ||
|  |             newDX = (int)event.getDeltaX();
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         if (iosInput.isMouseEventsInvertY()) {
 | ||
|  |             newY = (int) (iosInput.invertY(event.getY()));
 | ||
|  |             newDY = (int)event.getDeltaY() * -1;
 | ||
|  |         } else {
 | ||
|  |             newY = (int) event.getY();
 | ||
|  |             newDY = (int)event.getDeltaY();
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         switch (event.getType()) {
 | ||
|  |             case DOWN:
 | ||
|  |                 // Handle mouse down event
 | ||
|  |                 inputEvent = new MouseButtonEvent(0, true, newX, newY);
 | ||
|  |                 inputEvent.setTime(event.getTime());
 | ||
|  |                 break;
 | ||
|  | 
 | ||
|  |             case UP:
 | ||
|  |                 // Handle mouse up event
 | ||
|  |                 inputEvent = new MouseButtonEvent(0, false, newX, newY);
 | ||
|  |                 inputEvent.setTime(event.getTime());
 | ||
|  |                 break;
 | ||
|  | 
 | ||
|  |             case HOVER_MOVE:
 | ||
|  |             case MOVE:
 | ||
|  |                 inputEvent = new MouseMotionEvent(newX, newY, newDX, newDY, (int)event.getScaleSpan(), (int)event.getDeltaScaleSpan());
 | ||
|  |                 inputEvent.setTime(event.getTime());
 | ||
|  |                 break;
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         return inputEvent;
 | ||
|  |     }
 | ||
|  |     
 | ||
|  | }
 |