942 lines
20 KiB
TypeScript
942 lines
20 KiB
TypeScript
|
|
let _input_occupied: bool = false;
|
|
let _input_registered: bool = false;
|
|
|
|
function input_reset() {
|
|
// _input_occupied = false;
|
|
mouse_reset();
|
|
pen_reset();
|
|
keyboard_reset();
|
|
///if WITH_GAMEPAD
|
|
gamepad_reset();
|
|
///end
|
|
}
|
|
|
|
function input_end_frame() {
|
|
mouse_end_frame();
|
|
pen_end_frame();
|
|
keyboard_end_frame();
|
|
///if WITH_GAMEPAD
|
|
gamepad_end_frame();
|
|
///end
|
|
}
|
|
|
|
function input_on_foreground() {
|
|
mouse_reset(); // Reset mouse delta on foreground
|
|
}
|
|
|
|
function input_register() {
|
|
if (_input_registered) {
|
|
return;
|
|
}
|
|
_input_registered = true;
|
|
keyboard_reset();
|
|
mouse_reset();
|
|
///if WITH_GAMEPAD
|
|
gamepad_reset();
|
|
///end
|
|
}
|
|
|
|
let _mouse_buttons: string[] = ["left", "right", "middle", "side1", "side2"];
|
|
let _mouse_buttons_down: bool[] = [false, false, false, false, false];
|
|
let _mouse_buttons_started: bool[] = [false, false, false, false, false];
|
|
let _mouse_buttons_released: bool[] = [false, false, false, false, false];
|
|
let mouse_x: f32 = 0.0;
|
|
let mouse_y: f32 = 0.0;
|
|
let mouse_moved: bool = false;
|
|
let mouse_movement_x: f32 = 0.0;
|
|
let mouse_movement_y: f32 = 0.0;
|
|
let mouse_wheel_delta: f32 = 0.0;
|
|
let mouse_last_x: f32 = -1.0;
|
|
let mouse_last_y: f32 = -1.0;
|
|
|
|
function mouse_end_frame() {
|
|
_mouse_buttons_started[0] = _mouse_buttons_started[1] = _mouse_buttons_started[2] = _mouse_buttons_started[3] = _mouse_buttons_started[4] = false;
|
|
_mouse_buttons_released[0] = _mouse_buttons_released[1] = _mouse_buttons_released[2] = _mouse_buttons_released[3] = _mouse_buttons_released[4] = false;
|
|
mouse_moved = false;
|
|
mouse_movement_x = 0;
|
|
mouse_movement_y = 0;
|
|
mouse_wheel_delta = 0;
|
|
}
|
|
|
|
function mouse_reset() {
|
|
_mouse_buttons_down[0] = _mouse_buttons_down[1] = _mouse_buttons_down[2] = _mouse_buttons_down[3] = _mouse_buttons_down[4] = false;
|
|
mouse_end_frame();
|
|
}
|
|
|
|
function mouse_button_index(button: string): i32 {
|
|
for (let i: i32 = 0; i < _mouse_buttons.length; ++i) {
|
|
if (_mouse_buttons[i] == button) {
|
|
return i;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function mouse_down(button: string = "left"): bool {
|
|
return _mouse_buttons_down[mouse_button_index(button)];
|
|
}
|
|
|
|
function mouse_down_any(): bool {
|
|
return _mouse_buttons_down[0] || _mouse_buttons_down[1] || _mouse_buttons_down[2] || _mouse_buttons_down[3] || _mouse_buttons_down[4];
|
|
}
|
|
|
|
function mouse_started(button: string = "left"): bool {
|
|
return _mouse_buttons_started[mouse_button_index(button)];
|
|
}
|
|
|
|
function mouse_started_any(): bool {
|
|
return _mouse_buttons_started[0] || _mouse_buttons_started[1] || _mouse_buttons_started[2] || _mouse_buttons_started[3] || _mouse_buttons_started[4];
|
|
}
|
|
|
|
function mouse_released(button: string = "left"): bool {
|
|
return _mouse_buttons_released[mouse_button_index(button)];
|
|
}
|
|
|
|
function mouse_down_listener(index: i32, x: i32, y: i32) {
|
|
if (pen_in_use) {
|
|
return;
|
|
}
|
|
|
|
_mouse_buttons_down[index] = true;
|
|
_mouse_buttons_started[index] = true;
|
|
mouse_x = x;
|
|
mouse_y = y;
|
|
///if (arm_android || arm_ios) // For movement delta using touch
|
|
if (index == 0) {
|
|
mouse_last_x = x;
|
|
mouse_last_y = y;
|
|
}
|
|
///end
|
|
}
|
|
|
|
function mouse_up_listener(index: i32, x: i32, y: i32) {
|
|
if (pen_in_use) {
|
|
return;
|
|
}
|
|
|
|
_mouse_buttons_down[index] = false;
|
|
_mouse_buttons_released[index] = true;
|
|
mouse_x = x;
|
|
mouse_y = y;
|
|
}
|
|
|
|
function mouse_move_listener(x: i32, y: i32, movement_x: i32, movement_y: i32) {
|
|
if (mouse_last_x == -1.0 && mouse_last_y == -1.0) { // First frame init
|
|
mouse_last_x = x;
|
|
mouse_last_y = y;
|
|
}
|
|
if (iron_mouse_is_locked()) {
|
|
// Can be called multiple times per frame
|
|
mouse_movement_x += movement_x;
|
|
mouse_movement_y += movement_y;
|
|
}
|
|
else {
|
|
mouse_movement_x += x - mouse_last_x;
|
|
mouse_movement_y += y - mouse_last_y;
|
|
}
|
|
mouse_last_x = x;
|
|
mouse_last_y = y;
|
|
mouse_x = x;
|
|
mouse_y = y;
|
|
mouse_moved = true;
|
|
}
|
|
|
|
function mouse_wheel_listener(delta: i32) {
|
|
mouse_wheel_delta = delta;
|
|
}
|
|
|
|
///if (arm_android || arm_ios)
|
|
function mouse_on_touch_down(index: i32, x: i32, y: i32) {
|
|
if (index == 1) { // Two fingers down - right mouse button
|
|
_mouse_buttons_down[0] = false;
|
|
mouse_down_listener(1, math_floor(mouse_x), math_floor(mouse_y));
|
|
mouse_pinch_started = true;
|
|
mouse_pinch_total = 0.0;
|
|
mouse_pinch_dist = 0.0;
|
|
}
|
|
else if (index == 2) { // Three fingers down - middle mouse button
|
|
_mouse_buttons_down[1] = false;
|
|
mouse_down_listener(2, math_floor(mouse_x), math_floor(mouse_y));
|
|
}
|
|
}
|
|
|
|
function mouse_on_touch_up(index: i32, x: i32, y: i32) {
|
|
if (index == 1) {
|
|
mouse_up_listener(1, math_floor(mouse_x), math_floor(mouse_y));
|
|
}
|
|
else if (index == 2) {
|
|
mouse_up_listener(2, math_floor(mouse_x), math_floor(mouse_y));
|
|
}
|
|
}
|
|
|
|
let mouse_pinch_dist: f32 = 0.0;
|
|
let mouse_pinch_total: f32 = 0.0;
|
|
let mouse_pinch_started: bool = false;
|
|
|
|
function mouse_on_touch_move(index: i32, x: i32, y: i32) {
|
|
// Pinch to zoom - mouse wheel
|
|
if (index == 1) {
|
|
let last_dist: f32 = mouse_pinch_dist;
|
|
let dx: f32 = mouse_x - x;
|
|
let dy: f32 = mouse_y - y;
|
|
mouse_pinch_dist = math_sqrt(dx * dx + dy * dy);
|
|
mouse_pinch_total += last_dist != 0 ? last_dist - mouse_pinch_dist : 0;
|
|
if (!mouse_pinch_started) {
|
|
mouse_wheel_delta = mouse_pinch_total / 10;
|
|
if (mouse_wheel_delta != 0) {
|
|
mouse_pinch_total = 0.0;
|
|
}
|
|
}
|
|
mouse_pinch_started = false;
|
|
}
|
|
}
|
|
///end
|
|
|
|
function mouse_view_x(): f32 {
|
|
return mouse_x - sys_x();
|
|
}
|
|
|
|
function mouse_view_y(): f32 {
|
|
return mouse_y - sys_y();
|
|
}
|
|
|
|
let pen_buttons: string[] = ["tip"];
|
|
let pen_buttons_down: bool[] = [false];
|
|
let pen_buttons_started: bool[] = [false];
|
|
let pen_buttons_released: bool[] = [false];
|
|
let pen_x: f32 = 0.0;
|
|
let pen_y: f32 = 0.0;
|
|
let pen_moved: bool = false;
|
|
let pen_movement_x: f32 = 0.0;
|
|
let pen_movement_y: f32 = 0.0;
|
|
let pen_pressure: f32 = 0.0;
|
|
let pen_connected: bool = false;
|
|
let pen_in_use: bool = false;
|
|
let pen_last_x: f32 = -1.0;
|
|
let pen_last_y: f32 = -1.0;
|
|
|
|
function pen_end_frame() {
|
|
pen_buttons_started[0] = false;
|
|
pen_buttons_released[0] = false;
|
|
pen_moved = false;
|
|
pen_movement_x = 0;
|
|
pen_movement_y = 0;
|
|
pen_in_use = false;
|
|
}
|
|
|
|
function pen_reset() {
|
|
pen_buttons_down[0] = false;
|
|
pen_end_frame();
|
|
}
|
|
|
|
function pen_button_index(button: string): i32 {
|
|
return 0;
|
|
}
|
|
|
|
function pen_down(button: string = "tip"): bool {
|
|
return pen_buttons_down[pen_button_index(button)];
|
|
}
|
|
|
|
function pen_started(button: string = "tip"): bool {
|
|
return pen_buttons_started[pen_button_index(button)];
|
|
}
|
|
|
|
function pen_released(button: string = "tip"): bool {
|
|
return pen_buttons_released[pen_button_index(button)];
|
|
}
|
|
|
|
function pen_down_listener(x: i32, y: i32, pressure: f32) {
|
|
pen_buttons_down[0] = true;
|
|
pen_buttons_started[0] = true;
|
|
pen_x = x;
|
|
pen_y = y;
|
|
pen_pressure = pressure;
|
|
|
|
///if (!arm_android && !arm_ios)
|
|
mouse_down_listener(0, x, y);
|
|
///end
|
|
}
|
|
|
|
function pen_up_listener(x: i32, y: i32, pressure: f32) {
|
|
///if (!arm_android && !arm_ios)
|
|
if (pen_buttons_started[0]) {
|
|
pen_buttons_started[0] = false;
|
|
pen_in_use = true;
|
|
return;
|
|
}
|
|
///end
|
|
|
|
pen_buttons_down[0] = false;
|
|
pen_buttons_released[0] = true;
|
|
pen_x = x;
|
|
pen_y = y;
|
|
pen_pressure = pressure;
|
|
|
|
///if (!arm_android && !arm_ios)
|
|
mouse_up_listener(0, x, y);
|
|
pen_in_use = true; // On pen release, additional mouse down & up events are fired at once - filter those out
|
|
///end
|
|
}
|
|
|
|
function pen_move_listener(x: i32, y: i32, pressure: f32) {
|
|
///if arm_ios
|
|
// Listen to pen hover if no other input is active
|
|
if (!pen_buttons_down[0] && pressure == 0.0) {
|
|
if (!mouse_down_any()) {
|
|
mouse_move_listener(x, y, 0, 0);
|
|
}
|
|
return;
|
|
}
|
|
///end
|
|
|
|
if (pen_last_x == -1.0 && pen_last_y == -1.0) { // First frame init
|
|
pen_last_x = x;
|
|
pen_last_y = y;
|
|
}
|
|
pen_movement_x = x - pen_last_x;
|
|
pen_movement_y = y - pen_last_y;
|
|
pen_last_x = x;
|
|
pen_last_y = y;
|
|
pen_x = x;
|
|
pen_y = y;
|
|
pen_moved = true;
|
|
pen_pressure = pressure;
|
|
pen_connected = true;
|
|
}
|
|
|
|
function pen_view_x(): f32 {
|
|
return pen_x - sys_x();
|
|
}
|
|
|
|
function pen_view_y(): f32 {
|
|
return pen_y - sys_y();
|
|
}
|
|
|
|
let keyboard_keys: string[] = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "space", "backspace", "tab", "enter", "shift", "control", "alt", "win", "escape", "delete", "up", "down", "left", "right", "back", ",", ".", ":", ";", "<", "=", ">", "?", "!", "\"", "#", "$", "%", "&", "_", "(", ")", "*", "|", "{", "}", "[", "]", "~", "`", "/", "\\", "@", "+", "-", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12"];
|
|
let keyboard_keys_down: map_t<string, bool> = map_create();
|
|
let keyboard_keys_started: map_t<string, bool> = map_create();
|
|
let keyboard_keys_released: map_t<string, bool> = map_create();
|
|
let keyboard_keys_frame: string[] = [];
|
|
let keyboard_repeat_key: bool = false;
|
|
let keyboard_repeat_time: f32 = 0.0;
|
|
|
|
function keyboard_end_frame() {
|
|
if (keyboard_keys_frame.length > 0) {
|
|
for (let i: i32 = 0; i < keyboard_keys_frame.length; ++i) {
|
|
let s: string = keyboard_keys_frame[i];
|
|
map_set(keyboard_keys_started, s, false);
|
|
map_set(keyboard_keys_released, s, false);
|
|
}
|
|
array_splice(keyboard_keys_frame, 0, keyboard_keys_frame.length);
|
|
}
|
|
|
|
if (sys_time() - keyboard_repeat_time > 0.05) {
|
|
keyboard_repeat_time = sys_time();
|
|
keyboard_repeat_key = true;
|
|
}
|
|
else {
|
|
keyboard_repeat_key = false;
|
|
}
|
|
}
|
|
|
|
function keyboard_reset() {
|
|
// Use map_t for now..
|
|
for (let i: i32 = 0; i < keyboard_keys.length; ++i) {
|
|
let s: string = keyboard_keys[i];
|
|
map_set(keyboard_keys_down, s, false);
|
|
map_set(keyboard_keys_started, s, false);
|
|
map_set(keyboard_keys_released, s, false);
|
|
}
|
|
keyboard_end_frame();
|
|
}
|
|
|
|
function keyboard_down(key: string): bool {
|
|
return map_get(keyboard_keys_down, key);
|
|
}
|
|
|
|
function keyboard_started(key: string): bool {
|
|
return map_get(keyboard_keys_started, key);
|
|
}
|
|
|
|
function keyboard_started_any(): bool {
|
|
return keyboard_keys_frame.length > 0;
|
|
}
|
|
|
|
function keyboard_released(key: string): bool {
|
|
return map_get(keyboard_keys_released, key);
|
|
}
|
|
|
|
function keyboard_repeat(key: string): bool {
|
|
return map_get(keyboard_keys_started, key) || (keyboard_repeat_key && map_get(keyboard_keys_down, key));
|
|
}
|
|
|
|
function keyboard_key_code(key: key_code_t): string {
|
|
if (key == key_code_t.SPACE) {
|
|
return "space";
|
|
}
|
|
if (key == key_code_t.BACKSPACE) {
|
|
return "backspace";
|
|
}
|
|
if (key == key_code_t.TAB) {
|
|
return "tab";
|
|
}
|
|
if (key == key_code_t.RETURN) {
|
|
return "enter";
|
|
}
|
|
if (key == key_code_t.SHIFT) {
|
|
return "shift";
|
|
}
|
|
if (key == key_code_t.CONTROL) {
|
|
return "control";
|
|
}
|
|
///if arm_macos
|
|
if (key == key_code_t.META) {
|
|
return "control";
|
|
}
|
|
///end
|
|
if (key == key_code_t.ALT) {
|
|
return "alt";
|
|
}
|
|
if (key == key_code_t.WIN) {
|
|
return "win";
|
|
}
|
|
if (key == key_code_t.ESCAPE) {
|
|
return "escape";
|
|
}
|
|
if (key == key_code_t.DELETE) {
|
|
return "delete";
|
|
}
|
|
if (key == key_code_t.UP) {
|
|
return "up";
|
|
}
|
|
if (key == key_code_t.DOWN) {
|
|
return "down";
|
|
}
|
|
if (key == key_code_t.LEFT) {
|
|
return "left";
|
|
}
|
|
if (key == key_code_t.RIGHT) {
|
|
return "right";
|
|
}
|
|
if (key == key_code_t.BACK) {
|
|
return "back";
|
|
}
|
|
if (key == key_code_t.COMMA) {
|
|
return ",";
|
|
}
|
|
if (key == key_code_t.PERIOD) {
|
|
return ".";
|
|
}
|
|
if (key == key_code_t.COLON) {
|
|
return ":";
|
|
}
|
|
if (key == key_code_t.SEMICOLON) {
|
|
return ";";
|
|
}
|
|
if (key == key_code_t.LESS_THAN) {
|
|
return "<";
|
|
}
|
|
if (key == key_code_t.EQUALS) {
|
|
return "=";
|
|
}
|
|
if (key == key_code_t.GREATER_THAN) {
|
|
return ">";
|
|
}
|
|
if (key == key_code_t.QUESTION_MARK) {
|
|
return "?";
|
|
}
|
|
if (key == key_code_t.EXCLAMATION) {
|
|
return "!";
|
|
}
|
|
if (key == key_code_t.DOUBLE_QUOTE) {
|
|
return "\"";
|
|
}
|
|
if (key == key_code_t.HASH) {
|
|
return "#";
|
|
}
|
|
if (key == key_code_t.DOLLAR) {
|
|
return "$";
|
|
}
|
|
if (key == key_code_t.PERCENT) {
|
|
return "%";
|
|
}
|
|
if (key == key_code_t.AMPERSAND) {
|
|
return "&";
|
|
}
|
|
if (key == key_code_t.UNDERSCORE) {
|
|
return "_";
|
|
}
|
|
if (key == key_code_t.OPEN_PAREN) {
|
|
return "(";
|
|
}
|
|
if (key == key_code_t.CLOSE_PAREN) {
|
|
return ")";
|
|
}
|
|
if (key == key_code_t.ASTERISK) {
|
|
return "*";
|
|
}
|
|
if (key == key_code_t.PIPE) {
|
|
return "|";
|
|
}
|
|
if (key == key_code_t.OPEN_CURLY_BRACKET) {
|
|
return "{";
|
|
}
|
|
if (key == key_code_t.CLOSE_CURLY_BRACKET) {
|
|
return "}";
|
|
}
|
|
if (key == key_code_t.OPEN_BRACKET) {
|
|
return "[";
|
|
}
|
|
if (key == key_code_t.CLOSE_BRACKET) {
|
|
return "]";
|
|
}
|
|
if (key == key_code_t.TILDE) {
|
|
return "~";
|
|
}
|
|
if (key == key_code_t.BACK_QUOTE) {
|
|
return "`";
|
|
}
|
|
if (key == key_code_t.SLASH) {
|
|
return "/";
|
|
}
|
|
if (key == key_code_t.BACK_SLASH) {
|
|
return "\\";
|
|
}
|
|
if (key == key_code_t.AT) {
|
|
return "@";
|
|
}
|
|
if (key == key_code_t.ADD) {
|
|
return "+";
|
|
}
|
|
if (key == key_code_t.PLUS) {
|
|
return "+";
|
|
}
|
|
if (key == key_code_t.SUBTRACT) {
|
|
return "-";
|
|
}
|
|
if (key == key_code_t.HYPHEN_MINUS) {
|
|
return "-";
|
|
}
|
|
if (key == key_code_t.MULTIPLY) {
|
|
return "*";
|
|
}
|
|
if (key == key_code_t.DIVIDE) {
|
|
return "/";
|
|
}
|
|
if (key == key_code_t.DECIMAL) {
|
|
return ".";
|
|
}
|
|
if (key == key_code_t.ZERO) {
|
|
return "0";
|
|
}
|
|
if (key == key_code_t.NUMPAD0) {
|
|
return "0";
|
|
}
|
|
if (key == key_code_t.ONE) {
|
|
return "1";
|
|
}
|
|
if (key == key_code_t.NUMPAD1) {
|
|
return "1";
|
|
}
|
|
if (key == key_code_t.TWO) {
|
|
return "2";
|
|
}
|
|
if (key == key_code_t.NUMPAD2) {
|
|
return "2";
|
|
}
|
|
if (key == key_code_t.THREE) {
|
|
return "3";
|
|
}
|
|
if (key == key_code_t.NUMPAD3) {
|
|
return "3";
|
|
}
|
|
if (key == key_code_t.FOUR) {
|
|
return "4";
|
|
}
|
|
if (key == key_code_t.NUMPAD4) {
|
|
return "4";
|
|
}
|
|
if (key == key_code_t.FIVE) {
|
|
return "5";
|
|
}
|
|
if (key == key_code_t.NUMPAD5) {
|
|
return "5";
|
|
}
|
|
if (key == key_code_t.SIX) {
|
|
return "6";
|
|
}
|
|
if (key == key_code_t.NUMPAD6) {
|
|
return "6";
|
|
}
|
|
if (key == key_code_t.SEVEN) {
|
|
return "7";
|
|
}
|
|
if (key == key_code_t.NUMPAD7) {
|
|
return "7";
|
|
}
|
|
if (key == key_code_t.EIGHT) {
|
|
return "8";
|
|
}
|
|
if (key == key_code_t.NUMPAD8) {
|
|
return "8";
|
|
}
|
|
if (key == key_code_t.NINE) {
|
|
return "9";
|
|
}
|
|
if (key == key_code_t.NUMPAD9) {
|
|
return "9";
|
|
}
|
|
if (key == key_code_t.F1) {
|
|
return "f1";
|
|
}
|
|
if (key == key_code_t.F2) {
|
|
return "f2";
|
|
}
|
|
if (key == key_code_t.F3) {
|
|
return "f3";
|
|
}
|
|
if (key == key_code_t.F4) {
|
|
return "f4";
|
|
}
|
|
if (key == key_code_t.F5) {
|
|
return "f5";
|
|
}
|
|
if (key == key_code_t.F6) {
|
|
return "f6";
|
|
}
|
|
if (key == key_code_t.F7) {
|
|
return "f7";
|
|
}
|
|
if (key == key_code_t.F8) {
|
|
return "f8";
|
|
}
|
|
if (key == key_code_t.F9) {
|
|
return "f9";
|
|
}
|
|
if (key == key_code_t.F10) {
|
|
return "f10";
|
|
}
|
|
if (key == key_code_t.F11) {
|
|
return "f11";
|
|
}
|
|
if (key == key_code_t.F12) {
|
|
return "f12";
|
|
}
|
|
return to_lower_case(string_from_char_code(key));
|
|
}
|
|
|
|
function keyboard_down_listener(code: key_code_t) {
|
|
let s: string = keyboard_key_code(code);
|
|
array_push(keyboard_keys_frame, s);
|
|
map_set(keyboard_keys_started, s, true);
|
|
map_set(keyboard_keys_down, s, true);
|
|
keyboard_repeat_time = sys_time() + 0.4;
|
|
|
|
///if arm_android_rmb // Detect right mouse button on Android..
|
|
if (code == key_code_t.BACK) {
|
|
if (!_mouse_buttons_down[1]) {
|
|
mouse_down_listener(1, math_floor(mouse_x), math_floor(mouse_y));
|
|
}
|
|
}
|
|
///end
|
|
}
|
|
|
|
function keyboard_up_listener(code: key_code_t) {
|
|
let s: string = keyboard_key_code(code);
|
|
array_push(keyboard_keys_frame, s);
|
|
map_set(keyboard_keys_released, s, true);
|
|
map_set(keyboard_keys_down, s, false);
|
|
|
|
///if arm_android_rmb
|
|
if (code == key_code_t.BACK) {
|
|
mouse_up_listener(1, math_floor(mouse_x), math_floor(mouse_y));
|
|
}
|
|
///end
|
|
}
|
|
|
|
///if WITH_GAMEPAD
|
|
|
|
let gamepad_buttons_ps: string[] = ["cross", "circle", "square", "triangle", "l1", "r1", "l2", "r2", "share", "options", "l3", "r3", "up", "down", "left", "right", "home", "touchpad"];
|
|
let gamepad_buttons_xbox: string[] = ["a", "b", "x", "y", "l1", "r1", "l2", "r2", "share", "options", "l3", "r3", "up", "down", "left", "right", "home", "touchpad"];
|
|
let gamepad_buttons: string[] = gamepad_buttons_ps;
|
|
let gamepad_raws: gamepad_t[];
|
|
|
|
function gamepad_end_frame() {
|
|
// TODO: check valgrind error
|
|
// for (let i: i32 = 0; i < gamepad_raws.length; ++i) {
|
|
// let g: gamepad_t = gamepad_raws[i];
|
|
// if (g.buttons_frame.length > 0) {
|
|
// for (let j: i32 = 0; j < g.buttons_frame.length; ++j) {
|
|
// let b: i32 = g.buttons_frame[j];
|
|
// g.buttons_started[b] = false;
|
|
// g.buttons_released[b] = false;
|
|
// }
|
|
// array_splice(g.buttons_frame, 0, g.buttons_frame.length);
|
|
// }
|
|
// g.left_stick.moved = false;
|
|
// g.left_stick.movement_x = 0;
|
|
// g.left_stick.movement_y = 0;
|
|
// g.right_stick.moved = false;
|
|
// g.right_stick.movement_x = 0;
|
|
// g.right_stick.movement_y = 0;
|
|
// }
|
|
}
|
|
|
|
function gamepad_stick_create(): gamepad_stick_t {
|
|
let raw: gamepad_stick_t = {};
|
|
raw.x = 0.0;
|
|
raw.y = 0.0;
|
|
raw.last_x = 0.0;
|
|
raw.last_y = 0.0;
|
|
raw.moved = false;
|
|
raw.movement_x = 0.0;
|
|
raw.movement_y = 0.0;
|
|
return raw;
|
|
}
|
|
|
|
function gamepad_create(): gamepad_t {
|
|
let raw: gamepad_t = {};
|
|
raw.buttons_down = [];
|
|
raw.buttons_started = [];
|
|
raw.buttons_released = [];
|
|
raw.buttons_frame = [];
|
|
raw.left_stick = gamepad_stick_create();
|
|
raw.right_stick = gamepad_stick_create();
|
|
return raw;
|
|
}
|
|
|
|
function gamepad_reset() {
|
|
gamepad_raws = [];
|
|
for (let i: i32 = 0; i < 4; ++i) {
|
|
let g: gamepad_t = gamepad_create();
|
|
array_push(gamepad_raws, g);
|
|
for (let i: i32 = 0; i < gamepad_buttons.length; ++i) {
|
|
array_push(g.buttons_down, 0.0);
|
|
array_push(g.buttons_started, false);
|
|
array_push(g.buttons_released, false);
|
|
}
|
|
}
|
|
|
|
gamepad_end_frame();
|
|
}
|
|
|
|
function gamepad_key_code(button: i32): string {
|
|
return gamepad_buttons[button];
|
|
}
|
|
|
|
function gamepad_button_index(button: string): i32 {
|
|
for (let i: i32 = 0; i < gamepad_buttons.length; ++i) {
|
|
if (gamepad_buttons[i] == button) {
|
|
return i;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function gamepad_down(i: i32, button: string): f32 {
|
|
return gamepad_raws[i].buttons_down[gamepad_button_index(button)];
|
|
}
|
|
|
|
function gamepad_started(i: i32, button: string): bool {
|
|
return gamepad_raws[i].buttons_started[gamepad_button_index(button)];
|
|
}
|
|
|
|
function gamepad_released(i: i32, button: string): bool {
|
|
return gamepad_raws[i].buttons_released[gamepad_button_index(button)];
|
|
}
|
|
|
|
function gamepad_axis_listener(i: i32, axis: i32, value: f32) {
|
|
let stick: gamepad_stick_t = axis <= 1 ? gamepad_raws[i].left_stick : gamepad_raws[i].right_stick;
|
|
|
|
if (axis == 0 || axis == 2) { // X
|
|
stick.last_x = stick.x;
|
|
stick.x = value;
|
|
stick.movement_x = stick.x - stick.last_x;
|
|
}
|
|
else if (axis == 1 || axis == 3) { // Y
|
|
stick.last_y = stick.y;
|
|
stick.y = value;
|
|
stick.movement_y = stick.y - stick.last_y;
|
|
}
|
|
stick.moved = true;
|
|
}
|
|
|
|
function gamepad_button_listener(i: i32, button: i32, value: f32) {
|
|
// array_push(gamepad_raws[i].buttons_frame, button);
|
|
|
|
// gamepad_raws[i].buttons_down[button] = value;
|
|
// if (value > 0) {
|
|
// gamepad_raws[i].buttons_started[button] = true; // Will trigger L2/R2 multiple times..
|
|
// }
|
|
// else {
|
|
// gamepad_raws[i].buttons_released[button] = true;
|
|
// }
|
|
}
|
|
|
|
type gamepad_stick_t = {
|
|
x?: f32;
|
|
y?: f32;
|
|
last_x?: f32;
|
|
last_y?: f32;
|
|
moved?: bool;
|
|
movement_x?: f32;
|
|
movement_y?: f32;
|
|
};
|
|
|
|
type gamepad_t = {
|
|
buttons_down?: f32[]; // Intensity 0 - 1
|
|
buttons_started?: bool[];
|
|
buttons_released?: bool[];
|
|
buttons_frame?: i32[];
|
|
left_stick?: gamepad_stick_t;
|
|
right_stick?: gamepad_stick_t;
|
|
};
|
|
|
|
///end
|
|
|
|
enum key_code_t {
|
|
UNKNOWN = 0,
|
|
BACK = 1, // Android
|
|
CANCEL = 3,
|
|
HELP = 6,
|
|
BACKSPACE = 8,
|
|
TAB = 9,
|
|
RETURN = 13,
|
|
SHIFT = 16,
|
|
CONTROL = 17,
|
|
ALT = 18,
|
|
PAUSE = 19,
|
|
CAPS_LOCK = 20,
|
|
ESCAPE = 27,
|
|
SPACE = 32,
|
|
PAGE_UP = 33,
|
|
PAGE_DOWN = 34,
|
|
END = 35,
|
|
HOME = 36,
|
|
LEFT = 37,
|
|
UP = 38,
|
|
RIGHT = 39,
|
|
DOWN = 40,
|
|
PRINT_SCREEN = 44,
|
|
INSERT = 45,
|
|
DELETE = 46,
|
|
ZERO = 48,
|
|
ONE = 49,
|
|
TWO = 50,
|
|
THREE = 51,
|
|
FOUR = 52,
|
|
FIVE = 53,
|
|
SIX = 54,
|
|
SEVEN = 55,
|
|
EIGHT = 56,
|
|
NINE = 57,
|
|
COLON = 58,
|
|
SEMICOLON = 59,
|
|
LESS_THAN = 60,
|
|
EQUALS = 61,
|
|
GREATER_THAN = 62,
|
|
QUESTION_MARK = 63,
|
|
AT = 64,
|
|
A = 65,
|
|
B = 66,
|
|
C = 67,
|
|
D = 68,
|
|
E = 69,
|
|
F = 70,
|
|
G = 71,
|
|
H = 72,
|
|
I = 73,
|
|
J = 74,
|
|
K = 75,
|
|
L = 76,
|
|
M = 77,
|
|
N = 78,
|
|
O = 79,
|
|
P = 80,
|
|
Q = 81,
|
|
R = 82,
|
|
S = 83,
|
|
T = 84,
|
|
U = 85,
|
|
V = 86,
|
|
W = 87,
|
|
X = 88,
|
|
Y = 89,
|
|
Z = 90,
|
|
WIN = 91,
|
|
CONTEXT_MENU = 93,
|
|
SLEEP = 95,
|
|
NUMPAD0 = 96,
|
|
NUMPAD1 = 97,
|
|
NUMPAD2 = 98,
|
|
NUMPAD3 = 99,
|
|
NUMPAD4 = 100,
|
|
NUMPAD5 = 101,
|
|
NUMPAD6 = 102,
|
|
NUMPAD7 = 103,
|
|
NUMPAD8 = 104,
|
|
NUMPAD9 = 105,
|
|
MULTIPLY = 106,
|
|
ADD = 107,
|
|
SEPARATOR = 108,
|
|
SUBTRACT = 109,
|
|
DECIMAL = 110,
|
|
DIVIDE = 111,
|
|
F1 = 112,
|
|
F2 = 113,
|
|
F3 = 114,
|
|
F4 = 115,
|
|
F5 = 116,
|
|
F6 = 117,
|
|
F7 = 118,
|
|
F8 = 119,
|
|
F9 = 120,
|
|
F10 = 121,
|
|
F11 = 122,
|
|
F12 = 123,
|
|
F13 = 124,
|
|
F14 = 125,
|
|
F15 = 126,
|
|
F16 = 127,
|
|
F17 = 128,
|
|
F18 = 129,
|
|
F19 = 130,
|
|
F20 = 131,
|
|
F21 = 132,
|
|
F22 = 133,
|
|
F23 = 134,
|
|
F24 = 135,
|
|
NUM_LOCK = 144,
|
|
SCROLL_LOCK = 145,
|
|
EXCLAMATION = 161,
|
|
DOUBLE_QUOTE = 162,
|
|
HASH = 163,
|
|
DOLLAR = 164,
|
|
PERCENT = 165,
|
|
AMPERSAND = 166,
|
|
UNDERSCORE = 167,
|
|
OPEN_PAREN = 168,
|
|
CLOSE_PAREN = 169,
|
|
ASTERISK = 170,
|
|
PLUS = 171,
|
|
PIPE = 172,
|
|
HYPHEN_MINUS = 173,
|
|
OPEN_CURLY_BRACKET = 174,
|
|
CLOSE_CURLY_BRACKET = 175,
|
|
TILDE = 176,
|
|
VOLUME_MUTE = 181,
|
|
VOLUME_DOWN = 182,
|
|
VOLUME_UP = 183,
|
|
COMMA = 188,
|
|
PERIOD = 190,
|
|
SLASH = 191,
|
|
BACK_QUOTE = 192,
|
|
OPEN_BRACKET = 219,
|
|
BACK_SLASH = 220,
|
|
CLOSE_BRACKET = 221,
|
|
QUOTE = 222,
|
|
META = 224,
|
|
ALTGR = 225,
|
|
}
|