diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/bind/core_bind.cpp | 20 | ||||
-rw-r--r-- | core/bind/core_bind.h | 8 | ||||
-rw-r--r-- | core/error_macros.h | 20 | ||||
-rw-r--r-- | core/input_map.cpp | 30 | ||||
-rw-r--r-- | core/io/config_file.cpp | 18 | ||||
-rw-r--r-- | core/io/config_file.h | 2 | ||||
-rw-r--r-- | core/io/file_access_pack.cpp | 2 | ||||
-rw-r--r-- | core/io/file_access_pack.h | 2 | ||||
-rw-r--r-- | core/io/resource_format_binary.cpp | 2 | ||||
-rw-r--r-- | core/io/resource_loader.cpp | 1 | ||||
-rw-r--r-- | core/io/resource_loader.h | 2 | ||||
-rw-r--r-- | core/math/rect2.h | 42 | ||||
-rw-r--r-- | core/message_queue.cpp | 5 | ||||
-rw-r--r-- | core/os/dir_access.cpp | 5 | ||||
-rw-r--r-- | core/os/dir_access.h | 3 | ||||
-rw-r--r-- | core/os/input.cpp | 2 | ||||
-rw-r--r-- | core/os/input.h | 2 | ||||
-rw-r--r-- | core/os/input_event.cpp | 78 | ||||
-rw-r--r-- | core/os/input_event.h | 13 | ||||
-rw-r--r-- | core/project_settings.cpp | 30 | ||||
-rw-r--r-- | core/register_core_types.cpp | 2 | ||||
-rw-r--r-- | core/rid_owner.h | 4 | ||||
-rw-r--r-- | core/variant.cpp | 2 | ||||
-rw-r--r-- | core/variant_call.cpp | 4 | ||||
-rw-r--r-- | core/variant_parser.cpp | 10 | ||||
-rw-r--r-- | core/variant_parser.h | 2 |
26 files changed, 189 insertions, 122 deletions
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 202b1b1fe8..264d8d415c 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -1134,15 +1134,17 @@ String _OS::get_system_dir(SystemDir p_dir) const { return OS::get_singleton()->get_system_dir(OS::SystemDir(p_dir)); } -String _OS::get_scancode_string(uint32_t p_code) const { +String _OS::get_keycode_string(uint32_t p_code) const { return keycode_get_string(p_code); } -bool _OS::is_scancode_unicode(uint32_t p_unicode) const { + +bool _OS::is_keycode_unicode(uint32_t p_unicode) const { return keycode_has_unicode(p_unicode); } -int _OS::find_scancode_from_string(const String &p_code) const { + +int _OS::find_keycode_from_string(const String &p_code) const { return find_keycode(p_code); } @@ -1333,9 +1335,9 @@ void _OS::_bind_methods() { ClassDB::bind_method(D_METHOD("native_video_pause"), &_OS::native_video_pause); ClassDB::bind_method(D_METHOD("native_video_unpause"), &_OS::native_video_unpause); - ClassDB::bind_method(D_METHOD("get_scancode_string", "code"), &_OS::get_scancode_string); - ClassDB::bind_method(D_METHOD("is_scancode_unicode", "code"), &_OS::is_scancode_unicode); - ClassDB::bind_method(D_METHOD("find_scancode_from_string", "string"), &_OS::find_scancode_from_string); + ClassDB::bind_method(D_METHOD("get_keycode_string", "code"), &_OS::get_keycode_string); + ClassDB::bind_method(D_METHOD("is_keycode_unicode", "code"), &_OS::is_keycode_unicode); + ClassDB::bind_method(D_METHOD("find_keycode_from_string", "string"), &_OS::find_keycode_from_string); ClassDB::bind_method(D_METHOD("set_use_file_access_save_and_swap", "enabled"), &_OS::set_use_file_access_save_and_swap); @@ -2342,10 +2344,10 @@ Error _Directory::change_dir(String p_dir) { ERR_FAIL_COND_V_MSG(!d, ERR_UNCONFIGURED, "Directory must be opened before use."); return d->change_dir(p_dir); } -String _Directory::get_current_dir() { +String _Directory::get_current_dir(bool p_include_drive) { ERR_FAIL_COND_V_MSG(!d, "", "Directory must be opened before use."); - return d->get_current_dir(); + return d->get_current_dir(p_include_drive); } Error _Directory::make_dir(String p_dir) { @@ -2442,7 +2444,7 @@ void _Directory::_bind_methods() { ClassDB::bind_method(D_METHOD("get_drive", "idx"), &_Directory::get_drive); ClassDB::bind_method(D_METHOD("get_current_drive"), &_Directory::get_current_drive); ClassDB::bind_method(D_METHOD("change_dir", "todir"), &_Directory::change_dir); - ClassDB::bind_method(D_METHOD("get_current_dir"), &_Directory::get_current_dir); + ClassDB::bind_method(D_METHOD("get_current_dir", "include_drive"), &_Directory::get_current_dir, DEFVAL(true)); ClassDB::bind_method(D_METHOD("make_dir", "path"), &_Directory::make_dir); ClassDB::bind_method(D_METHOD("make_dir_recursive", "path"), &_Directory::make_dir_recursive); ClassDB::bind_method(D_METHOD("file_exists", "path"), &_Directory::file_exists); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index d4a7c00629..e7850de744 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -266,9 +266,9 @@ public: String get_unique_id() const; - String get_scancode_string(uint32_t p_code) const; - bool is_scancode_unicode(uint32_t p_unicode) const; - int find_scancode_from_string(const String &p_code) const; + String get_keycode_string(uint32_t p_code) const; + bool is_keycode_unicode(uint32_t p_unicode) const; + int find_keycode_from_string(const String &p_code) const; void set_use_file_access_save_and_swap(bool p_enable); @@ -572,7 +572,7 @@ public: int get_current_drive(); Error change_dir(String p_dir); // Can be relative or absolute, return false on success. - String get_current_dir(); // Return current dir location. + String get_current_dir(bool p_include_drive = true); // Return current dir location. Error make_dir(String p_dir); Error make_dir_recursive(String p_dir); diff --git a/core/error_macros.h b/core/error_macros.h index 4a3ea28957..e4d7609e04 100644 --- a/core/error_macros.h +++ b/core/error_macros.h @@ -502,11 +502,11 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li * * The current function returns `m_retval`. */ -#define ERR_FAIL_V(m_retval) \ - if (1) { \ - _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Method/Function Failed, returning: " __STR(m_value)); \ - return m_retval; \ - } else \ +#define ERR_FAIL_V(m_retval) \ + if (1) { \ + _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Method/Function Failed, returning: " __STR(m_retval)); \ + return m_retval; \ + } else \ ((void)0) /** @@ -515,11 +515,11 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li * * Prints `m_msg`, and the current function returns `m_retval`. */ -#define ERR_FAIL_V_MSG(m_retval, m_msg) \ - if (1) { \ - _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Method/Function Failed, returning: " __STR(m_value), DEBUG_STR(m_msg)); \ - return m_retval; \ - } else \ +#define ERR_FAIL_V_MSG(m_retval, m_msg) \ + if (1) { \ + _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Method/Function Failed, returning: " __STR(m_retval), DEBUG_STR(m_msg)); \ + return m_retval; \ + } else \ ((void)0) /** diff --git a/core/input_map.cpp b/core/input_map.cpp index 36a0e88ae0..b855e14e0d 100644 --- a/core/input_map.cpp +++ b/core/input_map.cpp @@ -256,76 +256,76 @@ void InputMap::load_default() { add_action("ui_accept"); key.instance(); - key->set_scancode(KEY_ENTER); + key->set_keycode(KEY_ENTER); action_add_event("ui_accept", key); key.instance(); - key->set_scancode(KEY_KP_ENTER); + key->set_keycode(KEY_KP_ENTER); action_add_event("ui_accept", key); key.instance(); - key->set_scancode(KEY_SPACE); + key->set_keycode(KEY_SPACE); action_add_event("ui_accept", key); add_action("ui_select"); key.instance(); - key->set_scancode(KEY_SPACE); + key->set_keycode(KEY_SPACE); action_add_event("ui_select", key); add_action("ui_cancel"); key.instance(); - key->set_scancode(KEY_ESCAPE); + key->set_keycode(KEY_ESCAPE); action_add_event("ui_cancel", key); add_action("ui_focus_next"); key.instance(); - key->set_scancode(KEY_TAB); + key->set_keycode(KEY_TAB); action_add_event("ui_focus_next", key); add_action("ui_focus_prev"); key.instance(); - key->set_scancode(KEY_TAB); + key->set_keycode(KEY_TAB); key->set_shift(true); action_add_event("ui_focus_prev", key); add_action("ui_left"); key.instance(); - key->set_scancode(KEY_LEFT); + key->set_keycode(KEY_LEFT); action_add_event("ui_left", key); add_action("ui_right"); key.instance(); - key->set_scancode(KEY_RIGHT); + key->set_keycode(KEY_RIGHT); action_add_event("ui_right", key); add_action("ui_up"); key.instance(); - key->set_scancode(KEY_UP); + key->set_keycode(KEY_UP); action_add_event("ui_up", key); add_action("ui_down"); key.instance(); - key->set_scancode(KEY_DOWN); + key->set_keycode(KEY_DOWN); action_add_event("ui_down", key); add_action("ui_page_up"); key.instance(); - key->set_scancode(KEY_PAGEUP); + key->set_keycode(KEY_PAGEUP); action_add_event("ui_page_up", key); add_action("ui_page_down"); key.instance(); - key->set_scancode(KEY_PAGEDOWN); + key->set_keycode(KEY_PAGEDOWN); action_add_event("ui_page_down", key); add_action("ui_home"); key.instance(); - key->set_scancode(KEY_HOME); + key->set_keycode(KEY_HOME); action_add_event("ui_home", key); add_action("ui_end"); key.instance(); - key->set_scancode(KEY_END); + key->set_keycode(KEY_END); action_add_event("ui_end", key); //set("display/window/handheld/orientation", "landscape"); diff --git a/core/io/config_file.cpp b/core/io/config_file.cpp index b44ac16a87..531467ecd6 100644 --- a/core/io/config_file.cpp +++ b/core/io/config_file.cpp @@ -86,7 +86,8 @@ void ConfigFile::set_value(const String &p_section, const String &p_key, const V Variant ConfigFile::get_value(const String &p_section, const String &p_key, Variant p_default) const { if (!values.has(p_section) || !values[p_section].has(p_key)) { - ERR_FAIL_COND_V_MSG(p_default.get_type() == Variant::NIL, Variant(), "Couldn't find the given section '" + p_section + "', key '" + p_key + "' and no default was given."); + ERR_FAIL_COND_V_MSG(p_default.get_type() == Variant::NIL, Variant(), + vformat("Couldn't find the given section \"%s\" and key \"%s\", and no default was given.", p_section, p_key)); return p_default; } @@ -112,7 +113,7 @@ void ConfigFile::get_sections(List<String> *r_sections) const { } void ConfigFile::get_section_keys(const String &p_section, List<String> *r_keys) const { - ERR_FAIL_COND_MSG(!values.has(p_section), "Cannont get keys from nonexistent section '" + p_section + "'."); + ERR_FAIL_COND_MSG(!values.has(p_section), vformat("Cannot get keys from nonexistent section \"%s\".", p_section)); for (OrderedHashMap<String, Variant>::ConstElement E = values[p_section].front(); E; E = E.next()) { r_keys->push_back(E.key()); @@ -121,12 +122,14 @@ void ConfigFile::get_section_keys(const String &p_section, List<String> *r_keys) void ConfigFile::erase_section(const String &p_section) { + ERR_FAIL_COND_MSG(!values.has(p_section), vformat("Cannot erase nonexistent section \"%s\".", p_section)); values.erase(p_section); } void ConfigFile::erase_section_key(const String &p_section, const String &p_key) { - ERR_FAIL_COND_MSG(!values.has(p_section), "Cannot erase key from nonexistent section '" + p_section + "'."); + ERR_FAIL_COND_MSG(!values.has(p_section), vformat("Cannot erase key \"%s\" from nonexistent section \"%s\".", p_key, p_section)); + ERR_FAIL_COND_MSG(!values[p_section].has(p_key), vformat("Cannot erase nonexistent key \"%s\" from section \"%s\".", p_key, p_section)); values[p_section].erase(p_key); } @@ -291,7 +294,7 @@ Error ConfigFile::_parse(const String &p_path, VariantParser::Stream *p_stream) if (err == ERR_FILE_EOF) { return OK; } else if (err != OK) { - ERR_PRINT("ConfgFile - " + p_path + ":" + itos(lines) + " error: " + error_text + "."); + ERR_PRINT(vformat("ConfigFile parse error at %s:%d: %s.", p_path, lines, error_text)); return err; } @@ -324,11 +327,8 @@ void ConfigFile::_bind_methods() { ClassDB::bind_method(D_METHOD("save", "path"), &ConfigFile::save); ClassDB::bind_method(D_METHOD("load_encrypted", "path", "key"), &ConfigFile::load_encrypted); - ClassDB::bind_method(D_METHOD("load_encrypted_pass", "path", "pass"), &ConfigFile::load_encrypted_pass); + ClassDB::bind_method(D_METHOD("load_encrypted_pass", "path", "password"), &ConfigFile::load_encrypted_pass); ClassDB::bind_method(D_METHOD("save_encrypted", "path", "key"), &ConfigFile::save_encrypted); - ClassDB::bind_method(D_METHOD("save_encrypted_pass", "path", "pass"), &ConfigFile::save_encrypted_pass); -} - -ConfigFile::ConfigFile() { + ClassDB::bind_method(D_METHOD("save_encrypted_pass", "path", "password"), &ConfigFile::save_encrypted_pass); } diff --git a/core/io/config_file.h b/core/io/config_file.h index 150fd24693..7efcb5a04c 100644 --- a/core/io/config_file.h +++ b/core/io/config_file.h @@ -74,8 +74,6 @@ public: Error save_encrypted(const String &p_path, const Vector<uint8_t> &p_key); Error save_encrypted_pass(const String &p_path, const String &p_pass); - - ConfigFile(); }; #endif // CONFIG_FILE_H diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index 83ce03418a..055ce816ad 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -454,7 +454,7 @@ Error DirAccessPack::change_dir(String p_dir) { return OK; } -String DirAccessPack::get_current_dir() { +String DirAccessPack::get_current_dir(bool p_include_drive) { PackedData::PackedDir *pd = current; String p = current->name; diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index b6ea9c158f..e1f35aabdd 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -216,7 +216,7 @@ public: virtual String get_drive(int p_drive); virtual Error change_dir(String p_dir); - virtual String get_current_dir(); + virtual String get_current_dir(bool p_include_drive = true); virtual bool file_exists(String p_file); virtual bool dir_exists(String p_dir); diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index 54b75cc29d..efd452191a 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -1008,7 +1008,9 @@ String ResourceLoaderBinary::recognize(FileAccess *p_f) { ResourceLoaderBinary::ResourceLoaderBinary() : translation_remapped(false), + ver_format(0), f(NULL), + importmd_ofs(0), error(OK) { progress = nullptr; diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp index 504dbe2d63..5dca8b3b89 100644 --- a/core/io/resource_loader.cpp +++ b/core/io/resource_loader.cpp @@ -538,6 +538,7 @@ RES ResourceLoader::load(const String &p_path, const String &p_type_hint, bool p if (r_error) { *r_error = err; } + thread_load_mutex->unlock(); return RES(); } thread_load_mutex->unlock(); diff --git a/core/io/resource_loader.h b/core/io/resource_loader.h index 3b7a27f551..ea89917a5f 100644 --- a/core/io/resource_loader.h +++ b/core/io/resource_loader.h @@ -116,7 +116,7 @@ private: String type_hint; float progress = 0.0; ThreadLoadStatus status = THREAD_LOAD_IN_PROGRESS; - Error error; + Error error = OK; RES resource; bool xl_remapped = false; bool use_sub_threads = false; diff --git a/core/math/rect2.h b/core/math/rect2.h index e4ea615c22..3b9660e2f0 100644 --- a/core/math/rect2.h +++ b/core/math/rect2.h @@ -47,28 +47,26 @@ struct Rect2 { real_t get_area() const { return size.width * size.height; } - inline bool intersects(const Rect2 &p_rect) const { - if (position.x >= (p_rect.position.x + p_rect.size.width)) - return false; - if ((position.x + size.width) <= p_rect.position.x) - return false; - if (position.y >= (p_rect.position.y + p_rect.size.height)) - return false; - if ((position.y + size.height) <= p_rect.position.y) - return false; - - return true; - } - - inline bool intersects_touch(const Rect2 &p_rect) const { - if (position.x > (p_rect.position.x + p_rect.size.width)) - return false; - if ((position.x + size.width) < p_rect.position.x) - return false; - if (position.y > (p_rect.position.y + p_rect.size.height)) - return false; - if ((position.y + size.height) < p_rect.position.y) - return false; + inline bool intersects(const Rect2 &p_rect, const bool p_include_borders = false) const { + if (p_include_borders) { + if (position.x > (p_rect.position.x + p_rect.size.width)) + return false; + if ((position.x + size.width) < p_rect.position.x) + return false; + if (position.y > (p_rect.position.y + p_rect.size.height)) + return false; + if ((position.y + size.height) < p_rect.position.y) + return false; + } else { + if (position.x >= (p_rect.position.x + p_rect.size.width)) + return false; + if ((position.x + size.width) <= p_rect.position.x) + return false; + if (position.y >= (p_rect.position.y + p_rect.size.height)) + return false; + if ((position.y + size.height) <= p_rect.position.y) + return false; + } return true; } diff --git a/core/message_queue.cpp b/core/message_queue.cpp index 235003627e..37207483fe 100644 --- a/core/message_queue.cpp +++ b/core/message_queue.cpp @@ -268,7 +268,10 @@ void MessageQueue::flush() { //using reverse locking strategy _THREAD_SAFE_LOCK_ - ERR_FAIL_COND(flushing); //already flushing, you did something odd + if (flushing) { + _THREAD_SAFE_UNLOCK_ + ERR_FAIL_COND(flushing); //already flushing, you did something odd + } flushing = true; while (read_pos < buffer_end) { diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp index f65fc00077..642c86be2f 100644 --- a/core/os/dir_access.cpp +++ b/core/os/dir_access.cpp @@ -66,6 +66,11 @@ int DirAccess::get_current_drive() { return 0; } +bool DirAccess::drives_are_shortcuts() { + + return false; +} + static Error _erase_recursive(DirAccess *da) { List<String> dirs; diff --git a/core/os/dir_access.h b/core/os/dir_access.h index 55a6d53f72..aac6c67f0a 100644 --- a/core/os/dir_access.h +++ b/core/os/dir_access.h @@ -76,9 +76,10 @@ public: virtual int get_drive_count() = 0; virtual String get_drive(int p_drive) = 0; virtual int get_current_drive(); + virtual bool drives_are_shortcuts(); virtual Error change_dir(String p_dir) = 0; ///< can be relative or absolute, return false on success - virtual String get_current_dir() = 0; ///< return current dir location + virtual String get_current_dir(bool p_include_drive = true) = 0; ///< return current dir location virtual Error make_dir(String p_dir) = 0; virtual Error make_dir_recursive(String p_dir); virtual Error erase_contents_recursive(); //super dangerous, use with care! diff --git a/core/os/input.cpp b/core/os/input.cpp index 6f0392fec9..1768b851df 100644 --- a/core/os/input.cpp +++ b/core/os/input.cpp @@ -57,7 +57,7 @@ Input::MouseMode Input::get_mouse_mode() const { void Input::_bind_methods() { - ClassDB::bind_method(D_METHOD("is_key_pressed", "scancode"), &Input::is_key_pressed); + ClassDB::bind_method(D_METHOD("is_key_pressed", "keycode"), &Input::is_key_pressed); ClassDB::bind_method(D_METHOD("is_mouse_button_pressed", "button"), &Input::is_mouse_button_pressed); ClassDB::bind_method(D_METHOD("is_joy_button_pressed", "device", "button"), &Input::is_joy_button_pressed); ClassDB::bind_method(D_METHOD("is_action_pressed", "action"), &Input::is_action_pressed); diff --git a/core/os/input.h b/core/os/input.h index 8df3b1c5a9..55e0511080 100644 --- a/core/os/input.h +++ b/core/os/input.h @@ -79,7 +79,7 @@ public: static Input *get_singleton(); - virtual bool is_key_pressed(int p_scancode) const = 0; + virtual bool is_key_pressed(int p_keycode) const = 0; virtual bool is_mouse_button_pressed(int p_button) const = 0; virtual bool is_joy_button_pressed(int p_device, int p_button) const = 0; virtual bool is_action_pressed(const StringName &p_action) const = 0; diff --git a/core/os/input_event.cpp b/core/os/input_event.cpp index 3cb9c2c1c2..204a36bf56 100644 --- a/core/os/input_event.cpp +++ b/core/os/input_event.cpp @@ -237,19 +237,31 @@ bool InputEventKey::is_pressed() const { return pressed; } -void InputEventKey::set_scancode(uint32_t p_scancode) { +void InputEventKey::set_keycode(uint32_t p_keycode) { - scancode = p_scancode; + keycode = p_keycode; } -uint32_t InputEventKey::get_scancode() const { - return scancode; +uint32_t InputEventKey::get_keycode() const { + + return keycode; +} + +void InputEventKey::set_physical_keycode(uint32_t p_keycode) { + + physical_keycode = p_keycode; +} + +uint32_t InputEventKey::get_physical_keycode() const { + + return physical_keycode; } void InputEventKey::set_unicode(uint32_t p_unicode) { unicode = p_unicode; } + uint32_t InputEventKey::get_unicode() const { return unicode; @@ -259,14 +271,30 @@ void InputEventKey::set_echo(bool p_enable) { echo = p_enable; } + bool InputEventKey::is_echo() const { return echo; } -uint32_t InputEventKey::get_scancode_with_modifiers() const { +uint32_t InputEventKey::get_keycode_with_modifiers() const { - uint32_t sc = scancode; + uint32_t sc = keycode; + if (get_control()) + sc |= KEY_MASK_CTRL; + if (get_alt()) + sc |= KEY_MASK_ALT; + if (get_shift()) + sc |= KEY_MASK_SHIFT; + if (get_metakey()) + sc |= KEY_MASK_META; + + return sc; +} + +uint32_t InputEventKey::get_physical_keycode_with_modifiers() const { + + uint32_t sc = physical_keycode; if (get_control()) sc |= KEY_MASK_CTRL; if (get_alt()) @@ -281,7 +309,7 @@ uint32_t InputEventKey::get_scancode_with_modifiers() const { String InputEventKey::as_text() const { - String kc = keycode_get_string(scancode); + String kc = keycode_get_string(keycode); if (kc == String()) return kc; @@ -306,10 +334,18 @@ bool InputEventKey::action_match(const Ref<InputEvent> &p_event, bool *p_pressed if (key.is_null()) return false; - uint32_t code = get_scancode_with_modifiers(); - uint32_t event_code = key->get_scancode_with_modifiers(); + bool match = false; + if (get_keycode() == 0) { + uint32_t code = get_physical_keycode_with_modifiers(); + uint32_t event_code = key->get_physical_keycode_with_modifiers(); - bool match = get_scancode() == key->get_scancode() && (!key->is_pressed() || (code & event_code) == code); + match = get_physical_keycode() == key->get_physical_keycode() && (!key->is_pressed() || (code & event_code) == code); + } else { + uint32_t code = get_keycode_with_modifiers(); + uint32_t event_code = key->get_keycode_with_modifiers(); + + match = get_keycode() == key->get_keycode() && (!key->is_pressed() || (code & event_code) == code); + } if (match) { if (p_pressed != NULL) *p_pressed = key->is_pressed(); @@ -325,8 +361,8 @@ bool InputEventKey::shortcut_match(const Ref<InputEvent> &p_event) const { if (key.is_null()) return false; - uint32_t code = get_scancode_with_modifiers(); - uint32_t event_code = key->get_scancode_with_modifiers(); + uint32_t code = get_keycode_with_modifiers(); + uint32_t event_code = key->get_keycode_with_modifiers(); return code == event_code; } @@ -335,26 +371,32 @@ void InputEventKey::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pressed", "pressed"), &InputEventKey::set_pressed); - ClassDB::bind_method(D_METHOD("set_scancode", "scancode"), &InputEventKey::set_scancode); - ClassDB::bind_method(D_METHOD("get_scancode"), &InputEventKey::get_scancode); + ClassDB::bind_method(D_METHOD("set_keycode", "keycode"), &InputEventKey::set_keycode); + ClassDB::bind_method(D_METHOD("get_keycode"), &InputEventKey::get_keycode); + + ClassDB::bind_method(D_METHOD("set_physical_keycode", "physical_keycode"), &InputEventKey::set_physical_keycode); + ClassDB::bind_method(D_METHOD("get_physical_keycode"), &InputEventKey::get_physical_keycode); ClassDB::bind_method(D_METHOD("set_unicode", "unicode"), &InputEventKey::set_unicode); ClassDB::bind_method(D_METHOD("get_unicode"), &InputEventKey::get_unicode); ClassDB::bind_method(D_METHOD("set_echo", "echo"), &InputEventKey::set_echo); - ClassDB::bind_method(D_METHOD("get_scancode_with_modifiers"), &InputEventKey::get_scancode_with_modifiers); + ClassDB::bind_method(D_METHOD("get_keycode_with_modifiers"), &InputEventKey::get_keycode_with_modifiers); + ClassDB::bind_method(D_METHOD("get_physical_keycode_with_modifiers"), &InputEventKey::get_physical_keycode_with_modifiers); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "pressed"), "set_pressed", "is_pressed"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "scancode"), "set_scancode", "get_scancode"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "keycode"), "set_keycode", "get_keycode"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "physical_keycode"), "set_physical_keycode", "get_physical_keycode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "unicode"), "set_unicode", "get_unicode"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "echo"), "set_echo", "is_echo"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "echo"), "set_echo", "is_echo"); } InputEventKey::InputEventKey() { pressed = false; - scancode = 0; + keycode = 0; + physical_keycode = 0; unicode = 0; ///unicode echo = false; } diff --git a/core/os/input_event.h b/core/os/input_event.h index c6b04bcfa5..c105fcd1c1 100644 --- a/core/os/input_event.h +++ b/core/os/input_event.h @@ -256,7 +256,8 @@ class InputEventKey : public InputEventWithModifiers { bool pressed; /// otherwise release - uint32_t scancode; ///< check keyboard.h , KeyCode enum, without modifier masks + uint32_t keycode; ///< check keyboard.h , KeyCode enum, without modifier masks + uint32_t physical_keycode; uint32_t unicode; ///unicode bool echo; /// true if this is an echo key @@ -268,8 +269,11 @@ public: void set_pressed(bool p_pressed); virtual bool is_pressed() const; - void set_scancode(uint32_t p_scancode); - uint32_t get_scancode() const; + void set_keycode(uint32_t p_keycode); + uint32_t get_keycode() const; + + void set_physical_keycode(uint32_t p_keycode); + uint32_t get_physical_keycode() const; void set_unicode(uint32_t p_unicode); uint32_t get_unicode() const; @@ -277,7 +281,8 @@ public: void set_echo(bool p_enable); virtual bool is_echo() const; - uint32_t get_scancode_with_modifiers() const; + uint32_t get_keycode_with_modifiers() const; + uint32_t get_physical_keycode_with_modifiers() const; virtual bool action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float p_deadzone) const; virtual bool shortcut_match(const Ref<InputEvent> &p_event) const; diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 90487bda0d..cf6b0471ec 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -1039,13 +1039,13 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_ENTER); + key->set_keycode(KEY_ENTER); events.push_back(key); key.instance(); - key->set_scancode(KEY_KP_ENTER); + key->set_keycode(KEY_KP_ENTER); events.push_back(key); key.instance(); - key->set_scancode(KEY_SPACE); + key->set_keycode(KEY_SPACE); events.push_back(key); joyb.instance(); joyb->set_button_index(JOY_BUTTON_0); @@ -1058,7 +1058,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_SPACE); + key->set_keycode(KEY_SPACE); events.push_back(key); joyb.instance(); joyb->set_button_index(JOY_BUTTON_3); @@ -1071,7 +1071,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_ESCAPE); + key->set_keycode(KEY_ESCAPE); events.push_back(key); joyb.instance(); joyb->set_button_index(JOY_BUTTON_1); @@ -1084,7 +1084,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_TAB); + key->set_keycode(KEY_TAB); events.push_back(key); action["events"] = events; GLOBAL_DEF("input/ui_focus_next", action); @@ -1094,7 +1094,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_TAB); + key->set_keycode(KEY_TAB); key->set_shift(true); events.push_back(key); action["events"] = events; @@ -1105,7 +1105,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_LEFT); + key->set_keycode(KEY_LEFT); events.push_back(key); joyb.instance(); joyb->set_button_index(JOY_DPAD_LEFT); @@ -1118,7 +1118,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_RIGHT); + key->set_keycode(KEY_RIGHT); events.push_back(key); joyb.instance(); joyb->set_button_index(JOY_DPAD_RIGHT); @@ -1131,7 +1131,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_UP); + key->set_keycode(KEY_UP); events.push_back(key); joyb.instance(); joyb->set_button_index(JOY_DPAD_UP); @@ -1144,7 +1144,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_DOWN); + key->set_keycode(KEY_DOWN); events.push_back(key); joyb.instance(); joyb->set_button_index(JOY_DPAD_DOWN); @@ -1157,7 +1157,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_PAGEUP); + key->set_keycode(KEY_PAGEUP); events.push_back(key); action["events"] = events; GLOBAL_DEF("input/ui_page_up", action); @@ -1167,7 +1167,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_PAGEDOWN); + key->set_keycode(KEY_PAGEDOWN); events.push_back(key); action["events"] = events; GLOBAL_DEF("input/ui_page_down", action); @@ -1177,7 +1177,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_HOME); + key->set_keycode(KEY_HOME); events.push_back(key); action["events"] = events; GLOBAL_DEF("input/ui_home", action); @@ -1187,7 +1187,7 @@ ProjectSettings::ProjectSettings() { action["deadzone"] = Variant(0.5f); events = Array(); key.instance(); - key->set_scancode(KEY_END); + key->set_keycode(KEY_END); events.push_back(key); action["events"] = events; GLOBAL_DEF("input/ui_end", action); diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index 07a252ad31..b0ba8ed194 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -100,7 +100,7 @@ extern void unregister_variant_methods(); void register_core_types() { //consistency check - ERR_FAIL_COND(sizeof(Callable) > 16); + static_assert(sizeof(Callable) <= 16); ObjectDB::setup(); ResourceCache::setup(); diff --git a/core/rid_owner.h b/core/rid_owner.h index bd01eba17d..5c8c48a4cb 100644 --- a/core/rid_owner.h +++ b/core/rid_owner.h @@ -298,7 +298,11 @@ public: if (description) { print_error("ERROR: " + itos(alloc_count) + " RID allocations of type '" + description + "' were leaked at exit."); } else { +#ifdef NO_SAFE_CAST + print_error("ERROR: " + itos(alloc_count) + " RID allocations of type 'unknown' were leaked at exit."); +#else print_error("ERROR: " + itos(alloc_count) + " RID allocations of type '" + typeid(T).name() + "' were leaked at exit."); +#endif } for (size_t i = 0; i < max_alloc; i++) { diff --git a/core/variant.cpp b/core/variant.cpp index 7bdaab8fa8..550974363b 100644 --- a/core/variant.cpp +++ b/core/variant.cpp @@ -2490,7 +2490,7 @@ Variant::operator Vector<Variant>() const { variants.resize(va_size); Variant *w = variants.ptrw(); for (int i = 0; i < va_size; i++) - w[i] = variants[i]; + w[i] = va[i]; return variants; } diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 9cc08b54e6..99cfc7ed3c 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -391,7 +391,7 @@ struct _VariantCall { VCALL_LOCALMEM0R(Rect2, has_no_area); VCALL_LOCALMEM1R(Rect2, has_point); VCALL_LOCALMEM1R(Rect2, is_equal_approx); - VCALL_LOCALMEM1R(Rect2, intersects); + VCALL_LOCALMEM2R(Rect2, intersects); VCALL_LOCALMEM1R(Rect2, encloses); VCALL_LOCALMEM1R(Rect2, clip); VCALL_LOCALMEM1R(Rect2, merge); @@ -1834,7 +1834,7 @@ void register_variant_methods() { ADDFUNC0R(RECT2, BOOL, Rect2, has_no_area, varray()); ADDFUNC1R(RECT2, BOOL, Rect2, has_point, VECTOR2, "point", varray()); ADDFUNC1R(RECT2, BOOL, Rect2, is_equal_approx, RECT2, "rect", varray()); - ADDFUNC1R(RECT2, BOOL, Rect2, intersects, RECT2, "b", varray()); + ADDFUNC2R(RECT2, BOOL, Rect2, intersects, RECT2, "b", BOOL, "include_borders", varray(false)); ADDFUNC1R(RECT2, BOOL, Rect2, encloses, RECT2, "b", varray()); ADDFUNC1R(RECT2, RECT2, Rect2, clip, RECT2, "b", varray()); ADDFUNC1R(RECT2, RECT2, Rect2, merge, RECT2, "b", varray()); diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp index 12fd9976bd..d2ee0b71c9 100644 --- a/core/variant_parser.cpp +++ b/core/variant_parser.cpp @@ -532,6 +532,10 @@ Error VariantParser::parse_value(Token &token, Variant &value, Stream *p_stream, value = false; else if (id == "null" || id == "nil") value = Variant(); + else if (id == "inf") + value = Math_INF; + else if (id == "nan") + value = Math_NAN; else if (id == "Vector2") { Vector<float> args; @@ -1499,8 +1503,10 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str case Variant::FLOAT: { String s = rtosfix(p_variant.operator real_t()); - if (s.find(".") == -1 && s.find("e") == -1) - s += ".0"; + if (s != "inf" && s != "nan") { + if (s.find(".") == -1 && s.find("e") == -1) + s += ".0"; + } p_store_string_func(p_store_string_ud, s); } break; case Variant::STRING: { diff --git a/core/variant_parser.h b/core/variant_parser.h index ad0a4d6682..d50842145c 100644 --- a/core/variant_parser.h +++ b/core/variant_parser.h @@ -77,7 +77,7 @@ public: struct ResourceParser { - void *userdata; + void *userdata = nullptr; ParseResourceFunc func; ParseResourceFunc ext_func; ParseResourceFunc sub_func; |