diff options
-rw-r--r-- | platform/javascript/javascript_main.cpp | 72 | ||||
-rw-r--r-- | platform/javascript/os_javascript.cpp | 133 | ||||
-rw-r--r-- | platform/javascript/os_javascript.h | 1 |
3 files changed, 113 insertions, 93 deletions
diff --git a/platform/javascript/javascript_main.cpp b/platform/javascript/javascript_main.cpp index ff29c21b1c..e122bb2e4d 100644 --- a/platform/javascript/javascript_main.cpp +++ b/platform/javascript/javascript_main.cpp @@ -43,74 +43,6 @@ static void _gfx_init(void *ud, bool gl2, int w, int h, bool fs) { glutCreateWindow("godot"); } -static uint32_t _mouse_button_mask = 0; - -static void _glut_mouse_button(int button, int state, int x, int y) { - - InputEvent ev; - ev.type = InputEvent::MOUSE_BUTTON; - switch (button) { - case GLUT_LEFT_BUTTON: ev.mouse_button.button_index = BUTTON_LEFT; break; - case GLUT_MIDDLE_BUTTON: ev.mouse_button.button_index = BUTTON_MIDDLE; break; - case GLUT_RIGHT_BUTTON: ev.mouse_button.button_index = BUTTON_RIGHT; break; - case 3: ev.mouse_button.button_index = BUTTON_WHEEL_UP; break; - case 4: ev.mouse_button.button_index = BUTTON_WHEEL_DOWN; break; - } - - ev.mouse_button.pressed = state == GLUT_DOWN; - ev.mouse_button.x = x; - ev.mouse_button.y = y; - ev.mouse_button.global_x = x; - ev.mouse_button.global_y = y; - - if (ev.mouse_button.button_index < 4) { - if (ev.mouse_button.pressed) { - _mouse_button_mask |= 1 << (ev.mouse_button.button_index - 1); - } else { - _mouse_button_mask &= ~(1 << (ev.mouse_button.button_index - 1)); - } - } - ev.mouse_button.button_mask = _mouse_button_mask; - - uint32_t m = glutGetModifiers(); - ev.mouse_button.mod.alt = (m & GLUT_ACTIVE_ALT) != 0; - ev.mouse_button.mod.shift = (m & GLUT_ACTIVE_SHIFT) != 0; - ev.mouse_button.mod.control = (m & GLUT_ACTIVE_CTRL) != 0; - - os->push_input(ev); - - if (ev.mouse_button.button_index == BUTTON_WHEEL_UP || ev.mouse_button.button_index == BUTTON_WHEEL_DOWN) { - // GLUT doesn't send release events for mouse wheel, so send manually - ev.mouse_button.pressed = false; - os->push_input(ev); - } -} - -static int _glut_prev_x = 0; -static int _glut_prev_y = 0; - -static void _glut_mouse_motion(int x, int y) { - - InputEvent ev; - ev.type = InputEvent::MOUSE_MOTION; - ev.mouse_motion.button_mask = _mouse_button_mask; - ev.mouse_motion.x = x; - ev.mouse_motion.y = y; - ev.mouse_motion.global_x = x; - ev.mouse_motion.global_y = y; - ev.mouse_motion.relative_x = x - _glut_prev_x; - ev.mouse_motion.relative_y = y - _glut_prev_y; - _glut_prev_x = x; - _glut_prev_y = y; - - uint32_t m = glutGetModifiers(); - ev.mouse_motion.mod.alt = (m & GLUT_ACTIVE_ALT) != 0; - ev.mouse_motion.mod.shift = (m & GLUT_ACTIVE_SHIFT) != 0; - ev.mouse_motion.mod.control = (m & GLUT_ACTIVE_CTRL) != 0; - - os->push_input(ev); -} - static void _gfx_idle() { glutPostRedisplay(); @@ -152,10 +84,6 @@ int main(int argc, char *argv[]) { ResourceLoader::set_abort_on_missing_resources(false); //ease up compatibility - glutMouseFunc(_glut_mouse_button); - glutMotionFunc(_glut_mouse_motion); - glutPassiveMotionFunc(_glut_mouse_motion); - /* Set up glut callback functions */ glutIdleFunc(_gfx_idle); // glutReshapeFunc(gears_reshape); diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index 71754502cb..45e77bc288 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -41,6 +41,21 @@ #include <emscripten.h> #include <stdlib.h> +#define DOM_BUTTON_LEFT 0 +#define DOM_BUTTON_MIDDLE 1 +#define DOM_BUTTON_RIGHT 2 + +template <typename T> +static InputModifierState dom2godot_mod(T emscripten_event_ptr) { + + InputModifierState mod; + mod.shift = emscripten_event_ptr->shiftKey; + mod.alt = emscripten_event_ptr->altKey; + mod.control = emscripten_event_ptr->ctrlKey; + mod.meta = emscripten_event_ptr->metaKey; + return mod; +} + int OS_JavaScript::get_video_driver_count() const { return 1; @@ -130,15 +145,100 @@ static EM_BOOL _fullscreen_change_callback(int event_type, const EmscriptenFulls return false; } +static InputDefault* _input; + +static EM_BOOL _mousebutton_callback(int event_type, const EmscriptenMouseEvent *mouse_event, void *user_data) { + + ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_MOUSEDOWN && event_type != EMSCRIPTEN_EVENT_MOUSEUP, false); + + InputEvent ev; + ev.type = InputEvent::MOUSE_BUTTON; + ev.mouse_button.pressed = event_type == EMSCRIPTEN_EVENT_MOUSEDOWN; + ev.mouse_button.global_x = ev.mouse_button.x = mouse_event->canvasX; + ev.mouse_button.global_y = ev.mouse_button.y = mouse_event->canvasY; + ev.mouse_button.mod = dom2godot_mod(mouse_event); + + switch (mouse_event->button) { + case DOM_BUTTON_LEFT: ev.mouse_button.button_index = BUTTON_LEFT; break; + case DOM_BUTTON_MIDDLE: ev.mouse_button.button_index = BUTTON_MIDDLE; break; + case DOM_BUTTON_RIGHT: ev.mouse_button.button_index = BUTTON_RIGHT; break; + default: return false; + } + + ev.mouse_button.button_mask = _input->get_mouse_button_mask(); + if (ev.mouse_button.pressed) + ev.mouse_button.button_mask |= 1 << ev.mouse_button.button_index; + else + ev.mouse_button.button_mask &= ~(1 << ev.mouse_button.button_index); + ev.mouse_button.button_mask >>= 1; + + _input->parse_input_event(ev); + return true; +} + +static EM_BOOL _mousemove_callback(int event_type, const EmscriptenMouseEvent *mouse_event, void *user_data) { + + ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_MOUSEMOVE, false); + + InputEvent ev; + ev.type = InputEvent::MOUSE_MOTION; + ev.mouse_motion.mod = dom2godot_mod(mouse_event); + ev.mouse_motion.button_mask = _input->get_mouse_button_mask() >> 1; + + ev.mouse_motion.global_x = ev.mouse_motion.x = mouse_event->canvasX; + ev.mouse_motion.global_y = ev.mouse_motion.y = mouse_event->canvasY; + + ev.mouse_motion.relative_x = _input->get_mouse_position().x - ev.mouse_motion.x; + ev.mouse_motion.relative_y = _input->get_mouse_position().y - ev.mouse_motion.y; + + _input->set_mouse_position(Point2(ev.mouse_motion.x, ev.mouse_motion.y)); + ev.mouse_motion.speed_x = _input->get_last_mouse_speed().x; + ev.mouse_motion.speed_y = _input->get_last_mouse_speed().y; + + _input->parse_input_event(ev); + return true; +} + +static EM_BOOL _wheel_callback(int event_type, const EmscriptenWheelEvent *wheel_event, void *user_data) { + + ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_WHEEL, false); + + InputEvent ev; + ev.type = InputEvent::MOUSE_BUTTON; + ev.mouse_button.button_mask = _input->get_mouse_button_mask() >> 1; + ev.mouse_button.global_x = ev.mouse_button.x = _input->get_mouse_position().x; + ev.mouse_button.global_y = ev.mouse_button.y = _input->get_mouse_position().y; + ev.mouse_button.mod.shift = _input->is_key_pressed(KEY_SHIFT); + ev.mouse_button.mod.alt = _input->is_key_pressed(KEY_ALT); + ev.mouse_button.mod.control = _input->is_key_pressed(KEY_CONTROL); + ev.mouse_button.mod.meta = _input->is_key_pressed(KEY_META); + + if (wheel_event->deltaY < 0) + ev.mouse_button.button_index = BUTTON_WHEEL_UP; + else if (wheel_event->deltaY > 0) + ev.mouse_button.button_index = BUTTON_WHEEL_DOWN; + else if (wheel_event->deltaX > 0) + ev.mouse_button.button_index = BUTTON_WHEEL_LEFT; + else if (wheel_event->deltaX < 0) + ev.mouse_button.button_index = BUTTON_WHEEL_RIGHT; + else + return false; + + ev.mouse_button.pressed = true; + _input->parse_input_event(ev); + + ev.mouse_button.pressed = false; + _input->parse_input_event(ev); + + return true; +} + static InputEvent _setup_key_event(const EmscriptenKeyboardEvent *emscripten_event) { InputEvent ev; ev.type = InputEvent::KEY; ev.key.echo = emscripten_event->repeat; - ev.key.mod.alt = emscripten_event->altKey; - ev.key.mod.shift = emscripten_event->shiftKey; - ev.key.mod.control = emscripten_event->ctrlKey; - ev.key.mod.meta = emscripten_event->metaKey; + ev.key.mod = dom2godot_mod(emscripten_event); ev.key.scancode = dom2godot_scancode(emscripten_event->keyCode); String unicode = String::utf8(emscripten_event->key); @@ -167,7 +267,7 @@ static EM_BOOL _keydown_callback(int event_type, const EmscriptenKeyboardEvent * deferred_key_event = ev; return false; // do not suppress keypress event } - static_cast<OS_JavaScript *>(user_data)->push_input(ev); + _input->parse_input_event(ev); return true; } @@ -176,7 +276,7 @@ static EM_BOOL _keypress_callback(int event_type, const EmscriptenKeyboardEvent ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_KEYPRESS, false); deferred_key_event.key.unicode = key_event->charCode; - static_cast<OS_JavaScript *>(user_data)->push_input(deferred_key_event); + _input->parse_input_event(deferred_key_event); return true; } @@ -186,7 +286,7 @@ static EM_BOOL _keyup_callback(int event_type, const EmscriptenKeyboardEvent *ke InputEvent ev = _setup_key_event(key_event); ev.key.pressed = false; - static_cast<OS_JavaScript *>(user_data)->push_input(ev); + _input->parse_input_event(ev); return ev.key.scancode != KEY_UNKNOWN && ev.key.scancode != 0; } @@ -257,6 +357,7 @@ void OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver, i physics_2d_server->init(); input = memnew(InputDefault); + _input = input; power_manager = memnew(PowerJavascript); @@ -271,6 +372,10 @@ void OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver, i EM_CHECK(ev) EMSCRIPTEN_RESULT result; + SET_EM_CALLBACK(mousemove, _mousemove_callback) + SET_EM_CALLBACK(mousedown, _mousebutton_callback) + SET_EM_CALLBACK(mouseup, _mousebutton_callback) + SET_EM_CALLBACK(wheel, _wheel_callback) SET_EM_CALLBACK(keydown, _keydown_callback) SET_EM_CALLBACK(keypress, _keypress_callback) SET_EM_CALLBACK(keyup, _keyup_callback) @@ -339,7 +444,7 @@ Point2 OS_JavaScript::get_mouse_position() const { int OS_JavaScript::get_mouse_button_state() const { - return last_button_mask; + return input->get_mouse_button_mask(); } void OS_JavaScript::set_window_title(const String &p_title) { @@ -518,17 +623,6 @@ void OS_JavaScript::main_loop_focusin() { //audio_driver_javascript.set_pause(false); } -void OS_JavaScript::push_input(const InputEvent &p_ev) { - - InputEvent ev = p_ev; - if (ev.type == InputEvent::MOUSE_MOTION) { - input->set_mouse_position(Point2(ev.mouse_motion.x, ev.mouse_motion.y)); - } else if (ev.type == InputEvent::MOUSE_BUTTON) { - last_button_mask = ev.mouse_button.button_mask; - } - input->parse_input_event(p_ev); -} - void OS_JavaScript::process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points) { //print_line("ev: "+itos(p_what)+" pnt: "+itos(p_pointer)+" pointc: "+itos(p_points.size())); @@ -833,7 +927,6 @@ OS_JavaScript::OS_JavaScript(const char *p_execpath, GFXInitFunc p_gfx_init_func set_cmdline(p_execpath, get_cmdline_args()); gfx_init_func = p_gfx_init_func; gfx_init_ud = p_gfx_init_ud; - last_button_mask = 0; main_loop = NULL; gl_extensions = NULL; window_maximized = false; diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h index ea906c560f..5d86640d95 100644 --- a/platform/javascript/os_javascript.h +++ b/platform/javascript/os_javascript.h @@ -58,7 +58,6 @@ public: private: Vector<TouchPos> touch; Point2 last_mouse; - int last_button_mask; GFXInitFunc gfx_init_func; void *gfx_init_ud; |