mirror of
https://github.com/godotengine/godot.git
synced 2024-11-26 06:03:38 +00:00
Android stylus pressure and tilt support
This commit is contained in:
parent
7ba79d68bd
commit
7494ad6b54
@ -292,7 +292,7 @@ void AndroidInputHandler::_release_mouse_event_info(bool p_source_mouse_relative
|
|||||||
mouse_event_info.valid = false;
|
mouse_event_info.valid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative) {
|
void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative, float p_pressure, Vector2 p_tilt) {
|
||||||
BitField<MouseButtonMask> event_buttons_mask = _android_button_mask_to_godot_button_mask(p_event_android_buttons_mask);
|
BitField<MouseButtonMask> event_buttons_mask = _android_button_mask_to_godot_button_mask(p_event_android_buttons_mask);
|
||||||
switch (p_event_action) {
|
switch (p_event_action) {
|
||||||
case AMOTION_EVENT_ACTION_HOVER_MOVE: // hover move
|
case AMOTION_EVENT_ACTION_HOVER_MOVE: // hover move
|
||||||
@ -349,6 +349,8 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an
|
|||||||
hover_prev_pos = p_event_pos;
|
hover_prev_pos = p_event_pos;
|
||||||
}
|
}
|
||||||
ev->set_button_mask(event_buttons_mask);
|
ev->set_button_mask(event_buttons_mask);
|
||||||
|
ev->set_pressure(p_pressure);
|
||||||
|
ev->set_tilt(p_tilt);
|
||||||
Input::get_singleton()->parse_input_event(ev);
|
Input::get_singleton()->parse_input_event(ev);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ private:
|
|||||||
void _cancel_all_touch();
|
void _cancel_all_touch();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative);
|
void process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative, float p_pressure, Vector2 p_tilt);
|
||||||
void process_touch_event(int p_event, int p_pointer, const Vector<TouchPos> &p_points, bool p_double_tap);
|
void process_touch_event(int p_event, int p_pointer, const Vector<TouchPos> &p_points, bool p_double_tap);
|
||||||
void process_magnify(Point2 p_pos, float p_factor);
|
void process_magnify(Point2 p_pos, float p_factor);
|
||||||
void process_pan(Point2 p_pos, Vector2 p_delta);
|
void process_pan(Point2 p_pos, Vector2 p_delta);
|
||||||
|
@ -114,7 +114,7 @@ public class GodotLib {
|
|||||||
/**
|
/**
|
||||||
* Dispatch mouse events
|
* Dispatch mouse events
|
||||||
*/
|
*/
|
||||||
public static native void dispatchMouseEvent(int event, int buttonMask, float x, float y, float deltaX, float deltaY, boolean doubleClick, boolean sourceMouseRelative);
|
public static native void dispatchMouseEvent(int event, int buttonMask, float x, float y, float deltaX, float deltaY, boolean doubleClick, boolean sourceMouseRelative, float pressure, float tiltX, float tiltY);
|
||||||
|
|
||||||
public static native void magnify(float x, float y, float factor);
|
public static native void magnify(float x, float y, float factor);
|
||||||
|
|
||||||
|
@ -433,7 +433,7 @@ public class GodotInputHandler implements InputManager.InputDeviceListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isMouseEvent(int eventSource) {
|
private static boolean isMouseEvent(int eventSource) {
|
||||||
boolean mouseSource = ((eventSource & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) || ((eventSource & (InputDevice.SOURCE_TOUCHSCREEN | InputDevice.SOURCE_STYLUS)) == InputDevice.SOURCE_STYLUS);
|
boolean mouseSource = ((eventSource & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) || ((eventSource & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS);
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
mouseSource = mouseSource || ((eventSource & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE);
|
mouseSource = mouseSource || ((eventSource & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE);
|
||||||
}
|
}
|
||||||
@ -470,13 +470,27 @@ public class GodotInputHandler implements InputManager.InputDeviceListener {
|
|||||||
final float y = event.getY();
|
final float y = event.getY();
|
||||||
final int buttonsMask = event.getButtonState();
|
final int buttonsMask = event.getButtonState();
|
||||||
|
|
||||||
|
final float pressure = event.getPressure();
|
||||||
|
|
||||||
|
// Orientation is returned as a radian value between 0 to pi clockwise or 0 to -pi counterclockwise.
|
||||||
|
final float orientation = event.getOrientation();
|
||||||
|
|
||||||
|
// Tilt is zero is perpendicular to the screen and pi/2 is flat on the surface.
|
||||||
|
final float tilt = event.getAxisValue(MotionEvent.AXIS_TILT);
|
||||||
|
|
||||||
|
float tiltMult = (float)Math.sin(tilt);
|
||||||
|
|
||||||
|
// To be consistent with expected tilt.
|
||||||
|
final float tiltX = (float)-Math.sin(orientation) * tiltMult;
|
||||||
|
final float tiltY = (float)Math.cos(orientation) * tiltMult;
|
||||||
|
|
||||||
final float verticalFactor = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
|
final float verticalFactor = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
|
||||||
final float horizontalFactor = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
|
final float horizontalFactor = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
|
||||||
boolean sourceMouseRelative = false;
|
boolean sourceMouseRelative = false;
|
||||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
||||||
sourceMouseRelative = event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE);
|
sourceMouseRelative = event.isFromSource(InputDevice.SOURCE_MOUSE_RELATIVE);
|
||||||
}
|
}
|
||||||
return handleMouseEvent(eventAction, buttonsMask, x, y, horizontalFactor, verticalFactor, false, sourceMouseRelative);
|
return handleMouseEvent(eventAction, buttonsMask, x, y, horizontalFactor, verticalFactor, false, sourceMouseRelative, pressure, tiltX, tiltY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y) {
|
static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y) {
|
||||||
@ -484,6 +498,10 @@ public class GodotInputHandler implements InputManager.InputDeviceListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y, float deltaX, float deltaY, boolean doubleClick, boolean sourceMouseRelative) {
|
static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y, float deltaX, float deltaY, boolean doubleClick, boolean sourceMouseRelative) {
|
||||||
|
return handleMouseEvent(eventAction, buttonsMask, x, y, deltaX, deltaY, doubleClick, sourceMouseRelative, 1, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean handleMouseEvent(int eventAction, int buttonsMask, float x, float y, float deltaX, float deltaY, boolean doubleClick, boolean sourceMouseRelative, float pressure, float tiltX, float tiltY) {
|
||||||
// Fix the buttonsMask
|
// Fix the buttonsMask
|
||||||
switch (eventAction) {
|
switch (eventAction) {
|
||||||
case MotionEvent.ACTION_CANCEL:
|
case MotionEvent.ACTION_CANCEL:
|
||||||
@ -511,7 +529,7 @@ public class GodotInputHandler implements InputManager.InputDeviceListener {
|
|||||||
case MotionEvent.ACTION_HOVER_MOVE:
|
case MotionEvent.ACTION_HOVER_MOVE:
|
||||||
case MotionEvent.ACTION_MOVE:
|
case MotionEvent.ACTION_MOVE:
|
||||||
case MotionEvent.ACTION_SCROLL: {
|
case MotionEvent.ACTION_SCROLL: {
|
||||||
GodotLib.dispatchMouseEvent(eventAction, buttonsMask, x, y, deltaX, deltaY, doubleClick, sourceMouseRelative);
|
GodotLib.dispatchMouseEvent(eventAction, buttonsMask, x, y, deltaX, deltaY, doubleClick, sourceMouseRelative, pressure, tiltX, tiltY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,12 +274,12 @@ JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Called on the UI thread
|
// Called on the UI thread
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative) {
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative, jfloat p_pressure, jfloat p_tilt_x, jfloat p_tilt_y) {
|
||||||
if (step.get() <= 0) {
|
if (step.get() <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
input_handler->process_mouse_event(p_event_type, p_button_mask, Point2(p_x, p_y), Vector2(p_delta_x, p_delta_y), p_double_click, p_source_mouse_relative);
|
input_handler->process_mouse_event(p_event_type, p_button_mask, Point2(p_x, p_y), Vector2(p_delta_x, p_delta_y), p_double_click, p_source_mouse_relative, p_pressure, Vector2(p_tilt_x, p_tilt_y));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called on the UI thread
|
// Called on the UI thread
|
||||||
|
@ -45,7 +45,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *en
|
|||||||
JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jclass clazz);
|
JNIEXPORT jboolean JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jclass clazz);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ttsCallback(JNIEnv *env, jclass clazz, jint event, jint id, jint pos);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ttsCallback(JNIEnv *env, jclass clazz, jint event, jint id, jint pos);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_back(JNIEnv *env, jclass clazz);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_back(JNIEnv *env, jclass clazz);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchMouseEvent(JNIEnv *env, jclass clazz, jint p_event_type, jint p_button_mask, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y, jboolean p_double_click, jboolean p_source_mouse_relative, jfloat p_pressure, jfloat p_tilt_x, jfloat p_tilt_y);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchTouchEvent(JNIEnv *env, jclass clazz, jint ev, jint pointer, jint pointer_count, jfloatArray positions, jboolean p_double_tap);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_dispatchTouchEvent(JNIEnv *env, jclass clazz, jint ev, jint pointer, jint pointer_count, jfloatArray positions, jboolean p_double_tap);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnify(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_factor);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnify(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_factor);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_pan(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_pan(JNIEnv *env, jclass clazz, jfloat p_x, jfloat p_y, jfloat p_delta_x, jfloat p_delta_y);
|
||||||
|
Loading…
Reference in New Issue
Block a user