Updating Godot
This commit is contained in:
parent
d6d2ee820d
commit
8a061aefaa
1743 changed files with 155858 additions and 187404 deletions
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/bash -e
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ham'n'Cheese
|
# Ham'n'Cheese
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/bash -e
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ham'n'Cheese
|
# Ham'n'Cheese
|
||||||
|
|
|
@ -23,6 +23,7 @@ debug_symbols="yes"
|
||||||
lto="none"
|
lto="none"
|
||||||
optimize = "size"
|
optimize = "size"
|
||||||
|
|
||||||
|
"""
|
||||||
#disable_3d = "yes"
|
#disable_3d = "yes"
|
||||||
deprecated = "no"
|
deprecated = "no"
|
||||||
module_basis_universal_enabled = "no"
|
module_basis_universal_enabled = "no"
|
||||||
|
@ -57,4 +58,6 @@ module_visual_script_enabled = "no"
|
||||||
module_vorbis_enabled = "no"
|
module_vorbis_enabled = "no"
|
||||||
module_websocket_enabled = "no"
|
module_websocket_enabled = "no"
|
||||||
module_webxr_enabled = "no"
|
module_webxr_enabled = "no"
|
||||||
|
"""
|
||||||
|
|
||||||
custom_modules = "../modules"
|
custom_modules = "../modules"
|
||||||
|
|
|
@ -21,13 +21,3 @@ indent_size = 4
|
||||||
[*.{yml,yaml}]
|
[*.{yml,yaml}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
# GDScript unit test files
|
|
||||||
[*.gd]
|
|
||||||
indent_style = tab
|
|
||||||
indent_size = 4
|
|
||||||
insert_final_newline = true
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
[*.out]
|
|
||||||
insert_final_newline = true
|
|
||||||
|
|
|
@ -63,6 +63,13 @@ Copyright: 2011, Ole Kniemeyer, MAXON, www.maxon.net
|
||||||
2007-2014, Juan Linietsky, Ariel Manzur
|
2007-2014, Juan Linietsky, Ariel Manzur
|
||||||
License: Expat and Zlib
|
License: Expat and Zlib
|
||||||
|
|
||||||
|
Files: ./modules/lightmapper_rd/lm_compute.glsl
|
||||||
|
Comment: Joint Non-Local Means (JNLM) denoiser
|
||||||
|
Copyright: 2020, Manuel Prandini
|
||||||
|
2014-present, Godot Engine contributors
|
||||||
|
2007-2014, Juan Linietsky, Ariel Manzur
|
||||||
|
License: Expat
|
||||||
|
|
||||||
Files: ./platform/android/java/lib/aidl/com/android/*
|
Files: ./platform/android/java/lib/aidl/com/android/*
|
||||||
./platform/android/java/lib/res/layout/status_bar_ongoing_event_progress_bar.xml
|
./platform/android/java/lib/res/layout/status_bar_ongoing_event_progress_bar.xml
|
||||||
./platform/android/java/lib/src/com/google/android/*
|
./platform/android/java/lib/src/com/google/android/*
|
||||||
|
@ -85,6 +92,11 @@ Copyright: 2001, Robert Penner
|
||||||
2007-2014, Juan Linietsky, Ariel Manzur
|
2007-2014, Juan Linietsky, Ariel Manzur
|
||||||
License: Expat
|
License: Expat
|
||||||
|
|
||||||
|
Files: ./servers/physics_2d/godot_joints_2d.cpp
|
||||||
|
Comment: Chipmunk2D Joint Constraints
|
||||||
|
Copyright: 2007, Scott Lembcke
|
||||||
|
License: Expat
|
||||||
|
|
||||||
Files: ./servers/physics_3d/collision_solver_3d_sat.cpp
|
Files: ./servers/physics_3d/collision_solver_3d_sat.cpp
|
||||||
Comment: Open Dynamics Engine
|
Comment: Open Dynamics Engine
|
||||||
Copyright: 2001-2003, Russell L. Smith, Alen Ladavac, Nguyen Binh
|
Copyright: 2001-2003, Russell L. Smith, Alen Ladavac, Nguyen Binh
|
||||||
|
@ -141,6 +153,16 @@ Comment: AMD FidelityFX Super Resolution
|
||||||
Copyright: 2021, Advanced Micro Devices, Inc.
|
Copyright: 2021, Advanced Micro Devices, Inc.
|
||||||
License: Expat
|
License: Expat
|
||||||
|
|
||||||
|
Files: ./thirdparty/amd-fsr2/
|
||||||
|
Comment: AMD FidelityFX Super Resolution 2
|
||||||
|
Copyright: 2022-2023, Advanced Micro Devices, Inc.
|
||||||
|
License: Expat
|
||||||
|
|
||||||
|
Files: ./thirdparty/angle/
|
||||||
|
Comment: ANGLE
|
||||||
|
Copyright: 2018, The ANGLE Project Authors.
|
||||||
|
License: BSD-3-clause
|
||||||
|
|
||||||
Files: ./thirdparty/astcenc/
|
Files: ./thirdparty/astcenc/
|
||||||
Comment: Arm ASTC Encoder
|
Comment: Arm ASTC Encoder
|
||||||
Copyright: 2011-2023, Arm Limited
|
Copyright: 2011-2023, Arm Limited
|
||||||
|
@ -161,6 +183,11 @@ Comment: CA certificates
|
||||||
Copyright: Mozilla Contributors
|
Copyright: Mozilla Contributors
|
||||||
License: MPL-2.0
|
License: MPL-2.0
|
||||||
|
|
||||||
|
Files: ./thirdparty/clipper2/
|
||||||
|
Comment: Clipper2
|
||||||
|
Copyright: 2010-2013, Angus Johnson
|
||||||
|
License: BSL-1.0
|
||||||
|
|
||||||
Files: ./thirdparty/cvtt/
|
Files: ./thirdparty/cvtt/
|
||||||
Comment: Convection Texture Tools Stand-Alone Kernels
|
Comment: Convection Texture Tools Stand-Alone Kernels
|
||||||
Copyright: 2018, Eric Lasota
|
Copyright: 2018, Eric Lasota
|
||||||
|
@ -408,11 +435,6 @@ Comment: Stripped down version of "nvapi.h" from the NVIDIA NVAPI SDK
|
||||||
Copyright: 2019-2022, NVIDIA Corporation
|
Copyright: 2019-2022, NVIDIA Corporation
|
||||||
License: Expat
|
License: Expat
|
||||||
|
|
||||||
Files: ./thirdparty/oidn/
|
|
||||||
Comment: Intel Open Image Denoise
|
|
||||||
Copyright: 2009-2019, Intel Corporation
|
|
||||||
License: Apache-2.0
|
|
||||||
|
|
||||||
Files: ./thirdparty/openxr/
|
Files: ./thirdparty/openxr/
|
||||||
Comment: OpenXR Loader
|
Comment: OpenXR Loader
|
||||||
Copyright: 2020-2023, The Khronos Group Inc.
|
Copyright: 2020-2023, The Khronos Group Inc.
|
||||||
|
@ -446,7 +468,7 @@ License: Expat
|
||||||
|
|
||||||
Files: ./thirdparty/thorvg/
|
Files: ./thirdparty/thorvg/
|
||||||
Comment: ThorVG
|
Comment: ThorVG
|
||||||
Copyright: 2020-2022, Samsung Electronics Co., Ltd.
|
Copyright: 2020-2023, The ThorVG Project
|
||||||
License: Expat
|
License: Expat
|
||||||
|
|
||||||
Files: ./thirdparty/tinyexr/
|
Files: ./thirdparty/tinyexr/
|
||||||
|
|
|
@ -226,6 +226,7 @@ opts.Add("scu_limit", "Max includes per SCU file when using scu_build (determine
|
||||||
# Thirdparty libraries
|
# Thirdparty libraries
|
||||||
opts.Add(BoolVariable("builtin_brotli", "Use the built-in Brotli library", True))
|
opts.Add(BoolVariable("builtin_brotli", "Use the built-in Brotli library", True))
|
||||||
opts.Add(BoolVariable("builtin_certs", "Use the built-in SSL certificates bundles", True))
|
opts.Add(BoolVariable("builtin_certs", "Use the built-in SSL certificates bundles", True))
|
||||||
|
opts.Add(BoolVariable("builtin_clipper2", "Use the built-in Clipper2 library", True))
|
||||||
opts.Add(BoolVariable("builtin_embree", "Use the built-in Embree library", True))
|
opts.Add(BoolVariable("builtin_embree", "Use the built-in Embree library", True))
|
||||||
opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True))
|
opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True))
|
||||||
opts.Add(BoolVariable("builtin_freetype", "Use the built-in FreeType library", True))
|
opts.Add(BoolVariable("builtin_freetype", "Use the built-in FreeType library", True))
|
||||||
|
@ -374,6 +375,8 @@ for name, path in modules_detected.items():
|
||||||
else:
|
else:
|
||||||
enabled = False
|
enabled = False
|
||||||
|
|
||||||
|
opts.Add(BoolVariable("module_" + name + "_enabled", "Enable module '%s'" % (name,), enabled))
|
||||||
|
|
||||||
# Add module-specific options.
|
# Add module-specific options.
|
||||||
try:
|
try:
|
||||||
for opt in config.get_opts(selected_platform):
|
for opt in config.get_opts(selected_platform):
|
||||||
|
@ -383,7 +386,6 @@ for name, path in modules_detected.items():
|
||||||
|
|
||||||
sys.path.remove(path)
|
sys.path.remove(path)
|
||||||
sys.modules.pop("config")
|
sys.modules.pop("config")
|
||||||
opts.Add(BoolVariable("module_" + name + "_enabled", "Enable module '%s'" % (name,), enabled))
|
|
||||||
|
|
||||||
methods.write_modules(modules_detected)
|
methods.write_modules(modules_detected)
|
||||||
|
|
||||||
|
@ -579,6 +581,8 @@ if selected_platform in platform_list:
|
||||||
if env["debug_symbols"]:
|
if env["debug_symbols"]:
|
||||||
env.Append(CCFLAGS=["/Zi", "/FS"])
|
env.Append(CCFLAGS=["/Zi", "/FS"])
|
||||||
env.Append(LINKFLAGS=["/DEBUG:FULL"])
|
env.Append(LINKFLAGS=["/DEBUG:FULL"])
|
||||||
|
else:
|
||||||
|
env.Append(LINKFLAGS=["/DEBUG:NONE"])
|
||||||
|
|
||||||
if env["optimize"] == "speed":
|
if env["optimize"] == "speed":
|
||||||
env.Append(CCFLAGS=["/O2"])
|
env.Append(CCFLAGS=["/O2"])
|
||||||
|
@ -984,9 +988,10 @@ if selected_platform in platform_list:
|
||||||
# Check for the existence of headers
|
# Check for the existence of headers
|
||||||
conf = Configure(env)
|
conf = Configure(env)
|
||||||
if "check_c_headers" in env:
|
if "check_c_headers" in env:
|
||||||
for header in env["check_c_headers"]:
|
headers = env["check_c_headers"]
|
||||||
if conf.CheckCHeader(header[0]):
|
for header in headers:
|
||||||
env.AppendUnique(CPPDEFINES=[header[1]])
|
if conf.CheckCHeader(header):
|
||||||
|
env.AppendUnique(CPPDEFINES=[headers[header]])
|
||||||
|
|
||||||
elif selected_platform != "":
|
elif selected_platform != "":
|
||||||
if selected_platform == "list":
|
if selected_platform == "list":
|
||||||
|
|
|
@ -89,6 +89,24 @@ if env["brotli"] and env["builtin_brotli"]:
|
||||||
|
|
||||||
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_brotli_sources)
|
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_brotli_sources)
|
||||||
|
|
||||||
|
# Clipper2 Thirdparty source files used for polygon and polyline boolean operations.
|
||||||
|
if env["builtin_clipper2"]:
|
||||||
|
thirdparty_clipper_dir = "#thirdparty/clipper2/"
|
||||||
|
thirdparty_clipper_sources = [
|
||||||
|
"src/clipper.engine.cpp",
|
||||||
|
"src/clipper.offset.cpp",
|
||||||
|
"src/clipper.rectclip.cpp",
|
||||||
|
]
|
||||||
|
thirdparty_clipper_sources = [thirdparty_clipper_dir + file for file in thirdparty_clipper_sources]
|
||||||
|
|
||||||
|
env_thirdparty.Prepend(CPPPATH=[thirdparty_clipper_dir + "include"])
|
||||||
|
env.Prepend(CPPPATH=[thirdparty_clipper_dir + "include"])
|
||||||
|
|
||||||
|
env_thirdparty.Append(CPPDEFINES=["CLIPPER2_ENABLED"])
|
||||||
|
env.Append(CPPDEFINES=["CLIPPER2_ENABLED"])
|
||||||
|
|
||||||
|
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_clipper_sources)
|
||||||
|
|
||||||
# Zlib library, can be unbundled
|
# Zlib library, can be unbundled
|
||||||
if env["builtin_zlib"]:
|
if env["builtin_zlib"]:
|
||||||
thirdparty_zlib_dir = "#thirdparty/zlib/"
|
thirdparty_zlib_dir = "#thirdparty/zlib/"
|
||||||
|
|
|
@ -260,14 +260,21 @@ bool Engine::is_printing_error_messages() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::add_singleton(const Singleton &p_singleton) {
|
void Engine::add_singleton(const Singleton &p_singleton) {
|
||||||
ERR_FAIL_COND_MSG(singleton_ptrs.has(p_singleton.name), "Can't register singleton that already exists: " + String(p_singleton.name));
|
ERR_FAIL_COND_MSG(singleton_ptrs.has(p_singleton.name), vformat("Can't register singleton '%s' because it already exists.", p_singleton.name));
|
||||||
singletons.push_back(p_singleton);
|
singletons.push_back(p_singleton);
|
||||||
singleton_ptrs[p_singleton.name] = p_singleton.ptr;
|
singleton_ptrs[p_singleton.name] = p_singleton.ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object *Engine::get_singleton_object(const StringName &p_name) const {
|
Object *Engine::get_singleton_object(const StringName &p_name) const {
|
||||||
HashMap<StringName, Object *>::ConstIterator E = singleton_ptrs.find(p_name);
|
HashMap<StringName, Object *>::ConstIterator E = singleton_ptrs.find(p_name);
|
||||||
ERR_FAIL_COND_V_MSG(!E, nullptr, "Failed to retrieve non-existent singleton '" + String(p_name) + "'.");
|
ERR_FAIL_COND_V_MSG(!E, nullptr, vformat("Failed to retrieve non-existent singleton '%s'.", p_name));
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (!is_editor_hint() && is_singleton_editor_only(p_name)) {
|
||||||
|
ERR_FAIL_V_MSG(nullptr, vformat("Can't retrieve singleton '%s' outside of editor.", p_name));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return E->value;
|
return E->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,6 +289,19 @@ bool Engine::is_singleton_user_created(const StringName &p_name) const {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Engine::is_singleton_editor_only(const StringName &p_name) const {
|
||||||
|
ERR_FAIL_COND_V(!singleton_ptrs.has(p_name), false);
|
||||||
|
|
||||||
|
for (const Singleton &E : singletons) {
|
||||||
|
if (E.name == p_name && E.editor_only) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void Engine::remove_singleton(const StringName &p_name) {
|
void Engine::remove_singleton(const StringName &p_name) {
|
||||||
ERR_FAIL_COND(!singleton_ptrs.has(p_name));
|
ERR_FAIL_COND(!singleton_ptrs.has(p_name));
|
||||||
|
|
||||||
|
@ -300,6 +320,12 @@ bool Engine::has_singleton(const StringName &p_name) const {
|
||||||
|
|
||||||
void Engine::get_singletons(List<Singleton> *p_singletons) {
|
void Engine::get_singletons(List<Singleton> *p_singletons) {
|
||||||
for (const Singleton &E : singletons) {
|
for (const Singleton &E : singletons) {
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (!is_editor_hint() && E.editor_only) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
p_singletons->push_back(E);
|
p_singletons->push_back(E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,8 +44,11 @@ public:
|
||||||
struct Singleton {
|
struct Singleton {
|
||||||
StringName name;
|
StringName name;
|
||||||
Object *ptr = nullptr;
|
Object *ptr = nullptr;
|
||||||
StringName class_name; //used for binding generation hinting
|
StringName class_name; // Used for binding generation hinting.
|
||||||
|
// Singleton scope flags.
|
||||||
bool user_created = false;
|
bool user_created = false;
|
||||||
|
bool editor_only = false;
|
||||||
|
|
||||||
Singleton(const StringName &p_name = StringName(), Object *p_ptr = nullptr, const StringName &p_class_name = StringName());
|
Singleton(const StringName &p_name = StringName(), Object *p_ptr = nullptr, const StringName &p_class_name = StringName());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -79,6 +82,7 @@ private:
|
||||||
|
|
||||||
bool editor_hint = false;
|
bool editor_hint = false;
|
||||||
bool project_manager_hint = false;
|
bool project_manager_hint = false;
|
||||||
|
bool extension_reloading = false;
|
||||||
|
|
||||||
static Engine *singleton;
|
static Engine *singleton;
|
||||||
|
|
||||||
|
@ -129,6 +133,7 @@ public:
|
||||||
Object *get_singleton_object(const StringName &p_name) const;
|
Object *get_singleton_object(const StringName &p_name) const;
|
||||||
void remove_singleton(const StringName &p_name);
|
void remove_singleton(const StringName &p_name);
|
||||||
bool is_singleton_user_created(const StringName &p_name) const;
|
bool is_singleton_user_created(const StringName &p_name) const;
|
||||||
|
bool is_singleton_editor_only(const StringName &p_name) const;
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
_FORCE_INLINE_ void set_editor_hint(bool p_enabled) { editor_hint = p_enabled; }
|
_FORCE_INLINE_ void set_editor_hint(bool p_enabled) { editor_hint = p_enabled; }
|
||||||
|
@ -136,12 +141,18 @@ public:
|
||||||
|
|
||||||
_FORCE_INLINE_ void set_project_manager_hint(bool p_enabled) { project_manager_hint = p_enabled; }
|
_FORCE_INLINE_ void set_project_manager_hint(bool p_enabled) { project_manager_hint = p_enabled; }
|
||||||
_FORCE_INLINE_ bool is_project_manager_hint() const { return project_manager_hint; }
|
_FORCE_INLINE_ bool is_project_manager_hint() const { return project_manager_hint; }
|
||||||
|
|
||||||
|
_FORCE_INLINE_ void set_extension_reloading_enabled(bool p_enabled) { extension_reloading = p_enabled; }
|
||||||
|
_FORCE_INLINE_ bool is_extension_reloading_enabled() const { return extension_reloading; }
|
||||||
#else
|
#else
|
||||||
_FORCE_INLINE_ void set_editor_hint(bool p_enabled) {}
|
_FORCE_INLINE_ void set_editor_hint(bool p_enabled) {}
|
||||||
_FORCE_INLINE_ bool is_editor_hint() const { return false; }
|
_FORCE_INLINE_ bool is_editor_hint() const { return false; }
|
||||||
|
|
||||||
_FORCE_INLINE_ void set_project_manager_hint(bool p_enabled) {}
|
_FORCE_INLINE_ void set_project_manager_hint(bool p_enabled) {}
|
||||||
_FORCE_INLINE_ bool is_project_manager_hint() const { return false; }
|
_FORCE_INLINE_ bool is_project_manager_hint() const { return false; }
|
||||||
|
|
||||||
|
_FORCE_INLINE_ void set_extension_reloading_enabled(bool p_enabled) {}
|
||||||
|
_FORCE_INLINE_ bool is_extension_reloading_enabled() const { return false; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Dictionary get_version_info() const;
|
Dictionary get_version_info() const;
|
||||||
|
|
|
@ -962,6 +962,7 @@ Error ProjectSettings::_save_custom_bnd(const String &p_file) { // add other par
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
bool _csproj_exists(String p_root_dir) {
|
bool _csproj_exists(String p_root_dir) {
|
||||||
Ref<DirAccess> dir = DirAccess::open(p_root_dir);
|
Ref<DirAccess> dir = DirAccess::open(p_root_dir);
|
||||||
|
ERR_FAIL_COND_V(dir.is_null(), false);
|
||||||
|
|
||||||
dir->list_dir_begin();
|
dir->list_dir_begin();
|
||||||
String file_name = dir->_get_next();
|
String file_name = dir->_get_next();
|
||||||
|
@ -1398,6 +1399,8 @@ ProjectSettings::ProjectSettings() {
|
||||||
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "rendering/textures/canvas_textures/default_texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,Linear Mipmap,Nearest Mipmap"), 1);
|
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "rendering/textures/canvas_textures/default_texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,Linear Mipmap,Nearest Mipmap"), 1);
|
||||||
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "rendering/textures/canvas_textures/default_texture_repeat", PROPERTY_HINT_ENUM, "Disable,Enable,Mirror"), 0);
|
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "rendering/textures/canvas_textures/default_texture_repeat", PROPERTY_HINT_ENUM, "Disable,Enable,Mirror"), 0);
|
||||||
|
|
||||||
|
GLOBAL_DEF("collada/use_ambient", false);
|
||||||
|
|
||||||
// These properties will not show up in the dialog. If you want to exclude whole groups, use add_hidden_prefix().
|
// These properties will not show up in the dialog. If you want to exclude whole groups, use add_hidden_prefix().
|
||||||
GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray());
|
GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray());
|
||||||
GLOBAL_DEF_INTERNAL("internationalization/locale/translation_remaps", PackedStringArray());
|
GLOBAL_DEF_INTERNAL("internationalization/locale/translation_remaps", PackedStringArray());
|
||||||
|
|
|
@ -32,12 +32,14 @@
|
||||||
|
|
||||||
#include "core/config/engine.h"
|
#include "core/config/engine.h"
|
||||||
#include "core/core_constants.h"
|
#include "core/core_constants.h"
|
||||||
|
#include "core/extension/gdextension_compat_hashes.h"
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
#include "core/io/json.h"
|
#include "core/io/json.h"
|
||||||
#include "core/templates/pair.h"
|
#include "core/templates/pair.h"
|
||||||
#include "core/version.h"
|
#include "core/version.h"
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
|
#include "editor/editor_help.h"
|
||||||
|
|
||||||
static String get_builtin_or_variant_type_name(const Variant::Type p_type) {
|
static String get_builtin_or_variant_type_name(const Variant::Type p_type) {
|
||||||
if (p_type == Variant::NIL) {
|
if (p_type == Variant::NIL) {
|
||||||
|
@ -87,7 +89,16 @@ static String get_type_meta_name(const GodotTypeInfo::Metadata metadata) {
|
||||||
return argmeta[metadata];
|
return argmeta[metadata];
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary GDExtensionAPIDump::generate_extension_api() {
|
static String fix_doc_description(const String &p_bbcode) {
|
||||||
|
// Based on what EditorHelp does.
|
||||||
|
|
||||||
|
return p_bbcode.dedent()
|
||||||
|
.replace("\t", "")
|
||||||
|
.replace("\r", "")
|
||||||
|
.strip_edges();
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
|
||||||
Dictionary api_dump;
|
Dictionary api_dump;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -459,12 +470,22 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
api_dump["builtin_class_member_offsets"] = core_type_member_offsets;
|
api_dump["builtin_class_member_offsets"] = core_type_member_offsets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
EditorHelp::generate_doc(false);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// Global enums and constants.
|
// Global enums and constants.
|
||||||
Array constants;
|
Array constants;
|
||||||
HashMap<String, List<Pair<String, int64_t>>> enum_list;
|
HashMap<String, List<Pair<String, int64_t>>> enum_list;
|
||||||
HashMap<String, bool> enum_is_bitfield;
|
HashMap<String, bool> enum_is_bitfield;
|
||||||
|
|
||||||
|
const DocData::ClassDoc *global_scope_doc = nullptr;
|
||||||
|
if (p_include_docs) {
|
||||||
|
global_scope_doc = EditorHelp::get_doc_data()->class_list.getptr("@GlobalScope");
|
||||||
|
CRASH_COND_MSG(!global_scope_doc, "Could not find '@GlobalScope' in DocData.");
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < CoreConstants::get_global_constant_count(); i++) {
|
for (int i = 0; i < CoreConstants::get_global_constant_count(); i++) {
|
||||||
int64_t value = CoreConstants::get_global_constant_value(i);
|
int64_t value = CoreConstants::get_global_constant_value(i);
|
||||||
String enum_name = CoreConstants::get_global_constant_enum(i);
|
String enum_name = CoreConstants::get_global_constant_enum(i);
|
||||||
|
@ -478,6 +499,14 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d["name"] = name;
|
d["name"] = name;
|
||||||
d["value"] = value;
|
d["value"] = value;
|
||||||
d["is_bitfield"] = bitfield;
|
d["is_bitfield"] = bitfield;
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::ConstantDoc &constant_doc : global_scope_doc->constants) {
|
||||||
|
if (constant_doc.name == name) {
|
||||||
|
d["documentation"] = fix_doc_description(constant_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
constants.push_back(d);
|
constants.push_back(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -489,11 +518,25 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
Dictionary d1;
|
Dictionary d1;
|
||||||
d1["name"] = E.key;
|
d1["name"] = E.key;
|
||||||
d1["is_bitfield"] = enum_is_bitfield[E.key];
|
d1["is_bitfield"] = enum_is_bitfield[E.key];
|
||||||
|
if (p_include_docs) {
|
||||||
|
const DocData::EnumDoc *enum_doc = global_scope_doc->enums.getptr(E.key);
|
||||||
|
if (enum_doc) {
|
||||||
|
d1["documentation"] = fix_doc_description(enum_doc->description);
|
||||||
|
}
|
||||||
|
}
|
||||||
Array values;
|
Array values;
|
||||||
for (const Pair<String, int64_t> &F : E.value) {
|
for (const Pair<String, int64_t> &F : E.value) {
|
||||||
Dictionary d2;
|
Dictionary d2;
|
||||||
d2["name"] = F.first;
|
d2["name"] = F.first;
|
||||||
d2["value"] = F.second;
|
d2["value"] = F.second;
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::ConstantDoc &constant_doc : global_scope_doc->constants) {
|
||||||
|
if (constant_doc.name == F.first) {
|
||||||
|
d2["documentation"] = fix_doc_description(constant_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
values.push_back(d2);
|
values.push_back(d2);
|
||||||
}
|
}
|
||||||
d1["values"] = values;
|
d1["values"] = values;
|
||||||
|
@ -508,6 +551,12 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
List<StringName> utility_func_names;
|
List<StringName> utility_func_names;
|
||||||
Variant::get_utility_function_list(&utility_func_names);
|
Variant::get_utility_function_list(&utility_func_names);
|
||||||
|
|
||||||
|
const DocData::ClassDoc *global_scope_doc = nullptr;
|
||||||
|
if (p_include_docs) {
|
||||||
|
global_scope_doc = EditorHelp::get_doc_data()->class_list.getptr("@GlobalScope");
|
||||||
|
CRASH_COND_MSG(!global_scope_doc, "Could not find '@GlobalScope' in DocData.");
|
||||||
|
}
|
||||||
|
|
||||||
for (const StringName &name : utility_func_names) {
|
for (const StringName &name : utility_func_names) {
|
||||||
Dictionary func;
|
Dictionary func;
|
||||||
func["name"] = String(name);
|
func["name"] = String(name);
|
||||||
|
@ -544,6 +593,15 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
func["arguments"] = arguments;
|
func["arguments"] = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::MethodDoc &method_doc : global_scope_doc->methods) {
|
||||||
|
if (method_doc.name == name) {
|
||||||
|
func["documentation"] = fix_doc_description(method_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
utility_funcs.push_back(func);
|
utility_funcs.push_back(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -570,6 +628,12 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
|
|
||||||
d["is_keyed"] = Variant::is_keyed(type);
|
d["is_keyed"] = Variant::is_keyed(type);
|
||||||
|
|
||||||
|
DocData::ClassDoc *builtin_doc = nullptr;
|
||||||
|
if (p_include_docs && d["name"] != "Nil") {
|
||||||
|
builtin_doc = EditorHelp::get_doc_data()->class_list.getptr(d["name"]);
|
||||||
|
CRASH_COND_MSG(!builtin_doc, vformat("Could not find '%s' in DocData.", d["name"]));
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
//members
|
//members
|
||||||
Array members;
|
Array members;
|
||||||
|
@ -580,6 +644,14 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
Dictionary d2;
|
Dictionary d2;
|
||||||
d2["name"] = String(member_name);
|
d2["name"] = String(member_name);
|
||||||
d2["type"] = get_builtin_or_variant_type_name(Variant::get_member_type(type, member_name));
|
d2["type"] = get_builtin_or_variant_type_name(Variant::get_member_type(type, member_name));
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::PropertyDoc &property_doc : builtin_doc->properties) {
|
||||||
|
if (property_doc.name == member_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(property_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
members.push_back(d2);
|
members.push_back(d2);
|
||||||
}
|
}
|
||||||
if (members.size()) {
|
if (members.size()) {
|
||||||
|
@ -598,6 +670,14 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
Variant constant = Variant::get_constant_value(type, constant_name);
|
Variant constant = Variant::get_constant_value(type, constant_name);
|
||||||
d2["type"] = get_builtin_or_variant_type_name(constant.get_type());
|
d2["type"] = get_builtin_or_variant_type_name(constant.get_type());
|
||||||
d2["value"] = constant.get_construct_string();
|
d2["value"] = constant.get_construct_string();
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::ConstantDoc &constant_doc : builtin_doc->constants) {
|
||||||
|
if (constant_doc.name == constant_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(constant_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
constants.push_back(d2);
|
constants.push_back(d2);
|
||||||
}
|
}
|
||||||
if (constants.size()) {
|
if (constants.size()) {
|
||||||
|
@ -623,9 +703,24 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
Dictionary values_dict;
|
Dictionary values_dict;
|
||||||
values_dict["name"] = String(enumeration);
|
values_dict["name"] = String(enumeration);
|
||||||
values_dict["value"] = Variant::get_enum_value(type, enum_name, enumeration);
|
values_dict["value"] = Variant::get_enum_value(type, enum_name, enumeration);
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::ConstantDoc &constant_doc : builtin_doc->constants) {
|
||||||
|
if (constant_doc.name == enumeration) {
|
||||||
|
values_dict["documentation"] = fix_doc_description(constant_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
values.push_back(values_dict);
|
values.push_back(values_dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
const DocData::EnumDoc *enum_doc = builtin_doc->enums.getptr(enum_name);
|
||||||
|
if (enum_doc) {
|
||||||
|
enum_dict["documentation"] = fix_doc_description(enum_doc->description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (values.size()) {
|
if (values.size()) {
|
||||||
enum_dict["values"] = values;
|
enum_dict["values"] = values;
|
||||||
}
|
}
|
||||||
|
@ -645,11 +740,22 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
Variant::Type rt = Variant::get_operator_return_type(Variant::Operator(k), type, Variant::Type(j));
|
Variant::Type rt = Variant::get_operator_return_type(Variant::Operator(k), type, Variant::Type(j));
|
||||||
if (rt != Variant::NIL) {
|
if (rt != Variant::NIL) {
|
||||||
Dictionary d2;
|
Dictionary d2;
|
||||||
d2["name"] = Variant::get_operator_name(Variant::Operator(k));
|
String operator_name = Variant::get_operator_name(Variant::Operator(k));
|
||||||
|
d2["name"] = operator_name;
|
||||||
if (k != Variant::OP_NEGATE && k != Variant::OP_POSITIVE && k != Variant::OP_NOT && k != Variant::OP_BIT_NEGATE) {
|
if (k != Variant::OP_NEGATE && k != Variant::OP_POSITIVE && k != Variant::OP_NOT && k != Variant::OP_BIT_NEGATE) {
|
||||||
d2["right_type"] = get_builtin_or_variant_type_name(Variant::Type(j));
|
d2["right_type"] = get_builtin_or_variant_type_name(Variant::Type(j));
|
||||||
}
|
}
|
||||||
d2["return_type"] = get_builtin_or_variant_type_name(Variant::get_operator_return_type(Variant::Operator(k), type, Variant::Type(j)));
|
d2["return_type"] = get_builtin_or_variant_type_name(Variant::get_operator_return_type(Variant::Operator(k), type, Variant::Type(j)));
|
||||||
|
|
||||||
|
if (p_include_docs && builtin_doc != nullptr) {
|
||||||
|
for (const DocData::MethodDoc &operator_doc : builtin_doc->operators) {
|
||||||
|
if (operator_doc.name == "operator " + operator_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(operator_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
operators.push_back(d2);
|
operators.push_back(d2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -696,6 +802,15 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d2["arguments"] = arguments;
|
d2["arguments"] = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::MethodDoc &method_doc : builtin_doc->methods) {
|
||||||
|
if (method_doc.name == method_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(method_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
methods.push_back(d2);
|
methods.push_back(d2);
|
||||||
}
|
}
|
||||||
if (methods.size()) {
|
if (methods.size()) {
|
||||||
|
@ -721,6 +836,28 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
if (arguments.size()) {
|
if (arguments.size()) {
|
||||||
d2["arguments"] = arguments;
|
d2["arguments"] = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs && builtin_doc) {
|
||||||
|
for (const DocData::MethodDoc &constructor_doc : builtin_doc->constructors) {
|
||||||
|
if (constructor_doc.arguments.size() != argcount) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
bool constructor_found = true;
|
||||||
|
for (int k = 0; k < argcount; k++) {
|
||||||
|
const DocData::ArgumentDoc &argument_doc = constructor_doc.arguments[k];
|
||||||
|
const Dictionary &argument_dict = arguments[k];
|
||||||
|
const String &argument_string = argument_dict["type"];
|
||||||
|
if (argument_doc.type != argument_string) {
|
||||||
|
constructor_found = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (constructor_found) {
|
||||||
|
d2["documentation"] = fix_doc_description(constructor_doc.description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
constructors.push_back(d2);
|
constructors.push_back(d2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -733,6 +870,10 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d["has_destructor"] = Variant::has_destructor(type);
|
d["has_destructor"] = Variant::has_destructor(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs && builtin_doc != nullptr) {
|
||||||
|
d["documentation"] = fix_doc_description(builtin_doc->description);
|
||||||
|
}
|
||||||
|
|
||||||
builtins.push_back(d);
|
builtins.push_back(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -762,6 +903,12 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d["inherits"] = String(parent_class);
|
d["inherits"] = String(parent_class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DocData::ClassDoc *class_doc = nullptr;
|
||||||
|
if (p_include_docs) {
|
||||||
|
class_doc = EditorHelp::get_doc_data()->class_list.getptr(class_name);
|
||||||
|
CRASH_COND_MSG(!class_doc, vformat("Could not find '%s' in DocData.", class_name));
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
ClassDB::APIType api = ClassDB::get_api_type(class_name);
|
ClassDB::APIType api = ClassDB::get_api_type(class_name);
|
||||||
static const char *api_type[5] = { "core", "editor", "extension", "editor_extension" };
|
static const char *api_type[5] = { "core", "editor", "extension", "editor_extension" };
|
||||||
|
@ -783,6 +930,15 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d2["name"] = String(F);
|
d2["name"] = String(F);
|
||||||
d2["value"] = ClassDB::get_integer_constant(class_name, F);
|
d2["value"] = ClassDB::get_integer_constant(class_name, F);
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::ConstantDoc &constant_doc : class_doc->constants) {
|
||||||
|
if (constant_doc.name == F) {
|
||||||
|
d2["documentation"] = fix_doc_description(constant_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
constants.push_back(d2);
|
constants.push_back(d2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -807,11 +963,28 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
Dictionary d3;
|
Dictionary d3;
|
||||||
d3["name"] = String(G->get());
|
d3["name"] = String(G->get());
|
||||||
d3["value"] = ClassDB::get_integer_constant(class_name, G->get());
|
d3["value"] = ClassDB::get_integer_constant(class_name, G->get());
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::ConstantDoc &constant_doc : class_doc->constants) {
|
||||||
|
if (constant_doc.name == G->get()) {
|
||||||
|
d3["documentation"] = fix_doc_description(constant_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
values.push_back(d3);
|
values.push_back(d3);
|
||||||
}
|
}
|
||||||
|
|
||||||
d2["values"] = values;
|
d2["values"] = values;
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
const DocData::EnumDoc *enum_doc = class_doc->enums.getptr(F);
|
||||||
|
if (enum_doc) {
|
||||||
|
d2["documentation"] = fix_doc_description(enum_doc->description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enums.push_back(d2);
|
enums.push_back(d2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,6 +1036,15 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d2["arguments"] = arguments;
|
d2["arguments"] = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::MethodDoc &method_doc : class_doc->methods) {
|
||||||
|
if (method_doc.name == method_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(method_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
methods.push_back(d2);
|
methods.push_back(d2);
|
||||||
|
|
||||||
} else if (F.name.begins_with("_")) {
|
} else if (F.name.begins_with("_")) {
|
||||||
|
@ -884,11 +1066,18 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d2["hash"] = method->get_hash();
|
d2["hash"] = method->get_hash();
|
||||||
|
|
||||||
Vector<uint32_t> compat_hashes = ClassDB::get_method_compatibility_hashes(class_name, method_name);
|
Vector<uint32_t> compat_hashes = ClassDB::get_method_compatibility_hashes(class_name, method_name);
|
||||||
|
Array compatibility;
|
||||||
if (compat_hashes.size()) {
|
if (compat_hashes.size()) {
|
||||||
Array compatibility;
|
|
||||||
for (int i = 0; i < compat_hashes.size(); i++) {
|
for (int i = 0; i < compat_hashes.size(); i++) {
|
||||||
compatibility.push_back(compat_hashes[i]);
|
compatibility.push_back(compat_hashes[i]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
GDExtensionCompatHashes::get_legacy_hashes(class_name, method_name, compatibility);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (compatibility.size() > 0) {
|
||||||
d2["hash_compatibility"] = compatibility;
|
d2["hash_compatibility"] = compatibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -924,6 +1113,15 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d2["arguments"] = arguments;
|
d2["arguments"] = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::MethodDoc &method_doc : class_doc->methods) {
|
||||||
|
if (method_doc.name == method_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(method_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
methods.push_back(d2);
|
methods.push_back(d2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -958,6 +1156,15 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
d2["arguments"] = arguments;
|
d2["arguments"] = arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::MethodDoc &signal_doc : class_doc->signals) {
|
||||||
|
if (signal_doc.name == signal_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(signal_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
signals.push_back(d2);
|
signals.push_back(d2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -997,6 +1204,16 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
d2["index"] = index;
|
d2["index"] = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs) {
|
||||||
|
for (const DocData::PropertyDoc &property_doc : class_doc->properties) {
|
||||||
|
if (property_doc.name == property_name) {
|
||||||
|
d2["documentation"] = fix_doc_description(property_doc.description);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
properties.push_back(d2);
|
properties.push_back(d2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1005,6 +1222,10 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p_include_docs && class_doc != nullptr) {
|
||||||
|
d["documentation"] = fix_doc_description(class_doc->description);
|
||||||
|
}
|
||||||
|
|
||||||
classes.push_back(d);
|
classes.push_back(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1057,8 +1278,8 @@ Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||||
return api_dump;
|
return api_dump;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GDExtensionAPIDump::generate_extension_json_file(const String &p_path) {
|
void GDExtensionAPIDump::generate_extension_json_file(const String &p_path, bool p_include_docs) {
|
||||||
Dictionary api = generate_extension_api();
|
Dictionary api = generate_extension_api(p_include_docs);
|
||||||
Ref<JSON> json;
|
Ref<JSON> json;
|
||||||
json.instantiate();
|
json.instantiate();
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,8 @@
|
||||||
|
|
||||||
class GDExtensionAPIDump {
|
class GDExtensionAPIDump {
|
||||||
public:
|
public:
|
||||||
static Dictionary generate_extension_api();
|
static Dictionary generate_extension_api(bool p_include_docs = false);
|
||||||
static void generate_extension_json_file(const String &p_path);
|
static void generate_extension_json_file(const String &p_path, bool p_include_docs = false);
|
||||||
static Error validate_extension_json_file(const String &p_path);
|
static Error validate_extension_json_file(const String &p_path);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -162,6 +162,14 @@ class GDExtensionMethodBind : public MethodBind {
|
||||||
List<PropertyInfo> arguments_info;
|
List<PropertyInfo> arguments_info;
|
||||||
List<GodotTypeInfo::Metadata> arguments_metadata;
|
List<GodotTypeInfo::Metadata> arguments_metadata;
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
friend class GDExtension;
|
||||||
|
|
||||||
|
StringName name;
|
||||||
|
bool is_reloading = false;
|
||||||
|
bool valid = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual Variant::Type _gen_argument_type(int p_arg) const override {
|
virtual Variant::Type _gen_argument_type(int p_arg) const override {
|
||||||
if (p_arg < 0) {
|
if (p_arg < 0) {
|
||||||
|
@ -179,6 +187,10 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
virtual bool is_valid() const override { return valid; }
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
virtual GodotTypeInfo::Metadata get_argument_meta(int p_arg) const override {
|
virtual GodotTypeInfo::Metadata get_argument_meta(int p_arg) const override {
|
||||||
if (p_arg < 0) {
|
if (p_arg < 0) {
|
||||||
|
@ -190,6 +202,9 @@ public:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const override {
|
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const override {
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
ERR_FAIL_COND_V_MSG(!valid, Variant(), vformat("Cannot call invalid GDExtension method bind '%s'. It's probably cached - you may need to restart Godot.", name));
|
||||||
|
#endif
|
||||||
Variant ret;
|
Variant ret;
|
||||||
GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance();
|
GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance();
|
||||||
GDExtensionCallError ce{ GDEXTENSION_CALL_OK, 0, 0 };
|
GDExtensionCallError ce{ GDEXTENSION_CALL_OK, 0, 0 };
|
||||||
|
@ -200,6 +215,9 @@ public:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
ERR_FAIL_COND_MSG(!valid, vformat("Cannot call invalid GDExtension method bind '%s'. It's probably cached - you may need to restart Godot.", name));
|
||||||
|
#endif
|
||||||
ERR_FAIL_COND_MSG(vararg, "Validated methods don't have ptrcall support. This is most likely an engine bug.");
|
ERR_FAIL_COND_MSG(vararg, "Validated methods don't have ptrcall support. This is most likely an engine bug.");
|
||||||
GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance();
|
GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance();
|
||||||
|
|
||||||
|
@ -234,6 +252,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
ERR_FAIL_COND_MSG(!valid, vformat("Cannot call invalid GDExtension method bind '%s'. It's probably cached - you may need to restart Godot.", name));
|
||||||
|
#endif
|
||||||
ERR_FAIL_COND_MSG(vararg, "Vararg methods don't have ptrcall support. This is most likely an engine bug.");
|
ERR_FAIL_COND_MSG(vararg, "Vararg methods don't have ptrcall support. This is most likely an engine bug.");
|
||||||
GDExtensionClassInstancePtr extension_instance = p_object->_get_extension_instance();
|
GDExtensionClassInstancePtr extension_instance = p_object->_get_extension_instance();
|
||||||
ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstTypePtr *>(p_args), (GDExtensionTypePtr)r_ret);
|
ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstTypePtr *>(p_args), (GDExtensionTypePtr)r_ret);
|
||||||
|
@ -243,7 +264,43 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit GDExtensionMethodBind(const GDExtensionClassMethodInfo *p_method_info) {
|
#ifdef TOOLS_ENABLED
|
||||||
|
bool try_update(const GDExtensionClassMethodInfo *p_method_info) {
|
||||||
|
if (is_static() != (bool)(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_STATIC)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vararg != (bool)(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_VARARG)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_return() != (bool)p_method_info->has_return_value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_return() && return_value_info.type != (Variant::Type)p_method_info->return_value_info->type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argument_count != p_method_info->argument_count) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < p_method_info->argument_count; i++) {
|
||||||
|
if (arguments_info[i].type != (Variant::Type)p_method_info->arguments_info[i].type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
update(p_method_info);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void update(const GDExtensionClassMethodInfo *p_method_info) {
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
name = *reinterpret_cast<StringName *>(p_method_info->name);
|
||||||
|
#endif
|
||||||
method_userdata = p_method_info->method_userdata;
|
method_userdata = p_method_info->method_userdata;
|
||||||
call_func = p_method_info->call_func;
|
call_func = p_method_info->call_func;
|
||||||
validated_call_func = nullptr;
|
validated_call_func = nullptr;
|
||||||
|
@ -255,6 +312,8 @@ public:
|
||||||
return_value_metadata = GodotTypeInfo::Metadata(p_method_info->return_value_metadata);
|
return_value_metadata = GodotTypeInfo::Metadata(p_method_info->return_value_metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arguments_info.clear();
|
||||||
|
arguments_metadata.clear();
|
||||||
for (uint32_t i = 0; i < p_method_info->argument_count; i++) {
|
for (uint32_t i = 0; i < p_method_info->argument_count; i++) {
|
||||||
arguments_info.push_back(PropertyInfo(p_method_info->arguments_info[i]));
|
arguments_info.push_back(PropertyInfo(p_method_info->arguments_info[i]));
|
||||||
arguments_metadata.push_back(GodotTypeInfo::Metadata(p_method_info->arguments_metadata[i]));
|
arguments_metadata.push_back(GodotTypeInfo::Metadata(p_method_info->arguments_metadata[i]));
|
||||||
|
@ -279,6 +338,10 @@ public:
|
||||||
|
|
||||||
set_default_arguments(defargs);
|
set_default_arguments(defargs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
explicit GDExtensionMethodBind(const GDExtensionClassMethodInfo *p_method_info) {
|
||||||
|
update(p_method_info);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef DISABLE_DEPRECATED
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
@ -300,7 +363,10 @@ void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library
|
||||||
p_extension_funcs->unreference_func, // GDExtensionClassUnreference unreference_func;
|
p_extension_funcs->unreference_func, // GDExtensionClassUnreference unreference_func;
|
||||||
p_extension_funcs->create_instance_func, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */
|
p_extension_funcs->create_instance_func, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */
|
||||||
p_extension_funcs->free_instance_func, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */
|
p_extension_funcs->free_instance_func, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */
|
||||||
|
nullptr, // GDExtensionClassRecreateInstance recreate_instance_func;
|
||||||
p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
|
p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
|
||||||
|
nullptr, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func;
|
||||||
|
nullptr, // GDExtensionClassCallVirtualWithData call_virtual_func;
|
||||||
p_extension_funcs->get_rid_func, // GDExtensionClassGetRID get_rid;
|
p_extension_funcs->get_rid_func, // GDExtensionClassGetRID get_rid;
|
||||||
p_extension_funcs->class_userdata, // void *class_userdata;
|
p_extension_funcs->class_userdata, // void *class_userdata;
|
||||||
};
|
};
|
||||||
|
@ -339,15 +405,33 @@ void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr
|
||||||
ERR_FAIL_MSG("Attempt to register an extension class '" + String(class_name) + "' using non-existing parent class '" + String(parent_class_name) + "'");
|
ERR_FAIL_MSG("Attempt to register an extension class '" + String(class_name) + "' using non-existing parent class '" + String(parent_class_name) + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
Extension *extension = nullptr;
|
||||||
|
if (self->is_reloading && self->extension_classes.has(class_name)) {
|
||||||
|
extension = &self->extension_classes[class_name];
|
||||||
|
if (!parent_extension && parent_class_name != extension->gdextension.parent_class_name) {
|
||||||
|
ERR_FAIL_MSG(vformat("GDExtension class '%s' attempt to change parent type from '%s' to '%s' on hot reload. Restart Godot for this change to take effect.", class_name, extension->gdextension.parent_class_name, parent_class_name));
|
||||||
|
}
|
||||||
|
extension->is_reloading = false;
|
||||||
|
} else {
|
||||||
|
self->extension_classes[class_name] = Extension();
|
||||||
|
extension = &self->extension_classes[class_name];
|
||||||
|
}
|
||||||
|
#else
|
||||||
self->extension_classes[class_name] = Extension();
|
self->extension_classes[class_name] = Extension();
|
||||||
|
|
||||||
Extension *extension = &self->extension_classes[class_name];
|
Extension *extension = &self->extension_classes[class_name];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (parent_extension) {
|
if (parent_extension) {
|
||||||
extension->gdextension.parent = &parent_extension->gdextension;
|
extension->gdextension.parent = &parent_extension->gdextension;
|
||||||
parent_extension->gdextension.children.push_back(&extension->gdextension);
|
parent_extension->gdextension.children.push_back(&extension->gdextension);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (self->reloadable && p_extension_funcs->recreate_instance_func == nullptr) {
|
||||||
|
ERR_PRINT(vformat("Extension marked as reloadable, but attempted to register class '%s' which doesn't support reloading. Perhaps your language binding don't support it? Reloading disabled for this extension.", class_name));
|
||||||
|
self->reloadable = false;
|
||||||
|
}
|
||||||
|
|
||||||
extension->gdextension.library = self;
|
extension->gdextension.library = self;
|
||||||
extension->gdextension.parent_class_name = parent_class_name;
|
extension->gdextension.parent_class_name = parent_class_name;
|
||||||
extension->gdextension.class_name = class_name;
|
extension->gdextension.class_name = class_name;
|
||||||
|
@ -374,9 +458,25 @@ void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr
|
||||||
extension->gdextension.class_userdata = p_extension_funcs->class_userdata;
|
extension->gdextension.class_userdata = p_extension_funcs->class_userdata;
|
||||||
extension->gdextension.create_instance = p_extension_funcs->create_instance_func;
|
extension->gdextension.create_instance = p_extension_funcs->create_instance_func;
|
||||||
extension->gdextension.free_instance = p_extension_funcs->free_instance_func;
|
extension->gdextension.free_instance = p_extension_funcs->free_instance_func;
|
||||||
|
extension->gdextension.recreate_instance = p_extension_funcs->recreate_instance_func;
|
||||||
extension->gdextension.get_virtual = p_extension_funcs->get_virtual_func;
|
extension->gdextension.get_virtual = p_extension_funcs->get_virtual_func;
|
||||||
|
extension->gdextension.get_virtual_call_data = p_extension_funcs->get_virtual_call_data_func;
|
||||||
|
extension->gdextension.call_virtual_with_data = p_extension_funcs->call_virtual_with_data_func;
|
||||||
extension->gdextension.get_rid = p_extension_funcs->get_rid_func;
|
extension->gdextension.get_rid = p_extension_funcs->get_rid_func;
|
||||||
|
|
||||||
|
extension->gdextension.reloadable = self->reloadable;
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (extension->gdextension.reloadable) {
|
||||||
|
extension->gdextension.tracking_userdata = extension;
|
||||||
|
extension->gdextension.track_instance = &GDExtension::_track_instance;
|
||||||
|
extension->gdextension.untrack_instance = &GDExtension::_untrack_instance;
|
||||||
|
} else {
|
||||||
|
extension->gdextension.tracking_userdata = nullptr;
|
||||||
|
extension->gdextension.track_instance = nullptr;
|
||||||
|
extension->gdextension.untrack_instance = nullptr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ClassDB::register_extension_class(&extension->gdextension);
|
ClassDB::register_extension_class(&extension->gdextension);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,10 +487,39 @@ void GDExtension::_register_extension_class_method(GDExtensionClassLibraryPtr p_
|
||||||
StringName method_name = *reinterpret_cast<const StringName *>(p_method_info->name);
|
StringName method_name = *reinterpret_cast<const StringName *>(p_method_info->name);
|
||||||
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension method '" + String(method_name) + "' for unexisting class '" + class_name + "'.");
|
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension method '" + String(method_name) + "' for unexisting class '" + class_name + "'.");
|
||||||
|
|
||||||
//Extension *extension = &self->extension_classes[class_name];
|
#ifdef TOOLS_ENABLED
|
||||||
|
Extension *extension = &self->extension_classes[class_name];
|
||||||
|
GDExtensionMethodBind *method = nullptr;
|
||||||
|
|
||||||
|
// If the extension is still marked as reloading, that means it failed to register again.
|
||||||
|
if (extension->is_reloading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->is_reloading && extension->methods.has(method_name)) {
|
||||||
|
method = extension->methods[method_name];
|
||||||
|
|
||||||
|
// Try to update the method bind. If it doesn't work (because it's incompatible) then
|
||||||
|
// mark as invalid and create a new one.
|
||||||
|
if (!method->is_reloading || !method->try_update(p_method_info)) {
|
||||||
|
method->valid = false;
|
||||||
|
self->invalid_methods.push_back(method);
|
||||||
|
|
||||||
|
method = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (method == nullptr) {
|
||||||
|
method = memnew(GDExtensionMethodBind(p_method_info));
|
||||||
|
method->set_instance_class(class_name);
|
||||||
|
extension->methods[method_name] = method;
|
||||||
|
} else {
|
||||||
|
method->is_reloading = false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
GDExtensionMethodBind *method = memnew(GDExtensionMethodBind(p_method_info));
|
GDExtensionMethodBind *method = memnew(GDExtensionMethodBind(p_method_info));
|
||||||
method->set_instance_class(class_name);
|
method->set_instance_class(class_name);
|
||||||
|
#endif
|
||||||
|
|
||||||
ClassDB::bind_method_custom(class_name, method);
|
ClassDB::bind_method_custom(class_name, method);
|
||||||
}
|
}
|
||||||
|
@ -402,6 +531,14 @@ void GDExtension::_register_extension_class_integer_constant(GDExtensionClassLib
|
||||||
StringName constant_name = *reinterpret_cast<const StringName *>(p_constant_name);
|
StringName constant_name = *reinterpret_cast<const StringName *>(p_constant_name);
|
||||||
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension constant '" + constant_name + "' for unexisting class '" + class_name + "'.");
|
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension constant '" + constant_name + "' for unexisting class '" + class_name + "'.");
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
// If the extension is still marked as reloading, that means it failed to register again.
|
||||||
|
Extension *extension = &self->extension_classes[class_name];
|
||||||
|
if (extension->is_reloading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ClassDB::bind_integer_constant(class_name, enum_name, constant_name, p_constant_value, p_is_bitfield);
|
ClassDB::bind_integer_constant(class_name, enum_name, constant_name, p_constant_value, p_is_bitfield);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,6 +555,14 @@ void GDExtension::_register_extension_class_property_indexed(GDExtensionClassLib
|
||||||
String property_name = *reinterpret_cast<const StringName *>(p_info->name);
|
String property_name = *reinterpret_cast<const StringName *>(p_info->name);
|
||||||
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property '" + property_name + "' for unexisting class '" + class_name + "'.");
|
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property '" + property_name + "' for unexisting class '" + class_name + "'.");
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
// If the extension is still marked as reloading, that means it failed to register again.
|
||||||
|
Extension *extension = &self->extension_classes[class_name];
|
||||||
|
if (extension->is_reloading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
PropertyInfo pinfo(*p_info);
|
PropertyInfo pinfo(*p_info);
|
||||||
|
|
||||||
ClassDB::add_property(class_name, pinfo, setter, getter, p_index);
|
ClassDB::add_property(class_name, pinfo, setter, getter, p_index);
|
||||||
|
@ -431,6 +576,14 @@ void GDExtension::_register_extension_class_property_group(GDExtensionClassLibra
|
||||||
String prefix = *reinterpret_cast<const String *>(p_prefix);
|
String prefix = *reinterpret_cast<const String *>(p_prefix);
|
||||||
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property group '" + group_name + "' for unexisting class '" + class_name + "'.");
|
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property group '" + group_name + "' for unexisting class '" + class_name + "'.");
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
// If the extension is still marked as reloading, that means it failed to register again.
|
||||||
|
Extension *extension = &self->extension_classes[class_name];
|
||||||
|
if (extension->is_reloading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ClassDB::add_property_group(class_name, group_name, prefix);
|
ClassDB::add_property_group(class_name, group_name, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,6 +595,14 @@ void GDExtension::_register_extension_class_property_subgroup(GDExtensionClassLi
|
||||||
String prefix = *reinterpret_cast<const String *>(p_prefix);
|
String prefix = *reinterpret_cast<const String *>(p_prefix);
|
||||||
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property subgroup '" + subgroup_name + "' for unexisting class '" + class_name + "'.");
|
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property subgroup '" + subgroup_name + "' for unexisting class '" + class_name + "'.");
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
// If the extension is still marked as reloading, that means it failed to register again.
|
||||||
|
Extension *extension = &self->extension_classes[class_name];
|
||||||
|
if (extension->is_reloading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ClassDB::add_property_subgroup(class_name, subgroup_name, prefix);
|
ClassDB::add_property_subgroup(class_name, subgroup_name, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,6 +613,14 @@ void GDExtension::_register_extension_class_signal(GDExtensionClassLibraryPtr p_
|
||||||
StringName signal_name = *reinterpret_cast<const StringName *>(p_signal_name);
|
StringName signal_name = *reinterpret_cast<const StringName *>(p_signal_name);
|
||||||
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class signal '" + signal_name + "' for unexisting class '" + class_name + "'.");
|
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class signal '" + signal_name + "' for unexisting class '" + class_name + "'.");
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
// If the extension is still marked as reloading, that means it failed to register again.
|
||||||
|
Extension *extension = &self->extension_classes[class_name];
|
||||||
|
if (extension->is_reloading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
MethodInfo s;
|
MethodInfo s;
|
||||||
s.name = signal_name;
|
s.name = signal_name;
|
||||||
for (int i = 0; i < p_argument_count; i++) {
|
for (int i = 0; i < p_argument_count; i++) {
|
||||||
|
@ -466,14 +635,32 @@ void GDExtension::_unregister_extension_class(GDExtensionClassLibraryPtr p_libra
|
||||||
|
|
||||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||||
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to unregister unexisting extension class '" + class_name + "'.");
|
ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to unregister unexisting extension class '" + class_name + "'.");
|
||||||
|
|
||||||
Extension *ext = &self->extension_classes[class_name];
|
Extension *ext = &self->extension_classes[class_name];
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (ext->is_reloading) {
|
||||||
|
self->_clear_extension(ext);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
ERR_FAIL_COND_MSG(ext->gdextension.children.size(), "Attempt to unregister class '" + class_name + "' while other extension classes inherit from it.");
|
ERR_FAIL_COND_MSG(ext->gdextension.children.size(), "Attempt to unregister class '" + class_name + "' while other extension classes inherit from it.");
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
ClassDB::unregister_extension_class(class_name, !ext->is_reloading);
|
||||||
|
#else
|
||||||
ClassDB::unregister_extension_class(class_name);
|
ClassDB::unregister_extension_class(class_name);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ext->gdextension.parent != nullptr) {
|
if (ext->gdextension.parent != nullptr) {
|
||||||
ext->gdextension.parent->children.erase(&ext->gdextension);
|
ext->gdextension.parent->children.erase(&ext->gdextension);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (!ext->is_reloading) {
|
||||||
|
self->extension_classes.erase(class_name);
|
||||||
|
}
|
||||||
|
#else
|
||||||
self->extension_classes.erase(class_name);
|
self->extension_classes.erase(class_name);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionUninitializedStringPtr r_path) {
|
void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionUninitializedStringPtr r_path) {
|
||||||
|
@ -496,9 +683,45 @@ GDExtensionInterfaceFunctionPtr GDExtension::get_interface_function(StringName p
|
||||||
}
|
}
|
||||||
|
|
||||||
Error GDExtension::open_library(const String &p_path, const String &p_entry_symbol) {
|
Error GDExtension::open_library(const String &p_path, const String &p_entry_symbol) {
|
||||||
Error err = OS::get_singleton()->open_dynamic_library(p_path, library, true, &library_path);
|
library_path = p_path;
|
||||||
|
|
||||||
|
String abs_path = ProjectSettings::get_singleton()->globalize_path(p_path);
|
||||||
|
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
||||||
|
// If running on the editor on Windows, we copy the library and open the copy.
|
||||||
|
// This is so the original file isn't locked and can be updated by a compiler.
|
||||||
|
if (Engine::get_singleton()->is_editor_hint()) {
|
||||||
|
if (!FileAccess::exists(abs_path)) {
|
||||||
|
ERR_PRINT("GDExtension library not found: " + library_path);
|
||||||
|
return ERR_FILE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the file to the same directory as the original with a prefix in the name.
|
||||||
|
// This is so relative path to dependencies are satisfied.
|
||||||
|
String copy_path = abs_path.get_base_dir().path_join("~" + abs_path.get_file());
|
||||||
|
|
||||||
|
// If there's a left-over copy (possibly from a crash) then delete it first.
|
||||||
|
if (FileAccess::exists(copy_path)) {
|
||||||
|
DirAccess::remove_absolute(copy_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
Error copy_err = DirAccess::copy_absolute(abs_path, copy_path);
|
||||||
|
if (copy_err) {
|
||||||
|
ERR_PRINT("Error copying GDExtension library: " + library_path);
|
||||||
|
return ERR_CANT_CREATE;
|
||||||
|
}
|
||||||
|
FileAccess::set_hidden_attribute(copy_path, true);
|
||||||
|
|
||||||
|
// Save the copied path so it can be deleted later.
|
||||||
|
temp_lib_path = copy_path;
|
||||||
|
|
||||||
|
// Use the copy to open the library.
|
||||||
|
abs_path = copy_path;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Error err = OS::get_singleton()->open_dynamic_library(abs_path, library, true);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
ERR_PRINT("GDExtension dynamic library not found: " + p_path);
|
ERR_PRINT("GDExtension dynamic library not found: " + abs_path);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,7 +730,7 @@ Error GDExtension::open_library(const String &p_path, const String &p_entry_symb
|
||||||
err = OS::get_singleton()->get_dynamic_library_symbol_handle(library, p_entry_symbol, entry_funcptr, false);
|
err = OS::get_singleton()->get_dynamic_library_symbol_handle(library, p_entry_symbol, entry_funcptr, false);
|
||||||
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
ERR_PRINT("GDExtension entry point '" + p_entry_symbol + "' not found in library " + p_path);
|
ERR_PRINT("GDExtension entry point '" + p_entry_symbol + "' not found in library " + abs_path);
|
||||||
OS::get_singleton()->close_dynamic_library(library);
|
OS::get_singleton()->close_dynamic_library(library);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -536,6 +759,11 @@ void GDExtension::close_library() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
library = nullptr;
|
library = nullptr;
|
||||||
|
class_icon_paths.clear();
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
instance_bindings.clear();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GDExtension::is_library_open() const {
|
bool GDExtension::is_library_open() const {
|
||||||
|
@ -586,6 +814,12 @@ GDExtension::~GDExtension() {
|
||||||
if (library != nullptr) {
|
if (library != nullptr) {
|
||||||
close_library();
|
close_library();
|
||||||
}
|
}
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
// If we have any invalid method binds still laying around, we can finally free them!
|
||||||
|
for (GDExtensionMethodBind *E : invalid_methods) {
|
||||||
|
memdelete(E);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GDExtension::initialize_gdextensions() {
|
void GDExtension::initialize_gdextensions() {
|
||||||
|
@ -606,27 +840,22 @@ void GDExtension::initialize_gdextensions() {
|
||||||
register_interface_function("get_library_path", (GDExtensionInterfaceFunctionPtr)&GDExtension::_get_library_path);
|
register_interface_function("get_library_path", (GDExtensionInterfaceFunctionPtr)&GDExtension::_get_library_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<Resource> GDExtensionResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) {
|
Error GDExtensionResourceLoader::load_gdextension_resource(const String &p_path, Ref<GDExtension> &p_extension) {
|
||||||
|
ERR_FAIL_COND_V_MSG(p_extension.is_valid() && p_extension->is_library_open(), ERR_ALREADY_IN_USE, "Cannot load GDExtension resource into already opened library.");
|
||||||
|
|
||||||
Ref<ConfigFile> config;
|
Ref<ConfigFile> config;
|
||||||
config.instantiate();
|
config.instantiate();
|
||||||
|
|
||||||
Error err = config->load(p_path);
|
Error err = config->load(p_path);
|
||||||
|
|
||||||
if (r_error) {
|
|
||||||
*r_error = err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
ERR_PRINT("Error loading GDExtension configuration file: " + p_path);
|
ERR_PRINT("Error loading GDExtension configuration file: " + p_path);
|
||||||
return Ref<Resource>();
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!config->has_section_key("configuration", "entry_symbol")) {
|
if (!config->has_section_key("configuration", "entry_symbol")) {
|
||||||
if (r_error) {
|
|
||||||
*r_error = ERR_INVALID_DATA;
|
|
||||||
}
|
|
||||||
ERR_PRINT("GDExtension configuration file must contain a \"configuration/entry_symbol\" key: " + p_path);
|
ERR_PRINT("GDExtension configuration file must contain a \"configuration/entry_symbol\" key: " + p_path);
|
||||||
return Ref<Resource>();
|
return ERR_INVALID_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
String entry_symbol = config->get_value("configuration", "entry_symbol");
|
String entry_symbol = config->get_value("configuration", "entry_symbol");
|
||||||
|
@ -644,19 +873,13 @@ Ref<Resource> GDExtensionResourceLoader::load(const String &p_path, const String
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (r_error) {
|
|
||||||
*r_error = ERR_INVALID_DATA;
|
|
||||||
}
|
|
||||||
ERR_PRINT("GDExtension configuration file must contain a \"configuration/compatibility_minimum\" key: " + p_path);
|
ERR_PRINT("GDExtension configuration file must contain a \"configuration/compatibility_minimum\" key: " + p_path);
|
||||||
return Ref<Resource>();
|
return ERR_INVALID_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compatibility_minimum[0] < 4 || (compatibility_minimum[0] == 4 && compatibility_minimum[1] == 0)) {
|
if (compatibility_minimum[0] < 4 || (compatibility_minimum[0] == 4 && compatibility_minimum[1] == 0)) {
|
||||||
if (r_error) {
|
|
||||||
*r_error = ERR_INVALID_DATA;
|
|
||||||
}
|
|
||||||
ERR_PRINT(vformat("GDExtension's compatibility_minimum (%d.%d.%d) must be at least 4.1.0: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path));
|
ERR_PRINT(vformat("GDExtension's compatibility_minimum (%d.%d.%d) must be at least 4.1.0: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path));
|
||||||
return Ref<Resource>();
|
return ERR_INVALID_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool compatible = true;
|
bool compatible = true;
|
||||||
|
@ -669,85 +892,44 @@ Ref<Resource> GDExtensionResourceLoader::load(const String &p_path, const String
|
||||||
compatible = VERSION_PATCH >= compatibility_minimum[2];
|
compatible = VERSION_PATCH >= compatibility_minimum[2];
|
||||||
}
|
}
|
||||||
if (!compatible) {
|
if (!compatible) {
|
||||||
if (r_error) {
|
|
||||||
*r_error = ERR_INVALID_DATA;
|
|
||||||
}
|
|
||||||
ERR_PRINT(vformat("GDExtension only compatible with Godot version %d.%d.%d or later: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path));
|
ERR_PRINT(vformat("GDExtension only compatible with Godot version %d.%d.%d or later: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path));
|
||||||
return Ref<Resource>();
|
return ERR_INVALID_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
String library_path = GDExtension::find_extension_library(p_path, config, [](String p_feature) { return OS::get_singleton()->has_feature(p_feature); });
|
String library_path = GDExtension::find_extension_library(p_path, config, [](String p_feature) { return OS::get_singleton()->has_feature(p_feature); });
|
||||||
|
|
||||||
if (library_path.is_empty()) {
|
if (library_path.is_empty()) {
|
||||||
if (r_error) {
|
|
||||||
*r_error = ERR_FILE_NOT_FOUND;
|
|
||||||
}
|
|
||||||
const String os_arch = OS::get_singleton()->get_name().to_lower() + "." + Engine::get_singleton()->get_architecture_name();
|
const String os_arch = OS::get_singleton()->get_name().to_lower() + "." + Engine::get_singleton()->get_architecture_name();
|
||||||
ERR_PRINT(vformat("No GDExtension library found for current OS and architecture (%s) in configuration file: %s", os_arch, p_path));
|
ERR_PRINT(vformat("No GDExtension library found for current OS and architecture (%s) in configuration file: %s", os_arch, p_path));
|
||||||
return Ref<Resource>();
|
return ERR_FILE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!library_path.is_resource_file() && !library_path.is_absolute_path()) {
|
if (!library_path.is_resource_file() && !library_path.is_absolute_path()) {
|
||||||
library_path = p_path.get_base_dir().path_join(library_path);
|
library_path = p_path.get_base_dir().path_join(library_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<GDExtension> lib;
|
if (p_extension.is_null()) {
|
||||||
lib.instantiate();
|
p_extension.instantiate();
|
||||||
String abs_path = ProjectSettings::get_singleton()->globalize_path(library_path);
|
|
||||||
|
|
||||||
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
|
||||||
// If running on the editor on Windows, we copy the library and open the copy.
|
|
||||||
// This is so the original file isn't locked and can be updated by a compiler.
|
|
||||||
if (Engine::get_singleton()->is_editor_hint()) {
|
|
||||||
if (!FileAccess::exists(abs_path)) {
|
|
||||||
if (r_error) {
|
|
||||||
*r_error = ERR_FILE_NOT_FOUND;
|
|
||||||
}
|
|
||||||
ERR_PRINT("GDExtension library not found: " + library_path);
|
|
||||||
return Ref<Resource>();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy the file to the same directory as the original with a prefix in the name.
|
|
||||||
// This is so relative path to dependencies are satisfied.
|
|
||||||
String copy_path = abs_path.get_base_dir().path_join("~" + abs_path.get_file());
|
|
||||||
|
|
||||||
// If there's a left-over copy (possibly from a crash) then delete it first.
|
|
||||||
if (FileAccess::exists(copy_path)) {
|
|
||||||
DirAccess::remove_absolute(copy_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
Error copy_err = DirAccess::copy_absolute(abs_path, copy_path);
|
|
||||||
if (copy_err) {
|
|
||||||
if (r_error) {
|
|
||||||
*r_error = ERR_CANT_CREATE;
|
|
||||||
}
|
|
||||||
ERR_PRINT("Error copying GDExtension library: " + library_path);
|
|
||||||
return Ref<Resource>();
|
|
||||||
}
|
|
||||||
FileAccess::set_hidden_attribute(copy_path, true);
|
|
||||||
|
|
||||||
// Save the copied path so it can be deleted later.
|
|
||||||
lib->set_temp_library_path(copy_path);
|
|
||||||
|
|
||||||
// Use the copy to open the library.
|
|
||||||
abs_path = copy_path;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
p_extension->set_reloadable(config->get_value("configuration", "reloadable", false) && Engine::get_singleton()->is_extension_reloading_enabled());
|
||||||
|
|
||||||
|
p_extension->update_last_modified_time(MAX(
|
||||||
|
FileAccess::get_modified_time(library_path),
|
||||||
|
FileAccess::get_modified_time(p_path)));
|
||||||
#endif
|
#endif
|
||||||
err = lib->open_library(abs_path, entry_symbol);
|
|
||||||
|
|
||||||
if (r_error) {
|
|
||||||
*r_error = err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
err = p_extension->open_library(library_path, entry_symbol);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
||||||
// If the DLL fails to load, make sure that temporary DLL copies are cleaned up.
|
// If the DLL fails to load, make sure that temporary DLL copies are cleaned up.
|
||||||
if (Engine::get_singleton()->is_editor_hint()) {
|
if (Engine::get_singleton()->is_editor_hint()) {
|
||||||
DirAccess::remove_absolute(lib->get_temp_library_path());
|
DirAccess::remove_absolute(p_extension->get_temp_library_path());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Errors already logged in open_library()
|
// Errors already logged in open_library()
|
||||||
return Ref<Resource>();
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle icons if any are specified.
|
// Handle icons if any are specified.
|
||||||
|
@ -755,10 +937,25 @@ Ref<Resource> GDExtensionResourceLoader::load(const String &p_path, const String
|
||||||
List<String> keys;
|
List<String> keys;
|
||||||
config->get_section_keys("icons", &keys);
|
config->get_section_keys("icons", &keys);
|
||||||
for (const String &key : keys) {
|
for (const String &key : keys) {
|
||||||
lib->class_icon_paths[key] = config->get_value("icons", key);
|
String icon_path = config->get_value("icons", key);
|
||||||
|
if (icon_path.is_relative_path()) {
|
||||||
|
icon_path = p_path.get_base_dir().path_join(icon_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
p_extension->class_icon_paths[key] = icon_path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<Resource> GDExtensionResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) {
|
||||||
|
Ref<GDExtension> lib;
|
||||||
|
Error err = load_gdextension_resource(p_path, lib);
|
||||||
|
if (err != OK && r_error) {
|
||||||
|
// Errors already logged in load_gdextension_resource().
|
||||||
|
*r_error = err;
|
||||||
|
}
|
||||||
return lib;
|
return lib;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -779,6 +976,183 @@ String GDExtensionResourceLoader::get_resource_type(const String &p_path) const
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
|
bool GDExtension::has_library_changed() const {
|
||||||
|
if (FileAccess::get_modified_time(get_path()) > last_modified_time) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (FileAccess::get_modified_time(library_path) > last_modified_time) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::prepare_reload() {
|
||||||
|
is_reloading = true;
|
||||||
|
|
||||||
|
for (KeyValue<StringName, Extension> &E : extension_classes) {
|
||||||
|
E.value.is_reloading = true;
|
||||||
|
|
||||||
|
for (KeyValue<StringName, GDExtensionMethodBind *> &M : E.value.methods) {
|
||||||
|
M.value->is_reloading = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const ObjectID &obj_id : E.value.instances) {
|
||||||
|
Object *obj = ObjectDB::get_instance(obj_id);
|
||||||
|
if (!obj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store instance state so it can be restored after reload.
|
||||||
|
List<Pair<String, Variant>> state;
|
||||||
|
List<PropertyInfo> prop_list;
|
||||||
|
obj->get_property_list(&prop_list);
|
||||||
|
for (const PropertyInfo &P : prop_list) {
|
||||||
|
if (!(P.usage & PROPERTY_USAGE_STORAGE)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant value = obj->get(P.name);
|
||||||
|
Variant default_value = ClassDB::class_get_default_property_value(obj->get_class_name(), P.name);
|
||||||
|
|
||||||
|
if (default_value.get_type() != Variant::NIL && bool(Variant::evaluate(Variant::OP_EQUAL, value, default_value))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (P.type == Variant::OBJECT && value.is_zero() && !(P.usage & PROPERTY_USAGE_STORE_IF_NULL)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.push_back(Pair<String, Variant>(P.name, value));
|
||||||
|
}
|
||||||
|
E.value.instance_state[obj_id] = state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::_clear_extension(Extension *p_extension) {
|
||||||
|
// Clear out hierarchy information because it may change.
|
||||||
|
p_extension->gdextension.parent = nullptr;
|
||||||
|
p_extension->gdextension.children.clear();
|
||||||
|
|
||||||
|
// Clear all objects of any GDExtension data. It will become its native parent class
|
||||||
|
// until the reload can reset the object with the new GDExtension data.
|
||||||
|
for (const ObjectID &obj_id : p_extension->instances) {
|
||||||
|
Object *obj = ObjectDB::get_instance(obj_id);
|
||||||
|
if (!obj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->clear_internal_extension();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::track_instance_binding(Object *p_object) {
|
||||||
|
instance_bindings.push_back(p_object->get_instance_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::untrack_instance_binding(Object *p_object) {
|
||||||
|
instance_bindings.erase(p_object->get_instance_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::clear_instance_bindings() {
|
||||||
|
for (ObjectID obj_id : instance_bindings) {
|
||||||
|
Object *obj = ObjectDB::get_instance(obj_id);
|
||||||
|
if (!obj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->free_instance_binding(this);
|
||||||
|
}
|
||||||
|
instance_bindings.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::finish_reload() {
|
||||||
|
is_reloading = false;
|
||||||
|
|
||||||
|
// Clean up any classes or methods that didn't get re-added.
|
||||||
|
Vector<StringName> classes_to_remove;
|
||||||
|
for (KeyValue<StringName, Extension> &E : extension_classes) {
|
||||||
|
if (E.value.is_reloading) {
|
||||||
|
E.value.is_reloading = false;
|
||||||
|
classes_to_remove.push_back(E.key);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<StringName> methods_to_remove;
|
||||||
|
for (KeyValue<StringName, GDExtensionMethodBind *> &M : E.value.methods) {
|
||||||
|
if (M.value->is_reloading) {
|
||||||
|
M.value->valid = false;
|
||||||
|
invalid_methods.push_back(M.value);
|
||||||
|
|
||||||
|
M.value->is_reloading = false;
|
||||||
|
methods_to_remove.push_back(M.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const StringName &method_name : methods_to_remove) {
|
||||||
|
E.value.methods.erase(method_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const StringName &class_name : classes_to_remove) {
|
||||||
|
extension_classes.erase(class_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset any the extension on instances made from the classes that remain.
|
||||||
|
for (KeyValue<StringName, Extension> &E : extension_classes) {
|
||||||
|
// Loop over 'instance_state' rather than 'instance' because new instances
|
||||||
|
// may have been created when re-initializing the extension.
|
||||||
|
for (const KeyValue<ObjectID, List<Pair<String, Variant>>> &S : E.value.instance_state) {
|
||||||
|
Object *obj = ObjectDB::get_instance(S.key);
|
||||||
|
if (!obj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->reset_internal_extension(&E.value.gdextension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now that all the classes are back, restore the state.
|
||||||
|
for (KeyValue<StringName, Extension> &E : extension_classes) {
|
||||||
|
for (const KeyValue<ObjectID, List<Pair<String, Variant>>> &S : E.value.instance_state) {
|
||||||
|
Object *obj = ObjectDB::get_instance(S.key);
|
||||||
|
if (!obj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const Pair<String, Variant> &state : S.value) {
|
||||||
|
obj->set(state.first, state.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, let the objects know that we are done reloading them.
|
||||||
|
for (KeyValue<StringName, Extension> &E : extension_classes) {
|
||||||
|
for (const KeyValue<ObjectID, List<Pair<String, Variant>>> &S : E.value.instance_state) {
|
||||||
|
Object *obj = ObjectDB::get_instance(S.key);
|
||||||
|
if (!obj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj->notification(NOTIFICATION_EXTENSION_RELOADED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear the instance state, we're done looping.
|
||||||
|
E.value.instance_state.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::_track_instance(void *p_user_data, void *p_instance) {
|
||||||
|
Extension *extension = reinterpret_cast<Extension *>(p_user_data);
|
||||||
|
Object *obj = reinterpret_cast<Object *>(p_instance);
|
||||||
|
|
||||||
|
extension->instances.insert(obj->get_instance_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtension::_untrack_instance(void *p_user_data, void *p_instance) {
|
||||||
|
Extension *extension = reinterpret_cast<Extension *>(p_user_data);
|
||||||
|
Object *obj = reinterpret_cast<Object *>(p_instance);
|
||||||
|
|
||||||
|
extension->instances.erase(obj->get_instance_id());
|
||||||
|
}
|
||||||
|
|
||||||
Vector<StringName> GDExtensionEditorPlugins::extension_classes;
|
Vector<StringName> GDExtensionEditorPlugins::extension_classes;
|
||||||
GDExtensionEditorPlugins::EditorPluginRegisterFunc GDExtensionEditorPlugins::editor_node_add_plugin = nullptr;
|
GDExtensionEditorPlugins::EditorPluginRegisterFunc GDExtensionEditorPlugins::editor_node_add_plugin = nullptr;
|
||||||
GDExtensionEditorPlugins::EditorPluginRegisterFunc GDExtensionEditorPlugins::editor_node_remove_plugin = nullptr;
|
GDExtensionEditorPlugins::EditorPluginRegisterFunc GDExtensionEditorPlugins::editor_node_remove_plugin = nullptr;
|
||||||
|
|
|
@ -38,17 +38,29 @@
|
||||||
#include "core/io/resource_loader.h"
|
#include "core/io/resource_loader.h"
|
||||||
#include "core/object/ref_counted.h"
|
#include "core/object/ref_counted.h"
|
||||||
|
|
||||||
|
class GDExtensionMethodBind;
|
||||||
|
|
||||||
class GDExtension : public Resource {
|
class GDExtension : public Resource {
|
||||||
GDCLASS(GDExtension, Resource)
|
GDCLASS(GDExtension, Resource)
|
||||||
|
|
||||||
|
friend class GDExtensionManager;
|
||||||
|
|
||||||
void *library = nullptr; // pointer if valid,
|
void *library = nullptr; // pointer if valid,
|
||||||
String library_path;
|
String library_path;
|
||||||
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
||||||
String temp_lib_path;
|
String temp_lib_path;
|
||||||
#endif
|
#endif
|
||||||
|
bool reloadable = false;
|
||||||
|
|
||||||
struct Extension {
|
struct Extension {
|
||||||
ObjectGDExtension gdextension;
|
ObjectGDExtension gdextension;
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
bool is_reloading = false;
|
||||||
|
HashMap<StringName, GDExtensionMethodBind *> methods;
|
||||||
|
HashSet<ObjectID> instances;
|
||||||
|
HashMap<ObjectID, List<Pair<String, Variant>>> instance_state;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
HashMap<StringName, Extension> extension_classes;
|
HashMap<StringName, Extension> extension_classes;
|
||||||
|
@ -77,6 +89,23 @@ class GDExtension : public Resource {
|
||||||
GDExtensionInitialization initialization;
|
GDExtensionInitialization initialization;
|
||||||
int32_t level_initialized = -1;
|
int32_t level_initialized = -1;
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
uint64_t last_modified_time = 0;
|
||||||
|
bool is_reloading = false;
|
||||||
|
Vector<GDExtensionMethodBind *> invalid_methods;
|
||||||
|
Vector<ObjectID> instance_bindings;
|
||||||
|
|
||||||
|
static void _track_instance(void *p_user_data, void *p_instance);
|
||||||
|
static void _untrack_instance(void *p_user_data, void *p_instance);
|
||||||
|
|
||||||
|
void _clear_extension(Extension *p_extension);
|
||||||
|
|
||||||
|
// Only called by GDExtensionManager during the reload process.
|
||||||
|
void prepare_reload();
|
||||||
|
void finish_reload();
|
||||||
|
void clear_instance_bindings();
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
|
@ -90,7 +119,6 @@ public:
|
||||||
void close_library();
|
void close_library();
|
||||||
|
|
||||||
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
#if defined(WINDOWS_ENABLED) && defined(TOOLS_ENABLED)
|
||||||
void set_temp_library_path(const String &p_path) { temp_lib_path = p_path; }
|
|
||||||
String get_temp_library_path() const { return temp_lib_path; }
|
String get_temp_library_path() const { return temp_lib_path; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -103,6 +131,19 @@ public:
|
||||||
|
|
||||||
bool is_library_open() const;
|
bool is_library_open() const;
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
bool is_reloadable() const { return reloadable; }
|
||||||
|
void set_reloadable(bool p_reloadable) { reloadable = p_reloadable; }
|
||||||
|
|
||||||
|
bool has_library_changed() const;
|
||||||
|
void update_last_modified_time(uint64_t p_last_modified_time) {
|
||||||
|
last_modified_time = MAX(last_modified_time, p_last_modified_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
void track_instance_binding(Object *p_object);
|
||||||
|
void untrack_instance_binding(Object *p_object);
|
||||||
|
#endif
|
||||||
|
|
||||||
InitializationLevel get_minimum_library_initialization_level() const;
|
InitializationLevel get_minimum_library_initialization_level() const;
|
||||||
void initialize_library(InitializationLevel p_level);
|
void initialize_library(InitializationLevel p_level);
|
||||||
void deinitialize_library(InitializationLevel p_level);
|
void deinitialize_library(InitializationLevel p_level);
|
||||||
|
@ -119,6 +160,8 @@ VARIANT_ENUM_CAST(GDExtension::InitializationLevel)
|
||||||
|
|
||||||
class GDExtensionResourceLoader : public ResourceFormatLoader {
|
class GDExtensionResourceLoader : public ResourceFormatLoader {
|
||||||
public:
|
public:
|
||||||
|
static Error load_gdextension_resource(const String &p_path, Ref<GDExtension> &p_extension);
|
||||||
|
|
||||||
virtual Ref<Resource> load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE);
|
virtual Ref<Resource> load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE);
|
||||||
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
virtual void get_recognized_extensions(List<String> *p_extensions) const;
|
||||||
virtual bool handles_type(const String &p_type) const;
|
virtual bool handles_type(const String &p_type) const;
|
||||||
|
|
843
godot/core/extension/gdextension_compat_hashes.cpp
Normal file
843
godot/core/extension/gdextension_compat_hashes.cpp
Normal file
|
@ -0,0 +1,843 @@
|
||||||
|
/**************************************************************************/
|
||||||
|
/* gdextension_compat_hashes.cpp */
|
||||||
|
/**************************************************************************/
|
||||||
|
/* This file is part of: */
|
||||||
|
/* GODOT ENGINE */
|
||||||
|
/* https://godotengine.org */
|
||||||
|
/**************************************************************************/
|
||||||
|
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||||
|
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||||
|
/* */
|
||||||
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||||
|
/* a copy of this software and associated documentation files (the */
|
||||||
|
/* "Software"), to deal in the Software without restriction, including */
|
||||||
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||||
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||||
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||||
|
/* the following conditions: */
|
||||||
|
/* */
|
||||||
|
/* The above copyright notice and this permission notice shall be */
|
||||||
|
/* included in all copies or substantial portions of the Software. */
|
||||||
|
/* */
|
||||||
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||||
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||||
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||||
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||||
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||||
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
|
/**************************************************************************/
|
||||||
|
|
||||||
|
#include "gdextension_compat_hashes.h"
|
||||||
|
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
|
||||||
|
#include "core/variant/variant.h"
|
||||||
|
|
||||||
|
HashMap<StringName, LocalVector<GDExtensionCompatHashes::Mapping>> GDExtensionCompatHashes::mappings;
|
||||||
|
|
||||||
|
bool GDExtensionCompatHashes::lookup_current_hash(const StringName &p_class, const StringName &p_method, uint32_t p_legacy_hash, uint32_t *r_current_hash) {
|
||||||
|
LocalVector<Mapping> *methods = mappings.getptr(p_class);
|
||||||
|
if (!methods) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const Mapping &mapping : *methods) {
|
||||||
|
if (mapping.method == p_method && mapping.legacy_hash == p_legacy_hash) {
|
||||||
|
*r_current_hash = mapping.current_hash;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GDExtensionCompatHashes::get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes) {
|
||||||
|
LocalVector<Mapping> *methods = mappings.getptr(p_class);
|
||||||
|
if (!methods) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
for (const Mapping &mapping : *methods) {
|
||||||
|
if (mapping.method == p_method) {
|
||||||
|
r_hashes.push_back(mapping.legacy_hash);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtensionCompatHashes::initialize() {
|
||||||
|
// clang-format off
|
||||||
|
mappings.insert("AESContext", {
|
||||||
|
{ "start", 3167574919, 3122411423 },
|
||||||
|
});
|
||||||
|
mappings.insert("AStar2D", {
|
||||||
|
{ "add_point", 3370185124, 4074201818 },
|
||||||
|
{ "set_point_disabled", 4023243586, 972357352 },
|
||||||
|
{ "connect_points", 3785370599, 3710494224 },
|
||||||
|
{ "disconnect_points", 3785370599, 3710494224 },
|
||||||
|
{ "are_points_connected", 4063588998, 2288175859 },
|
||||||
|
});
|
||||||
|
mappings.insert("AStar3D", {
|
||||||
|
{ "add_point", 2920922839, 1038703438 },
|
||||||
|
{ "set_point_disabled", 4023243586, 972357352 },
|
||||||
|
{ "connect_points", 3785370599, 3710494224 },
|
||||||
|
{ "disconnect_points", 3785370599, 3710494224 },
|
||||||
|
{ "are_points_connected", 4063588998, 2288175859 },
|
||||||
|
});
|
||||||
|
mappings.insert("AStarGrid2D", {
|
||||||
|
{ "set_point_solid", 2825551965, 1765703753 },
|
||||||
|
{ "fill_solid_region", 1152863744, 2261970063 },
|
||||||
|
});
|
||||||
|
mappings.insert("AcceptDialog", {
|
||||||
|
{ "add_button", 4158837846, 3328440682 },
|
||||||
|
});
|
||||||
|
mappings.insert("Animation", {
|
||||||
|
{ "add_track", 2393815928, 3843682357 },
|
||||||
|
{ "track_insert_key", 1985425300, 808952278 },
|
||||||
|
{ "track_find_key", 3898229885, 3245197284 },
|
||||||
|
{ "bezier_track_insert_key", 1057544502, 3656773645 },
|
||||||
|
{ "bezier_track_set_key_in_handle", 1028302688, 1719223284 },
|
||||||
|
{ "bezier_track_set_key_out_handle", 1028302688, 1719223284 },
|
||||||
|
{ "audio_track_insert_key", 3489962123, 4021027286 },
|
||||||
|
});
|
||||||
|
mappings.insert("AnimationNode", {
|
||||||
|
{ "blend_animation", 11797022, 1630801826 },
|
||||||
|
{ "blend_node", 263389446, 1746075988 },
|
||||||
|
{ "blend_input", 2709059328, 1361527350 },
|
||||||
|
});
|
||||||
|
mappings.insert("AnimationNodeBlendSpace1D", {
|
||||||
|
{ "add_blend_point", 4069484420, 285050433 },
|
||||||
|
});
|
||||||
|
mappings.insert("AnimationNodeBlendSpace2D", {
|
||||||
|
{ "add_blend_point", 1533588937, 402261981 },
|
||||||
|
{ "add_triangle", 642454959, 753017335 },
|
||||||
|
});
|
||||||
|
mappings.insert("AnimationNodeBlendTree", {
|
||||||
|
{ "add_node", 2055804584, 1980270704 },
|
||||||
|
});
|
||||||
|
mappings.insert("AnimationNodeStateMachine", {
|
||||||
|
{ "add_node", 2055804584, 1980270704 },
|
||||||
|
});
|
||||||
|
mappings.insert("AnimationNodeStateMachinePlayback", {
|
||||||
|
{ "travel", 3683006648, 3823612587 },
|
||||||
|
{ "start", 3683006648, 3823612587 },
|
||||||
|
});
|
||||||
|
mappings.insert("ArrayMesh", {
|
||||||
|
{ "add_surface_from_arrays", 172284304, 1796411378 },
|
||||||
|
});
|
||||||
|
mappings.insert("AudioEffectSpectrumAnalyzerInstance", {
|
||||||
|
{ "get_magnitude_for_frequency_range", 2693213071, 797993915 },
|
||||||
|
});
|
||||||
|
mappings.insert("AudioServer", {
|
||||||
|
{ "add_bus_effect", 4147765248, 4068819785 },
|
||||||
|
{ "get_bus_effect_instance", 2887144608, 1829771234 },
|
||||||
|
});
|
||||||
|
mappings.insert("AudioStreamPlaybackPolyphonic", {
|
||||||
|
{ "play_stream", 3792189967, 604492179 },
|
||||||
|
});
|
||||||
|
mappings.insert("AudioStreamRandomizer", {
|
||||||
|
{ "add_stream", 3197802065, 1892018854 },
|
||||||
|
});
|
||||||
|
mappings.insert("BitMap", {
|
||||||
|
{ "create_from_image_alpha", 505265891, 106271684 },
|
||||||
|
{ "opaque_to_polygons", 876132484, 48478126 },
|
||||||
|
});
|
||||||
|
mappings.insert("CanvasItem", {
|
||||||
|
{ "draw_line", 2516941890, 1562330099 },
|
||||||
|
{ "draw_dashed_line", 2175215884, 684651049 },
|
||||||
|
{ "draw_polyline", 4175878946, 3797364428 },
|
||||||
|
{ "draw_polyline_colors", 2239164197, 2311979562 },
|
||||||
|
{ "draw_arc", 3486841771, 4140652635 },
|
||||||
|
{ "draw_multiline", 4230657331, 2239075205 },
|
||||||
|
{ "draw_multiline_colors", 235933050, 4072951537 },
|
||||||
|
{ "draw_rect", 84391229, 2417231121 },
|
||||||
|
{ "draw_texture", 1695860435, 520200117 },
|
||||||
|
{ "draw_texture_rect", 3204081724, 3832805018 },
|
||||||
|
{ "draw_texture_rect_region", 3196597532, 3883821411 },
|
||||||
|
{ "draw_msdf_texture_rect_region", 2672026175, 4219163252 },
|
||||||
|
{ "draw_lcd_texture_rect_region", 169610548, 3212350954 },
|
||||||
|
{ "draw_primitive", 2248678295, 3288481815 },
|
||||||
|
{ "draw_polygon", 2683625537, 974537912 },
|
||||||
|
{ "draw_colored_polygon", 1659099617, 15245644 },
|
||||||
|
{ "draw_string", 2552080639, 728290553 },
|
||||||
|
{ "draw_multiline_string", 4002645436, 1927038192 },
|
||||||
|
{ "draw_string_outline", 850005221, 340562381 },
|
||||||
|
{ "draw_multiline_string_outline", 3717870722, 1912318525 },
|
||||||
|
{ "draw_char", 2329089032, 3339793283 },
|
||||||
|
{ "draw_char_outline", 419453826, 3302344391 },
|
||||||
|
{ "draw_mesh", 1634855856, 153818295 },
|
||||||
|
{ "draw_set_transform", 3283884939, 288975085 },
|
||||||
|
{ "draw_animation_slice", 2295343543, 3112831842 },
|
||||||
|
});
|
||||||
|
mappings.insert("CodeEdit", {
|
||||||
|
{ "is_in_string", 3294126239, 688195400 },
|
||||||
|
{ "is_in_comment", 3294126239, 688195400 },
|
||||||
|
{ "add_code_completion_option", 1629240608, 947964390 },
|
||||||
|
});
|
||||||
|
mappings.insert("Control", {
|
||||||
|
{ "set_offsets_preset", 3651818904, 3724524307 },
|
||||||
|
{ "set_anchors_and_offsets_preset", 3651818904, 3724524307 },
|
||||||
|
{ "set_anchor", 2589937826, 2302782885 },
|
||||||
|
{ "get_theme_icon", 2336455395, 3163973443 },
|
||||||
|
{ "get_theme_stylebox", 2759935355, 604739069 },
|
||||||
|
{ "get_theme_font", 387378635, 2826986490 },
|
||||||
|
{ "get_theme_font_size", 229578101, 1327056374 },
|
||||||
|
{ "get_theme_color", 2377051548, 2798751242 },
|
||||||
|
{ "get_theme_constant", 229578101, 1327056374 },
|
||||||
|
{ "has_theme_icon", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_stylebox", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_font", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_font_size", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_color", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_constant", 1187511791, 866386512 },
|
||||||
|
});
|
||||||
|
mappings.insert("Crypto", {
|
||||||
|
{ "generate_self_signed_certificate", 947314696, 492266173 },
|
||||||
|
});
|
||||||
|
mappings.insert("Curve", {
|
||||||
|
{ "add_point", 2766148617, 434072736 },
|
||||||
|
});
|
||||||
|
mappings.insert("Curve2D", {
|
||||||
|
{ "add_point", 2437345566, 4175465202 },
|
||||||
|
});
|
||||||
|
mappings.insert("Curve3D", {
|
||||||
|
{ "add_point", 3836314258, 2931053748 },
|
||||||
|
});
|
||||||
|
mappings.insert("DirAccess", {
|
||||||
|
{ "list_dir_begin", 2018049411, 2610976713 },
|
||||||
|
{ "copy", 198434953, 1063198817 },
|
||||||
|
{ "copy_absolute", 198434953, 1063198817 },
|
||||||
|
});
|
||||||
|
mappings.insert("DisplayServer", {
|
||||||
|
{ "global_menu_add_submenu_item", 3806306913, 2828985934 },
|
||||||
|
{ "global_menu_add_item", 3415468211, 3401266716 },
|
||||||
|
{ "global_menu_add_check_item", 3415468211, 3401266716 },
|
||||||
|
{ "global_menu_add_icon_item", 1700867534, 4245856523 },
|
||||||
|
{ "global_menu_add_icon_check_item", 1700867534, 4245856523 },
|
||||||
|
{ "global_menu_add_radio_check_item", 3415468211, 3401266716 },
|
||||||
|
{ "global_menu_add_icon_radio_check_item", 1700867534, 4245856523 },
|
||||||
|
{ "global_menu_add_multistate_item", 635750054, 3431222859 },
|
||||||
|
{ "global_menu_add_separator", 1041533178, 3214812433 },
|
||||||
|
{ "tts_speak", 3741216677, 903992738 },
|
||||||
|
{ "is_touchscreen_available", 4162880507, 3323674545 },
|
||||||
|
{ "screen_set_orientation", 2629526904, 2211511631 },
|
||||||
|
{ "window_get_native_handle", 2709193271, 1096425680 },
|
||||||
|
{ "window_set_title", 3043792800, 441246282 },
|
||||||
|
{ "window_set_mouse_passthrough", 3958815166, 1993637420 },
|
||||||
|
{ "window_set_current_screen", 3023605688, 2230941749 },
|
||||||
|
{ "window_set_position", 3614040015, 2019273902 },
|
||||||
|
{ "window_set_size", 3614040015, 2019273902 },
|
||||||
|
{ "window_set_rect_changed_callback", 3653650673, 1091192925 },
|
||||||
|
{ "window_set_window_event_callback", 3653650673, 1091192925 },
|
||||||
|
{ "window_set_input_event_callback", 3653650673, 1091192925 },
|
||||||
|
{ "window_set_input_text_callback", 3653650673, 1091192925 },
|
||||||
|
{ "window_set_drop_files_callback", 3653650673, 1091192925 },
|
||||||
|
{ "window_set_max_size", 3614040015, 2019273902 },
|
||||||
|
{ "window_set_min_size", 3614040015, 2019273902 },
|
||||||
|
{ "window_set_mode", 2942569511, 1319965401 },
|
||||||
|
{ "window_set_flag", 3971592565, 254894155 },
|
||||||
|
{ "window_get_flag", 2662949986, 802816991 },
|
||||||
|
{ "window_set_window_buttons_offset", 3614040015, 2019273902 },
|
||||||
|
{ "window_set_ime_active", 450484987, 1661950165 },
|
||||||
|
{ "window_set_ime_position", 3614040015, 2019273902 },
|
||||||
|
{ "window_set_vsync_mode", 1708924624, 2179333492 },
|
||||||
|
{ "virtual_keyboard_show", 860410478, 3042891259 },
|
||||||
|
{ "cursor_set_custom_image", 1358907026, 1816663697 },
|
||||||
|
});
|
||||||
|
mappings.insert("ENetConnection", {
|
||||||
|
{ "create_host_bound", 866250949, 1515002313 },
|
||||||
|
{ "connect_to_host", 385984708, 2171300490 },
|
||||||
|
{ "dtls_client_setup", 3097527179, 1966198364 },
|
||||||
|
});
|
||||||
|
mappings.insert("ENetMultiplayerPeer", {
|
||||||
|
{ "create_server", 1616151701, 2917761309 },
|
||||||
|
{ "create_client", 920217784, 2327163476 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorCommandPalette", {
|
||||||
|
{ "add_command", 3664614892, 864043298 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorDebuggerSession", {
|
||||||
|
{ "send_message", 3780025912, 85656714 },
|
||||||
|
{ "toggle_profiler", 35674246, 1198443697 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorFileDialog", {
|
||||||
|
{ "add_filter", 233059325, 3388804757 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorImportPlugin", {
|
||||||
|
{ "append_import_external_resource", 3645925746, 320493106 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorInterface", {
|
||||||
|
{ "popup_dialog", 2478844058, 2015770942 },
|
||||||
|
{ "popup_dialog_centered", 1723337679, 346557367 },
|
||||||
|
{ "popup_dialog_centered_ratio", 1310934579, 2093669136 },
|
||||||
|
{ "popup_dialog_centered_clamped", 3433759678, 3763385571 },
|
||||||
|
{ "inspect_object", 2564140749, 127962172 },
|
||||||
|
{ "edit_script", 3664508569, 219829402 },
|
||||||
|
{ "save_scene_as", 1168363258, 3647332257 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorNode3DGizmo", {
|
||||||
|
{ "add_lines", 302451090, 2910971437 },
|
||||||
|
{ "add_mesh", 1868867708, 1579955111 },
|
||||||
|
{ "add_unscaled_billboard", 3719733075, 520007164 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorNode3DGizmoPlugin", {
|
||||||
|
{ "create_icon_material", 2976007329, 3804976916 },
|
||||||
|
{ "get_material", 3501703615, 974464017 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorScenePostImportPlugin", {
|
||||||
|
{ "add_import_option_advanced", 3774155785, 3674075649 },
|
||||||
|
});
|
||||||
|
mappings.insert("EditorUndoRedoManager", {
|
||||||
|
{ "create_action", 3577985681, 2107025470 },
|
||||||
|
});
|
||||||
|
mappings.insert("EngineDebugger", {
|
||||||
|
{ "profiler_enable", 438160728, 3192561009 },
|
||||||
|
});
|
||||||
|
mappings.insert("Expression", {
|
||||||
|
{ "parse", 3658149758, 3069722906 },
|
||||||
|
});
|
||||||
|
mappings.insert("FileAccess", {
|
||||||
|
{ "open_compressed", 2874458257, 3686439335 },
|
||||||
|
{ "store_csv_line", 2217842308, 2173791505 },
|
||||||
|
});
|
||||||
|
mappings.insert("FileDialog", {
|
||||||
|
{ "add_filter", 233059325, 3388804757 },
|
||||||
|
});
|
||||||
|
mappings.insert("Font", {
|
||||||
|
{ "find_variation", 1222433716, 3344325384 },
|
||||||
|
{ "get_string_size", 3678918099, 1868866121 },
|
||||||
|
{ "get_multiline_string_size", 2427690650, 519636710 },
|
||||||
|
{ "draw_string", 2565402639, 1983721962 },
|
||||||
|
{ "draw_multiline_string", 348869189, 1171506176 },
|
||||||
|
{ "draw_string_outline", 657875837, 623754045 },
|
||||||
|
{ "draw_multiline_string_outline", 1649790182, 3206388178 },
|
||||||
|
{ "draw_char", 1462476057, 3815617597 },
|
||||||
|
{ "draw_char_outline", 4161008124, 209525354 },
|
||||||
|
// Pre-existing compatibility hash.
|
||||||
|
{ "find_variation", 1149405976, 1851767612 },
|
||||||
|
});
|
||||||
|
mappings.insert("GLTFDocument", {
|
||||||
|
{ "append_from_file", 1862991421, 866380864 },
|
||||||
|
{ "append_from_buffer", 2818062664, 1616081266 },
|
||||||
|
{ "append_from_scene", 374125375, 1622574258 },
|
||||||
|
{ "generate_scene", 2770277081, 596118388 },
|
||||||
|
});
|
||||||
|
mappings.insert("Geometry2D", {
|
||||||
|
{ "offset_polygon", 3837618924, 1275354010 },
|
||||||
|
{ "offset_polyline", 328033063, 2328231778 },
|
||||||
|
});
|
||||||
|
mappings.insert("Geometry3D", {
|
||||||
|
{ "build_cylinder_planes", 3142160516, 449920067 },
|
||||||
|
{ "build_capsule_planes", 410870045, 2113592876 },
|
||||||
|
});
|
||||||
|
mappings.insert("GraphNode", {
|
||||||
|
{ "set_slot", 902131739, 2873310869 },
|
||||||
|
});
|
||||||
|
mappings.insert("GridMap", {
|
||||||
|
{ "set_cell_item", 4177201334, 3449088946 },
|
||||||
|
});
|
||||||
|
mappings.insert("HTTPClient", {
|
||||||
|
{ "connect_to_host", 1970282951, 504540374 },
|
||||||
|
{ "request", 3249905507, 3778990155 },
|
||||||
|
});
|
||||||
|
mappings.insert("HTTPRequest", {
|
||||||
|
{ "request", 2720304520, 3215244323 },
|
||||||
|
{ "request_raw", 4282724657, 2714829993 },
|
||||||
|
});
|
||||||
|
mappings.insert("IP", {
|
||||||
|
{ "resolve_hostname", 396864159, 4283295457 },
|
||||||
|
{ "resolve_hostname_addresses", 3462780090, 773767525 },
|
||||||
|
{ "resolve_hostname_queue_item", 3936392508, 1749894742 },
|
||||||
|
});
|
||||||
|
mappings.insert("Image", {
|
||||||
|
{ "resize", 2461393748, 994498151 },
|
||||||
|
{ "save_jpg", 578836491, 2800019068 },
|
||||||
|
{ "save_webp", 3594949219, 2781156876 },
|
||||||
|
{ "compress", 4094210332, 2975424957 },
|
||||||
|
{ "compress_from_channels", 279105990, 4212890953 },
|
||||||
|
{ "load_svg_from_buffer", 1822513750, 311853421 },
|
||||||
|
{ "load_svg_from_string", 1461766635, 3254053600 },
|
||||||
|
});
|
||||||
|
mappings.insert("ImmediateMesh", {
|
||||||
|
{ "surface_begin", 3716480242, 2794442543 },
|
||||||
|
});
|
||||||
|
mappings.insert("ImporterMesh", {
|
||||||
|
{ "add_surface", 4122361985, 1740448849 },
|
||||||
|
});
|
||||||
|
mappings.insert("Input", {
|
||||||
|
{ "get_vector", 1517139831, 2479607902 },
|
||||||
|
{ "start_joy_vibration", 1890603622, 2576575033 },
|
||||||
|
{ "action_press", 573731101, 1713091165 },
|
||||||
|
{ "set_custom_mouse_cursor", 3489634142, 703945977 },
|
||||||
|
});
|
||||||
|
mappings.insert("InputEvent", {
|
||||||
|
{ "is_match", 3392494811, 1754951977 },
|
||||||
|
{ "xformed_by", 2747409789, 1282766827 },
|
||||||
|
});
|
||||||
|
mappings.insert("InputMap", {
|
||||||
|
{ "add_action", 573731101, 4100757082 },
|
||||||
|
});
|
||||||
|
mappings.insert("ItemList", {
|
||||||
|
{ "add_item", 4086250691, 359861678 },
|
||||||
|
{ "add_icon_item", 3332687421, 4256579627 },
|
||||||
|
{ "get_item_rect", 1501513492, 159227807 },
|
||||||
|
{ "select", 4023243586, 972357352 },
|
||||||
|
});
|
||||||
|
mappings.insert("JSON", {
|
||||||
|
{ "stringify", 2656701787, 462733549 },
|
||||||
|
});
|
||||||
|
mappings.insert("JavaScriptBridge", {
|
||||||
|
{ "download_buffer", 4123979296, 3352272093 },
|
||||||
|
});
|
||||||
|
mappings.insert("Line2D", {
|
||||||
|
{ "add_point", 468506575, 2654014372 },
|
||||||
|
});
|
||||||
|
mappings.insert("MultiplayerAPI", {
|
||||||
|
{ "rpc", 1833408346, 2077486355 },
|
||||||
|
});
|
||||||
|
mappings.insert("NavigationMeshGenerator", {
|
||||||
|
{ "parse_source_geometry_data", 3703028813, 685862123 },
|
||||||
|
{ "bake_from_source_geometry_data", 3669016597, 2469318639 },
|
||||||
|
});
|
||||||
|
mappings.insert("NavigationServer2D", {
|
||||||
|
{ "map_get_path", 56240621, 3146466012 },
|
||||||
|
});
|
||||||
|
mappings.insert("NavigationServer3D", {
|
||||||
|
{ "map_get_path", 2121045993, 1187418690 },
|
||||||
|
{ "parse_source_geometry_data", 3703028813, 685862123 },
|
||||||
|
{ "bake_from_source_geometry_data", 3669016597, 2469318639 },
|
||||||
|
{ "bake_from_source_geometry_data_async", 3669016597, 2469318639 },
|
||||||
|
});
|
||||||
|
mappings.insert("Node", {
|
||||||
|
{ "add_child", 3070154285, 3863233950 },
|
||||||
|
{ "reparent", 2570952461, 3685795103 },
|
||||||
|
{ "find_child", 4253159453, 2008217037 },
|
||||||
|
{ "find_children", 1585018254, 2560337219 },
|
||||||
|
{ "propagate_call", 1667910434, 1871007965 },
|
||||||
|
{ "set_multiplayer_authority", 4023243586, 972357352 },
|
||||||
|
});
|
||||||
|
mappings.insert("Node3D", {
|
||||||
|
{ "look_at", 3123400617, 2882425029 },
|
||||||
|
{ "look_at_from_position", 4067663783, 2086826090 },
|
||||||
|
});
|
||||||
|
mappings.insert("Noise", {
|
||||||
|
{ "get_image", 2569233413, 3180683109 },
|
||||||
|
{ "get_seamless_image", 2210827790, 2770743602 },
|
||||||
|
{ "get_image_3d", 2358868431, 3977814329 },
|
||||||
|
{ "get_seamless_image_3d", 3328694319, 451006340 },
|
||||||
|
});
|
||||||
|
mappings.insert("OS", {
|
||||||
|
{ "alert", 233059325, 1783970740 },
|
||||||
|
{ "get_system_font_path", 2262142305, 626580860 },
|
||||||
|
{ "get_system_font_path_for_text", 3824042574, 197317981 },
|
||||||
|
{ "execute", 2881709059, 1488299882 },
|
||||||
|
{ "shell_show_in_file_manager", 885841341, 3565188097 },
|
||||||
|
{ "set_restart_on_exit", 611198603, 3331453935 },
|
||||||
|
{ "get_system_dir", 1965199849, 3073895123 },
|
||||||
|
});
|
||||||
|
mappings.insert("Object", {
|
||||||
|
{ "add_user_signal", 3780025912, 85656714 },
|
||||||
|
{ "connect", 1469446357, 1518946055 },
|
||||||
|
{ "tr", 2475554935, 1195764410 },
|
||||||
|
{ "tr_n", 4021311862, 162698058 },
|
||||||
|
});
|
||||||
|
mappings.insert("OptionButton", {
|
||||||
|
{ "add_item", 3043792800, 2697778442 },
|
||||||
|
{ "add_icon_item", 3944051090, 3781678508 },
|
||||||
|
});
|
||||||
|
mappings.insert("PCKPacker", {
|
||||||
|
{ "pck_start", 3232891339, 508410629 },
|
||||||
|
});
|
||||||
|
mappings.insert("PacketPeerDTLS", {
|
||||||
|
{ "connect_to_peer", 1801538152, 2880188099 },
|
||||||
|
});
|
||||||
|
mappings.insert("PacketPeerUDP", {
|
||||||
|
{ "bind", 4290438434, 4051239242 },
|
||||||
|
});
|
||||||
|
mappings.insert("Performance", {
|
||||||
|
{ "add_custom_monitor", 2865980031, 4099036814 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicalBone3D", {
|
||||||
|
{ "apply_impulse", 1002852006, 2754756483 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsBody2D", {
|
||||||
|
{ "move_and_collide", 1529961754, 3681923724 },
|
||||||
|
{ "test_move", 1369208982, 3324464701 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsBody3D", {
|
||||||
|
{ "move_and_collide", 2825704414, 3208792678 },
|
||||||
|
{ "test_move", 680299713, 2481691619 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsDirectBodyState2D", {
|
||||||
|
{ "apply_impulse", 496058220, 4288681949 },
|
||||||
|
{ "apply_force", 496058220, 4288681949 },
|
||||||
|
{ "add_constant_force", 496058220, 4288681949 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsDirectBodyState3D", {
|
||||||
|
{ "apply_impulse", 1002852006, 2754756483 },
|
||||||
|
{ "apply_force", 1002852006, 2754756483 },
|
||||||
|
{ "add_constant_force", 1002852006, 2754756483 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsDirectSpaceState2D", {
|
||||||
|
{ "intersect_point", 3278207904, 2118456068 },
|
||||||
|
{ "intersect_shape", 3803848594, 2488867228 },
|
||||||
|
{ "collide_shape", 3803848594, 2488867228 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsDirectSpaceState3D", {
|
||||||
|
{ "intersect_point", 45993382, 975173756 },
|
||||||
|
{ "intersect_shape", 550215980, 3762137681 },
|
||||||
|
{ "collide_shape", 550215980, 3762137681 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsRayQueryParameters2D", {
|
||||||
|
{ "create", 1118143851, 3196569324 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsRayQueryParameters3D", {
|
||||||
|
{ "create", 680321959, 3110599579 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsServer2D", {
|
||||||
|
{ "area_add_shape", 754862190, 339056240 },
|
||||||
|
{ "body_add_shape", 754862190, 339056240 },
|
||||||
|
{ "body_apply_impulse", 34330743, 205485391 },
|
||||||
|
{ "body_apply_force", 34330743, 205485391 },
|
||||||
|
{ "body_add_constant_force", 34330743, 205485391 },
|
||||||
|
{ "joint_make_pin", 2288600450, 1612646186 },
|
||||||
|
{ "joint_make_groove", 3573265764, 481430435 },
|
||||||
|
{ "joint_make_damped_spring", 206603952, 1994657646 },
|
||||||
|
});
|
||||||
|
mappings.insert("PhysicsServer3D", {
|
||||||
|
{ "area_add_shape", 4040559639, 3711419014 },
|
||||||
|
{ "body_add_shape", 4040559639, 3711419014 },
|
||||||
|
{ "body_apply_impulse", 110375048, 390416203 },
|
||||||
|
{ "body_apply_force", 110375048, 390416203 },
|
||||||
|
{ "body_add_constant_force", 110375048, 390416203 },
|
||||||
|
});
|
||||||
|
mappings.insert("PopupMenu", {
|
||||||
|
{ "add_item", 3224536192, 3674230041 },
|
||||||
|
{ "add_icon_item", 1200674553, 1086190128 },
|
||||||
|
{ "add_check_item", 3224536192, 3674230041 },
|
||||||
|
{ "add_icon_check_item", 1200674553, 1086190128 },
|
||||||
|
{ "add_radio_check_item", 3224536192, 3674230041 },
|
||||||
|
{ "add_icon_radio_check_item", 1200674553, 1086190128 },
|
||||||
|
{ "add_multistate_item", 1585218420, 150780458 },
|
||||||
|
{ "add_shortcut", 2482211467, 3451850107 },
|
||||||
|
{ "add_icon_shortcut", 3060251822, 2997871092 },
|
||||||
|
{ "add_check_shortcut", 2168272394, 1642193386 },
|
||||||
|
{ "add_icon_check_shortcut", 68101841, 3856247530 },
|
||||||
|
{ "add_radio_check_shortcut", 2168272394, 1642193386 },
|
||||||
|
{ "add_icon_radio_check_shortcut", 68101841, 3856247530 },
|
||||||
|
{ "add_submenu_item", 3728518296, 2979222410 },
|
||||||
|
// Pre-existing compatibility hashes.
|
||||||
|
{ "add_icon_shortcut", 68101841, 3856247530 },
|
||||||
|
{ "add_shortcut", 2168272394, 1642193386 },
|
||||||
|
});
|
||||||
|
mappings.insert("PortableCompressedTexture2D", {
|
||||||
|
{ "create_from_image", 97251393, 3679243433 },
|
||||||
|
});
|
||||||
|
mappings.insert("ProjectSettings", {
|
||||||
|
{ "load_resource_pack", 3001721055, 708980503 },
|
||||||
|
});
|
||||||
|
mappings.insert("RegEx", {
|
||||||
|
{ "search", 4087180739, 3365977994 },
|
||||||
|
{ "search_all", 3354100289, 849021363 },
|
||||||
|
{ "sub", 758293621, 54019702 },
|
||||||
|
});
|
||||||
|
mappings.insert("RenderingDevice", {
|
||||||
|
{ "texture_create", 3011278298, 3709173589 },
|
||||||
|
{ "texture_create_shared_from_slice", 864132525, 1808971279 },
|
||||||
|
{ "texture_update", 2736912341, 2096463824 },
|
||||||
|
{ "texture_copy", 3741367532, 2339493201 },
|
||||||
|
{ "texture_clear", 3423681478, 3396867530 },
|
||||||
|
{ "texture_resolve_multisample", 2126834943, 594679454 },
|
||||||
|
{ "framebuffer_format_create", 2635475316, 697032759 },
|
||||||
|
{ "framebuffer_format_create_multipass", 1992489524, 2647479094 },
|
||||||
|
{ "framebuffer_format_get_texture_samples", 1036806638, 4223391010 },
|
||||||
|
{ "framebuffer_create", 1884747791, 3284231055 },
|
||||||
|
{ "framebuffer_create_multipass", 452534725, 1750306695 },
|
||||||
|
{ "framebuffer_create_empty", 382373098, 3058360618 },
|
||||||
|
{ "vertex_buffer_create", 3491282828, 3410049843 },
|
||||||
|
{ "vertex_array_create", 3137892244, 3799816279 },
|
||||||
|
{ "index_buffer_create", 975915977, 3935920523 },
|
||||||
|
{ "shader_compile_spirv_from_source", 3459523685, 1178973306 },
|
||||||
|
{ "shader_compile_binary_from_spirv", 1395027180, 134910450 },
|
||||||
|
{ "shader_create_from_spirv", 3297482566, 342949005 },
|
||||||
|
{ "shader_create_from_bytecode", 2078349841, 1687031350 },
|
||||||
|
{ "uniform_buffer_create", 1453158401, 34556762 },
|
||||||
|
{ "storage_buffer_create", 1173156076, 2316365934 },
|
||||||
|
{ "texture_buffer_create", 2344087557, 1470338698 },
|
||||||
|
{ "buffer_update", 652628289, 3793150683 },
|
||||||
|
{ "buffer_clear", 1645170096, 2797041220 },
|
||||||
|
{ "buffer_get_data", 125363422, 3101830688 },
|
||||||
|
{ "render_pipeline_create", 2911419500, 2385451958 },
|
||||||
|
{ "compute_pipeline_create", 403593840, 1448838280 },
|
||||||
|
{ "draw_list_begin", 4252992020, 2468082605 },
|
||||||
|
{ "draw_list_begin_split", 832527510, 2406300660 },
|
||||||
|
{ "draw_list_draw", 3710874499, 4230067973 },
|
||||||
|
{ "draw_list_enable_scissor", 338791288, 244650101 },
|
||||||
|
});
|
||||||
|
mappings.insert("RenderingServer", {
|
||||||
|
{ "texture_rd_create", 3291180269, 1434128712 },
|
||||||
|
{ "shader_set_default_texture_parameter", 3864903085, 4094001817 },
|
||||||
|
{ "shader_get_default_texture_parameter", 2523186822, 1464608890 },
|
||||||
|
{ "mesh_create_from_surfaces", 4007581507, 4291747531 },
|
||||||
|
{ "mesh_add_surface_from_arrays", 1247008646, 2342446560 },
|
||||||
|
{ "viewport_attach_to_screen", 1278520651, 1062245816 },
|
||||||
|
{ "environment_set_ambient_light", 491659071, 1214961493 },
|
||||||
|
{ "instances_cull_aabb", 2031554939, 2570105777 },
|
||||||
|
{ "instances_cull_ray", 3388524336, 2208759584 },
|
||||||
|
{ "instances_cull_convex", 3690700105, 2488539944 },
|
||||||
|
{ "canvas_item_set_custom_rect", 2180266943, 1333997032 },
|
||||||
|
{ "canvas_item_add_line", 2843922985, 1819681853 },
|
||||||
|
{ "canvas_item_add_polyline", 3438017257, 3098767073 },
|
||||||
|
{ "canvas_item_add_multiline", 3176074788, 2088642721 },
|
||||||
|
{ "canvas_item_add_texture_rect", 3205360868, 324864032 },
|
||||||
|
{ "canvas_item_add_msdf_texture_rect_region", 349157222, 97408773 },
|
||||||
|
{ "canvas_item_add_texture_rect_region", 2782979504, 485157892 },
|
||||||
|
{ "canvas_item_add_nine_patch", 904428547, 389957886 },
|
||||||
|
{ "canvas_item_add_polygon", 2907936855, 3580000528 },
|
||||||
|
{ "canvas_item_add_triangle_array", 749685193, 660261329 },
|
||||||
|
{ "canvas_item_add_mesh", 3548053052, 316450961 },
|
||||||
|
{ "canvas_item_add_multimesh", 1541595251, 2131855138 },
|
||||||
|
{ "canvas_item_add_animation_slice", 4107531031, 2646834499 },
|
||||||
|
{ "canvas_item_set_canvas_group_mode", 41973386, 3973586316 },
|
||||||
|
{ "set_boot_image", 2244367877, 3759744527 },
|
||||||
|
});
|
||||||
|
mappings.insert("ResourceLoader", {
|
||||||
|
{ "load_threaded_request", 1939848623, 3614384323 },
|
||||||
|
{ "load_threaded_get_status", 3931021148, 4137685479 },
|
||||||
|
{ "load", 2622212233, 3358495409 },
|
||||||
|
{ "exists", 2220807150, 4185558881 },
|
||||||
|
});
|
||||||
|
mappings.insert("ResourceSaver", {
|
||||||
|
{ "save", 2303056517, 2983274697 },
|
||||||
|
});
|
||||||
|
mappings.insert("RichTextLabel", {
|
||||||
|
{ "add_image", 3346058748, 3580801207 },
|
||||||
|
{ "push_font", 814287596, 2347424842 },
|
||||||
|
{ "push_paragraph", 3218895358, 3089306873 },
|
||||||
|
{ "push_list", 4036303897, 3017143144 },
|
||||||
|
{ "push_table", 1125058220, 2623499273 },
|
||||||
|
{ "push_dropcap", 311501835, 4061635501 },
|
||||||
|
{ "set_table_column_expand", 4132157579, 2185176273 },
|
||||||
|
});
|
||||||
|
mappings.insert("RigidBody2D", {
|
||||||
|
{ "apply_impulse", 496058220, 4288681949 },
|
||||||
|
{ "apply_force", 496058220, 4288681949 },
|
||||||
|
{ "add_constant_force", 496058220, 4288681949 },
|
||||||
|
});
|
||||||
|
mappings.insert("RigidBody3D", {
|
||||||
|
{ "apply_impulse", 1002852006, 2754756483 },
|
||||||
|
{ "apply_force", 1002852006, 2754756483 },
|
||||||
|
{ "add_constant_force", 1002852006, 2754756483 },
|
||||||
|
});
|
||||||
|
mappings.insert("SceneMultiplayer", {
|
||||||
|
{ "send_bytes", 2742700601, 1307428718 },
|
||||||
|
});
|
||||||
|
mappings.insert("SceneReplicationConfig", {
|
||||||
|
{ "add_property", 3818401521, 4094619021 },
|
||||||
|
});
|
||||||
|
mappings.insert("SceneTree", {
|
||||||
|
{ "create_timer", 1780978058, 2709170273 },
|
||||||
|
});
|
||||||
|
mappings.insert("ScriptCreateDialog", {
|
||||||
|
{ "config", 4210001628, 869314288 },
|
||||||
|
});
|
||||||
|
mappings.insert("Shader", {
|
||||||
|
{ "set_default_texture_parameter", 1628453603, 2750740428 },
|
||||||
|
{ "get_default_texture_parameter", 3823812009, 3090538643 },
|
||||||
|
});
|
||||||
|
mappings.insert("Skeleton3D", {
|
||||||
|
{ "set_bone_enabled", 4023243586, 972357352 },
|
||||||
|
});
|
||||||
|
mappings.insert("SpriteFrames", {
|
||||||
|
{ "add_frame", 407562921, 1351332740 },
|
||||||
|
{ "set_frame", 3155743884, 56804795 },
|
||||||
|
});
|
||||||
|
mappings.insert("StreamPeerTCP", {
|
||||||
|
{ "bind", 4025329869, 3167955072 },
|
||||||
|
});
|
||||||
|
mappings.insert("StreamPeerTLS", {
|
||||||
|
{ "connect_to_stream", 1325480781, 57169517 },
|
||||||
|
});
|
||||||
|
mappings.insert("SurfaceTool", {
|
||||||
|
{ "add_triangle_fan", 297960074, 2235017613 },
|
||||||
|
{ "generate_lod", 1894448909, 1938056459 },
|
||||||
|
});
|
||||||
|
mappings.insert("TCPServer", {
|
||||||
|
{ "listen", 4025329869, 3167955072 },
|
||||||
|
});
|
||||||
|
mappings.insert("TextEdit", {
|
||||||
|
{ "get_line_width", 3294126239, 688195400 },
|
||||||
|
{ "insert_text_at_caret", 3043792800, 2697778442 },
|
||||||
|
{ "get_line_column_at_pos", 850652858, 239517838 },
|
||||||
|
{ "is_mouse_over_selection", 1099474134, 1840282309 },
|
||||||
|
{ "set_caret_line", 1413195636, 1302582944 },
|
||||||
|
{ "set_caret_column", 1071284433, 3796796178 },
|
||||||
|
{ "set_selection_mode", 2920622473, 1443345937 },
|
||||||
|
{ "select", 4269665324, 2560984452 },
|
||||||
|
{ "get_scroll_pos_for_line", 3274652423, 3929084198 },
|
||||||
|
{ "set_line_as_first_visible", 3023605688, 2230941749 },
|
||||||
|
{ "set_line_as_center_visible", 3023605688, 2230941749 },
|
||||||
|
{ "set_line_as_last_visible", 3023605688, 2230941749 },
|
||||||
|
});
|
||||||
|
mappings.insert("TextLine", {
|
||||||
|
{ "add_string", 867188035, 621426851 },
|
||||||
|
{ "add_object", 735420116, 1316529304 },
|
||||||
|
{ "resize_object", 960819067, 2095776372 },
|
||||||
|
{ "draw", 1164457837, 856975658 },
|
||||||
|
{ "draw_outline", 1364491366, 1343401456 },
|
||||||
|
});
|
||||||
|
mappings.insert("TextParagraph", {
|
||||||
|
{ "set_dropcap", 2613124475, 2498990330 },
|
||||||
|
{ "add_string", 867188035, 621426851 },
|
||||||
|
{ "add_object", 735420116, 1316529304 },
|
||||||
|
{ "resize_object", 960819067, 2095776372 },
|
||||||
|
{ "draw", 367324453, 1567802413 },
|
||||||
|
{ "draw_outline", 2159523405, 1893131224 },
|
||||||
|
{ "draw_line", 3963848920, 1242169894 },
|
||||||
|
{ "draw_line_outline", 1814903311, 2664926980 },
|
||||||
|
{ "draw_dropcap", 1164457837, 856975658 },
|
||||||
|
{ "draw_dropcap_outline", 1364491366, 1343401456 },
|
||||||
|
});
|
||||||
|
mappings.insert("TextServer", {
|
||||||
|
{ "font_draw_glyph", 1821196351, 1339057948 },
|
||||||
|
{ "font_draw_glyph_outline", 1124898203, 2626165733 },
|
||||||
|
{ "shaped_text_set_direction", 2616949700, 1551430183 },
|
||||||
|
{ "shaped_text_set_orientation", 104095128, 3019609126 },
|
||||||
|
{ "shaped_text_add_string", 2621279422, 623473029 },
|
||||||
|
{ "shaped_text_add_object", 2838446185, 3664424789 },
|
||||||
|
{ "shaped_text_resize_object", 2353789835, 790361552 },
|
||||||
|
{ "shaped_set_span_update_font", 1578983057, 2022725822 },
|
||||||
|
{ "shaped_text_fit_to_width", 603718830, 530670926 },
|
||||||
|
{ "shaped_text_get_line_breaks_adv", 4206849830, 2376991424 },
|
||||||
|
{ "shaped_text_get_line_breaks", 303410369, 2651359741 },
|
||||||
|
{ "shaped_text_get_word_breaks", 3299477123, 185957063 },
|
||||||
|
{ "shaped_text_overrun_trim_to_width", 1572579718, 2723146520 },
|
||||||
|
{ "shaped_text_draw", 70679950, 880389142 },
|
||||||
|
{ "shaped_text_draw_outline", 2673671346, 2559184194 },
|
||||||
|
{ "format_number", 2305636099, 2664628024 },
|
||||||
|
{ "parse_number", 2305636099, 2664628024 },
|
||||||
|
{ "string_get_word_breaks", 1398910359, 581857818 },
|
||||||
|
{ "string_get_character_breaks", 1586579831, 2333794773 },
|
||||||
|
{ "string_to_upper", 2305636099, 2664628024 },
|
||||||
|
{ "string_to_lower", 2305636099, 2664628024 },
|
||||||
|
});
|
||||||
|
mappings.insert("Texture2D", {
|
||||||
|
{ "draw", 1115460088, 2729649137 },
|
||||||
|
{ "draw_rect", 575156982, 3499451691 },
|
||||||
|
{ "draw_rect_region", 1066564656, 2963678660 },
|
||||||
|
});
|
||||||
|
mappings.insert("Thread", {
|
||||||
|
{ "start", 2779832528, 1327203254 },
|
||||||
|
});
|
||||||
|
mappings.insert("TileMap", {
|
||||||
|
{ "set_cell", 1732664643, 966713560 },
|
||||||
|
{ "set_cells_terrain_connect", 3072115677, 3578627656 },
|
||||||
|
{ "set_cells_terrain_path", 3072115677, 3578627656 },
|
||||||
|
{ "get_used_cells_by_id", 4152068407, 2931012785 },
|
||||||
|
});
|
||||||
|
mappings.insert("TileMapPattern", {
|
||||||
|
{ "set_cell", 634000503, 2224802556 },
|
||||||
|
});
|
||||||
|
mappings.insert("TileSet", {
|
||||||
|
{ "add_source", 276991387, 1059186179 },
|
||||||
|
{ "add_terrain", 3023605688, 1230568737 },
|
||||||
|
{ "add_pattern", 3009264082, 763712015 },
|
||||||
|
});
|
||||||
|
mappings.insert("TileSetAtlasSource", {
|
||||||
|
{ "create_tile", 1583819816, 190528769 },
|
||||||
|
{ "move_tile_in_atlas", 1375626516, 3870111920 },
|
||||||
|
{ "has_room_for_tile", 4182444377, 3018597268 },
|
||||||
|
{ "create_alternative_tile", 3531100812, 2226298068 },
|
||||||
|
{ "get_tile_texture_region", 1321423751, 241857547 },
|
||||||
|
});
|
||||||
|
mappings.insert("TileSetScenesCollectionSource", {
|
||||||
|
{ "create_scene_tile", 2633389122, 1117465415 },
|
||||||
|
});
|
||||||
|
mappings.insert("Translation", {
|
||||||
|
{ "add_message", 971803314, 3898530326 },
|
||||||
|
{ "add_plural_message", 360316719, 2356982266 },
|
||||||
|
{ "get_message", 58037827, 1829228469 },
|
||||||
|
{ "get_plural_message", 1333931916, 229954002 },
|
||||||
|
{ "erase_message", 3919944288, 3959009644 },
|
||||||
|
});
|
||||||
|
mappings.insert("TranslationServer", {
|
||||||
|
{ "translate", 58037827, 1829228469 },
|
||||||
|
{ "translate_plural", 1333931916, 229954002 },
|
||||||
|
});
|
||||||
|
mappings.insert("Tree", {
|
||||||
|
{ "get_item_area_rect", 1235226180, 47968679 },
|
||||||
|
});
|
||||||
|
mappings.insert("TreeItem", {
|
||||||
|
{ "propagate_check", 4023243586, 972357352 },
|
||||||
|
{ "add_button", 1507727907, 1688223362 },
|
||||||
|
});
|
||||||
|
mappings.insert("UDPServer", {
|
||||||
|
{ "listen", 4025329869, 3167955072 },
|
||||||
|
});
|
||||||
|
mappings.insert("UPNP", {
|
||||||
|
{ "add_port_mapping", 3358934458, 818314583 },
|
||||||
|
{ "delete_port_mapping", 760296170, 3444187325 },
|
||||||
|
});
|
||||||
|
mappings.insert("UPNPDevice", {
|
||||||
|
{ "add_port_mapping", 3358934458, 818314583 },
|
||||||
|
{ "delete_port_mapping", 760296170, 3444187325 },
|
||||||
|
});
|
||||||
|
mappings.insert("UndoRedo", {
|
||||||
|
{ "create_action", 3900135403, 3171901514 },
|
||||||
|
});
|
||||||
|
mappings.insert("VideoStreamPlayback", {
|
||||||
|
{ "mix_audio", 1369271885, 93876830 },
|
||||||
|
});
|
||||||
|
mappings.insert("WebRTCMultiplayerPeer", {
|
||||||
|
{ "create_client", 1777354631, 2641732907 },
|
||||||
|
{ "create_mesh", 1777354631, 2641732907 },
|
||||||
|
{ "add_peer", 2555866323, 4078953270 },
|
||||||
|
});
|
||||||
|
mappings.insert("WebRTCPeerConnection", {
|
||||||
|
{ "create_data_channel", 3997447457, 1288557393 },
|
||||||
|
});
|
||||||
|
mappings.insert("WebSocketMultiplayerPeer", {
|
||||||
|
{ "create_client", 3097527179, 1966198364 },
|
||||||
|
{ "create_server", 337374795, 2400822951 },
|
||||||
|
});
|
||||||
|
mappings.insert("WebSocketPeer", {
|
||||||
|
{ "connect_to_url", 3097527179, 1966198364 },
|
||||||
|
{ "send", 3440492527, 2780360567 },
|
||||||
|
});
|
||||||
|
mappings.insert("Window", {
|
||||||
|
{ "get_theme_icon", 2336455395, 3163973443 },
|
||||||
|
{ "get_theme_stylebox", 2759935355, 604739069 },
|
||||||
|
{ "get_theme_font", 387378635, 2826986490 },
|
||||||
|
{ "get_theme_font_size", 229578101, 1327056374 },
|
||||||
|
{ "get_theme_color", 2377051548, 2798751242 },
|
||||||
|
{ "get_theme_constant", 229578101, 1327056374 },
|
||||||
|
{ "has_theme_icon", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_stylebox", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_font", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_font_size", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_color", 1187511791, 866386512 },
|
||||||
|
{ "has_theme_constant", 1187511791, 866386512 },
|
||||||
|
{ "popup_exclusive", 1728044812, 2134721627 },
|
||||||
|
{ "popup_exclusive_centered", 2561668109, 3357594017 },
|
||||||
|
{ "popup_exclusive_centered_ratio", 4257659513, 2284776287 },
|
||||||
|
{ "popup_exclusive_centered_clamped", 224798062, 2612708785 },
|
||||||
|
});
|
||||||
|
mappings.insert("WorkerThreadPool", {
|
||||||
|
{ "add_task", 3976347598, 3745067146 },
|
||||||
|
{ "add_group_task", 2377228549, 1801953219 },
|
||||||
|
});
|
||||||
|
mappings.insert("ZIPPacker", {
|
||||||
|
{ "open", 3715508516, 1936816515 },
|
||||||
|
});
|
||||||
|
mappings.insert("ZIPReader", {
|
||||||
|
{ "read_file", 156385007, 740857591 },
|
||||||
|
{ "file_exists", 1676256, 35364943 },
|
||||||
|
});
|
||||||
|
// clang-format on
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // DISABLE_DEPRECATED
|
57
godot/core/extension/gdextension_compat_hashes.h
Normal file
57
godot/core/extension/gdextension_compat_hashes.h
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/**************************************************************************/
|
||||||
|
/* gdextension_compat_hashes.h */
|
||||||
|
/**************************************************************************/
|
||||||
|
/* This file is part of: */
|
||||||
|
/* GODOT ENGINE */
|
||||||
|
/* https://godotengine.org */
|
||||||
|
/**************************************************************************/
|
||||||
|
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||||
|
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||||
|
/* */
|
||||||
|
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||||
|
/* a copy of this software and associated documentation files (the */
|
||||||
|
/* "Software"), to deal in the Software without restriction, including */
|
||||||
|
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||||
|
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||||
|
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||||
|
/* the following conditions: */
|
||||||
|
/* */
|
||||||
|
/* The above copyright notice and this permission notice shall be */
|
||||||
|
/* included in all copies or substantial portions of the Software. */
|
||||||
|
/* */
|
||||||
|
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||||
|
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||||
|
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||||
|
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||||
|
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||||
|
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||||
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
|
/**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef GDEXTENSION_COMPAT_HASHES_H
|
||||||
|
#define GDEXTENSION_COMPAT_HASHES_H
|
||||||
|
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
|
||||||
|
#include "core/string/string_name.h"
|
||||||
|
#include "core/templates/hash_map.h"
|
||||||
|
#include "core/templates/local_vector.h"
|
||||||
|
|
||||||
|
class GDExtensionCompatHashes {
|
||||||
|
struct Mapping {
|
||||||
|
StringName method;
|
||||||
|
uint32_t legacy_hash;
|
||||||
|
uint32_t current_hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
static HashMap<StringName, LocalVector<Mapping>> mappings;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void initialize();
|
||||||
|
static bool lookup_current_hash(const StringName &p_class, const StringName &p_method, uint32_t p_legacy_hash, uint32_t *r_current_hash);
|
||||||
|
static bool get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DISABLE_DEPRECATED
|
||||||
|
|
||||||
|
#endif // GDEXTENSION_COMPAT_HASHES_H
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#include "core/config/engine.h"
|
#include "core/config/engine.h"
|
||||||
#include "core/extension/gdextension.h"
|
#include "core/extension/gdextension.h"
|
||||||
|
#include "core/extension/gdextension_compat_hashes.h"
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
#include "core/io/xml_parser.h"
|
#include "core/io/xml_parser.h"
|
||||||
#include "core/object/class_db.h"
|
#include "core/object/class_db.h"
|
||||||
|
@ -41,6 +42,152 @@
|
||||||
#include "core/variant/variant.h"
|
#include "core/variant/variant.h"
|
||||||
#include "core/version.h"
|
#include "core/version.h"
|
||||||
|
|
||||||
|
class CallableCustomExtension : public CallableCustom {
|
||||||
|
void *userdata;
|
||||||
|
void *token;
|
||||||
|
|
||||||
|
ObjectID object;
|
||||||
|
|
||||||
|
GDExtensionCallableCustomCall call_func;
|
||||||
|
GDExtensionCallableCustomIsValid is_valid_func;
|
||||||
|
GDExtensionCallableCustomFree free_func;
|
||||||
|
|
||||||
|
GDExtensionCallableCustomEqual equal_func;
|
||||||
|
GDExtensionCallableCustomLessThan less_than_func;
|
||||||
|
|
||||||
|
GDExtensionCallableCustomToString to_string_func;
|
||||||
|
|
||||||
|
uint32_t _hash;
|
||||||
|
|
||||||
|
static bool default_compare_equal(const CallableCustom *p_a, const CallableCustom *p_b) {
|
||||||
|
const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);
|
||||||
|
const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);
|
||||||
|
|
||||||
|
if (a->call_func != b->call_func || a->userdata != b->userdata) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool default_compare_less(const CallableCustom *p_a, const CallableCustom *p_b) {
|
||||||
|
const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);
|
||||||
|
const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);
|
||||||
|
|
||||||
|
if (a->call_func != b->call_func) {
|
||||||
|
return a->call_func < b->call_func;
|
||||||
|
}
|
||||||
|
return a->userdata < b->userdata;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool custom_compare_equal(const CallableCustom *p_a, const CallableCustom *p_b) {
|
||||||
|
const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);
|
||||||
|
const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);
|
||||||
|
|
||||||
|
if (a->equal_func != b->equal_func) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return a->equal_func(a->userdata, b->userdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool custom_compare_less(const CallableCustom *p_a, const CallableCustom *p_b) {
|
||||||
|
const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);
|
||||||
|
const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);
|
||||||
|
|
||||||
|
if (a->less_than_func != b->less_than_func) {
|
||||||
|
return default_compare_less(p_a, p_b);
|
||||||
|
}
|
||||||
|
return a->less_than_func(a->userdata, b->userdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
uint32_t hash() const override {
|
||||||
|
return _hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
String get_as_text() const override {
|
||||||
|
if (to_string_func != nullptr) {
|
||||||
|
String out;
|
||||||
|
GDExtensionBool is_valid = false;
|
||||||
|
|
||||||
|
to_string_func(userdata, &is_valid, (GDExtensionStringPtr)&out);
|
||||||
|
|
||||||
|
if (is_valid) {
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "<CallableCustom>";
|
||||||
|
}
|
||||||
|
|
||||||
|
CompareEqualFunc get_compare_equal_func() const override {
|
||||||
|
return (equal_func != nullptr) ? custom_compare_equal : default_compare_equal;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompareLessFunc get_compare_less_func() const override {
|
||||||
|
return (less_than_func != nullptr) ? custom_compare_less : default_compare_less;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_valid() const override {
|
||||||
|
if (is_valid_func != nullptr && !is_valid_func(userdata)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return call_func != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringName get_method() const override {
|
||||||
|
return StringName();
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectID get_object() const override {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *get_userdata(void *p_token) const {
|
||||||
|
return (p_token == token) ? userdata : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const override {
|
||||||
|
GDExtensionCallError error;
|
||||||
|
|
||||||
|
call_func(userdata, (GDExtensionConstVariantPtr *)p_arguments, p_argcount, (GDExtensionVariantPtr)&r_return_value, &error);
|
||||||
|
|
||||||
|
r_call_error.error = (Callable::CallError::Error)error.error;
|
||||||
|
r_call_error.argument = error.argument;
|
||||||
|
r_call_error.expected = error.expected;
|
||||||
|
}
|
||||||
|
|
||||||
|
CallableCustomExtension(GDExtensionCallableCustomInfo *p_info) {
|
||||||
|
userdata = p_info->callable_userdata;
|
||||||
|
token = p_info->token;
|
||||||
|
|
||||||
|
if (p_info->object != nullptr) {
|
||||||
|
object = ((Object *)p_info->object)->get_instance_id();
|
||||||
|
}
|
||||||
|
|
||||||
|
call_func = p_info->call_func;
|
||||||
|
is_valid_func = p_info->is_valid_func;
|
||||||
|
free_func = p_info->free_func;
|
||||||
|
|
||||||
|
equal_func = p_info->equal_func;
|
||||||
|
less_than_func = p_info->less_than_func;
|
||||||
|
|
||||||
|
to_string_func = p_info->to_string_func;
|
||||||
|
|
||||||
|
// Pre-calculate the hash.
|
||||||
|
if (p_info->hash_func != nullptr) {
|
||||||
|
_hash = p_info->hash_func(userdata);
|
||||||
|
} else {
|
||||||
|
_hash = hash_murmur3_one_64((uint64_t)call_func);
|
||||||
|
_hash = hash_murmur3_one_64((uint64_t)userdata, _hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~CallableCustomExtension() {
|
||||||
|
if (free_func != nullptr) {
|
||||||
|
free_func(userdata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Core interface functions.
|
// Core interface functions.
|
||||||
GDExtensionInterfaceFunctionPtr gdextension_get_proc_address(const char *p_name) {
|
GDExtensionInterfaceFunctionPtr gdextension_get_proc_address(const char *p_name) {
|
||||||
return GDExtension::get_interface_function(p_name);
|
return GDExtension::get_interface_function(p_name);
|
||||||
|
@ -607,25 +754,25 @@ static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionUninitiali
|
||||||
dest->parse_utf8(p_contents, p_size);
|
dest->parse_utf8(p_contents, p_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size) {
|
static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count) {
|
||||||
memnew_placement(r_dest, String);
|
memnew_placement(r_dest, String);
|
||||||
String *dest = reinterpret_cast<String *>(r_dest);
|
String *dest = reinterpret_cast<String *>(r_dest);
|
||||||
dest->parse_utf16(p_contents, p_size);
|
dest->parse_utf16(p_contents, p_char_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size) {
|
static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count) {
|
||||||
memnew_placement(r_dest, String((const char32_t *)p_contents, p_size));
|
memnew_placement(r_dest, String((const char32_t *)p_contents, p_char_count));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size) {
|
static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_char_count) {
|
||||||
if constexpr (sizeof(wchar_t) == 2) {
|
if constexpr (sizeof(wchar_t) == 2) {
|
||||||
// wchar_t is 16 bit, parse.
|
// wchar_t is 16 bit, parse.
|
||||||
memnew_placement(r_dest, String);
|
memnew_placement(r_dest, String);
|
||||||
String *dest = reinterpret_cast<String *>(r_dest);
|
String *dest = reinterpret_cast<String *>(r_dest);
|
||||||
dest->parse_utf16((const char16_t *)p_contents, p_size);
|
dest->parse_utf16((const char16_t *)p_contents, p_char_count);
|
||||||
} else {
|
} else {
|
||||||
// wchar_t is 32 bit, copy.
|
// wchar_t is 32 bit, copy.
|
||||||
memnew_placement(r_dest, String((const char32_t *)p_contents, p_size));
|
memnew_placement(r_dest, String((const char32_t *)p_contents, p_char_count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -731,6 +878,24 @@ static GDExtensionInt gdextension_string_resize(GDExtensionStringPtr p_self, GDE
|
||||||
return (*self).resize(p_length);
|
return (*self).resize(p_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_name_new_with_latin1_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionBool p_is_static) {
|
||||||
|
memnew_placement(r_dest, StringName(p_contents, static_cast<bool>(p_is_static)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_name_new_with_utf8_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents) {
|
||||||
|
String tmp;
|
||||||
|
tmp.parse_utf8(p_contents);
|
||||||
|
|
||||||
|
memnew_placement(r_dest, StringName(tmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gdextension_string_name_new_with_utf8_chars_and_len(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionInt p_size) {
|
||||||
|
String tmp;
|
||||||
|
tmp.parse_utf8(p_contents, p_size);
|
||||||
|
|
||||||
|
memnew_placement(r_dest, StringName(tmp));
|
||||||
|
}
|
||||||
|
|
||||||
static GDExtensionInt gdextension_xml_parser_open_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_buffer, size_t p_size) {
|
static GDExtensionInt gdextension_xml_parser_open_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_buffer, size_t p_size) {
|
||||||
XMLParser *xml = (XMLParser *)p_instance;
|
XMLParser *xml = (XMLParser *)p_instance;
|
||||||
return (GDExtensionInt)xml->_open_buffer(p_buffer, p_size);
|
return (GDExtensionInt)xml->_open_buffer(p_buffer, p_size);
|
||||||
|
@ -987,6 +1152,11 @@ static void gdextension_object_set_instance_binding(GDExtensionObjectPtr p_objec
|
||||||
o->set_instance_binding(p_token, p_binding, p_callbacks);
|
o->set_instance_binding(p_token, p_binding, p_callbacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gdextension_object_free_instance_binding(GDExtensionObjectPtr p_object, void *p_token) {
|
||||||
|
Object *o = (Object *)p_object;
|
||||||
|
o->free_instance_binding(p_token);
|
||||||
|
}
|
||||||
|
|
||||||
static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {
|
static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {
|
||||||
const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
|
const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
|
||||||
Object *o = (Object *)p_object;
|
Object *o = (Object *)p_object;
|
||||||
|
@ -1048,6 +1218,7 @@ static GDExtensionScriptInstancePtr gdextension_script_instance_create(const GDE
|
||||||
info_2->get_func = p_info->get_func;
|
info_2->get_func = p_info->get_func;
|
||||||
info_2->get_property_list_func = p_info->get_property_list_func;
|
info_2->get_property_list_func = p_info->get_property_list_func;
|
||||||
info_2->free_property_list_func = p_info->free_property_list_func;
|
info_2->free_property_list_func = p_info->free_property_list_func;
|
||||||
|
info_2->get_class_category_func = nullptr;
|
||||||
info_2->property_can_revert_func = p_info->property_can_revert_func;
|
info_2->property_can_revert_func = p_info->property_can_revert_func;
|
||||||
info_2->property_get_revert_func = p_info->property_get_revert_func;
|
info_2->property_get_revert_func = p_info->property_get_revert_func;
|
||||||
info_2->get_owner_func = p_info->get_owner_func;
|
info_2->get_owner_func = p_info->get_owner_func;
|
||||||
|
@ -1139,20 +1310,43 @@ static GDExtensionScriptInstancePtr gdextension_object_get_script_instance(GDExt
|
||||||
return script_instance_extension->instance;
|
return script_instance_extension->instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gdextension_callable_custom_create(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo *p_custom_callable_info) {
|
||||||
|
memnew_placement(r_callable, Callable(memnew(CallableCustomExtension(p_custom_callable_info))));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *gdextension_callable_custom_get_userdata(GDExtensionTypePtr p_callable, void *p_token) {
|
||||||
|
const Callable &callable = *reinterpret_cast<const Callable *>(p_callable);
|
||||||
|
if (!callable.is_custom()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
const CallableCustomExtension *custom_callable = dynamic_cast<const CallableCustomExtension *>(callable.get_custom());
|
||||||
|
if (!custom_callable) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return custom_callable->get_userdata(p_token);
|
||||||
|
}
|
||||||
|
|
||||||
static GDExtensionMethodBindPtr gdextension_classdb_get_method_bind(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash) {
|
static GDExtensionMethodBindPtr gdextension_classdb_get_method_bind(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash) {
|
||||||
const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
|
const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
|
||||||
const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname);
|
const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname);
|
||||||
bool exists = false;
|
bool exists = false;
|
||||||
MethodBind *mb = ClassDB::get_method_with_compatibility(classname, methodname, p_hash, &exists);
|
MethodBind *mb = ClassDB::get_method_with_compatibility(classname, methodname, p_hash, &exists);
|
||||||
|
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
// If lookup failed, see if this is one of the broken hashes from issue #81386.
|
||||||
|
if (!mb && exists) {
|
||||||
|
uint32_t mapped_hash;
|
||||||
|
if (GDExtensionCompatHashes::lookup_current_hash(classname, methodname, p_hash, &mapped_hash)) {
|
||||||
|
mb = ClassDB::get_method_with_compatibility(classname, methodname, mapped_hash, &exists);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!mb && exists) {
|
if (!mb && exists) {
|
||||||
ERR_PRINT("Method '" + classname + "." + methodname + "' has changed and no compatibility fallback has been provided. Please open an issue.");
|
ERR_PRINT("Method '" + classname + "." + methodname + "' has changed and no compatibility fallback has been provided. Please open an issue.");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
ERR_FAIL_NULL_V(mb, nullptr);
|
ERR_FAIL_NULL_V(mb, nullptr);
|
||||||
if (mb->get_hash() != p_hash) {
|
|
||||||
ERR_PRINT("Hash mismatch for method '" + classname + "." + methodname + "'.");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return (GDExtensionMethodBindPtr)mb;
|
return (GDExtensionMethodBindPtr)mb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1264,6 +1458,9 @@ void gdextension_setup_interface() {
|
||||||
REGISTER_INTERFACE_FUNC(string_operator_plus_eq_wcstr);
|
REGISTER_INTERFACE_FUNC(string_operator_plus_eq_wcstr);
|
||||||
REGISTER_INTERFACE_FUNC(string_operator_plus_eq_c32str);
|
REGISTER_INTERFACE_FUNC(string_operator_plus_eq_c32str);
|
||||||
REGISTER_INTERFACE_FUNC(string_resize);
|
REGISTER_INTERFACE_FUNC(string_resize);
|
||||||
|
REGISTER_INTERFACE_FUNC(string_name_new_with_latin1_chars);
|
||||||
|
REGISTER_INTERFACE_FUNC(string_name_new_with_utf8_chars);
|
||||||
|
REGISTER_INTERFACE_FUNC(string_name_new_with_utf8_chars_and_len);
|
||||||
REGISTER_INTERFACE_FUNC(xml_parser_open_buffer);
|
REGISTER_INTERFACE_FUNC(xml_parser_open_buffer);
|
||||||
REGISTER_INTERFACE_FUNC(file_access_store_buffer);
|
REGISTER_INTERFACE_FUNC(file_access_store_buffer);
|
||||||
REGISTER_INTERFACE_FUNC(file_access_get_buffer);
|
REGISTER_INTERFACE_FUNC(file_access_get_buffer);
|
||||||
|
@ -1299,6 +1496,7 @@ void gdextension_setup_interface() {
|
||||||
REGISTER_INTERFACE_FUNC(global_get_singleton);
|
REGISTER_INTERFACE_FUNC(global_get_singleton);
|
||||||
REGISTER_INTERFACE_FUNC(object_get_instance_binding);
|
REGISTER_INTERFACE_FUNC(object_get_instance_binding);
|
||||||
REGISTER_INTERFACE_FUNC(object_set_instance_binding);
|
REGISTER_INTERFACE_FUNC(object_set_instance_binding);
|
||||||
|
REGISTER_INTERFACE_FUNC(object_free_instance_binding);
|
||||||
REGISTER_INTERFACE_FUNC(object_set_instance);
|
REGISTER_INTERFACE_FUNC(object_set_instance);
|
||||||
REGISTER_INTERFACE_FUNC(object_get_class_name);
|
REGISTER_INTERFACE_FUNC(object_get_class_name);
|
||||||
REGISTER_INTERFACE_FUNC(object_cast_to);
|
REGISTER_INTERFACE_FUNC(object_cast_to);
|
||||||
|
@ -1313,6 +1511,8 @@ void gdextension_setup_interface() {
|
||||||
REGISTER_INTERFACE_FUNC(placeholder_script_instance_create);
|
REGISTER_INTERFACE_FUNC(placeholder_script_instance_create);
|
||||||
REGISTER_INTERFACE_FUNC(placeholder_script_instance_update);
|
REGISTER_INTERFACE_FUNC(placeholder_script_instance_update);
|
||||||
REGISTER_INTERFACE_FUNC(object_get_script_instance);
|
REGISTER_INTERFACE_FUNC(object_get_script_instance);
|
||||||
|
REGISTER_INTERFACE_FUNC(callable_custom_create);
|
||||||
|
REGISTER_INTERFACE_FUNC(callable_custom_get_userdata);
|
||||||
REGISTER_INTERFACE_FUNC(classdb_construct_object);
|
REGISTER_INTERFACE_FUNC(classdb_construct_object);
|
||||||
REGISTER_INTERFACE_FUNC(classdb_get_method_bind);
|
REGISTER_INTERFACE_FUNC(classdb_get_method_bind);
|
||||||
REGISTER_INTERFACE_FUNC(classdb_get_class_tag);
|
REGISTER_INTERFACE_FUNC(classdb_get_class_tag);
|
||||||
|
|
|
@ -265,9 +265,12 @@ typedef void (*GDExtensionClassToString)(GDExtensionClassInstancePtr p_instance,
|
||||||
typedef void (*GDExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
|
typedef void (*GDExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
|
||||||
typedef void (*GDExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
|
typedef void (*GDExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
|
||||||
typedef void (*GDExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
|
typedef void (*GDExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
|
||||||
typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance)(void *p_userdata);
|
typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance)(void *p_class_userdata);
|
||||||
typedef void (*GDExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
|
typedef void (*GDExtensionClassFreeInstance)(void *p_class_userdata, GDExtensionClassInstancePtr p_instance);
|
||||||
typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual)(void *p_userdata, GDExtensionConstStringNamePtr p_name);
|
typedef GDExtensionClassInstancePtr (*GDExtensionClassRecreateInstance)(void *p_class_userdata, GDExtensionObjectPtr p_object);
|
||||||
|
typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual)(void *p_class_userdata, GDExtensionConstStringNamePtr p_name);
|
||||||
|
typedef void *(*GDExtensionClassGetVirtualCallData)(void *p_class_userdata, GDExtensionConstStringNamePtr p_name);
|
||||||
|
typedef void (*GDExtensionClassCallVirtualWithData)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, void *p_virtual_call_userdata, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GDExtensionBool is_virtual;
|
GDExtensionBool is_virtual;
|
||||||
|
@ -306,7 +309,18 @@ typedef struct {
|
||||||
GDExtensionClassUnreference unreference_func;
|
GDExtensionClassUnreference unreference_func;
|
||||||
GDExtensionClassCreateInstance create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract.
|
GDExtensionClassCreateInstance create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract.
|
||||||
GDExtensionClassFreeInstance free_instance_func; // Destructor; mandatory.
|
GDExtensionClassFreeInstance free_instance_func; // Destructor; mandatory.
|
||||||
GDExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function.
|
GDExtensionClassRecreateInstance recreate_instance_func;
|
||||||
|
// Queries a virtual function by name and returns a callback to invoke the requested virtual function.
|
||||||
|
GDExtensionClassGetVirtual get_virtual_func;
|
||||||
|
// Paired with `call_virtual_with_data_func`, this is an alternative to `get_virtual_func` for extensions that
|
||||||
|
// need or benefit from extra data when calling virtual functions.
|
||||||
|
// Returns user data that will be passed to `call_virtual_with_data_func`.
|
||||||
|
// Returning `NULL` from this function signals to Godot that the virtual function is not overridden.
|
||||||
|
// Data returned from this function should be managed by the extension and must be valid until the extension is deinitialized.
|
||||||
|
// You should supply either `get_virtual_func`, or `get_virtual_call_data_func` with `call_virtual_with_data_func`.
|
||||||
|
GDExtensionClassGetVirtualCallData get_virtual_call_data_func;
|
||||||
|
// Used to call virtual functions when `get_virtual_call_data_func` is not null.
|
||||||
|
GDExtensionClassCallVirtualWithData call_virtual_with_data_func;
|
||||||
GDExtensionClassGetRID get_rid_func;
|
GDExtensionClassGetRID get_rid_func;
|
||||||
void *class_userdata; // Per-class user data, later accessible in instance bindings.
|
void *class_userdata; // Per-class user data, later accessible in instance bindings.
|
||||||
} GDExtensionClassCreationInfo2;
|
} GDExtensionClassCreationInfo2;
|
||||||
|
@ -367,6 +381,47 @@ typedef struct {
|
||||||
GDExtensionVariantPtr *default_arguments;
|
GDExtensionVariantPtr *default_arguments;
|
||||||
} GDExtensionClassMethodInfo;
|
} GDExtensionClassMethodInfo;
|
||||||
|
|
||||||
|
typedef void (*GDExtensionCallableCustomCall)(void *callable_userdata, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
|
||||||
|
typedef GDExtensionBool (*GDExtensionCallableCustomIsValid)(void *callable_userdata);
|
||||||
|
typedef void (*GDExtensionCallableCustomFree)(void *callable_userdata);
|
||||||
|
|
||||||
|
typedef uint32_t (*GDExtensionCallableCustomHash)(void *callable_userdata);
|
||||||
|
typedef GDExtensionBool (*GDExtensionCallableCustomEqual)(void *callable_userdata_a, void *callable_userdata_b);
|
||||||
|
typedef GDExtensionBool (*GDExtensionCallableCustomLessThan)(void *callable_userdata_a, void *callable_userdata_b);
|
||||||
|
|
||||||
|
typedef void (*GDExtensionCallableCustomToString)(void *callable_userdata, GDExtensionBool *r_is_valid, GDExtensionStringPtr r_out);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* Only `call_func` and `token` are strictly required, however, `object` should be passed if its not a static method.
|
||||||
|
*
|
||||||
|
* `token` should point to an address that uniquely identifies the GDExtension (for example, the
|
||||||
|
* `GDExtensionClassLibraryPtr` passed to the entry symbol function.
|
||||||
|
*
|
||||||
|
* `hash_func`, `equal_func`, and `less_than_func` are optional. If not provided both `call_func` and
|
||||||
|
* `callable_userdata` together are used as the identity of the callable for hashing and comparison purposes.
|
||||||
|
*
|
||||||
|
* The hash returned by `hash_func` is cached, `hash_func` will not be called more than once per callable.
|
||||||
|
*
|
||||||
|
* `is_valid_func` is necessary if the validity of the callable can change before destruction.
|
||||||
|
*
|
||||||
|
* `free_func` is necessary if `callable_userdata` needs to be cleaned up when the callable is freed.
|
||||||
|
*/
|
||||||
|
void *callable_userdata;
|
||||||
|
void *token;
|
||||||
|
|
||||||
|
GDExtensionObjectPtr object;
|
||||||
|
|
||||||
|
GDExtensionCallableCustomCall call_func;
|
||||||
|
GDExtensionCallableCustomIsValid is_valid_func;
|
||||||
|
GDExtensionCallableCustomFree free_func;
|
||||||
|
|
||||||
|
GDExtensionCallableCustomHash hash_func;
|
||||||
|
GDExtensionCallableCustomEqual equal_func;
|
||||||
|
GDExtensionCallableCustomLessThan less_than_func;
|
||||||
|
|
||||||
|
GDExtensionCallableCustomToString to_string_func;
|
||||||
|
} GDExtensionCallableCustomInfo;
|
||||||
|
|
||||||
/* SCRIPT INSTANCE EXTENSION */
|
/* SCRIPT INSTANCE EXTENSION */
|
||||||
|
|
||||||
typedef void *GDExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation.
|
typedef void *GDExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation.
|
||||||
|
@ -375,6 +430,8 @@ typedef GDExtensionBool (*GDExtensionScriptInstanceSet)(GDExtensionScriptInstanc
|
||||||
typedef GDExtensionBool (*GDExtensionScriptInstanceGet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
|
typedef GDExtensionBool (*GDExtensionScriptInstanceGet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
|
||||||
typedef const GDExtensionPropertyInfo *(*GDExtensionScriptInstanceGetPropertyList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
|
typedef const GDExtensionPropertyInfo *(*GDExtensionScriptInstanceGetPropertyList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
|
||||||
typedef void (*GDExtensionScriptInstanceFreePropertyList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionPropertyInfo *p_list);
|
typedef void (*GDExtensionScriptInstanceFreePropertyList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionPropertyInfo *p_list);
|
||||||
|
typedef GDExtensionBool (*GDExtensionScriptInstanceGetClassCategory)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionPropertyInfo *p_class_category);
|
||||||
|
|
||||||
typedef GDExtensionVariantType (*GDExtensionScriptInstanceGetPropertyType)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionBool *r_is_valid);
|
typedef GDExtensionVariantType (*GDExtensionScriptInstanceGetPropertyType)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionBool *r_is_valid);
|
||||||
typedef GDExtensionBool (*GDExtensionScriptInstanceValidateProperty)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionPropertyInfo *p_property);
|
typedef GDExtensionBool (*GDExtensionScriptInstanceValidateProperty)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionPropertyInfo *p_property);
|
||||||
|
|
||||||
|
@ -453,6 +510,7 @@ typedef struct {
|
||||||
GDExtensionScriptInstanceGet get_func;
|
GDExtensionScriptInstanceGet get_func;
|
||||||
GDExtensionScriptInstanceGetPropertyList get_property_list_func;
|
GDExtensionScriptInstanceGetPropertyList get_property_list_func;
|
||||||
GDExtensionScriptInstanceFreePropertyList free_property_list_func;
|
GDExtensionScriptInstanceFreePropertyList free_property_list_func;
|
||||||
|
GDExtensionScriptInstanceGetClassCategory get_class_category_func; // Optional. Set to NULL for the default behavior.
|
||||||
|
|
||||||
GDExtensionScriptInstancePropertyCanRevert property_can_revert_func;
|
GDExtensionScriptInstancePropertyCanRevert property_can_revert_func;
|
||||||
GDExtensionScriptInstancePropertyGetRevert property_get_revert_func;
|
GDExtensionScriptInstancePropertyGetRevert property_get_revert_func;
|
||||||
|
@ -1379,7 +1437,7 @@ typedef void (*GDExtensionInterfaceStringNewWithWideChars)(GDExtensionUninitiali
|
||||||
*
|
*
|
||||||
* @param r_dest A pointer to a Variant to hold the newly created String.
|
* @param r_dest A pointer to a Variant to hold the newly created String.
|
||||||
* @param p_contents A pointer to a Latin-1 encoded C string.
|
* @param p_contents A pointer to a Latin-1 encoded C string.
|
||||||
* @param p_size The number of characters.
|
* @param p_size The number of characters (= number of bytes).
|
||||||
*/
|
*/
|
||||||
typedef void (*GDExtensionInterfaceStringNewWithLatin1CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
|
typedef void (*GDExtensionInterfaceStringNewWithLatin1CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
|
||||||
|
|
||||||
|
@ -1391,7 +1449,7 @@ typedef void (*GDExtensionInterfaceStringNewWithLatin1CharsAndLen)(GDExtensionUn
|
||||||
*
|
*
|
||||||
* @param r_dest A pointer to a Variant to hold the newly created String.
|
* @param r_dest A pointer to a Variant to hold the newly created String.
|
||||||
* @param p_contents A pointer to a UTF-8 encoded C string.
|
* @param p_contents A pointer to a UTF-8 encoded C string.
|
||||||
* @param p_size The number of characters.
|
* @param p_size The number of bytes (not code units).
|
||||||
*/
|
*/
|
||||||
typedef void (*GDExtensionInterfaceStringNewWithUtf8CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
|
typedef void (*GDExtensionInterfaceStringNewWithUtf8CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
|
||||||
|
|
||||||
|
@ -1403,9 +1461,9 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf8CharsAndLen)(GDExtensionUnin
|
||||||
*
|
*
|
||||||
* @param r_dest A pointer to a Variant to hold the newly created String.
|
* @param r_dest A pointer to a Variant to hold the newly created String.
|
||||||
* @param p_contents A pointer to a UTF-16 encoded C string.
|
* @param p_contents A pointer to a UTF-16 encoded C string.
|
||||||
* @param p_size The number of characters.
|
* @param p_size The number of characters (not bytes).
|
||||||
*/
|
*/
|
||||||
typedef void (*GDExtensionInterfaceStringNewWithUtf16CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size);
|
typedef void (*GDExtensionInterfaceStringNewWithUtf16CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name string_new_with_utf32_chars_and_len
|
* @name string_new_with_utf32_chars_and_len
|
||||||
|
@ -1415,9 +1473,9 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf16CharsAndLen)(GDExtensionUni
|
||||||
*
|
*
|
||||||
* @param r_dest A pointer to a Variant to hold the newly created String.
|
* @param r_dest A pointer to a Variant to hold the newly created String.
|
||||||
* @param p_contents A pointer to a UTF-32 encoded C string.
|
* @param p_contents A pointer to a UTF-32 encoded C string.
|
||||||
* @param p_size The number of characters.
|
* @param p_size The number of characters (not bytes).
|
||||||
*/
|
*/
|
||||||
typedef void (*GDExtensionInterfaceStringNewWithUtf32CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size);
|
typedef void (*GDExtensionInterfaceStringNewWithUtf32CharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name string_new_with_wide_chars_and_len
|
* @name string_new_with_wide_chars_and_len
|
||||||
|
@ -1427,9 +1485,9 @@ typedef void (*GDExtensionInterfaceStringNewWithUtf32CharsAndLen)(GDExtensionUni
|
||||||
*
|
*
|
||||||
* @param r_dest A pointer to a Variant to hold the newly created String.
|
* @param r_dest A pointer to a Variant to hold the newly created String.
|
||||||
* @param p_contents A pointer to a wide C string.
|
* @param p_contents A pointer to a wide C string.
|
||||||
* @param p_size The number of characters.
|
* @param p_size The number of characters (not bytes).
|
||||||
*/
|
*/
|
||||||
typedef void (*GDExtensionInterfaceStringNewWithWideCharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size);
|
typedef void (*GDExtensionInterfaceStringNewWithWideCharsAndLen)(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_char_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name string_to_latin1_chars
|
* @name string_to_latin1_chars
|
||||||
|
@ -1611,6 +1669,50 @@ typedef void (*GDExtensionInterfaceStringOperatorPlusEqC32str)(GDExtensionString
|
||||||
*/
|
*/
|
||||||
typedef GDExtensionInt (*GDExtensionInterfaceStringResize)(GDExtensionStringPtr p_self, GDExtensionInt p_resize);
|
typedef GDExtensionInt (*GDExtensionInterfaceStringResize)(GDExtensionStringPtr p_self, GDExtensionInt p_resize);
|
||||||
|
|
||||||
|
/* INTERFACE: StringName Utilities */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name string_name_new_with_latin1_chars
|
||||||
|
* @since 4.2
|
||||||
|
*
|
||||||
|
* Creates a StringName from a Latin-1 encoded C string.
|
||||||
|
*
|
||||||
|
* If `p_is_static` is true, then:
|
||||||
|
* - The StringName will reuse the `p_contents` buffer instead of copying it.
|
||||||
|
* You must guarantee that the buffer remains valid for the duration of the application (e.g. string literal).
|
||||||
|
* - You must not call a destructor for this StringName. Incrementing the initial reference once should achieve this.
|
||||||
|
*
|
||||||
|
* `p_is_static` is purely an optimization and can easily introduce undefined behavior if used wrong. In case of doubt, set it to false.
|
||||||
|
*
|
||||||
|
* @param r_dest A pointer to uninitialized storage, into which the newly created StringName is constructed.
|
||||||
|
* @param p_contents A pointer to a C string (null terminated and Latin-1 or ASCII encoded).
|
||||||
|
* @param p_is_static Whether the StringName reuses the buffer directly (see above).
|
||||||
|
*/
|
||||||
|
typedef void (*GDExtensionInterfaceStringNameNewWithLatin1Chars)(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionBool p_is_static);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name string_name_new_with_utf8_chars
|
||||||
|
* @since 4.2
|
||||||
|
*
|
||||||
|
* Creates a StringName from a UTF-8 encoded C string.
|
||||||
|
*
|
||||||
|
* @param r_dest A pointer to uninitialized storage, into which the newly created StringName is constructed.
|
||||||
|
* @param p_contents A pointer to a C string (null terminated and UTF-8 encoded).
|
||||||
|
*/
|
||||||
|
typedef void (*GDExtensionInterfaceStringNameNewWithUtf8Chars)(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name string_name_new_with_utf8_chars_and_len
|
||||||
|
* @since 4.2
|
||||||
|
*
|
||||||
|
* Creates a StringName from a UTF-8 encoded string with a given number of characters.
|
||||||
|
*
|
||||||
|
* @param r_dest A pointer to uninitialized storage, into which the newly created StringName is constructed.
|
||||||
|
* @param p_contents A pointer to a C string (null terminated and UTF-8 encoded).
|
||||||
|
* @param p_size The number of bytes (not UTF-8 code points).
|
||||||
|
*/
|
||||||
|
typedef void (*GDExtensionInterfaceStringNameNewWithUtf8CharsAndLen)(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionInt p_size);
|
||||||
|
|
||||||
/* INTERFACE: XMLParser Utilities */
|
/* INTERFACE: XMLParser Utilities */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2089,6 +2191,17 @@ typedef void *(*GDExtensionInterfaceObjectGetInstanceBinding)(GDExtensionObjectP
|
||||||
*/
|
*/
|
||||||
typedef void (*GDExtensionInterfaceObjectSetInstanceBinding)(GDExtensionObjectPtr p_o, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
typedef void (*GDExtensionInterfaceObjectSetInstanceBinding)(GDExtensionObjectPtr p_o, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name object_free_instance_binding
|
||||||
|
* @since 4.2
|
||||||
|
*
|
||||||
|
* Free an Object's instance binding.
|
||||||
|
*
|
||||||
|
* @param p_o A pointer to the Object.
|
||||||
|
* @param p_library A token the library received by the GDExtension's entry point function.
|
||||||
|
*/
|
||||||
|
typedef void (*GDExtensionInterfaceObjectFreeInstanceBinding)(GDExtensionObjectPtr p_o, void *p_token);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name object_set_instance
|
* @name object_set_instance
|
||||||
* @since 4.1
|
* @since 4.1
|
||||||
|
@ -2250,6 +2363,34 @@ typedef void (*GDExtensionInterfacePlaceHolderScriptInstanceUpdate)(GDExtensionS
|
||||||
*/
|
*/
|
||||||
typedef GDExtensionScriptInstanceDataPtr (*GDExtensionInterfaceObjectGetScriptInstance)(GDExtensionConstObjectPtr p_object, GDExtensionObjectPtr p_language);
|
typedef GDExtensionScriptInstanceDataPtr (*GDExtensionInterfaceObjectGetScriptInstance)(GDExtensionConstObjectPtr p_object, GDExtensionObjectPtr p_language);
|
||||||
|
|
||||||
|
/* INTERFACE: Callable */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name callable_custom_create
|
||||||
|
* @since 4.2
|
||||||
|
*
|
||||||
|
* Creates a custom Callable object from a function pointer.
|
||||||
|
*
|
||||||
|
* Provided struct can be safely freed once the function returns.
|
||||||
|
*
|
||||||
|
* @param r_callable A pointer that will receive the new Callable.
|
||||||
|
* @param p_callable_custom_info The info required to construct a Callable.
|
||||||
|
*/
|
||||||
|
typedef void (*GDExtensionInterfaceCallableCustomCreate)(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo *p_callable_custom_info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name callable_custom_get_userdata
|
||||||
|
* @since 4.2
|
||||||
|
*
|
||||||
|
* Retrieves the userdata pointer from a custom Callable.
|
||||||
|
*
|
||||||
|
* If the Callable is not a custom Callable or the token does not match the one provided to callable_custom_create() via GDExtensionCallableCustomInfo then NULL will be returned.
|
||||||
|
*
|
||||||
|
* @param p_callable A pointer to a Callable.
|
||||||
|
* @param p_token A pointer to an address that uniquely identifies the GDExtension.
|
||||||
|
*/
|
||||||
|
typedef void *(*GDExtensionInterfaceCallableCustomGetUserData)(GDExtensionConstTypePtr p_callable, void *p_token);
|
||||||
|
|
||||||
/* INTERFACE: ClassDB */
|
/* INTERFACE: ClassDB */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -29,7 +29,44 @@
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
||||||
#include "gdextension_manager.h"
|
#include "gdextension_manager.h"
|
||||||
|
|
||||||
|
#include "core/extension/gdextension_compat_hashes.h"
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
|
#include "core/object/script_language.h"
|
||||||
|
|
||||||
|
GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(const Ref<GDExtension> &p_extension) {
|
||||||
|
if (level >= 0) { // Already initialized up to some level.
|
||||||
|
int32_t minimum_level = p_extension->get_minimum_library_initialization_level();
|
||||||
|
if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) {
|
||||||
|
return LOAD_STATUS_NEEDS_RESTART;
|
||||||
|
}
|
||||||
|
// Initialize up to current level.
|
||||||
|
for (int32_t i = minimum_level; i <= level; i++) {
|
||||||
|
p_extension->initialize_library(GDExtension::InitializationLevel(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const KeyValue<String, String> &kv : p_extension->class_icon_paths) {
|
||||||
|
gdextension_class_icon_paths[kv.key] = kv.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return LOAD_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(const Ref<GDExtension> &p_extension) {
|
||||||
|
if (level >= 0) { // Already initialized up to some level.
|
||||||
|
// Deinitialize down from current level.
|
||||||
|
for (int32_t i = level; i >= GDExtension::INITIALIZATION_LEVEL_CORE; i--) {
|
||||||
|
p_extension->deinitialize_library(GDExtension::InitializationLevel(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const KeyValue<String, String> &kv : p_extension->class_icon_paths) {
|
||||||
|
gdextension_class_icon_paths.erase(kv.key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return LOAD_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &p_path) {
|
GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &p_path) {
|
||||||
if (gdextension_map.has(p_path)) {
|
if (gdextension_map.has(p_path)) {
|
||||||
|
@ -40,19 +77,9 @@ GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &
|
||||||
return LOAD_STATUS_FAILED;
|
return LOAD_STATUS_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level >= 0) { // Already initialized up to some level.
|
LoadStatus status = _load_extension_internal(extension);
|
||||||
int32_t minimum_level = extension->get_minimum_library_initialization_level();
|
if (status != LOAD_STATUS_OK) {
|
||||||
if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) {
|
return status;
|
||||||
return LOAD_STATUS_NEEDS_RESTART;
|
|
||||||
}
|
|
||||||
// Initialize up to current level.
|
|
||||||
for (int32_t i = minimum_level; i <= level; i++) {
|
|
||||||
extension->initialize_library(GDExtension::InitializationLevel(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const KeyValue<String, String> &kv : extension->class_icon_paths) {
|
|
||||||
gdextension_class_icon_paths[kv.key] = kv.value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gdextension_map[p_path] = extension;
|
gdextension_map[p_path] = extension;
|
||||||
|
@ -60,8 +87,52 @@ GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &
|
||||||
}
|
}
|
||||||
|
|
||||||
GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String &p_path) {
|
GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String &p_path) {
|
||||||
return LOAD_STATUS_OK; //TODO
|
#ifndef TOOLS_ENABLED
|
||||||
|
ERR_FAIL_V_MSG(LOAD_STATUS_FAILED, "GDExtensions can only be reloaded in an editor build.");
|
||||||
|
#else
|
||||||
|
ERR_FAIL_COND_V_MSG(!Engine::get_singleton()->is_extension_reloading_enabled(), LOAD_STATUS_FAILED, "GDExtension reloading is disabled.");
|
||||||
|
|
||||||
|
if (!gdextension_map.has(p_path)) {
|
||||||
|
return LOAD_STATUS_NOT_LOADED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<GDExtension> extension = gdextension_map[p_path];
|
||||||
|
ERR_FAIL_COND_V_MSG(!extension->is_reloadable(), LOAD_STATUS_FAILED, vformat("This GDExtension is not marked as 'reloadable' or doesn't support reloading: %s.", p_path));
|
||||||
|
|
||||||
|
LoadStatus status;
|
||||||
|
|
||||||
|
extension->prepare_reload();
|
||||||
|
|
||||||
|
// Unload library if it's open. It may not be open if the developer made a
|
||||||
|
// change that broke loading in a previous hot-reload attempt.
|
||||||
|
if (extension->is_library_open()) {
|
||||||
|
status = _unload_extension_internal(extension);
|
||||||
|
if (status != LOAD_STATUS_OK) {
|
||||||
|
// We need to clear these no matter what.
|
||||||
|
extension->clear_instance_bindings();
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
extension->clear_instance_bindings();
|
||||||
|
extension->close_library();
|
||||||
|
}
|
||||||
|
|
||||||
|
Error err = GDExtensionResourceLoader::load_gdextension_resource(p_path, extension);
|
||||||
|
if (err != OK) {
|
||||||
|
return LOAD_STATUS_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = _load_extension_internal(extension);
|
||||||
|
if (status != LOAD_STATUS_OK) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
extension->finish_reload();
|
||||||
|
|
||||||
|
return LOAD_STATUS_OK;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
GDExtensionManager::LoadStatus GDExtensionManager::unload_extension(const String &p_path) {
|
GDExtensionManager::LoadStatus GDExtensionManager::unload_extension(const String &p_path) {
|
||||||
if (!gdextension_map.has(p_path)) {
|
if (!gdextension_map.has(p_path)) {
|
||||||
return LOAD_STATUS_NOT_LOADED;
|
return LOAD_STATUS_NOT_LOADED;
|
||||||
|
@ -69,19 +140,9 @@ GDExtensionManager::LoadStatus GDExtensionManager::unload_extension(const String
|
||||||
|
|
||||||
Ref<GDExtension> extension = gdextension_map[p_path];
|
Ref<GDExtension> extension = gdextension_map[p_path];
|
||||||
|
|
||||||
if (level >= 0) { // Already initialized up to some level.
|
LoadStatus status = _unload_extension_internal(extension);
|
||||||
int32_t minimum_level = extension->get_minimum_library_initialization_level();
|
if (status != LOAD_STATUS_OK) {
|
||||||
if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) {
|
return status;
|
||||||
return LOAD_STATUS_NEEDS_RESTART;
|
|
||||||
}
|
|
||||||
// Deinitialize down to current level.
|
|
||||||
for (int32_t i = level; i >= minimum_level; i--) {
|
|
||||||
extension->deinitialize_library(GDExtension::InitializationLevel(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const KeyValue<String, String> &kv : extension->class_icon_paths) {
|
|
||||||
gdextension_class_icon_paths.erase(kv.key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gdextension_map.erase(p_path);
|
gdextension_map.erase(p_path);
|
||||||
|
@ -134,6 +195,36 @@ void GDExtensionManager::deinitialize_extensions(GDExtension::InitializationLeve
|
||||||
level = int32_t(p_level) - 1;
|
level = int32_t(p_level) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
void GDExtensionManager::track_instance_binding(void *p_token, Object *p_object) {
|
||||||
|
for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
|
||||||
|
if (E.value.ptr() == p_token) {
|
||||||
|
if (E.value->is_reloadable()) {
|
||||||
|
E.value->track_instance_binding(p_object);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtensionManager::untrack_instance_binding(void *p_token, Object *p_object) {
|
||||||
|
for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
|
||||||
|
if (E.value.ptr() == p_token) {
|
||||||
|
if (E.value->is_reloadable()) {
|
||||||
|
E.value->untrack_instance_binding(p_object);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GDExtensionManager::_reload_all_scripts() {
|
||||||
|
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
|
||||||
|
ScriptServer::get_language(i)->reload_all_scripts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // TOOLS_ENABLED
|
||||||
|
|
||||||
void GDExtensionManager::load_extensions() {
|
void GDExtensionManager::load_extensions() {
|
||||||
Ref<FileAccess> f = FileAccess::open(GDExtension::get_extension_list_config_file(), FileAccess::READ);
|
Ref<FileAccess> f = FileAccess::open(GDExtension::get_extension_list_config_file(), FileAccess::READ);
|
||||||
while (f.is_valid() && !f->eof_reached()) {
|
while (f.is_valid() && !f->eof_reached()) {
|
||||||
|
@ -147,9 +238,33 @@ void GDExtensionManager::load_extensions() {
|
||||||
OS::get_singleton()->load_platform_gdextensions();
|
OS::get_singleton()->load_platform_gdextensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GDExtensionManager::reload_extensions() {
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
bool reloaded = false;
|
||||||
|
for (const KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
|
||||||
|
if (!E.value->is_reloadable()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (E.value->has_library_changed()) {
|
||||||
|
reloaded = true;
|
||||||
|
reload_extension(E.value->get_path());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reloaded) {
|
||||||
|
emit_signal("extensions_reloaded");
|
||||||
|
|
||||||
|
// Reload all scripts to clear out old references.
|
||||||
|
callable_mp_static(&GDExtensionManager::_reload_all_scripts).call_deferred();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
GDExtensionManager *GDExtensionManager::get_singleton() {
|
GDExtensionManager *GDExtensionManager::get_singleton() {
|
||||||
return singleton;
|
return singleton;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GDExtensionManager::_bind_methods() {
|
void GDExtensionManager::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("load_extension", "path"), &GDExtensionManager::load_extension);
|
ClassDB::bind_method(D_METHOD("load_extension", "path"), &GDExtensionManager::load_extension);
|
||||||
ClassDB::bind_method(D_METHOD("reload_extension", "path"), &GDExtensionManager::reload_extension);
|
ClassDB::bind_method(D_METHOD("reload_extension", "path"), &GDExtensionManager::reload_extension);
|
||||||
|
@ -164,6 +279,8 @@ void GDExtensionManager::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(LOAD_STATUS_ALREADY_LOADED);
|
BIND_ENUM_CONSTANT(LOAD_STATUS_ALREADY_LOADED);
|
||||||
BIND_ENUM_CONSTANT(LOAD_STATUS_NOT_LOADED);
|
BIND_ENUM_CONSTANT(LOAD_STATUS_NOT_LOADED);
|
||||||
BIND_ENUM_CONSTANT(LOAD_STATUS_NEEDS_RESTART);
|
BIND_ENUM_CONSTANT(LOAD_STATUS_NEEDS_RESTART);
|
||||||
|
|
||||||
|
ADD_SIGNAL(MethodInfo("extensions_reloaded"));
|
||||||
}
|
}
|
||||||
|
|
||||||
GDExtensionManager *GDExtensionManager::singleton = nullptr;
|
GDExtensionManager *GDExtensionManager::singleton = nullptr;
|
||||||
|
@ -171,4 +288,8 @@ GDExtensionManager *GDExtensionManager::singleton = nullptr;
|
||||||
GDExtensionManager::GDExtensionManager() {
|
GDExtensionManager::GDExtensionManager() {
|
||||||
ERR_FAIL_COND(singleton != nullptr);
|
ERR_FAIL_COND(singleton != nullptr);
|
||||||
singleton = this;
|
singleton = this;
|
||||||
|
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
|
GDExtensionCompatHashes::initialize();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,15 @@ public:
|
||||||
LOAD_STATUS_NEEDS_RESTART,
|
LOAD_STATUS_NEEDS_RESTART,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
LoadStatus _load_extension_internal(const Ref<GDExtension> &p_extension);
|
||||||
|
LoadStatus _unload_extension_internal(const Ref<GDExtension> &p_extension);
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
static void _reload_all_scripts();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
public:
|
||||||
LoadStatus load_extension(const String &p_path);
|
LoadStatus load_extension(const String &p_path);
|
||||||
LoadStatus reload_extension(const String &p_path);
|
LoadStatus reload_extension(const String &p_path);
|
||||||
LoadStatus unload_extension(const String &p_path);
|
LoadStatus unload_extension(const String &p_path);
|
||||||
|
@ -66,9 +75,15 @@ public:
|
||||||
void initialize_extensions(GDExtension::InitializationLevel p_level);
|
void initialize_extensions(GDExtension::InitializationLevel p_level);
|
||||||
void deinitialize_extensions(GDExtension::InitializationLevel p_level);
|
void deinitialize_extensions(GDExtension::InitializationLevel p_level);
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
void track_instance_binding(void *p_token, Object *p_object);
|
||||||
|
void untrack_instance_binding(void *p_token, Object *p_object);
|
||||||
|
#endif
|
||||||
|
|
||||||
static GDExtensionManager *get_singleton();
|
static GDExtensionManager *get_singleton();
|
||||||
|
|
||||||
void load_extensions();
|
void load_extensions();
|
||||||
|
void reload_extensions();
|
||||||
|
|
||||||
GDExtensionManager();
|
GDExtensionManager();
|
||||||
};
|
};
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,
|
03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,
|
03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
|
03000000c82d00002090000000000000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
|
03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows,
|
03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows,
|
||||||
03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
|
@ -35,6 +36,8 @@
|
||||||
03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
|
03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
|
||||||
03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
|
03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,
|
||||||
|
03000000c82d00006928000000000000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,platform:Windows,
|
||||||
|
03000000c82d00002590000000000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
030000003512000012ab000000000000,8BitDo NES30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Windows,
|
030000003512000012ab000000000000,8BitDo NES30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Windows,
|
||||||
03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
|
03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
|
@ -66,12 +69,15 @@
|
||||||
03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
03000000c82d00000121000000000000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
|
||||||
03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
|
03000000c82d00001230000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
|
03000000c82d00001530000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
|
03000000c82d00001630000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
|
03000000c82d00001730000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000c82d00001230000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
|
||||||
03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
|
03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
|
03000000c82d00000121000000000000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
|
03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
|
@ -79,6 +85,7 @@
|
||||||
03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows,
|
03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows,
|
||||||
|
030000006f0e00008801000000000000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
@ -105,6 +112,8 @@
|
||||||
03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
|
03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,start:b3,platform:Windows,
|
||||||
|
03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,
|
||||||
03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows,
|
03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows,
|
||||||
|
@ -176,21 +185,23 @@
|
||||||
03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
|
03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
|
030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
|
||||||
03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||||
030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00008101000000000000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
|
03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,
|
||||||
0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,
|
0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,
|
03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
|
03005036852100000000000000000000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows,
|
03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows,
|
||||||
03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows,
|
03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows,
|
||||||
03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows,
|
03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows,
|
||||||
03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
03000000151900004000000000000000,Flydigi Vader 2,a:b11,b:b10,back:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,leftstick:b1,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b0,righttrigger:b4,rightx:a3,righty:a4,start:b2,x:b9,y:b8,platform:Windows,
|
03000000151900004000000000000000,Flydigi Vader 2,a:b27,b:b26,back:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b23,leftstick:b17,lefttrigger:b21,leftx:a0,lefty:a1,misc1:b15,paddle1:b11,paddle2:b10,paddle3:b13,paddle4:b12,rightshoulder:b22,rightstick:b16,righttrigger:b20,rightx:a3,righty:a4,start:b18,x:b25,y:b24,platform:Windows,
|
||||||
03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows,
|
03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b14,paddle1:b4,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows,
|
||||||
03000000b40400001224000000000000,Flydigi Vader 2 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,paddle3:b17,paddle4:b18,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
|
03000000b40400001224000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||||
030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows,
|
030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows,
|
||||||
0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,
|
0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,
|
||||||
03000000260900002625000000000000,GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows,
|
03000000260900002625000000000000,GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
|
@ -288,7 +299,6 @@
|
||||||
03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows,
|
03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows,
|
||||||
030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
|
||||||
030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
@ -297,16 +307,20 @@
|
||||||
030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
030000000d0f0000c100000000000000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
030000000d0f0000f600000000000000,Horipad Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||||
030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows,
|
03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows,
|
||||||
03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows,
|
03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows,
|
||||||
03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows,
|
03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows,
|
||||||
|
03000000242e00006a38000000000000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Windows,
|
||||||
03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows,
|
03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows,
|
||||||
03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
03000000d81d00001000000000000000,iBuffalo BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
03000000d81d00001000000000000000,iBuffalo BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows,
|
030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows,
|
||||||
03000000696400006964000000000000,iDroidCon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000696400006964000000000000,iDroidCon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
03000000511d00000230000000000000,iGUGU Gamecore,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b1,leftstick:b4,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b2,platform:Windows,
|
||||||
03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,
|
03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,
|
||||||
030000006f0e00002401000000000000,Injustice Fightstick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00002401000000000000,Injustice Fightstick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
|
03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
|
||||||
|
@ -374,7 +388,7 @@
|
||||||
030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
|
030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
|
||||||
03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows,
|
03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows,
|
||||||
030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows,
|
030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,
|
03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
@ -382,6 +396,7 @@
|
||||||
03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,
|
03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,
|
||||||
0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
03000000242f0000f400000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows,
|
||||||
03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows,
|
03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows,
|
||||||
030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
|
030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
|
||||||
0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
|
0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
|
||||||
|
@ -445,7 +460,7 @@
|
||||||
03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows,
|
03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows,
|
||||||
03000000120c0000f60e000000000000,P4 Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,
|
03000000120c0000f60e000000000000,P4 Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows,
|
030000006f0e00008501000000000000,PDP Fightpad Pro GameCube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||||
030000006f0e00000901000000000000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00000901000000000000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows,
|
030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows,
|
||||||
03000000666600006706000000000000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows,
|
03000000666600006706000000000000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows,
|
||||||
|
@ -455,9 +470,14 @@
|
||||||
03000000f0250000c183000000000000,PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000f0250000c183000000000000,PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
|
03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
|
030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
03000000d620000011a7000000000000,PowerA Core Plus GameCube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||||
|
03000000dd62000015a7000000000000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
03000000d620000012a7000000000000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
03000000d620000013a7000000000000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000d620000013a7000000000000,PowerA Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000d620000014a7000000000000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,
|
030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,
|
||||||
03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
|
@ -530,9 +550,11 @@
|
||||||
030000009b2800002300000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,
|
030000009b2800002300000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,
|
||||||
030000009b2800006900000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,
|
030000009b2800006900000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,
|
||||||
030000009b2800000800000000000000,Raphnet Dreamcast Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows,
|
030000009b2800000800000000000000,Raphnet Dreamcast Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows,
|
||||||
|
030000009b2800006200000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,
|
||||||
030000009b2800003200000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,
|
030000009b2800003200000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,
|
||||||
030000009b2800006000000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,
|
030000009b2800006000000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,
|
||||||
030000009b2800001800000000000000,Raphnet Jaguar Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows,
|
030000009b2800001800000000000000,Raphnet Jaguar Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows,
|
||||||
|
030000009b2800006300000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows,
|
||||||
030000009b2800000200000000000000,Raphnet NES Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows,
|
030000009b2800000200000000000000,Raphnet NES Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows,
|
||||||
030000009b2800004400000000000000,Raphnet PS1 and PS2 Adapter,a:b1,b:b2,back:b5,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b9,rightx:a3,righty:a4,start:b4,x:b0,y:b3,platform:Windows,
|
030000009b2800004400000000000000,Raphnet PS1 and PS2 Adapter,a:b1,b:b2,back:b5,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b9,rightx:a3,righty:a4,start:b4,x:b0,y:b3,platform:Windows,
|
||||||
030000009b2800004300000000000000,Raphnet Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,
|
030000009b2800004300000000000000,Raphnet Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,
|
||||||
|
@ -545,6 +567,7 @@
|
||||||
030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
|
030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
|
||||||
030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
|
030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,
|
||||||
03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
|
03000000f8270000bf0b000000000000,Razer Kishi,a:b6,b:b7,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b12,leftstick:b19,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b13,rightstick:b20,righttrigger:b15,rightx:a3,righty:a4,start:b17,x:b9,y:b10,platform:Windows,
|
||||||
03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
@ -571,10 +594,10 @@
|
||||||
030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
|
030000006f0e00008701000000000000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000006f0e00008701000000000000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
|
||||||
03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
|
03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
|
||||||
03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
|
03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
|
||||||
03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
|
03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,
|
||||||
|
@ -612,6 +635,7 @@
|
||||||
03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows,
|
03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows,
|
||||||
03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
|
03000000d804000086e6000000000000,Sega Multi Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,
|
||||||
0300000000050000289b000000000000,Sega Saturn Adapter,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,
|
0300000000050000289b000000000000,Sega Saturn Adapter,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows,
|
0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows,
|
||||||
03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
|
03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
|
||||||
|
@ -645,8 +669,6 @@
|
||||||
030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,
|
030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,
|
03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
03000000341200001300000000000000,Super Racer,a:b2,b:b3,back:b8,leftshoulder:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b7,x:b0,y:b1,platform:Windows,
|
03000000341200001300000000000000,Super Racer,a:b2,b:b3,back:b8,leftshoulder:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b7,x:b0,y:b1,platform:Windows,
|
||||||
03000000d620000011a7000000000000,Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
|
||||||
030000000d0f0000f600000000000000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
|
||||||
03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows,
|
030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows,
|
||||||
030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
@ -657,6 +679,8 @@
|
||||||
03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows,
|
03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows,
|
||||||
03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,
|
03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,
|
||||||
03000000790000002601000000000000,TGZ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,
|
03000000790000002601000000000000,TGZ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,
|
||||||
|
03000000591c00002400000000000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,
|
||||||
|
03000000591c00002600000000000000,THEGamepad,a:b2,b:b1,back:b6,leftx:a0,lefty:a1,start:b7,x:b3,y:b0,platform:Windows,
|
||||||
030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,
|
030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,
|
||||||
030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
030000004f0400000ed0000000000000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
030000004f0400000ed0000000000000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
@ -772,9 +796,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X,
|
03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
|
03000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X,
|
03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X,
|
||||||
03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
|
03000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X,
|
||||||
|
03000000c82d00002590000000010000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000c82d00002690000000010000,8BitDo NEOGEOa:b0,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,b:b1,back:b10,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
|
030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
@ -798,6 +827,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X,
|
03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||||
|
03000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000c82d00001530000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000c82d00001630000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000c82d00001730000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
@ -812,6 +845,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000503200000110000047010000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X,
|
||||||
|
03000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
@ -823,9 +858,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,
|
03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
|
03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
|
||||||
030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X,
|
030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X,
|
||||||
030000006f0e00008401000003010000,Faceoff Premiere Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000006f0e00008401000003010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
03000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
03000000151900004000000001000000,Flydigi Vader 2,a:b14,b:b15,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Mac OS X,
|
||||||
03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle3:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Mac OS X,
|
03000000b40400001124000001040000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000b40400001224000003030000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,
|
03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,
|
||||||
03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
@ -849,7 +885,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X,
|
030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X,
|
||||||
030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
030000000d0f0000aa00000072050000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
|
030000000d0f0000aa00000072050000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
|
||||||
030000000d0f00000002000015010000,Hori Switch Split Pad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000000d0f00000002000015010000,Hori Switch Split Pad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
@ -857,7 +893,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X,
|
03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X,
|
||||||
03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X,
|
03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X,
|
||||||
03000000830500006020000000000000,iBuffalo Gamepad,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X,
|
03000000830500006020000000000000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X,
|
||||||
03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X,
|
03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X,
|
||||||
03000000fd0500000030000010010000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Mac OS X,
|
03000000fd0500000030000010010000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Mac OS X,
|
||||||
030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X,
|
030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
@ -889,6 +925,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,
|
03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,
|
||||||
03000000790000000018000000010000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,
|
03000000790000000018000000010000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,
|
||||||
030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Mac OS X,
|
030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Mac OS X,
|
||||||
|
030000005e0400000300000006010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
030000005e0400000700000006010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Mac OS X,
|
||||||
030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X,
|
030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X,
|
||||||
03000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,
|
03000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,
|
||||||
03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
@ -896,8 +934,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X,
|
03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X,
|
03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X,
|
||||||
030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X,
|
030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X,
|
||||||
03000000d620000011a7000000020000,Nintendo Switch Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
|
||||||
03000000d620000011a7000010050000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
|
||||||
030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:Mac OS X,
|
050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:Mac OS X,
|
||||||
|
@ -910,6 +946,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000666600006706000088020000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X,
|
03000000666600006706000088020000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X,
|
||||||
030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,
|
030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,
|
||||||
030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
03000000d620000011a7000000020000,PowerA Core Plus Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
03000000d620000011a7000010050000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
|
03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
|
||||||
030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
|
030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
|
||||||
|
@ -946,8 +984,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X,
|
030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X,
|
||||||
|
030000006f0e00008701000005010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
030000006f0e00008701000005010000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
|
||||||
03000000e804000000a000001b010000,Samsung EIGP20,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b11,leftx:a1,lefty:a3,rightshoulder:b12,rightx:a4,righty:a5,start:b16,x:b7,y:b9,platform:Mac OS X,
|
03000000e804000000a000001b010000,Samsung EIGP20,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b11,leftx:a1,lefty:a3,rightshoulder:b12,rightx:a4,righty:a5,start:b16,x:b7,y:b9,platform:Mac OS X,
|
||||||
03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X,
|
03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X,
|
||||||
03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X,
|
03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X,
|
||||||
|
@ -971,6 +1009,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||||
|
03000000591c00002400000021000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
03000000591c00002600000021000000,THEGamepad,a:b2,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Mac OS X,
|
||||||
030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X,
|
030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X,
|
||||||
030000004f0400000ed0000000020000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
030000004f0400000ed0000000020000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X,
|
030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X,
|
||||||
|
@ -1026,9 +1066,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux,
|
03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux,
|
05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000c82d00002090000011010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
|
05000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux,
|
03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux,
|
||||||
03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
|
05000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux,
|
||||||
|
05000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
|
03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
|
05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
@ -1039,11 +1083,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
|
03000000c82d00001030000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
03000000c82d00000631000014010000,8BitDo Pro 2 Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000c82d00000020000000000000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000c82d00001030000011010000,8BitDo Pro 2 Wired Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
06000000c82d00000020000006010000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000c82d00000020000000000000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
|
||||||
06000000c82d00000020000006010000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
|
||||||
03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
|
@ -1063,21 +1106,27 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
03000000c82d00000121000011010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux,
|
|
||||||
05000000c82d00000121000000010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux,
|
|
||||||
03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
|
05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
|
05000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000c82d00001530000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000c82d00001630000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000c82d00001730000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000c82d00000631000014010000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000c82d00000121000011010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
05000000c82d00000121000000010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
|
05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
|
05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
|
03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
050000005e040000e002000030110000,8BitDo Zero 2,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,
|
050000005e040000e002000030110000,8BitDo Zero 2,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||||
03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000006f0e00008801000011010000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e00003901000013020000,Afterglow Prismatic Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00003901000013020000,Afterglow Prismatic Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e00001302000000010000,Afterglow Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00001302000000010000,Afterglow Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
@ -1129,14 +1178,20 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000006e0500000720000010010000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,
|
030000006e0500000720000010010000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,
|
||||||
030000007d0400000640000010010000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Linux,
|
030000007d0400000640000010010000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Linux,
|
||||||
03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
030000006f0e00008401000011010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
030000006f0e00008101000011010000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000006f0e00008001000011010000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
03005036852100000201000010010000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,
|
030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,
|
||||||
19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
|
19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000ac0500007a05000011010000,GameSir G5,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000ac0500001a06000011010000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000ac0500001a06000011010000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
|
@ -1148,6 +1203,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
190000004b4800000011000000010000,GO-Super Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b2,y:b3,platform:Linux,
|
190000004b4800000011000000010000,GO-Super Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b2,y:b3,platform:Linux,
|
||||||
03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e0400008e02000001010000,GPD Win Max 2 (6800U) Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux,
|
030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux,
|
||||||
|
@ -1175,25 +1231,26 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux,
|
030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux,
|
||||||
030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f0000aa00000011010000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
|
||||||
030000000d0f00001100000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f00001100000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,
|
030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
|
030000000d0f0000aa00000011010000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
030000000d0f00008501000015010000,Hori Switch Split Pad Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000000d0f00008501000015010000,Hori Switch Split Pad Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000000d0f0000c100000011010000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
|
||||||
050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
|
03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux,
|
05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux,
|
||||||
03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux,
|
03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux,
|
||||||
|
03000000242e00006a38000010010000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Linux,
|
||||||
03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
|
03000000830500006020000010010000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
|
||||||
050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
|
03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
|
||||||
03000000d80400008200000003000000,IMS PCU0,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux,
|
03000000d80400008200000003000000,IMS PCU0,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux,
|
||||||
|
@ -1217,6 +1274,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000242f00008a00000011010000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,
|
03000000242f00008a00000011010000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,
|
||||||
030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000006d040000d1ca000011010000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
@ -1255,10 +1313,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,
|
03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,
|
||||||
03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
|
03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,
|
||||||
|
03000000b50700004f00000000010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,
|
||||||
03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
|
03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux,
|
030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux,
|
||||||
030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux,
|
030000005e0400000300000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux,
|
||||||
030000005e0400000700000000010000,Microsoft SideWinder Gamepad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux,
|
030000005e0400000700000000010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux,
|
||||||
|
030000005e0400000e00000000010000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux,
|
||||||
030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux,
|
030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux,
|
||||||
030000005e0400008502000000010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
|
030000005e0400008502000000010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
|
||||||
030000005e0400008902000021010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
|
030000005e0400008902000021010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
|
||||||
|
@ -1272,7 +1332,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000005e040000ea02000008040000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000ea02000008040000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
060000005e040000120b000009050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
060000005e040000120b000009050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e040000e302000003020000,Microsoft Xbox One Elite,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000e302000003020000,Microsoft Xbox One Elite,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e040000000b000008040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000000b000007040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e040000000b000008040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
030000005e040000120b00000b050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000120b00000b050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
|
03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
|
||||||
|
@ -1304,8 +1365,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
|
060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
|
||||||
050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux,
|
050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux,
|
||||||
03000000d620000013a7000011010000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
|
||||||
03000000d620000011a7000011010000,Nintendo Switch PowerA Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
|
||||||
030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux,
|
030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux,
|
||||||
030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
|
030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
|
||||||
050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
|
@ -1314,8 +1373,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,
|
050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,
|
||||||
030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux,
|
030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux,
|
||||||
|
030000007e0500001920000011810000,NSO N64 Controller,+rightx:b10,+righty:b8,-rightx:b9,-righty:b7,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b4,righttrigger:b5,start:b6,platform:Linux,
|
||||||
050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux,
|
050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux,
|
||||||
050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
|
050000007e0500001920000001800000,NSO N64 Controller,+rightx:b10,+righty:b8,-rightx:b9,-righty:b7,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b4,righttrigger:b5,start:b6,platform:Linux,
|
||||||
|
030000007e0500001720000011810000,NSO SNES Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,
|
||||||
|
050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b8,start:b10,x:b3,y:b2,platform:Linux,
|
||||||
|
050000007e0500001720000001800000,NSO SNES Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,
|
||||||
03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
|
03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
|
03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
|
||||||
05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
|
05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
|
||||||
|
@ -1333,24 +1396,30 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e0000d702000006640000,PDP Black Camo Wired Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b13,dpup:b14,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e0000d702000006640000,PDP Black Camo Wired Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b13,dpup:b14,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e00008001000011010000,PDP Faceoff Nintendo Switch Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000006f0e00008501000011010000,PDP Fightpad Pro Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e00008501000011010000,PDP Nintendo Switch Fightpad Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
|
||||||
030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006f0e00000901000011010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
030000006f0e00000901000011010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000ad1b000004f9000000010000,PDP Xbox 360 Versus Fighting,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,
|
03000000ad1b000004f9000000010000,PDP Xbox 360 Versus Fighting,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e0000d802000006640000,PDP Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e0000d802000006640000,PDP Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000006f0e0000ef02000007640000,PDP Xbox Series Kinetic Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000666600006706000000010000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,
|
03000000666600006706000000010000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,
|
||||||
030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
|
030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
|
030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000d620000011a7000011010000,PowerA Core Plus Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000dd62000015a7000011010000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
03000000d620000012a7000011010000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000d620000013a7000011010000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
03000000d620000014a7000011010000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,
|
03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,
|
||||||
03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
@ -1404,6 +1473,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux,
|
030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux,
|
||||||
030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
|
030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
|
||||||
030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
|
030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
|
||||||
|
03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
@ -1418,6 +1488,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
|
03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
|
050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000321500000b10000011010000,Razer Wolverine PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||||
03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux,
|
03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux,
|
0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
@ -1427,8 +1498,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000006f0e00008701000011010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
030000006f0e00008701000011010000,Rock Candy Switch Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
|
||||||
03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
|
03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
@ -1487,6 +1558,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux,
|
03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux,
|
||||||
03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
03000000591c00002400000010010000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000591c00002600000010010000,THEGamepad,a:b2,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,
|
||||||
030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
|
030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
|
||||||
030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
|
030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
|
||||||
030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
|
030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,
|
||||||
|
@ -1512,6 +1585,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
03000000e00d00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,
|
03000000e00d00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,
|
||||||
03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,
|
03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,
|
||||||
030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
|
06000000f51000000870000003010000,Turtle Beach Recon,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
|
@ -1528,6 +1602,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
030000005e0400009102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e0400009102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e040000a102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000a102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e040000a102000030060000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e0400008e02000000010000,Xbox 360 EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e0400008e02000000010000,Xbox 360 EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
|
030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,
|
||||||
|
@ -1544,6 +1619,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
050000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
030000005e040000ea02000011050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
060000005e040000ea0200000d050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
060000005e040000ea0200000d050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
@ -1559,10 +1635,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
050000005e040000130b000011050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000130b000011050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
|
050000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
060000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
060000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
060000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
050000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
|
||||||
03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux,
|
05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux,
|
||||||
03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux,
|
03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux,
|
||||||
|
@ -1596,10 +1673,19 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android,
|
64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||||
66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android,
|
66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android,
|
||||||
66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android,
|
66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
|
61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
|
62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||||
38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||||
05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
|
38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||||
|
38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||||
|
32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
@ -1644,6 +1730,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||||
32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,
|
32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,
|
||||||
417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,
|
417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,
|
||||||
|
35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,start:b6,platform:Android,
|
||||||
|
32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||||
38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||||
34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
||||||
|
@ -1654,6 +1742,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||||
66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||||
35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||||
484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||||
|
@ -1664,9 +1753,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||||
48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,
|
48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,
|
||||||
62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,
|
62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,
|
||||||
31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||||
5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||||
0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android,
|
0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android,
|
||||||
|
5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android,
|
||||||
64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android,
|
64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android,
|
||||||
532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android,
|
532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android,
|
||||||
65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android,
|
65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android,
|
||||||
|
@ -1682,7 +1772,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4~,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5~,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||||
4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||||
|
@ -1716,6 +1806,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
050000005509000014720000df7f3f80,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||||
37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
@ -1734,6 +1825,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||||
|
050000004c050000c4050000fffe3f80,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||||
050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
@ -1751,6 +1843,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||||
66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||||
050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||||
|
050000004c050000e60c0000fffe3f80,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||||
050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||||
|
@ -1769,6 +1862,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android,
|
526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android,
|
||||||
61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android,
|
61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android,
|
||||||
38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
526574726f696420506f636b65742043,Retroid Pocket Flip,a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||||
|
582d426f7820436f6e74726f6c6c6572,Retroid Pocket Flip,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android,
|
64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android,
|
||||||
37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,
|
37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,
|
||||||
5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,
|
5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,
|
||||||
|
@ -1790,7 +1885,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
|
5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
|
||||||
5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||||
63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,
|
63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,
|
||||||
63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,
|
63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,
|
||||||
476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,
|
05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,
|
||||||
|
@ -1799,6 +1894,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android,
|
35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android,
|
||||||
54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
37323236633763666465316365313236,THEC64 Joystick,a:b21,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b27,x:b23,y:b24,platform:Android,
|
||||||
|
38346162326232346533316164363336,THEGamepad,a:b23,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b24,y:b21,platform:Android,
|
||||||
050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android,
|
5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android,
|
||||||
30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
@ -1815,8 +1912,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
050000005e04000091020000ff073f80,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,
|
050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,
|
||||||
|
050000005e040000e00200000ffe3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android,
|
||||||
050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,
|
050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,
|
||||||
|
050000005e040000e0020000ffff3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android,
|
||||||
050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android,
|
34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android,
|
||||||
|
@ -1824,10 +1924,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
050000005e040000000b000000783f80,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
050000005e040000050b0000ffff3f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
050000005e040000120b000000783f80,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||||
050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||||
|
@ -1840,6 +1943,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||||
05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,
|
05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,
|
||||||
05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,
|
05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,
|
||||||
05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,
|
05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,
|
||||||
|
050000008a35000003010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,
|
||||||
|
050000008a35000004010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,
|
||||||
4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS,
|
4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS,
|
||||||
4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS,
|
4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS,
|
||||||
050000007e050000062000000f060000,Nintendo Switch Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS,
|
050000007e050000062000000f060000,Nintendo Switch Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS,
|
||||||
|
|
|
@ -1802,3 +1802,7 @@ String InputEventShortcut::to_string() {
|
||||||
|
|
||||||
return vformat("InputEventShortcut: shortcut=%s", shortcut->get_as_text());
|
return vformat("InputEventShortcut: shortcut=%s", shortcut->get_as_text());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InputEventShortcut::InputEventShortcut() {
|
||||||
|
pressed = true;
|
||||||
|
}
|
||||||
|
|
|
@ -567,6 +567,8 @@ public:
|
||||||
|
|
||||||
virtual String as_text() const override;
|
virtual String as_text() const override;
|
||||||
virtual String to_string() override;
|
virtual String to_string() override;
|
||||||
|
|
||||||
|
InputEventShortcut();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INPUT_EVENT_H
|
#endif // INPUT_EVENT_H
|
||||||
|
|
|
@ -1930,8 +1930,7 @@ Error Image::generate_mipmaps(bool p_renormalize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Error Image::generate_mipmap_roughness(RoughnessChannel p_roughness_channel, const Ref<Image> &p_normal_map) {
|
Error Image::generate_mipmap_roughness(RoughnessChannel p_roughness_channel, const Ref<Image> &p_normal_map) {
|
||||||
Vector<double> normal_sat_vec; //summed area table
|
LocalVector<double> normal_sat_vec; //summed area table
|
||||||
double *normal_sat = nullptr; //summed area table for normal map
|
|
||||||
int normal_w = 0, normal_h = 0;
|
int normal_w = 0, normal_h = 0;
|
||||||
|
|
||||||
ERR_FAIL_COND_V_MSG(p_normal_map.is_null() || p_normal_map->is_empty(), ERR_INVALID_PARAMETER, "Must provide a valid normal map for roughness mipmaps");
|
ERR_FAIL_COND_V_MSG(p_normal_map.is_null() || p_normal_map->is_empty(), ERR_INVALID_PARAMETER, "Must provide a valid normal map for roughness mipmaps");
|
||||||
|
@ -1945,8 +1944,7 @@ Error Image::generate_mipmap_roughness(RoughnessChannel p_roughness_channel, con
|
||||||
normal_h = nm->get_height();
|
normal_h = nm->get_height();
|
||||||
|
|
||||||
normal_sat_vec.resize(normal_w * normal_h * 3);
|
normal_sat_vec.resize(normal_w * normal_h * 3);
|
||||||
|
double *normal_sat = normal_sat_vec.ptr();
|
||||||
normal_sat = normal_sat_vec.ptrw();
|
|
||||||
|
|
||||||
//create summed area table
|
//create summed area table
|
||||||
|
|
||||||
|
@ -2021,24 +2019,26 @@ Error Image::generate_mipmap_roughness(RoughnessChannel p_roughness_channel, con
|
||||||
avg[2] += normal_sat[tofs + 2];
|
avg[2] += normal_sat[tofs + 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (from_y > 0) {
|
if (from_y > 0 && to_x > 0) {
|
||||||
uint32_t tofs = ((from_y - 1) * normal_w + to_x) * 3;
|
uint32_t tofs = ((from_y - 1) * normal_w + to_x) * 3;
|
||||||
avg[0] -= normal_sat[tofs + 0];
|
avg[0] -= normal_sat[tofs + 0];
|
||||||
avg[1] -= normal_sat[tofs + 1];
|
avg[1] -= normal_sat[tofs + 1];
|
||||||
avg[2] -= normal_sat[tofs + 2];
|
avg[2] -= normal_sat[tofs + 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (from_x > 0) {
|
if (from_x > 0 && to_y > 0) {
|
||||||
uint32_t tofs = (to_y * normal_w + (from_x - 1)) * 3;
|
uint32_t tofs = (to_y * normal_w + (from_x - 1)) * 3;
|
||||||
avg[0] -= normal_sat[tofs + 0];
|
avg[0] -= normal_sat[tofs + 0];
|
||||||
avg[1] -= normal_sat[tofs + 1];
|
avg[1] -= normal_sat[tofs + 1];
|
||||||
avg[2] -= normal_sat[tofs + 2];
|
avg[2] -= normal_sat[tofs + 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t tofs = (to_y * normal_w + to_x) * 3;
|
if (to_y > 0 && to_x > 0) {
|
||||||
avg[0] += normal_sat[tofs + 0];
|
uint32_t tofs = (to_y * normal_w + to_x) * 3;
|
||||||
avg[1] += normal_sat[tofs + 1];
|
avg[0] += normal_sat[tofs + 0];
|
||||||
avg[2] += normal_sat[tofs + 2];
|
avg[1] += normal_sat[tofs + 1];
|
||||||
|
avg[2] += normal_sat[tofs + 2];
|
||||||
|
}
|
||||||
|
|
||||||
double div = double(size_x * size_y);
|
double div = double(size_x * size_y);
|
||||||
Vector3 vec(avg[0] / div, avg[1] / div, avg[2] / div);
|
Vector3 vec(avg[0] / div, avg[1] / div, avg[2] / div);
|
||||||
|
@ -3412,6 +3412,7 @@ void Image::_bind_methods() {
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("convert", "format"), &Image::convert);
|
ClassDB::bind_method(D_METHOD("convert", "format"), &Image::convert);
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_mipmap_count"), &Image::get_mipmap_count);
|
||||||
ClassDB::bind_method(D_METHOD("get_mipmap_offset", "mipmap"), &Image::get_mipmap_offset);
|
ClassDB::bind_method(D_METHOD("get_mipmap_offset", "mipmap"), &Image::get_mipmap_offset);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("resize_to_po2", "square", "interpolation"), &Image::resize_to_po2, DEFVAL(false), DEFVAL(INTERPOLATE_BILINEAR));
|
ClassDB::bind_method(D_METHOD("resize_to_po2", "square", "interpolation"), &Image::resize_to_po2, DEFVAL(false), DEFVAL(INTERPOLATE_BILINEAR));
|
||||||
|
|
|
@ -379,8 +379,8 @@ Node *Resource::get_local_scene() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Resource::setup_local_to_scene() {
|
void Resource::setup_local_to_scene() {
|
||||||
// Can't use GDVIRTUAL in Resource, so this will have to be done with a signal
|
|
||||||
emit_signal(SNAME("setup_local_to_scene_requested"));
|
emit_signal(SNAME("setup_local_to_scene_requested"));
|
||||||
|
GDVIRTUAL_CALL(_setup_local_to_scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Resource::reset_local_to_scene() {
|
void Resource::reset_local_to_scene() {
|
||||||
|
@ -460,6 +460,7 @@ void Resource::_bind_methods() {
|
||||||
get_rid_bind.return_val.type = Variant::RID;
|
get_rid_bind.return_val.type = Variant::RID;
|
||||||
|
|
||||||
::ClassDB::add_virtual_method(get_class_static(), get_rid_bind, true, Vector<String>(), true);
|
::ClassDB::add_virtual_method(get_class_static(), get_rid_bind, true, Vector<String>(), true);
|
||||||
|
GDVIRTUAL_BIND(_setup_local_to_scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
Resource::Resource() :
|
Resource::Resource() :
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include "core/io/resource_uid.h"
|
#include "core/io/resource_uid.h"
|
||||||
#include "core/object/class_db.h"
|
#include "core/object/class_db.h"
|
||||||
|
#include "core/object/gdvirtual.gen.inc"
|
||||||
#include "core/object/ref_counted.h"
|
#include "core/object/ref_counted.h"
|
||||||
#include "core/templates/safe_refcount.h"
|
#include "core/templates/safe_refcount.h"
|
||||||
#include "core/templates/self_list.h"
|
#include "core/templates/self_list.h"
|
||||||
|
@ -81,6 +82,7 @@ protected:
|
||||||
void _take_over_path(const String &p_path);
|
void _take_over_path(const String &p_path);
|
||||||
|
|
||||||
virtual void reset_local_to_scene();
|
virtual void reset_local_to_scene();
|
||||||
|
GDVIRTUAL0(_setup_local_to_scene);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Node *(*_get_local_scene_func)(); //used by editor
|
static Node *(*_get_local_scene_func)(); //used by editor
|
||||||
|
|
|
@ -230,7 +230,11 @@ public:
|
||||||
// Loaders can safely use this regardless which thread they are running on.
|
// Loaders can safely use this regardless which thread they are running on.
|
||||||
static void notify_dependency_error(const String &p_path, const String &p_dependency, const String &p_type) {
|
static void notify_dependency_error(const String &p_path, const String &p_dependency, const String &p_type) {
|
||||||
if (dep_err_notify) {
|
if (dep_err_notify) {
|
||||||
callable_mp_static(dep_err_notify).bind(p_path, p_dependency, p_type).call_deferred();
|
if (Thread::get_caller_id() == Thread::get_main_id()) {
|
||||||
|
dep_err_notify(p_path, p_dependency, p_type);
|
||||||
|
} else {
|
||||||
|
callable_mp_static(dep_err_notify).bind(p_path, p_dependency, p_type).call_deferred();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void set_dependency_error_notify_func(DependencyErrorNotify p_err_notify) {
|
static void set_dependency_error_notify_func(DependencyErrorNotify p_err_notify) {
|
||||||
|
|
|
@ -32,9 +32,7 @@
|
||||||
|
|
||||||
#include "core/variant/typed_array.h"
|
#include "core/variant/typed_array.h"
|
||||||
|
|
||||||
#define GET_POINT_UNCHECKED(m_id) points[m_id.y - region.position.y][m_id.x - region.position.x]
|
static real_t heuristic_euclidean(const Vector2i &p_from, const Vector2i &p_to) {
|
||||||
|
|
||||||
static real_t heuristic_euclidian(const Vector2i &p_from, const Vector2i &p_to) {
|
|
||||||
real_t dx = (real_t)ABS(p_to.x - p_from.x);
|
real_t dx = (real_t)ABS(p_to.x - p_from.x);
|
||||||
real_t dy = (real_t)ABS(p_to.y - p_from.y);
|
real_t dy = (real_t)ABS(p_to.y - p_from.y);
|
||||||
return (real_t)Math::sqrt(dx * dx + dy * dy);
|
return (real_t)Math::sqrt(dx * dx + dy * dy);
|
||||||
|
@ -59,7 +57,7 @@ static real_t heuristic_chebyshev(const Vector2i &p_from, const Vector2i &p_to)
|
||||||
return MAX(dx, dy);
|
return MAX(dx, dy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static real_t (*heuristics[AStarGrid2D::HEURISTIC_MAX])(const Vector2i &, const Vector2i &) = { heuristic_euclidian, heuristic_manhattan, heuristic_octile, heuristic_chebyshev };
|
static real_t (*heuristics[AStarGrid2D::HEURISTIC_MAX])(const Vector2i &, const Vector2i &) = { heuristic_euclidean, heuristic_manhattan, heuristic_octile, heuristic_chebyshev };
|
||||||
|
|
||||||
void AStarGrid2D::set_region(const Rect2i &p_region) {
|
void AStarGrid2D::set_region(const Rect2i &p_region) {
|
||||||
ERR_FAIL_COND(p_region.size.x < 0 || p_region.size.y < 0);
|
ERR_FAIL_COND(p_region.size.x < 0 || p_region.size.y < 0);
|
||||||
|
@ -110,19 +108,22 @@ Size2 AStarGrid2D::get_cell_size() const {
|
||||||
|
|
||||||
void AStarGrid2D::update() {
|
void AStarGrid2D::update() {
|
||||||
points.clear();
|
points.clear();
|
||||||
const int64_t end_x = region.position.x + region.size.width;
|
|
||||||
const int64_t end_y = region.position.y + region.size.height;
|
const int32_t end_x = region.get_end().x;
|
||||||
for (int64_t y = region.position.y; y < end_y; y++) {
|
const int32_t end_y = region.get_end().y;
|
||||||
|
|
||||||
|
for (int32_t y = region.position.y; y < end_y; y++) {
|
||||||
LocalVector<Point> line;
|
LocalVector<Point> line;
|
||||||
for (int64_t x = region.position.x; x < end_x; x++) {
|
for (int32_t x = region.position.x; x < end_x; x++) {
|
||||||
line.push_back(Point(Vector2i(x, y), offset + Vector2(x, y) * cell_size));
|
line.push_back(Point(Vector2i(x, y), offset + Vector2(x, y) * cell_size));
|
||||||
}
|
}
|
||||||
points.push_back(line);
|
points.push_back(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
dirty = false;
|
dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AStarGrid2D::is_in_bounds(int p_x, int p_y) const {
|
bool AStarGrid2D::is_in_bounds(int32_t p_x, int32_t p_y) const {
|
||||||
return region.has_point(Vector2i(p_x, p_y));
|
return region.has_point(Vector2i(p_x, p_y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,40 +173,38 @@ AStarGrid2D::Heuristic AStarGrid2D::get_default_estimate_heuristic() const {
|
||||||
void AStarGrid2D::set_point_solid(const Vector2i &p_id, bool p_solid) {
|
void AStarGrid2D::set_point_solid(const Vector2i &p_id, bool p_solid) {
|
||||||
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
||||||
ERR_FAIL_COND_MSG(!is_in_boundsv(p_id), vformat("Can't set if point is disabled. Point %s out of bounds %s.", p_id, region));
|
ERR_FAIL_COND_MSG(!is_in_boundsv(p_id), vformat("Can't set if point is disabled. Point %s out of bounds %s.", p_id, region));
|
||||||
GET_POINT_UNCHECKED(p_id).solid = p_solid;
|
_get_point_unchecked(p_id)->solid = p_solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AStarGrid2D::is_point_solid(const Vector2i &p_id) const {
|
bool AStarGrid2D::is_point_solid(const Vector2i &p_id) const {
|
||||||
ERR_FAIL_COND_V_MSG(dirty, false, "Grid is not initialized. Call the update method.");
|
ERR_FAIL_COND_V_MSG(dirty, false, "Grid is not initialized. Call the update method.");
|
||||||
ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), false, vformat("Can't get if point is disabled. Point %s out of bounds %s.", p_id, region));
|
ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), false, vformat("Can't get if point is disabled. Point %s out of bounds %s.", p_id, region));
|
||||||
return GET_POINT_UNCHECKED(p_id).solid;
|
return _get_point_unchecked(p_id)->solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AStarGrid2D::set_point_weight_scale(const Vector2i &p_id, real_t p_weight_scale) {
|
void AStarGrid2D::set_point_weight_scale(const Vector2i &p_id, real_t p_weight_scale) {
|
||||||
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
||||||
ERR_FAIL_COND_MSG(!is_in_boundsv(p_id), vformat("Can't set point's weight scale. Point %s out of bounds %s.", p_id, region));
|
ERR_FAIL_COND_MSG(!is_in_boundsv(p_id), vformat("Can't set point's weight scale. Point %s out of bounds %s.", p_id, region));
|
||||||
ERR_FAIL_COND_MSG(p_weight_scale < 0.0, vformat("Can't set point's weight scale less than 0.0: %f.", p_weight_scale));
|
ERR_FAIL_COND_MSG(p_weight_scale < 0.0, vformat("Can't set point's weight scale less than 0.0: %f.", p_weight_scale));
|
||||||
GET_POINT_UNCHECKED(p_id).weight_scale = p_weight_scale;
|
_get_point_unchecked(p_id)->weight_scale = p_weight_scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
real_t AStarGrid2D::get_point_weight_scale(const Vector2i &p_id) const {
|
real_t AStarGrid2D::get_point_weight_scale(const Vector2i &p_id) const {
|
||||||
ERR_FAIL_COND_V_MSG(dirty, 0, "Grid is not initialized. Call the update method.");
|
ERR_FAIL_COND_V_MSG(dirty, 0, "Grid is not initialized. Call the update method.");
|
||||||
ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), 0, vformat("Can't get point's weight scale. Point %s out of bounds %s.", p_id, region));
|
ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), 0, vformat("Can't get point's weight scale. Point %s out of bounds %s.", p_id, region));
|
||||||
return GET_POINT_UNCHECKED(p_id).weight_scale;
|
return _get_point_unchecked(p_id)->weight_scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AStarGrid2D::fill_solid_region(const Rect2i &p_region, bool p_solid) {
|
void AStarGrid2D::fill_solid_region(const Rect2i &p_region, bool p_solid) {
|
||||||
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
||||||
|
|
||||||
Rect2i safe_region = p_region.intersection(region);
|
const Rect2i safe_region = p_region.intersection(region);
|
||||||
int from_x = safe_region.get_position().x;
|
const int32_t end_x = safe_region.get_end().x;
|
||||||
int from_y = safe_region.get_position().y;
|
const int32_t end_y = safe_region.get_end().y;
|
||||||
int end_x = safe_region.get_end().x;
|
|
||||||
int end_y = safe_region.get_end().y;
|
|
||||||
|
|
||||||
for (int x = from_x; x < end_x; x++) {
|
for (int32_t y = safe_region.position.y; y < end_y; y++) {
|
||||||
for (int y = from_y; y < end_y; y++) {
|
for (int32_t x = safe_region.position.x; x < end_x; x++) {
|
||||||
GET_POINT_UNCHECKED(Vector2i(x, y)).solid = p_solid;
|
_get_point_unchecked(x, y)->solid = p_solid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,14 +213,13 @@ void AStarGrid2D::fill_weight_scale_region(const Rect2i &p_region, real_t p_weig
|
||||||
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method.");
|
||||||
ERR_FAIL_COND_MSG(p_weight_scale < 0.0, vformat("Can't set point's weight scale less than 0.0: %f.", p_weight_scale));
|
ERR_FAIL_COND_MSG(p_weight_scale < 0.0, vformat("Can't set point's weight scale less than 0.0: %f.", p_weight_scale));
|
||||||
|
|
||||||
Rect2i safe_region = p_region.intersection(region);
|
const Rect2i safe_region = p_region.intersection(region);
|
||||||
int from_x = safe_region.get_position().x;
|
const int32_t end_x = safe_region.get_end().x;
|
||||||
int from_y = safe_region.get_position().y;
|
const int32_t end_y = safe_region.get_end().y;
|
||||||
int end_x = safe_region.get_end().x;
|
|
||||||
int end_y = safe_region.get_end().y;
|
for (int32_t y = safe_region.position.y; y < end_y; y++) {
|
||||||
for (int x = from_x; x < end_x; x++) {
|
for (int32_t x = safe_region.position.x; x < end_x; x++) {
|
||||||
for (int y = from_y; y < end_y; y++) {
|
_get_point_unchecked(x, y)->weight_scale = p_weight_scale;
|
||||||
GET_POINT_UNCHECKED(Vector2i(x, y)).weight_scale = p_weight_scale;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,14 +232,14 @@ AStarGrid2D::Point *AStarGrid2D::_jump(Point *p_from, Point *p_to) {
|
||||||
return p_to;
|
return p_to;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t from_x = p_from->id.x;
|
int32_t from_x = p_from->id.x;
|
||||||
int64_t from_y = p_from->id.y;
|
int32_t from_y = p_from->id.y;
|
||||||
|
|
||||||
int64_t to_x = p_to->id.x;
|
int32_t to_x = p_to->id.x;
|
||||||
int64_t to_y = p_to->id.y;
|
int32_t to_y = p_to->id.y;
|
||||||
|
|
||||||
int64_t dx = to_x - from_x;
|
int32_t dx = to_x - from_x;
|
||||||
int64_t dy = to_y - from_y;
|
int32_t dy = to_y - from_y;
|
||||||
|
|
||||||
if (diagonal_mode == DIAGONAL_MODE_ALWAYS || diagonal_mode == DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE) {
|
if (diagonal_mode == DIAGONAL_MODE_ALWAYS || diagonal_mode == DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE) {
|
||||||
if (dx != 0 && dy != 0) {
|
if (dx != 0 && dy != 0) {
|
||||||
|
@ -516,7 +514,7 @@ void AStarGrid2D::clear() {
|
||||||
Vector2 AStarGrid2D::get_point_position(const Vector2i &p_id) const {
|
Vector2 AStarGrid2D::get_point_position(const Vector2i &p_id) const {
|
||||||
ERR_FAIL_COND_V_MSG(dirty, Vector2(), "Grid is not initialized. Call the update method.");
|
ERR_FAIL_COND_V_MSG(dirty, Vector2(), "Grid is not initialized. Call the update method.");
|
||||||
ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), Vector2(), vformat("Can't get point's position. Point %s out of bounds %s.", p_id, region));
|
ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), Vector2(), vformat("Can't get point's position. Point %s out of bounds %s.", p_id, region));
|
||||||
return GET_POINT_UNCHECKED(p_id).pos;
|
return _get_point_unchecked(p_id)->pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Vector2> AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vector2i &p_to_id) {
|
Vector<Vector2> AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vector2i &p_to_id) {
|
||||||
|
@ -542,7 +540,7 @@ Vector<Vector2> AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vec
|
||||||
}
|
}
|
||||||
|
|
||||||
Point *p = end_point;
|
Point *p = end_point;
|
||||||
int64_t pc = 1;
|
int32_t pc = 1;
|
||||||
while (p != begin_point) {
|
while (p != begin_point) {
|
||||||
pc++;
|
pc++;
|
||||||
p = p->prev_point;
|
p = p->prev_point;
|
||||||
|
@ -555,7 +553,7 @@ Vector<Vector2> AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vec
|
||||||
Vector2 *w = path.ptrw();
|
Vector2 *w = path.ptrw();
|
||||||
|
|
||||||
p = end_point;
|
p = end_point;
|
||||||
int64_t idx = pc - 1;
|
int32_t idx = pc - 1;
|
||||||
while (p != begin_point) {
|
while (p != begin_point) {
|
||||||
w[idx--] = p->pos;
|
w[idx--] = p->pos;
|
||||||
p = p->prev_point;
|
p = p->prev_point;
|
||||||
|
@ -590,7 +588,7 @@ TypedArray<Vector2i> AStarGrid2D::get_id_path(const Vector2i &p_from_id, const V
|
||||||
}
|
}
|
||||||
|
|
||||||
Point *p = end_point;
|
Point *p = end_point;
|
||||||
int64_t pc = 1;
|
int32_t pc = 1;
|
||||||
while (p != begin_point) {
|
while (p != begin_point) {
|
||||||
pc++;
|
pc++;
|
||||||
p = p->prev_point;
|
p = p->prev_point;
|
||||||
|
@ -601,7 +599,7 @@ TypedArray<Vector2i> AStarGrid2D::get_id_path(const Vector2i &p_from_id, const V
|
||||||
|
|
||||||
{
|
{
|
||||||
p = end_point;
|
p = end_point;
|
||||||
int64_t idx = pc - 1;
|
int32_t idx = pc - 1;
|
||||||
while (p != begin_point) {
|
while (p != begin_point) {
|
||||||
path[idx--] = p->id;
|
path[idx--] = p->id;
|
||||||
p = p->prev_point;
|
p = p->prev_point;
|
||||||
|
@ -671,5 +669,3 @@ void AStarGrid2D::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(DIAGONAL_MODE_ONLY_IF_NO_OBSTACLES);
|
BIND_ENUM_CONSTANT(DIAGONAL_MODE_ONLY_IF_NO_OBSTACLES);
|
||||||
BIND_ENUM_CONSTANT(DIAGONAL_MODE_MAX);
|
BIND_ENUM_CONSTANT(DIAGONAL_MODE_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef GET_POINT_UNCHECKED
|
|
||||||
|
|
|
@ -105,24 +105,32 @@ private:
|
||||||
uint64_t pass = 1;
|
uint64_t pass = 1;
|
||||||
|
|
||||||
private: // Internal routines.
|
private: // Internal routines.
|
||||||
_FORCE_INLINE_ bool _is_walkable(int64_t p_x, int64_t p_y) const {
|
_FORCE_INLINE_ bool _is_walkable(int32_t p_x, int32_t p_y) const {
|
||||||
if (region.has_point(Vector2i(p_x, p_y))) {
|
if (region.has_point(Vector2i(p_x, p_y))) {
|
||||||
return !points[p_y - region.position.y][p_x - region.position.x].solid;
|
return !points[p_y - region.position.y][p_x - region.position.x].solid;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_FORCE_INLINE_ Point *_get_point(int64_t p_x, int64_t p_y) {
|
_FORCE_INLINE_ Point *_get_point(int32_t p_x, int32_t p_y) {
|
||||||
if (region.has_point(Vector2i(p_x, p_y))) {
|
if (region.has_point(Vector2i(p_x, p_y))) {
|
||||||
return &points[p_y - region.position.y][p_x - region.position.x];
|
return &points[p_y - region.position.y][p_x - region.position.x];
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
_FORCE_INLINE_ Point *_get_point_unchecked(int64_t p_x, int64_t p_y) {
|
_FORCE_INLINE_ Point *_get_point_unchecked(int32_t p_x, int32_t p_y) {
|
||||||
return &points[p_y - region.position.y][p_x - region.position.x];
|
return &points[p_y - region.position.y][p_x - region.position.x];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_FORCE_INLINE_ Point *_get_point_unchecked(const Vector2i &p_id) {
|
||||||
|
return &points[p_id.y - region.position.y][p_id.x - region.position.x];
|
||||||
|
}
|
||||||
|
|
||||||
|
_FORCE_INLINE_ const Point *_get_point_unchecked(const Vector2i &p_id) const {
|
||||||
|
return &points[p_id.y - region.position.y][p_id.x - region.position.x];
|
||||||
|
}
|
||||||
|
|
||||||
void _get_nbors(Point *p_point, LocalVector<Point *> &r_nbors);
|
void _get_nbors(Point *p_point, LocalVector<Point *> &r_nbors);
|
||||||
Point *_jump(Point *p_from, Point *p_to);
|
Point *_jump(Point *p_from, Point *p_to);
|
||||||
bool _solve(Point *p_begin_point, Point *p_end_point);
|
bool _solve(Point *p_begin_point, Point *p_end_point);
|
||||||
|
@ -151,10 +159,7 @@ public:
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
int get_width() const;
|
bool is_in_bounds(int32_t p_x, int32_t p_y) const;
|
||||||
int get_height() const;
|
|
||||||
|
|
||||||
bool is_in_bounds(int p_x, int p_y) const;
|
|
||||||
bool is_in_boundsv(const Vector2i &p_id) const;
|
bool is_in_boundsv(const Vector2i &p_id) const;
|
||||||
bool is_dirty() const;
|
bool is_dirty() const;
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,14 @@ bool Basis::is_orthogonal() const {
|
||||||
return m.is_equal_approx(identity);
|
return m.is_equal_approx(identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Basis::is_conformal() const {
|
||||||
|
const Vector3 x = get_column(0);
|
||||||
|
const Vector3 y = get_column(1);
|
||||||
|
const Vector3 z = get_column(2);
|
||||||
|
const real_t x_len_sq = x.length_squared();
|
||||||
|
return Math::is_equal_approx(x_len_sq, y.length_squared()) && Math::is_equal_approx(x_len_sq, z.length_squared()) && Math::is_zero_approx(x.dot(y)) && Math::is_zero_approx(x.dot(z)) && Math::is_zero_approx(y.dot(z));
|
||||||
|
}
|
||||||
|
|
||||||
bool Basis::is_diagonal() const {
|
bool Basis::is_diagonal() const {
|
||||||
return (
|
return (
|
||||||
Math::is_zero_approx(rows[0][1]) && Math::is_zero_approx(rows[0][2]) &&
|
Math::is_zero_approx(rows[0][1]) && Math::is_zero_approx(rows[0][2]) &&
|
||||||
|
|
|
@ -138,6 +138,7 @@ struct _NO_DISCARD_ Basis {
|
||||||
_FORCE_INLINE_ Basis operator*(const real_t p_val) const;
|
_FORCE_INLINE_ Basis operator*(const real_t p_val) const;
|
||||||
|
|
||||||
bool is_orthogonal() const;
|
bool is_orthogonal() const;
|
||||||
|
bool is_conformal() const;
|
||||||
bool is_diagonal() const;
|
bool is_diagonal() const;
|
||||||
bool is_rotation() const;
|
bool is_rotation() const;
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ void refit_branch(uint32_t p_node_id) {
|
||||||
TLeaf &leaf = _node_get_leaf(tnode);
|
TLeaf &leaf = _node_get_leaf(tnode);
|
||||||
if (leaf.is_dirty()) {
|
if (leaf.is_dirty()) {
|
||||||
leaf.set_dirty(false);
|
leaf.set_dirty(false);
|
||||||
refit_upward(p_node_id);
|
refit_upward(rp.node_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // while more nodes to pop
|
} // while more nodes to pop
|
||||||
|
|
|
@ -20,8 +20,8 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
|
||||||
group_b[num_b++] = ind;
|
group_b[num_b++] = ind;
|
||||||
|
|
||||||
// remove from a
|
// remove from a
|
||||||
group_a[0] = group_a[num_a - 1];
|
|
||||||
num_a--;
|
num_a--;
|
||||||
|
group_a[0] = group_a[num_a];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,15 +30,15 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
|
||||||
|
|
||||||
int order[POINT::AXIS_COUNT];
|
int order[POINT::AXIS_COUNT];
|
||||||
|
|
||||||
order[0] = size.min_axis_index();
|
order[0] = size.max_axis_index(); // The longest axis.
|
||||||
order[POINT::AXIS_COUNT - 1] = size.max_axis_index();
|
order[POINT::AXIS_COUNT - 1] = size.min_axis_index(); // The shortest axis.
|
||||||
|
|
||||||
static_assert(POINT::AXIS_COUNT <= 3, "BVH POINT::AXIS_COUNT has unexpected size");
|
static_assert(POINT::AXIS_COUNT <= 3, "BVH POINT::AXIS_COUNT has unexpected size");
|
||||||
if constexpr (POINT::AXIS_COUNT == 3) {
|
if constexpr (POINT::AXIS_COUNT == 3) {
|
||||||
order[1] = 3 - (order[0] + order[2]);
|
order[1] = 3 - (order[0] + order[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// simplest case, split on the longest axis
|
// Simplest case, split on the longest axis.
|
||||||
int split_axis = order[0];
|
int split_axis = order[0];
|
||||||
for (int a = 0; a < num_a; a++) {
|
for (int a = 0; a < num_a; a++) {
|
||||||
uint32_t ind = group_a[a];
|
uint32_t ind = group_a[a];
|
||||||
|
@ -48,8 +48,8 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
|
||||||
group_b[num_b++] = ind;
|
group_b[num_b++] = ind;
|
||||||
|
|
||||||
// remove from a
|
// remove from a
|
||||||
group_a[a] = group_a[num_a - 1];
|
|
||||||
num_a--;
|
num_a--;
|
||||||
|
group_a[a] = group_a[num_a];
|
||||||
|
|
||||||
// do this one again, as it has been replaced
|
// do this one again, as it has been replaced
|
||||||
a--;
|
a--;
|
||||||
|
@ -67,7 +67,7 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
|
||||||
}
|
}
|
||||||
num_b = 0;
|
num_b = 0;
|
||||||
|
|
||||||
// now calculate the best split
|
// Now calculate the best split.
|
||||||
for (int axis = 1; axis < POINT::AXIS_COUNT; axis++) {
|
for (int axis = 1; axis < POINT::AXIS_COUNT; axis++) {
|
||||||
split_axis = order[axis];
|
split_axis = order[axis];
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
@ -105,8 +105,8 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
|
||||||
group_b[num_b++] = ind;
|
group_b[num_b++] = ind;
|
||||||
|
|
||||||
// remove from a
|
// remove from a
|
||||||
group_a[a] = group_a[num_a - 1];
|
|
||||||
num_a--;
|
num_a--;
|
||||||
|
group_a[a] = group_a[num_a];
|
||||||
|
|
||||||
// do this one again, as it has been replaced
|
// do this one again, as it has been replaced
|
||||||
a--;
|
a--;
|
||||||
|
@ -123,8 +123,8 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
|
||||||
group_b[num_b++] = ind;
|
group_b[num_b++] = ind;
|
||||||
|
|
||||||
// remove from a
|
// remove from a
|
||||||
group_a[0] = group_a[num_a - 1];
|
|
||||||
num_a--;
|
num_a--;
|
||||||
|
group_a[0] = group_a[num_a];
|
||||||
}
|
}
|
||||||
// opposite problem! :)
|
// opposite problem! :)
|
||||||
if (!num_a) {
|
if (!num_a) {
|
||||||
|
@ -134,8 +134,8 @@ void _split_leaf_sort_groups_simple(int &num_a, int &num_b, uint16_t *group_a, u
|
||||||
group_a[num_a++] = ind;
|
group_a[num_a++] = ind;
|
||||||
|
|
||||||
// remove from b
|
// remove from b
|
||||||
group_b[0] = group_b[num_b - 1];
|
|
||||||
num_b--;
|
num_b--;
|
||||||
|
group_b[0] = group_b[num_b];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ public:
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
num_items = 0;
|
num_items = 0;
|
||||||
set_dirty(true);
|
set_dirty(false);
|
||||||
}
|
}
|
||||||
bool is_full() const { return num_items >= MAX_ITEMS; }
|
bool is_full() const { return num_items >= MAX_ITEMS; }
|
||||||
|
|
||||||
|
|
|
@ -399,15 +399,20 @@ public:
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
static _ALWAYS_INLINE_ double lerp_angle(double p_from, double p_to, double p_weight) {
|
static _ALWAYS_INLINE_ double angle_difference(double p_from, double p_to) {
|
||||||
double difference = fmod(p_to - p_from, Math_TAU);
|
double difference = fmod(p_to - p_from, Math_TAU);
|
||||||
double distance = fmod(2.0 * difference, Math_TAU) - difference;
|
return fmod(2.0 * difference, Math_TAU) - difference;
|
||||||
return p_from + distance * p_weight;
|
}
|
||||||
|
static _ALWAYS_INLINE_ float angle_difference(float p_from, float p_to) {
|
||||||
|
float difference = fmod(p_to - p_from, (float)Math_TAU);
|
||||||
|
return fmod(2.0f * difference, (float)Math_TAU) - difference;
|
||||||
|
}
|
||||||
|
|
||||||
|
static _ALWAYS_INLINE_ double lerp_angle(double p_from, double p_to, double p_weight) {
|
||||||
|
return p_from + Math::angle_difference(p_from, p_to) * p_weight;
|
||||||
}
|
}
|
||||||
static _ALWAYS_INLINE_ float lerp_angle(float p_from, float p_to, float p_weight) {
|
static _ALWAYS_INLINE_ float lerp_angle(float p_from, float p_to, float p_weight) {
|
||||||
float difference = fmod(p_to - p_from, (float)Math_TAU);
|
return p_from + Math::angle_difference(p_from, p_to) * p_weight;
|
||||||
float distance = fmod(2.0f * difference, (float)Math_TAU) - difference;
|
|
||||||
return p_from + distance * p_weight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static _ALWAYS_INLINE_ double inverse_lerp(double p_from, double p_to, double p_value) {
|
static _ALWAYS_INLINE_ double inverse_lerp(double p_from, double p_to, double p_value) {
|
||||||
|
@ -438,6 +443,7 @@ public:
|
||||||
float s = CLAMP((p_s - p_from) / (p_to - p_from), 0.0f, 1.0f);
|
float s = CLAMP((p_s - p_from) / (p_to - p_from), 0.0f, 1.0f);
|
||||||
return s * s * (3.0f - 2.0f * s);
|
return s * s * (3.0f - 2.0f * s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static _ALWAYS_INLINE_ double move_toward(double p_from, double p_to, double p_delta) {
|
static _ALWAYS_INLINE_ double move_toward(double p_from, double p_to, double p_delta) {
|
||||||
return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta;
|
return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta;
|
||||||
}
|
}
|
||||||
|
@ -445,6 +451,19 @@ public:
|
||||||
return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta;
|
return abs(p_to - p_from) <= p_delta ? p_to : p_from + SIGN(p_to - p_from) * p_delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _ALWAYS_INLINE_ double rotate_toward(double p_from, double p_to, double p_delta) {
|
||||||
|
double difference = Math::angle_difference(p_from, p_to);
|
||||||
|
double abs_difference = Math::abs(difference);
|
||||||
|
// When `p_delta < 0` move no further than to PI radians away from `p_to` (as PI is the max possible angle distance).
|
||||||
|
return p_from + CLAMP(p_delta, abs_difference - Math_PI, abs_difference) * (difference >= 0.0 ? 1.0 : -1.0);
|
||||||
|
}
|
||||||
|
static _ALWAYS_INLINE_ float rotate_toward(float p_from, float p_to, float p_delta) {
|
||||||
|
float difference = Math::angle_difference(p_from, p_to);
|
||||||
|
float abs_difference = Math::abs(difference);
|
||||||
|
// When `p_delta < 0` move no further than to PI radians away from `p_to` (as PI is the max possible angle distance).
|
||||||
|
return p_from + CLAMP(p_delta, abs_difference - (float)Math_PI, abs_difference) * (difference >= 0.0f ? 1.0f : -1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
static _ALWAYS_INLINE_ double linear_to_db(double p_linear) {
|
static _ALWAYS_INLINE_ double linear_to_db(double p_linear) {
|
||||||
return Math::log(p_linear) * 8.6858896380650365530225783783321;
|
return Math::log(p_linear) * 8.6858896380650365530225783783321;
|
||||||
}
|
}
|
||||||
|
|
|
@ -408,7 +408,6 @@ real_t Projection::get_z_far() const {
|
||||||
matrix[11] - matrix[10],
|
matrix[11] - matrix[10],
|
||||||
matrix[15] - matrix[14]);
|
matrix[15] - matrix[14]);
|
||||||
|
|
||||||
new_plane.normal = -new_plane.normal;
|
|
||||||
new_plane.normalize();
|
new_plane.normalize();
|
||||||
|
|
||||||
return new_plane.d;
|
return new_plane.d;
|
||||||
|
|
|
@ -164,6 +164,18 @@ Transform2D Transform2D::orthonormalized() const {
|
||||||
return ortho;
|
return ortho;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Transform2D::is_conformal() const {
|
||||||
|
// Non-flipped case.
|
||||||
|
if (Math::is_equal_approx(columns[0][0], columns[1][1]) && Math::is_equal_approx(columns[0][1], -columns[1][0])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Flipped case.
|
||||||
|
if (Math::is_equal_approx(columns[0][0], -columns[1][1]) && Math::is_equal_approx(columns[0][1], columns[1][0])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool Transform2D::is_equal_approx(const Transform2D &p_transform) const {
|
bool Transform2D::is_equal_approx(const Transform2D &p_transform) const {
|
||||||
return columns[0].is_equal_approx(p_transform.columns[0]) && columns[1].is_equal_approx(p_transform.columns[1]) && columns[2].is_equal_approx(p_transform.columns[2]);
|
return columns[0].is_equal_approx(p_transform.columns[0]) && columns[1].is_equal_approx(p_transform.columns[1]) && columns[2].is_equal_approx(p_transform.columns[2]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,7 @@ struct _NO_DISCARD_ Transform2D {
|
||||||
|
|
||||||
void orthonormalize();
|
void orthonormalize();
|
||||||
Transform2D orthonormalized() const;
|
Transform2D orthonormalized() const;
|
||||||
|
bool is_conformal() const;
|
||||||
bool is_equal_approx(const Transform2D &p_transform) const;
|
bool is_equal_approx(const Transform2D &p_transform) const;
|
||||||
bool is_finite() const;
|
bool is_finite() const;
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "class_db.h"
|
#include "class_db.h"
|
||||||
|
|
||||||
#include "core/config/engine.h"
|
#include "core/config/engine.h"
|
||||||
|
#include "core/io/resource_loader.h"
|
||||||
#include "core/object/script_language.h"
|
#include "core/object/script_language.h"
|
||||||
#include "core/os/mutex.h"
|
#include "core/os/mutex.h"
|
||||||
#include "core/version.h"
|
#include "core/version.h"
|
||||||
|
@ -221,10 +222,11 @@ uint32_t ClassDB::get_api_hash(APIType p_api) {
|
||||||
|
|
||||||
hash = hash_murmur3_one_64(mb->get_default_argument_count(), hash);
|
hash = hash_murmur3_one_64(mb->get_default_argument_count(), hash);
|
||||||
|
|
||||||
for (int i = 0; i < mb->get_default_argument_count(); i++) {
|
for (int i = 0; i < mb->get_argument_count(); i++) {
|
||||||
//hash should not change, i hope for tis
|
if (mb->has_default_argument(i)) {
|
||||||
Variant da = mb->get_default_argument(i);
|
Variant da = mb->get_default_argument(i);
|
||||||
hash = hash_murmur3_one_64(da.hash(), hash);
|
hash = hash_murmur3_one_64(da.hash(), hash);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hash = hash_murmur3_one_64(mb->get_hint_flags(), hash);
|
hash = hash_murmur3_one_64(mb->get_hint_flags(), hash);
|
||||||
|
@ -347,7 +349,13 @@ Object *ClassDB::instantiate(const StringName &p_class) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (ti->gdextension && ti->gdextension->create_instance) {
|
if (ti->gdextension && ti->gdextension->create_instance) {
|
||||||
return (Object *)ti->gdextension->create_instance(ti->gdextension->class_userdata);
|
Object *obj = (Object *)ti->gdextension->create_instance(ti->gdextension->class_userdata);
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (ti->gdextension->track_instance) {
|
||||||
|
ti->gdextension->track_instance(ti->gdextension->tracking_userdata, obj);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return obj;
|
||||||
} else {
|
} else {
|
||||||
return ti->creation_func();
|
return ti->creation_func();
|
||||||
}
|
}
|
||||||
|
@ -377,7 +385,14 @@ bool ClassDB::can_instantiate(const StringName &p_class) {
|
||||||
OBJTYPE_RLOCK;
|
OBJTYPE_RLOCK;
|
||||||
|
|
||||||
ClassInfo *ti = classes.getptr(p_class);
|
ClassInfo *ti = classes.getptr(p_class);
|
||||||
ERR_FAIL_NULL_V_MSG(ti, false, "Cannot get class '" + String(p_class) + "'.");
|
if (!ti) {
|
||||||
|
if (!ScriptServer::is_global_class(p_class)) {
|
||||||
|
ERR_FAIL_V_MSG(false, "Cannot get class '" + String(p_class) + "'.");
|
||||||
|
}
|
||||||
|
String path = ScriptServer::get_global_class_path(p_class);
|
||||||
|
Ref<Script> scr = ResourceLoader::load(path);
|
||||||
|
return scr.is_valid() && scr->is_valid() && !scr->is_abstract();
|
||||||
|
}
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
if (ti->api == API_EDITOR && !Engine::get_singleton()->is_editor_hint()) {
|
if (ti->api == API_EDITOR && !Engine::get_singleton()->is_editor_hint()) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -394,7 +409,9 @@ bool ClassDB::is_virtual(const StringName &p_class) {
|
||||||
if (!ScriptServer::is_global_class(p_class)) {
|
if (!ScriptServer::is_global_class(p_class)) {
|
||||||
ERR_FAIL_V_MSG(false, "Cannot get class '" + String(p_class) + "'.");
|
ERR_FAIL_V_MSG(false, "Cannot get class '" + String(p_class) + "'.");
|
||||||
}
|
}
|
||||||
return false;
|
String path = ScriptServer::get_global_class_path(p_class);
|
||||||
|
Ref<Script> scr = ResourceLoader::load(path);
|
||||||
|
return scr.is_valid() && scr->is_valid() && scr->is_abstract();
|
||||||
}
|
}
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
if (ti->api == API_EDITOR && !Engine::get_singleton()->is_editor_hint()) {
|
if (ti->api == API_EDITOR && !Engine::get_singleton()->is_editor_hint()) {
|
||||||
|
@ -463,7 +480,6 @@ void ClassDB::get_method_list(const StringName &p_class, List<MethodInfo> *p_met
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
|
|
||||||
for (const MethodInfo &E : type->virtual_methods) {
|
for (const MethodInfo &E : type->virtual_methods) {
|
||||||
p_methods->push_back(E);
|
p_methods->push_back(E);
|
||||||
}
|
}
|
||||||
|
@ -478,15 +494,12 @@ void ClassDB::get_method_list(const StringName &p_class, List<MethodInfo> *p_met
|
||||||
|
|
||||||
p_methods->push_back(minfo);
|
p_methods->push_back(minfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
for (KeyValue<StringName, MethodBind *> &E : type->method_map) {
|
for (KeyValue<StringName, MethodBind *> &E : type->method_map) {
|
||||||
MethodBind *m = E.value;
|
MethodBind *m = E.value;
|
||||||
MethodInfo minfo = info_from_bind(m);
|
MethodInfo minfo = info_from_bind(m);
|
||||||
p_methods->push_back(minfo);
|
p_methods->push_back(minfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (p_no_inheritance) {
|
if (p_no_inheritance) {
|
||||||
|
@ -497,6 +510,66 @@ void ClassDB::get_method_list(const StringName &p_class, List<MethodInfo> *p_met
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassDB::get_method_list_with_compatibility(const StringName &p_class, List<Pair<MethodInfo, uint32_t>> *p_methods, bool p_no_inheritance, bool p_exclude_from_properties) {
|
||||||
|
OBJTYPE_RLOCK;
|
||||||
|
|
||||||
|
ClassInfo *type = classes.getptr(p_class);
|
||||||
|
|
||||||
|
while (type) {
|
||||||
|
if (type->disabled) {
|
||||||
|
if (p_no_inheritance) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = type->inherits_ptr;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
|
for (const MethodInfo &E : type->virtual_methods) {
|
||||||
|
Pair<MethodInfo, uint32_t> pair(E, 0);
|
||||||
|
p_methods->push_back(pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const StringName &E : type->method_order) {
|
||||||
|
if (p_exclude_from_properties && type->methods_in_properties.has(E)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
MethodBind *method = type->method_map.get(E);
|
||||||
|
MethodInfo minfo = info_from_bind(method);
|
||||||
|
|
||||||
|
Pair<MethodInfo, uint32_t> pair(minfo, method->get_hash());
|
||||||
|
p_methods->push_back(pair);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
for (KeyValue<StringName, MethodBind *> &E : type->method_map) {
|
||||||
|
MethodBind *method = E.value;
|
||||||
|
MethodInfo minfo = info_from_bind(method);
|
||||||
|
|
||||||
|
Pair<MethodInfo, uint32_t> pair(minfo, method->get_hash());
|
||||||
|
p_methods->push_back(pair);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (const KeyValue<StringName, LocalVector<MethodBind *, unsigned int, false, false>> &E : type->method_map_compatibility) {
|
||||||
|
LocalVector<MethodBind *> compat = E.value;
|
||||||
|
for (MethodBind *method : compat) {
|
||||||
|
MethodInfo minfo = info_from_bind(method);
|
||||||
|
|
||||||
|
Pair<MethodInfo, uint32_t> pair(minfo, method->get_hash());
|
||||||
|
p_methods->push_back(pair);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_no_inheritance) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = type->inherits_ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool ClassDB::get_method_info(const StringName &p_class, const StringName &p_method, MethodInfo *r_info, bool p_no_inheritance, bool p_exclude_from_properties) {
|
bool ClassDB::get_method_info(const StringName &p_class, const StringName &p_method, MethodInfo *r_info, bool p_no_inheritance, bool p_exclude_from_properties) {
|
||||||
OBJTYPE_RLOCK;
|
OBJTYPE_RLOCK;
|
||||||
|
|
||||||
|
@ -1544,6 +1617,14 @@ bool ClassDB::is_class_exposed(const StringName &p_class) {
|
||||||
return ti->exposed;
|
return ti->exposed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ClassDB::is_class_reloadable(const StringName &p_class) {
|
||||||
|
OBJTYPE_RLOCK;
|
||||||
|
|
||||||
|
ClassInfo *ti = classes.getptr(p_class);
|
||||||
|
ERR_FAIL_NULL_V_MSG(ti, false, "Cannot get class '" + String(p_class) + "'.");
|
||||||
|
return ti->reloadable;
|
||||||
|
}
|
||||||
|
|
||||||
void ClassDB::add_resource_base_extension(const StringName &p_extension, const StringName &p_class) {
|
void ClassDB::add_resource_base_extension(const StringName &p_extension, const StringName &p_class) {
|
||||||
if (resource_base_extensions.has(p_extension)) {
|
if (resource_base_extensions.has(p_extension)) {
|
||||||
return;
|
return;
|
||||||
|
@ -1682,15 +1763,18 @@ void ClassDB::register_extension_class(ObjectGDExtension *p_extension) {
|
||||||
parent = classes.getptr(parent->name);
|
parent = classes.getptr(parent->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
c.reloadable = p_extension->reloadable;
|
||||||
|
|
||||||
classes[p_extension->class_name] = c;
|
classes[p_extension->class_name] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClassDB::unregister_extension_class(const StringName &p_class) {
|
void ClassDB::unregister_extension_class(const StringName &p_class, bool p_free_method_binds) {
|
||||||
ClassInfo *c = classes.getptr(p_class);
|
ClassInfo *c = classes.getptr(p_class);
|
||||||
ERR_FAIL_NULL_MSG(c, "Class '" + String(p_class) + "' does not exist.");
|
ERR_FAIL_NULL_MSG(c, "Class '" + String(p_class) + "' does not exist.");
|
||||||
for (KeyValue<StringName, MethodBind *> &F : c->method_map) {
|
if (p_free_method_binds) {
|
||||||
memdelete(F.value);
|
for (KeyValue<StringName, MethodBind *> &F : c->method_map) {
|
||||||
|
memdelete(F.value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
classes.erase(p_class);
|
classes.erase(p_class);
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,7 @@ public:
|
||||||
StringName name;
|
StringName name;
|
||||||
bool disabled = false;
|
bool disabled = false;
|
||||||
bool exposed = false;
|
bool exposed = false;
|
||||||
|
bool reloadable = false;
|
||||||
bool is_virtual = false;
|
bool is_virtual = false;
|
||||||
Object *(*creation_func)() = nullptr;
|
Object *(*creation_func)() = nullptr;
|
||||||
|
|
||||||
|
@ -228,7 +229,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void register_extension_class(ObjectGDExtension *p_extension);
|
static void register_extension_class(ObjectGDExtension *p_extension);
|
||||||
static void unregister_extension_class(const StringName &p_class);
|
static void unregister_extension_class(const StringName &p_class, bool p_free_method_binds = true);
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
static Object *_create_ptr_func() {
|
static Object *_create_ptr_func() {
|
||||||
|
@ -398,6 +399,7 @@ public:
|
||||||
static void set_method_flags(const StringName &p_class, const StringName &p_method, int p_flags);
|
static void set_method_flags(const StringName &p_class, const StringName &p_method, int p_flags);
|
||||||
|
|
||||||
static void get_method_list(const StringName &p_class, List<MethodInfo> *p_methods, bool p_no_inheritance = false, bool p_exclude_from_properties = false);
|
static void get_method_list(const StringName &p_class, List<MethodInfo> *p_methods, bool p_no_inheritance = false, bool p_exclude_from_properties = false);
|
||||||
|
static void get_method_list_with_compatibility(const StringName &p_class, List<Pair<MethodInfo, uint32_t>> *p_methods_with_hash, bool p_no_inheritance = false, bool p_exclude_from_properties = false);
|
||||||
static bool get_method_info(const StringName &p_class, const StringName &p_method, MethodInfo *r_info, bool p_no_inheritance = false, bool p_exclude_from_properties = false);
|
static bool get_method_info(const StringName &p_class, const StringName &p_method, MethodInfo *r_info, bool p_no_inheritance = false, bool p_exclude_from_properties = false);
|
||||||
static MethodBind *get_method(const StringName &p_class, const StringName &p_name);
|
static MethodBind *get_method(const StringName &p_class, const StringName &p_name);
|
||||||
static MethodBind *get_method_with_compatibility(const StringName &p_class, const StringName &p_name, uint64_t p_hash, bool *r_method_exists = nullptr, bool *r_is_deprecated = nullptr);
|
static MethodBind *get_method_with_compatibility(const StringName &p_class, const StringName &p_name, uint64_t p_hash, bool *r_method_exists = nullptr, bool *r_is_deprecated = nullptr);
|
||||||
|
@ -426,6 +428,7 @@ public:
|
||||||
static bool is_class_enabled(const StringName &p_class);
|
static bool is_class_enabled(const StringName &p_class);
|
||||||
|
|
||||||
static bool is_class_exposed(const StringName &p_class);
|
static bool is_class_exposed(const StringName &p_class);
|
||||||
|
static bool is_class_reloadable(const StringName &p_class);
|
||||||
|
|
||||||
static void add_resource_base_extension(const StringName &p_extension, const StringName &p_class);
|
static void add_resource_base_extension(const StringName &p_extension, const StringName &p_class);
|
||||||
static void get_resource_base_extensions(List<String> *p_extensions);
|
static void get_resource_base_extensions(List<String> *p_extensions);
|
||||||
|
|
|
@ -2,7 +2,7 @@ proto = """
|
||||||
#define GDVIRTUAL$VER($RET m_name $ARG) \\
|
#define GDVIRTUAL$VER($RET m_name $ARG) \\
|
||||||
StringName _gdvirtual_##m_name##_sn = #m_name;\\
|
StringName _gdvirtual_##m_name##_sn = #m_name;\\
|
||||||
mutable bool _gdvirtual_##m_name##_initialized = false;\\
|
mutable bool _gdvirtual_##m_name##_initialized = false;\\
|
||||||
mutable GDExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\
|
mutable void* _gdvirtual_##m_name = nullptr;\\
|
||||||
template<bool required>\\
|
template<bool required>\\
|
||||||
_FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
|
_FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
|
||||||
ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\
|
ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\
|
||||||
|
@ -16,15 +16,25 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
|
||||||
} \\
|
} \\
|
||||||
}\\
|
}\\
|
||||||
if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
|
if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
|
||||||
/* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
|
_gdvirtual_##m_name = nullptr;\\
|
||||||
_gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\
|
if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
|
||||||
|
_gdvirtual_##m_name = _get_extension()->get_virtual_call_data(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
|
||||||
|
} else if (_get_extension()->get_virtual) {\\
|
||||||
|
_gdvirtual_##m_name = (void *)_get_extension()->get_virtual(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
|
||||||
|
}\\
|
||||||
|
GDVIRTUAL_TRACK(_gdvirtual_##m_name, _gdvirtual_##m_name##_initialized); \\
|
||||||
_gdvirtual_##m_name##_initialized = true;\\
|
_gdvirtual_##m_name##_initialized = true;\\
|
||||||
}\\
|
}\\
|
||||||
if (_gdvirtual_##m_name) {\\
|
if (_gdvirtual_##m_name) {\\
|
||||||
$CALLPTRARGS\\
|
$CALLPTRARGS\\
|
||||||
$CALLPTRRETDEF\\
|
$CALLPTRRETDEF\\
|
||||||
_gdvirtual_##m_name(_get_extension_instance(),$CALLPTRARGPASS,$CALLPTRRETPASS);\\
|
if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
|
||||||
$CALLPTRRET\\
|
_get_extension()->call_virtual_with_data(_get_extension_instance(), &_gdvirtual_##m_name##_sn, _gdvirtual_##m_name, $CALLPTRARGPASS,$CALLPTRRETPASS);\\
|
||||||
|
$CALLPTRRET\\
|
||||||
|
} else {\\
|
||||||
|
((GDExtensionClassCallVirtual)_gdvirtual_##m_name)(_get_extension_instance(),$CALLPTRARGPASS,$CALLPTRRETPASS);\\
|
||||||
|
$CALLPTRRET\\
|
||||||
|
}\\
|
||||||
return true;\\
|
return true;\\
|
||||||
}\\
|
}\\
|
||||||
\\
|
\\
|
||||||
|
@ -41,8 +51,13 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const { \\
|
||||||
return _script_instance->has_method(_gdvirtual_##m_name##_sn);\\
|
return _script_instance->has_method(_gdvirtual_##m_name##_sn);\\
|
||||||
}\\
|
}\\
|
||||||
if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
|
if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
|
||||||
/* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
|
_gdvirtual_##m_name = nullptr;\\
|
||||||
_gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\
|
if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
|
||||||
|
_gdvirtual_##m_name = _get_extension()->get_virtual_call_data(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
|
||||||
|
} else if (_get_extension()->get_virtual) {\\
|
||||||
|
_gdvirtual_##m_name = (void *)_get_extension()->get_virtual(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
|
||||||
|
}\\
|
||||||
|
GDVIRTUAL_TRACK(_gdvirtual_##m_name, _gdvirtual_##m_name##_initialized); \\
|
||||||
_gdvirtual_##m_name##_initialized = true;\\
|
_gdvirtual_##m_name##_initialized = true;\\
|
||||||
}\\
|
}\\
|
||||||
if (_gdvirtual_##m_name) {\\
|
if (_gdvirtual_##m_name) {\\
|
||||||
|
@ -162,6 +177,18 @@ def run(target, source, env):
|
||||||
|
|
||||||
#include "core/object/script_instance.h"
|
#include "core/object/script_instance.h"
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
#define GDVIRTUAL_TRACK(m_virtual, m_initialized) \\
|
||||||
|
if (_get_extension()->reloadable) {\\
|
||||||
|
VirtualMethodTracker *tracker = memnew(VirtualMethodTracker);\\
|
||||||
|
tracker->method = (void **)&m_virtual;\\
|
||||||
|
tracker->initialized = &m_initialized;\\
|
||||||
|
tracker->next = virtual_method_list;\\
|
||||||
|
virtual_method_list = tracker;\\
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define GDVIRTUAL_TRACK(m_virtual, m_initialized)
|
||||||
|
#endif
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -47,9 +47,11 @@ uint32_t MethodBind::get_hash() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
hash = hash_murmur3_one_32(get_default_argument_count(), hash);
|
hash = hash_murmur3_one_32(get_default_argument_count(), hash);
|
||||||
for (int i = 0; i < get_default_argument_count(); i++) {
|
for (int i = 0; i < get_argument_count(); i++) {
|
||||||
Variant v = get_default_argument(i);
|
if (has_default_argument(i)) {
|
||||||
hash = hash_murmur3_one_32(v.hash(), hash);
|
Variant v = get_default_argument(i);
|
||||||
|
hash = hash_murmur3_one_32(v.hash(), hash);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hash = hash_murmur3_one_32(is_const(), hash);
|
hash = hash_murmur3_one_32(is_const(), hash);
|
||||||
|
|
|
@ -111,6 +111,10 @@ public:
|
||||||
|
|
||||||
_FORCE_INLINE_ int get_argument_count() const { return argument_count; };
|
_FORCE_INLINE_ int get_argument_count() const { return argument_count; };
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
virtual bool is_valid() const { return true; }
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const = 0;
|
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const = 0;
|
||||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const = 0;
|
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const = 0;
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "object.h"
|
#include "object.h"
|
||||||
|
|
||||||
#include "core/core_string_names.h"
|
#include "core/core_string_names.h"
|
||||||
|
#include "core/extension/gdextension_manager.h"
|
||||||
#include "core/io/resource.h"
|
#include "core/io/resource.h"
|
||||||
#include "core/object/class_db.h"
|
#include "core/object/class_db.h"
|
||||||
#include "core/object/message_queue.h"
|
#include "core/object/message_queue.h"
|
||||||
|
@ -616,7 +617,7 @@ void Object::get_method_list(List<MethodInfo> *p_list) const {
|
||||||
Variant Object::_call_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
Variant Object::_call_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
||||||
if (p_argcount < 1) {
|
if (p_argcount < 1) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = 0;
|
r_error.expected = 1;
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,7 +636,7 @@ Variant Object::_call_bind(const Variant **p_args, int p_argcount, Callable::Cal
|
||||||
Variant Object::_call_deferred_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
Variant Object::_call_deferred_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
||||||
if (p_argcount < 1) {
|
if (p_argcount < 1) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = 0;
|
r_error.expected = 1;
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -665,8 +666,16 @@ bool Object::has_method(const StringName &p_method) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
MethodBind *method = ClassDB::get_method(get_class_name(), p_method);
|
MethodBind *method = ClassDB::get_method(get_class_name(), p_method);
|
||||||
|
if (method != nullptr) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return method != nullptr;
|
const Script *scr = Object::cast_to<Script>(this);
|
||||||
|
if (scr != nullptr) {
|
||||||
|
return scr->has_static_method(p_method);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant Object::getvar(const Variant &p_key, bool *r_valid) const {
|
Variant Object::getvar(const Variant &p_key, bool *r_valid) const {
|
||||||
|
@ -714,12 +723,11 @@ Variant Object::callp(const StringName &p_method, const Variant **p_args, int p_
|
||||||
//free must be here, before anything, always ready
|
//free must be here, before anything, always ready
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (p_argcount != 0) {
|
if (p_argcount != 0) {
|
||||||
r_error.argument = 0;
|
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
|
r_error.expected = 0;
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
if (Object::cast_to<RefCounted>(this)) {
|
if (Object::cast_to<RefCounted>(this)) {
|
||||||
r_error.argument = 0;
|
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
|
||||||
ERR_FAIL_V_MSG(Variant(), "Can't 'free' a reference.");
|
ERR_FAIL_V_MSG(Variant(), "Can't 'free' a reference.");
|
||||||
}
|
}
|
||||||
|
@ -880,7 +888,10 @@ void Object::set_script(const Variant &p_script) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<Script> s = p_script;
|
Ref<Script> s = p_script;
|
||||||
ERR_FAIL_COND_MSG(s.is_null() && !p_script.is_null(), "Invalid parameter, it should be a reference to a valid script (or null).");
|
if (!p_script.is_null()) {
|
||||||
|
ERR_FAIL_COND_MSG(s.is_null(), "Cannot set object script. Parameter should be null or a reference to a valid script.");
|
||||||
|
ERR_FAIL_COND_MSG(s->is_abstract(), vformat("Cannot set object script. Script '%s' should not be abstract.", s->get_path()));
|
||||||
|
}
|
||||||
|
|
||||||
script = p_script;
|
script = p_script;
|
||||||
|
|
||||||
|
@ -1032,14 +1043,17 @@ struct _ObjectSignalDisconnectData {
|
||||||
};
|
};
|
||||||
|
|
||||||
Error Object::_emit_signal(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
Error Object::_emit_signal(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
if (unlikely(p_argcount < 1)) {
|
||||||
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
|
r_error.expected = 1;
|
||||||
|
ERR_FAIL_V(Error::ERR_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
|
||||||
ERR_FAIL_COND_V(p_argcount < 1, Error::ERR_INVALID_PARAMETER);
|
if (unlikely(p_args[0]->get_type() != Variant::STRING_NAME && p_args[0]->get_type() != Variant::STRING)) {
|
||||||
if (p_args[0]->get_type() != Variant::STRING_NAME && p_args[0]->get_type() != Variant::STRING) {
|
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.argument = 0;
|
r_error.argument = 0;
|
||||||
r_error.expected = Variant::STRING_NAME;
|
r_error.expected = Variant::STRING_NAME;
|
||||||
ERR_FAIL_COND_V(p_args[0]->get_type() != Variant::STRING_NAME && p_args[0]->get_type() != Variant::STRING, Error::ERR_INVALID_PARAMETER);
|
ERR_FAIL_V(Error::ERR_INVALID_PARAMETER);
|
||||||
}
|
}
|
||||||
|
|
||||||
r_error.error = Callable::CallError::CALL_OK;
|
r_error.error = Callable::CallError::CALL_OK;
|
||||||
|
@ -1791,14 +1805,17 @@ StringName Object::get_class_name_for_extension(const GDExtension *p_library) co
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
|
void Object::set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
|
||||||
// This is only meant to be used on creation by the binder.
|
// This is only meant to be used on creation by the binder, but we also
|
||||||
ERR_FAIL_COND(_instance_bindings != nullptr);
|
// need to account for reloading (where the 'binding' will be cleared).
|
||||||
_instance_bindings = (InstanceBinding *)memalloc(sizeof(InstanceBinding));
|
ERR_FAIL_COND(_instance_bindings != nullptr && _instance_bindings[0].binding != nullptr);
|
||||||
|
if (_instance_bindings == nullptr) {
|
||||||
|
_instance_bindings = (InstanceBinding *)memalloc(sizeof(InstanceBinding));
|
||||||
|
_instance_binding_count = 1;
|
||||||
|
}
|
||||||
_instance_bindings[0].binding = p_binding;
|
_instance_bindings[0].binding = p_binding;
|
||||||
_instance_bindings[0].free_callback = p_callbacks->free_callback;
|
_instance_bindings[0].free_callback = p_callbacks->free_callback;
|
||||||
_instance_bindings[0].reference_callback = p_callbacks->reference_callback;
|
_instance_bindings[0].reference_callback = p_callbacks->reference_callback;
|
||||||
_instance_bindings[0].token = p_token;
|
_instance_bindings[0].token = p_token;
|
||||||
_instance_binding_count = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *Object::get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
|
void *Object::get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
|
||||||
|
@ -1825,6 +1842,12 @@ void *Object::get_instance_binding(void *p_token, const GDExtensionInstanceBindi
|
||||||
binding = p_callbacks->create_callback(p_token, this);
|
binding = p_callbacks->create_callback(p_token, this);
|
||||||
_instance_bindings[_instance_binding_count].binding = binding;
|
_instance_bindings[_instance_binding_count].binding = binding;
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (!_extension && Engine::get_singleton()->is_extension_reloading_enabled()) {
|
||||||
|
GDExtensionManager::get_singleton()->track_instance_binding(p_token, this);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
_instance_binding_count++;
|
_instance_binding_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1848,6 +1871,71 @@ bool Object::has_instance_binding(void *p_token) {
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Object::free_instance_binding(void *p_token) {
|
||||||
|
bool found = false;
|
||||||
|
_instance_binding_mutex.lock();
|
||||||
|
for (uint32_t i = 0; i < _instance_binding_count; i++) {
|
||||||
|
if (!found && _instance_bindings[i].token == p_token) {
|
||||||
|
if (_instance_bindings[i].free_callback) {
|
||||||
|
_instance_bindings[i].free_callback(_instance_bindings[i].token, this, _instance_bindings[i].binding);
|
||||||
|
}
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
if (i + 1 < _instance_binding_count) {
|
||||||
|
_instance_bindings[i] = _instance_bindings[i + 1];
|
||||||
|
} else {
|
||||||
|
_instance_bindings[i] = { nullptr };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
_instance_binding_count--;
|
||||||
|
}
|
||||||
|
_instance_binding_mutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
void Object::clear_internal_extension() {
|
||||||
|
ERR_FAIL_NULL(_extension);
|
||||||
|
|
||||||
|
// Free the instance inside the GDExtension.
|
||||||
|
if (_extension->free_instance) {
|
||||||
|
_extension->free_instance(_extension->class_userdata, _extension_instance);
|
||||||
|
}
|
||||||
|
_extension = nullptr;
|
||||||
|
_extension_instance = nullptr;
|
||||||
|
|
||||||
|
// Clear the instance bindings.
|
||||||
|
_instance_binding_mutex.lock();
|
||||||
|
if (_instance_bindings[0].free_callback) {
|
||||||
|
_instance_bindings[0].free_callback(_instance_bindings[0].token, this, _instance_bindings[0].binding);
|
||||||
|
}
|
||||||
|
_instance_bindings[0].binding = nullptr;
|
||||||
|
_instance_bindings[0].token = nullptr;
|
||||||
|
_instance_bindings[0].free_callback = nullptr;
|
||||||
|
_instance_bindings[0].reference_callback = nullptr;
|
||||||
|
_instance_binding_mutex.unlock();
|
||||||
|
|
||||||
|
// Clear the virtual methods.
|
||||||
|
while (virtual_method_list) {
|
||||||
|
(*virtual_method_list->method) = nullptr;
|
||||||
|
(*virtual_method_list->initialized) = false;
|
||||||
|
virtual_method_list = virtual_method_list->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::reset_internal_extension(ObjectGDExtension *p_extension) {
|
||||||
|
ERR_FAIL_COND(_extension != nullptr);
|
||||||
|
|
||||||
|
if (p_extension) {
|
||||||
|
_extension_instance = p_extension->recreate_instance ? p_extension->recreate_instance(p_extension->class_userdata, (GDExtensionObjectPtr)this) : nullptr;
|
||||||
|
ERR_FAIL_NULL_MSG(_extension_instance, "Unable to recreate GDExtension instance - does this extension support hot reloading?");
|
||||||
|
_extension = p_extension;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void Object::_construct_object(bool p_reference) {
|
void Object::_construct_object(bool p_reference) {
|
||||||
type_is_reference = p_reference;
|
type_is_reference = p_reference;
|
||||||
_instance_id = ObjectDB::add_instance(this);
|
_instance_id = ObjectDB::add_instance(this);
|
||||||
|
@ -1878,11 +1966,25 @@ Object::~Object() {
|
||||||
}
|
}
|
||||||
script_instance = nullptr;
|
script_instance = nullptr;
|
||||||
|
|
||||||
if (_extension && _extension->free_instance) {
|
if (_extension) {
|
||||||
_extension->free_instance(_extension->class_userdata, _extension_instance);
|
#ifdef TOOLS_ENABLED
|
||||||
|
if (_extension->untrack_instance) {
|
||||||
|
_extension->untrack_instance(_extension->tracking_userdata, this);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (_extension->free_instance) {
|
||||||
|
_extension->free_instance(_extension->class_userdata, _extension_instance);
|
||||||
|
}
|
||||||
_extension = nullptr;
|
_extension = nullptr;
|
||||||
_extension_instance = nullptr;
|
_extension_instance = nullptr;
|
||||||
}
|
}
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
else if (_instance_bindings != nullptr && Engine::get_singleton()->is_extension_reloading_enabled()) {
|
||||||
|
for (uint32_t i = 0; i < _instance_binding_count; i++) {
|
||||||
|
GDExtensionManager::get_singleton()->untrack_instance_binding(_instance_bindings[i].token, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (_emitting) {
|
if (_emitting) {
|
||||||
//@todo this may need to actually reach the debugger prioritarily somehow because it may crash before
|
//@todo this may need to actually reach the debugger prioritarily somehow because it may crash before
|
||||||
|
|
|
@ -49,7 +49,7 @@ class TypedArray;
|
||||||
|
|
||||||
enum PropertyHint {
|
enum PropertyHint {
|
||||||
PROPERTY_HINT_NONE, ///< no hint provided.
|
PROPERTY_HINT_NONE, ///< no hint provided.
|
||||||
PROPERTY_HINT_RANGE, ///< hint_text = "min,max[,step][,or_greater][,or_less][,hide_slider][,radians][,degrees][,exp][,suffix:<keyword>] range.
|
PROPERTY_HINT_RANGE, ///< hint_text = "min,max[,step][,or_greater][,or_less][,hide_slider][,radians_as_degrees][,degrees][,exp][,suffix:<keyword>] range.
|
||||||
PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc"
|
PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc"
|
||||||
PROPERTY_HINT_ENUM_SUGGESTION, ///< hint_text= "val1,val2,val3,etc"
|
PROPERTY_HINT_ENUM_SUGGESTION, ///< hint_text= "val1,val2,val3,etc"
|
||||||
PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) use "attenuation" hint string to revert (flip h), "positive_only" to exclude in-out and out-in. (ie: "attenuation,positive_only")
|
PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) use "attenuation" hint string to revert (flip h), "positive_only" to exclude in-out and out-in. (ie: "attenuation,positive_only")
|
||||||
|
@ -313,6 +313,7 @@ struct ObjectGDExtension {
|
||||||
StringName parent_class_name;
|
StringName parent_class_name;
|
||||||
StringName class_name;
|
StringName class_name;
|
||||||
bool editor_class = false;
|
bool editor_class = false;
|
||||||
|
bool reloadable = false;
|
||||||
bool is_virtual = false;
|
bool is_virtual = false;
|
||||||
bool is_abstract = false;
|
bool is_abstract = false;
|
||||||
bool is_exposed = true;
|
bool is_exposed = true;
|
||||||
|
@ -347,6 +348,15 @@ struct ObjectGDExtension {
|
||||||
GDExtensionClassCreateInstance create_instance;
|
GDExtensionClassCreateInstance create_instance;
|
||||||
GDExtensionClassFreeInstance free_instance;
|
GDExtensionClassFreeInstance free_instance;
|
||||||
GDExtensionClassGetVirtual get_virtual;
|
GDExtensionClassGetVirtual get_virtual;
|
||||||
|
GDExtensionClassGetVirtualCallData get_virtual_call_data;
|
||||||
|
GDExtensionClassCallVirtualWithData call_virtual_with_data;
|
||||||
|
GDExtensionClassRecreateInstance recreate_instance;
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
void *tracking_userdata = nullptr;
|
||||||
|
void (*track_instance)(void *p_userdata, void *p_instance);
|
||||||
|
void (*untrack_instance)(void *p_userdata, void *p_instance);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call<false>(__VA_ARGS__)
|
#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call<false>(__VA_ARGS__)
|
||||||
|
@ -748,6 +758,16 @@ protected:
|
||||||
|
|
||||||
bool _disconnect(const StringName &p_signal, const Callable &p_callable, bool p_force = false);
|
bool _disconnect(const StringName &p_signal, const Callable &p_callable, bool p_force = false);
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
struct VirtualMethodTracker {
|
||||||
|
void **method;
|
||||||
|
bool *initialized;
|
||||||
|
VirtualMethodTracker *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
mutable VirtualMethodTracker *virtual_method_list = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
public: // Should be protected, but bug in clang++.
|
public: // Should be protected, but bug in clang++.
|
||||||
static void initialize_class();
|
static void initialize_class();
|
||||||
_FORCE_INLINE_ static void register_custom_data_to_otdb() {}
|
_FORCE_INLINE_ static void register_custom_data_to_otdb() {}
|
||||||
|
@ -779,7 +799,8 @@ public:
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NOTIFICATION_POSTINITIALIZE = 0,
|
NOTIFICATION_POSTINITIALIZE = 0,
|
||||||
NOTIFICATION_PREDELETE = 1
|
NOTIFICATION_PREDELETE = 1,
|
||||||
|
NOTIFICATION_EXTENSION_RELOADED = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* TYPE API */
|
/* TYPE API */
|
||||||
|
@ -949,6 +970,12 @@ public:
|
||||||
// Used on creation by binding only.
|
// Used on creation by binding only.
|
||||||
void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
||||||
bool has_instance_binding(void *p_token);
|
bool has_instance_binding(void *p_token);
|
||||||
|
void free_instance_binding(void *p_token);
|
||||||
|
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
void clear_internal_extension();
|
||||||
|
void reset_internal_extension(ObjectGDExtension *p_extension);
|
||||||
|
#endif
|
||||||
|
|
||||||
void clear_internal_resource_paths();
|
void clear_internal_resource_paths();
|
||||||
|
|
||||||
|
|
|
@ -146,6 +146,7 @@ void Script::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("get_property_default_value", "property"), &Script::_get_property_default_value);
|
ClassDB::bind_method(D_METHOD("get_property_default_value", "property"), &Script::_get_property_default_value);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("is_tool"), &Script::is_tool);
|
ClassDB::bind_method(D_METHOD("is_tool"), &Script::is_tool);
|
||||||
|
ClassDB::bind_method(D_METHOD("is_abstract"), &Script::is_abstract);
|
||||||
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::STRING, "source_code", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_source_code", "get_source_code");
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "source_code", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_source_code", "get_source_code");
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,11 +145,15 @@ public:
|
||||||
virtual PropertyInfo get_class_category() const;
|
virtual PropertyInfo get_class_category() const;
|
||||||
#endif // TOOLS_ENABLED
|
#endif // TOOLS_ENABLED
|
||||||
|
|
||||||
|
// TODO: In the next compat breakage rename to `*_script_*` to disambiguate from `Object::has_method()`.
|
||||||
virtual bool has_method(const StringName &p_method) const = 0;
|
virtual bool has_method(const StringName &p_method) const = 0;
|
||||||
|
virtual bool has_static_method(const StringName &p_method) const { return false; }
|
||||||
|
|
||||||
virtual MethodInfo get_method_info(const StringName &p_method) const = 0;
|
virtual MethodInfo get_method_info(const StringName &p_method) const = 0;
|
||||||
|
|
||||||
virtual bool is_tool() const = 0;
|
virtual bool is_tool() const = 0;
|
||||||
virtual bool is_valid() const = 0;
|
virtual bool is_valid() const = 0;
|
||||||
|
virtual bool is_abstract() const = 0;
|
||||||
|
|
||||||
virtual ScriptLanguage *get_language() const = 0;
|
virtual ScriptLanguage *get_language() const = 0;
|
||||||
|
|
||||||
|
@ -242,7 +246,9 @@ public:
|
||||||
virtual bool validate(const String &p_script, const String &p_path = "", List<String> *r_functions = nullptr, List<ScriptError> *r_errors = nullptr, List<Warning> *r_warnings = nullptr, HashSet<int> *r_safe_lines = nullptr) const = 0;
|
virtual bool validate(const String &p_script, const String &p_path = "", List<String> *r_functions = nullptr, List<ScriptError> *r_errors = nullptr, List<Warning> *r_warnings = nullptr, HashSet<int> *r_safe_lines = nullptr) const = 0;
|
||||||
virtual String validate_path(const String &p_path) const { return ""; }
|
virtual String validate_path(const String &p_path) const { return ""; }
|
||||||
virtual Script *create_script() const = 0;
|
virtual Script *create_script() const = 0;
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
virtual bool has_named_classes() const = 0;
|
virtual bool has_named_classes() const = 0;
|
||||||
|
#endif
|
||||||
virtual bool supports_builtin_mode() const = 0;
|
virtual bool supports_builtin_mode() const = 0;
|
||||||
virtual bool supports_documentation() const { return false; }
|
virtual bool supports_documentation() const { return false; }
|
||||||
virtual bool can_inherit_from_file() const { return false; }
|
virtual bool can_inherit_from_file() const { return false; }
|
||||||
|
|
|
@ -55,10 +55,12 @@ void ScriptExtension::_bind_methods() {
|
||||||
GDVIRTUAL_BIND(_get_class_icon_path);
|
GDVIRTUAL_BIND(_get_class_icon_path);
|
||||||
|
|
||||||
GDVIRTUAL_BIND(_has_method, "method");
|
GDVIRTUAL_BIND(_has_method, "method");
|
||||||
|
GDVIRTUAL_BIND(_has_static_method, "method");
|
||||||
GDVIRTUAL_BIND(_get_method_info, "method");
|
GDVIRTUAL_BIND(_get_method_info, "method");
|
||||||
|
|
||||||
GDVIRTUAL_BIND(_is_tool);
|
GDVIRTUAL_BIND(_is_tool);
|
||||||
GDVIRTUAL_BIND(_is_valid);
|
GDVIRTUAL_BIND(_is_valid);
|
||||||
|
GDVIRTUAL_BIND(_is_abstract);
|
||||||
GDVIRTUAL_BIND(_get_language);
|
GDVIRTUAL_BIND(_get_language);
|
||||||
|
|
||||||
GDVIRTUAL_BIND(_has_script_signal, "signal");
|
GDVIRTUAL_BIND(_has_script_signal, "signal");
|
||||||
|
@ -98,7 +100,9 @@ void ScriptLanguageExtension::_bind_methods() {
|
||||||
|
|
||||||
GDVIRTUAL_BIND(_validate_path, "path");
|
GDVIRTUAL_BIND(_validate_path, "path");
|
||||||
GDVIRTUAL_BIND(_create_script);
|
GDVIRTUAL_BIND(_create_script);
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
GDVIRTUAL_BIND(_has_named_classes);
|
GDVIRTUAL_BIND(_has_named_classes);
|
||||||
|
#endif
|
||||||
GDVIRTUAL_BIND(_supports_builtin_mode);
|
GDVIRTUAL_BIND(_supports_builtin_mode);
|
||||||
GDVIRTUAL_BIND(_supports_documentation);
|
GDVIRTUAL_BIND(_supports_documentation);
|
||||||
GDVIRTUAL_BIND(_can_inherit_from_file);
|
GDVIRTUAL_BIND(_can_inherit_from_file);
|
||||||
|
|
|
@ -99,6 +99,7 @@ public:
|
||||||
#endif // TOOLS_ENABLED
|
#endif // TOOLS_ENABLED
|
||||||
|
|
||||||
EXBIND1RC(bool, has_method, const StringName &)
|
EXBIND1RC(bool, has_method, const StringName &)
|
||||||
|
EXBIND1RC(bool, has_static_method, const StringName &)
|
||||||
|
|
||||||
GDVIRTUAL1RC(Dictionary, _get_method_info, const StringName &)
|
GDVIRTUAL1RC(Dictionary, _get_method_info, const StringName &)
|
||||||
virtual MethodInfo get_method_info(const StringName &p_method) const override {
|
virtual MethodInfo get_method_info(const StringName &p_method) const override {
|
||||||
|
@ -110,6 +111,12 @@ public:
|
||||||
EXBIND0RC(bool, is_tool)
|
EXBIND0RC(bool, is_tool)
|
||||||
EXBIND0RC(bool, is_valid)
|
EXBIND0RC(bool, is_valid)
|
||||||
|
|
||||||
|
virtual bool is_abstract() const override {
|
||||||
|
bool abst;
|
||||||
|
return GDVIRTUAL_CALL(_is_abstract, abst) && abst;
|
||||||
|
}
|
||||||
|
GDVIRTUAL0RC(bool, _is_abstract)
|
||||||
|
|
||||||
EXBIND0RC(ScriptLanguage *, get_language)
|
EXBIND0RC(ScriptLanguage *, get_language)
|
||||||
EXBIND1RC(bool, has_script_signal, const StringName &)
|
EXBIND1RC(bool, has_script_signal, const StringName &)
|
||||||
|
|
||||||
|
@ -344,7 +351,9 @@ public:
|
||||||
GDVIRTUAL_REQUIRED_CALL(_create_script, ret);
|
GDVIRTUAL_REQUIRED_CALL(_create_script, ret);
|
||||||
return Object::cast_to<Script>(ret);
|
return Object::cast_to<Script>(ret);
|
||||||
}
|
}
|
||||||
|
#ifndef DISABLE_DEPRECATED
|
||||||
EXBIND0RC(bool, has_named_classes)
|
EXBIND0RC(bool, has_named_classes)
|
||||||
|
#endif
|
||||||
EXBIND0RC(bool, supports_builtin_mode)
|
EXBIND0RC(bool, supports_builtin_mode)
|
||||||
EXBIND0RC(bool, supports_documentation)
|
EXBIND0RC(bool, supports_documentation)
|
||||||
EXBIND0RC(bool, can_inherit_from_file)
|
EXBIND0RC(bool, can_inherit_from_file)
|
||||||
|
@ -633,7 +642,7 @@ public:
|
||||||
const GDExtensionScriptInstanceInfo2 *native_info;
|
const GDExtensionScriptInstanceInfo2 *native_info;
|
||||||
bool free_native_info = false;
|
bool free_native_info = false;
|
||||||
struct {
|
struct {
|
||||||
GDExtensionClassNotification notification_func;
|
GDExtensionScriptInstanceNotification notification_func = nullptr;
|
||||||
} deprecated_native_info;
|
} deprecated_native_info;
|
||||||
|
|
||||||
GDExtensionScriptInstanceDataPtr instance = nullptr;
|
GDExtensionScriptInstanceDataPtr instance = nullptr;
|
||||||
|
@ -662,9 +671,18 @@ public:
|
||||||
const GDExtensionPropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount);
|
const GDExtensionPropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount);
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
Ref<Script> script = get_script();
|
if (pcount > 0) {
|
||||||
if (script.is_valid() && pcount > 0) {
|
if (native_info->get_class_category_func) {
|
||||||
p_list->push_back(script->get_class_category());
|
GDExtensionPropertyInfo gdext_class_category;
|
||||||
|
if (native_info->get_class_category_func(instance, &gdext_class_category)) {
|
||||||
|
p_list->push_back(PropertyInfo(gdext_class_category));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Ref<Script> script = get_script();
|
||||||
|
if (script.is_valid()) {
|
||||||
|
p_list->push_back(script->get_class_category());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // TOOLS_ENABLED
|
#endif // TOOLS_ENABLED
|
||||||
|
|
||||||
|
|
|
@ -75,10 +75,6 @@ void WorkerThreadPool::_process_task(Task *p_task) {
|
||||||
if (p_task->group) {
|
if (p_task->group) {
|
||||||
// Handling a group
|
// Handling a group
|
||||||
bool do_post = false;
|
bool do_post = false;
|
||||||
Callable::CallError ce;
|
|
||||||
Variant ret;
|
|
||||||
Variant arg;
|
|
||||||
Variant *argptr = &arg;
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
uint32_t work_index = p_task->group->index.postincrement();
|
uint32_t work_index = p_task->group->index.postincrement();
|
||||||
|
@ -91,8 +87,7 @@ void WorkerThreadPool::_process_task(Task *p_task) {
|
||||||
} else if (p_task->template_userdata) {
|
} else if (p_task->template_userdata) {
|
||||||
p_task->template_userdata->callback_indexed(work_index);
|
p_task->template_userdata->callback_indexed(work_index);
|
||||||
} else {
|
} else {
|
||||||
arg = work_index;
|
p_task->callable.call(work_index);
|
||||||
p_task->callable.callp((const Variant **)&argptr, 1, ret, ce);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the only way to ensure posting is done when all tasks are really complete.
|
// This is the only way to ensure posting is done when all tasks are really complete.
|
||||||
|
@ -141,9 +136,7 @@ void WorkerThreadPool::_process_task(Task *p_task) {
|
||||||
p_task->template_userdata->callback();
|
p_task->template_userdata->callback();
|
||||||
memdelete(p_task->template_userdata);
|
memdelete(p_task->template_userdata);
|
||||||
} else {
|
} else {
|
||||||
Callable::CallError ce;
|
p_task->callable.call();
|
||||||
Variant ret;
|
|
||||||
p_task->callable.callp(nullptr, 0, ret, ce);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task_mutex.lock();
|
task_mutex.lock();
|
||||||
|
|
|
@ -355,7 +355,7 @@ void OS::set_cmdline(const char *p_execpath, const List<String> &p_args, const L
|
||||||
}
|
}
|
||||||
|
|
||||||
String OS::get_unique_id() const {
|
String OS::get_unique_id() const {
|
||||||
ERR_FAIL_V("");
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
int OS::get_processor_count() const {
|
int OS::get_processor_count() const {
|
||||||
|
|
|
@ -2763,12 +2763,13 @@ double String::to_float() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t String::hash(const char *p_cstr) {
|
uint32_t String::hash(const char *p_cstr) {
|
||||||
|
// static_cast: avoid negative values on platforms where char is signed.
|
||||||
uint32_t hashv = 5381;
|
uint32_t hashv = 5381;
|
||||||
uint32_t c = *p_cstr++;
|
uint32_t c = static_cast<uint8_t>(*p_cstr++);
|
||||||
|
|
||||||
while (c) {
|
while (c) {
|
||||||
hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */
|
hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */
|
||||||
c = *p_cstr++;
|
c = static_cast<uint8_t>(*p_cstr++);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hashv;
|
return hashv;
|
||||||
|
@ -2777,28 +2778,35 @@ uint32_t String::hash(const char *p_cstr) {
|
||||||
uint32_t String::hash(const char *p_cstr, int p_len) {
|
uint32_t String::hash(const char *p_cstr, int p_len) {
|
||||||
uint32_t hashv = 5381;
|
uint32_t hashv = 5381;
|
||||||
for (int i = 0; i < p_len; i++) {
|
for (int i = 0; i < p_len; i++) {
|
||||||
hashv = ((hashv << 5) + hashv) + p_cstr[i]; /* hash * 33 + c */
|
// static_cast: avoid negative values on platforms where char is signed.
|
||||||
|
hashv = ((hashv << 5) + hashv) + static_cast<uint8_t>(p_cstr[i]); /* hash * 33 + c */
|
||||||
}
|
}
|
||||||
|
|
||||||
return hashv;
|
return hashv;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t String::hash(const wchar_t *p_cstr, int p_len) {
|
uint32_t String::hash(const wchar_t *p_cstr, int p_len) {
|
||||||
|
// Avoid negative values on platforms where wchar_t is signed. Account for different sizes.
|
||||||
|
using wide_unsigned = std::conditional<sizeof(wchar_t) == 2, uint16_t, uint32_t>::type;
|
||||||
|
|
||||||
uint32_t hashv = 5381;
|
uint32_t hashv = 5381;
|
||||||
for (int i = 0; i < p_len; i++) {
|
for (int i = 0; i < p_len; i++) {
|
||||||
hashv = ((hashv << 5) + hashv) + p_cstr[i]; /* hash * 33 + c */
|
hashv = ((hashv << 5) + hashv) + static_cast<wide_unsigned>(p_cstr[i]); /* hash * 33 + c */
|
||||||
}
|
}
|
||||||
|
|
||||||
return hashv;
|
return hashv;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t String::hash(const wchar_t *p_cstr) {
|
uint32_t String::hash(const wchar_t *p_cstr) {
|
||||||
|
// Avoid negative values on platforms where wchar_t is signed. Account for different sizes.
|
||||||
|
using wide_unsigned = std::conditional<sizeof(wchar_t) == 2, uint16_t, uint32_t>::type;
|
||||||
|
|
||||||
uint32_t hashv = 5381;
|
uint32_t hashv = 5381;
|
||||||
uint32_t c = *p_cstr++;
|
uint32_t c = static_cast<wide_unsigned>(*p_cstr++);
|
||||||
|
|
||||||
while (c) {
|
while (c) {
|
||||||
hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */
|
hashv = ((hashv << 5) + hashv) + c; /* hash * 33 + c */
|
||||||
c = *p_cstr++;
|
c = static_cast<wide_unsigned>(*p_cstr++);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hashv;
|
return hashv;
|
||||||
|
@ -3966,24 +3974,22 @@ bool String::is_absolute_path() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static _FORCE_INLINE_ bool _is_valid_identifier_bit(int p_index, char32_t p_char) {
|
|
||||||
if (p_index == 0 && is_digit(p_char)) {
|
|
||||||
return false; // No start with number plz.
|
|
||||||
}
|
|
||||||
return is_ascii_identifier_char(p_char);
|
|
||||||
}
|
|
||||||
|
|
||||||
String String::validate_identifier() const {
|
String String::validate_identifier() const {
|
||||||
if (is_empty()) {
|
if (is_empty()) {
|
||||||
return "_"; // Empty string is not a valid identifier;
|
return "_"; // Empty string is not a valid identifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
String result = *this;
|
String result;
|
||||||
|
if (is_digit(operator[](0))) {
|
||||||
|
result = "_" + *this;
|
||||||
|
} else {
|
||||||
|
result = *this;
|
||||||
|
}
|
||||||
|
|
||||||
int len = result.length();
|
int len = result.length();
|
||||||
char32_t *buffer = result.ptrw();
|
char32_t *buffer = result.ptrw();
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
if (!_is_valid_identifier_bit(i, buffer[i])) {
|
if (!is_ascii_identifier_char(buffer[i])) {
|
||||||
buffer[i] = '_';
|
buffer[i] = '_';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3998,10 +4004,14 @@ bool String::is_valid_identifier() const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_digit(operator[](0))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const char32_t *str = &operator[](0);
|
const char32_t *str = &operator[](0);
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
if (!_is_valid_identifier_bit(i, str[i])) {
|
if (!is_ascii_identifier_char(str[i])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,10 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
_FORCE_INLINE_ bool _get_alloc_size_checked(size_t p_elements, size_t *out) const {
|
_FORCE_INLINE_ bool _get_alloc_size_checked(size_t p_elements, size_t *out) const {
|
||||||
|
if (unlikely(p_elements == 0)) {
|
||||||
|
*out = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
#if defined(__GNUC__)
|
#if defined(__GNUC__)
|
||||||
size_t o;
|
size_t o;
|
||||||
size_t p;
|
size_t p;
|
||||||
|
@ -101,13 +105,12 @@ private:
|
||||||
if (__builtin_add_overflow(o, static_cast<size_t>(32), &p)) {
|
if (__builtin_add_overflow(o, static_cast<size_t>(32), &p)) {
|
||||||
return false; // No longer allocated here.
|
return false; // No longer allocated here.
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
#else
|
#else
|
||||||
// Speed is more important than correctness here, do the operations unchecked
|
// Speed is more important than correctness here, do the operations unchecked
|
||||||
// and hope for the best.
|
// and hope for the best.
|
||||||
*out = _get_alloc_size(p_elements);
|
*out = _get_alloc_size(p_elements);
|
||||||
return true;
|
|
||||||
#endif
|
#endif
|
||||||
|
return *out;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _unref(void *p_data);
|
void _unref(void *p_data);
|
||||||
|
|
|
@ -105,6 +105,57 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sort() {
|
||||||
|
sort_custom<Comparator<T>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class C>
|
||||||
|
void sort_custom() {
|
||||||
|
if (_first == _last) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SelfList<T> *from = _first;
|
||||||
|
SelfList<T> *current = from;
|
||||||
|
SelfList<T> *to = from;
|
||||||
|
|
||||||
|
while (current) {
|
||||||
|
SelfList<T> *next = current->_next;
|
||||||
|
|
||||||
|
if (from != current) {
|
||||||
|
current->_prev = nullptr;
|
||||||
|
current->_next = from;
|
||||||
|
|
||||||
|
SelfList<T> *find = from;
|
||||||
|
C less;
|
||||||
|
while (find && less(*find->_self, *current->_self)) {
|
||||||
|
current->_prev = find;
|
||||||
|
current->_next = find->_next;
|
||||||
|
find = find->_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current->_prev) {
|
||||||
|
current->_prev->_next = current;
|
||||||
|
} else {
|
||||||
|
from = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current->_next) {
|
||||||
|
current->_next->_prev = current;
|
||||||
|
} else {
|
||||||
|
to = current;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
current->_prev = nullptr;
|
||||||
|
current->_next = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
current = next;
|
||||||
|
}
|
||||||
|
_first = from;
|
||||||
|
_last = to;
|
||||||
|
}
|
||||||
|
|
||||||
_FORCE_INLINE_ SelfList<T> *first() { return _first; }
|
_FORCE_INLINE_ SelfList<T> *first() { return _first; }
|
||||||
_FORCE_INLINE_ const SelfList<T> *first() const { return _first; }
|
_FORCE_INLINE_ const SelfList<T> *first() const { return _first; }
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,7 @@ bool Array::recursive_equal(const Array &p_array, int recursion_count) const {
|
||||||
}
|
}
|
||||||
recursion_count++;
|
recursion_count++;
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
if (!a1[i].hash_compare(a2[i], recursion_count)) {
|
if (!a1[i].hash_compare(a2[i], recursion_count, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -404,13 +404,13 @@ void call_with_variant_args(T *p_instance, void (T::*p_method)(P...), const Vari
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)p_argcount < sizeof...(P)) {
|
if ((size_t)p_argcount < sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -422,7 +422,7 @@ void call_with_variant_args_dv(T *p_instance, void (T::*p_method)(P...), const V
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -433,7 +433,7 @@ void call_with_variant_args_dv(T *p_instance, void (T::*p_method)(P...), const V
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -455,13 +455,13 @@ void call_with_variant_argsc(T *p_instance, void (T::*p_method)(P...) const, con
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)p_argcount < sizeof...(P)) {
|
if ((size_t)p_argcount < sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -473,7 +473,7 @@ void call_with_variant_argsc_dv(T *p_instance, void (T::*p_method)(P...) const,
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -484,7 +484,7 @@ void call_with_variant_argsc_dv(T *p_instance, void (T::*p_method)(P...) const,
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -506,7 +506,7 @@ void call_with_variant_args_ret_dv(T *p_instance, R (T::*p_method)(P...), const
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -517,7 +517,7 @@ void call_with_variant_args_ret_dv(T *p_instance, R (T::*p_method)(P...), const
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -539,7 +539,7 @@ void call_with_variant_args_retc_dv(T *p_instance, R (T::*p_method)(P...) const,
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -550,7 +550,7 @@ void call_with_variant_args_retc_dv(T *p_instance, R (T::*p_method)(P...) const,
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -785,13 +785,13 @@ void call_with_variant_args_ret(T *p_instance, R (T::*p_method)(P...), const Var
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)p_argcount < sizeof...(P)) {
|
if ((size_t)p_argcount < sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -815,13 +815,13 @@ void call_with_variant_args_static_ret(R (*p_method)(P...), const Variant **p_ar
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)p_argcount < sizeof...(P)) {
|
if ((size_t)p_argcount < sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -833,13 +833,13 @@ void call_with_variant_args_static_ret(void (*p_method)(P...), const Variant **p
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)p_argcount < sizeof...(P)) {
|
if ((size_t)p_argcount < sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -851,13 +851,13 @@ void call_with_variant_args_retc(T *p_instance, R (T::*p_method)(P...) const, co
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)p_argcount < sizeof...(P)) {
|
if ((size_t)p_argcount < sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -882,7 +882,7 @@ void call_with_variant_args_retc_static_helper_dv(T *p_instance, R (*p_method)(T
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -893,7 +893,7 @@ void call_with_variant_args_retc_static_helper_dv(T *p_instance, R (*p_method)(T
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -928,7 +928,7 @@ void call_with_variant_args_static_helper_dv(T *p_instance, void (*p_method)(T *
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -939,7 +939,7 @@ void call_with_variant_args_static_helper_dv(T *p_instance, void (*p_method)(T *
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -961,7 +961,7 @@ void call_with_variant_args_static_ret_dv(R (*p_method)(P...), const Variant **p
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -972,7 +972,7 @@ void call_with_variant_args_static_ret_dv(R (*p_method)(P...), const Variant **p
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -994,7 +994,7 @@ void call_with_variant_args_static_dv(void (*p_method)(P...), const Variant **p_
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if ((size_t)p_argcount > sizeof...(P)) {
|
if ((size_t)p_argcount > sizeof...(P)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1005,7 +1005,7 @@ void call_with_variant_args_static_dv(void (*p_method)(P...), const Variant **p_
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (missing > dvs) {
|
if (missing > dvs) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = sizeof...(P);
|
r_error.expected = sizeof...(P);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -69,6 +69,8 @@ public:
|
||||||
int expected = 0;
|
int expected = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename... VarArgs>
|
||||||
|
Variant call(VarArgs... p_args) const;
|
||||||
void callp(const Variant **p_arguments, int p_argcount, Variant &r_return_value, CallError &r_call_error) const;
|
void callp(const Variant **p_arguments, int p_argcount, Variant &r_return_value, CallError &r_call_error) const;
|
||||||
void call_deferredp(const Variant **p_arguments, int p_argcount) const;
|
void call_deferredp(const Variant **p_arguments, int p_argcount) const;
|
||||||
Variant callv(const Array &p_arguments) const;
|
Variant callv(const Array &p_arguments) const;
|
||||||
|
|
|
@ -245,9 +245,8 @@ void CallableCustomUnbind::get_bound_arguments(Vector<Variant> &r_arguments, int
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallableCustomUnbind::call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const {
|
void CallableCustomUnbind::call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const {
|
||||||
if (argcount > p_argcount) {
|
if (p_argcount < argcount) {
|
||||||
r_call_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_call_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_call_error.argument = 0;
|
|
||||||
r_call_error.expected = argcount;
|
r_call_error.expected = argcount;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -255,9 +254,8 @@ void CallableCustomUnbind::call(const Variant **p_arguments, int p_argcount, Var
|
||||||
}
|
}
|
||||||
|
|
||||||
Error CallableCustomUnbind::rpc(int p_peer_id, const Variant **p_arguments, int p_argcount, Callable::CallError &r_call_error) const {
|
Error CallableCustomUnbind::rpc(int p_peer_id, const Variant **p_arguments, int p_argcount, Callable::CallError &r_call_error) const {
|
||||||
if (argcount > p_argcount) {
|
if (p_argcount < argcount) {
|
||||||
r_call_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_call_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_call_error.argument = 0;
|
|
||||||
r_call_error.expected = argcount;
|
r_call_error.expected = argcount;
|
||||||
return ERR_UNCONFIGURED;
|
return ERR_UNCONFIGURED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -210,7 +210,7 @@ bool Dictionary::recursive_equal(const Dictionary &p_dictionary, int recursion_c
|
||||||
recursion_count++;
|
recursion_count++;
|
||||||
for (const KeyValue<Variant, Variant> &this_E : _p->variant_map) {
|
for (const KeyValue<Variant, Variant> &this_E : _p->variant_map) {
|
||||||
HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator>::ConstIterator other_E(p_dictionary._p->variant_map.find(this_E.key));
|
HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator>::ConstIterator other_E(p_dictionary._p->variant_map.find(this_E.key));
|
||||||
if (!other_E || !this_E.value.hash_compare(other_E->value, recursion_count)) {
|
if (!other_E || !this_E.value.hash_compare(other_E->value, recursion_count, false)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,26 +38,26 @@
|
||||||
template <class T>
|
template <class T>
|
||||||
struct PtrToArg {};
|
struct PtrToArg {};
|
||||||
|
|
||||||
#define MAKE_PTRARG(m_type) \
|
#define MAKE_PTRARG(m_type) \
|
||||||
template <> \
|
template <> \
|
||||||
struct PtrToArg<m_type> { \
|
struct PtrToArg<m_type> { \
|
||||||
_FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
|
_FORCE_INLINE_ static const m_type &convert(const void *p_ptr) { \
|
||||||
return *reinterpret_cast<const m_type *>(p_ptr); \
|
return *reinterpret_cast<const m_type *>(p_ptr); \
|
||||||
} \
|
} \
|
||||||
typedef m_type EncodeT; \
|
typedef m_type EncodeT; \
|
||||||
_FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
|
_FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
|
||||||
*((m_type *)p_ptr) = p_val; \
|
*((m_type *)p_ptr) = p_val; \
|
||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
template <> \
|
template <> \
|
||||||
struct PtrToArg<const m_type &> { \
|
struct PtrToArg<const m_type &> { \
|
||||||
_FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
|
_FORCE_INLINE_ static const m_type &convert(const void *p_ptr) { \
|
||||||
return *reinterpret_cast<const m_type *>(p_ptr); \
|
return *reinterpret_cast<const m_type *>(p_ptr); \
|
||||||
} \
|
} \
|
||||||
typedef m_type EncodeT; \
|
typedef m_type EncodeT; \
|
||||||
_FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
|
_FORCE_INLINE_ static void encode(m_type p_val, void *p_ptr) { \
|
||||||
*((m_type *)p_ptr) = p_val; \
|
*((m_type *)p_ptr) = p_val; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAKE_PTRARGCONV(m_type, m_conv) \
|
#define MAKE_PTRARGCONV(m_type, m_conv) \
|
||||||
|
@ -85,7 +85,7 @@ struct PtrToArg {};
|
||||||
#define MAKE_PTRARG_BY_REFERENCE(m_type) \
|
#define MAKE_PTRARG_BY_REFERENCE(m_type) \
|
||||||
template <> \
|
template <> \
|
||||||
struct PtrToArg<m_type> { \
|
struct PtrToArg<m_type> { \
|
||||||
_FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
|
_FORCE_INLINE_ static const m_type &convert(const void *p_ptr) { \
|
||||||
return *reinterpret_cast<const m_type *>(p_ptr); \
|
return *reinterpret_cast<const m_type *>(p_ptr); \
|
||||||
} \
|
} \
|
||||||
typedef m_type EncodeT; \
|
typedef m_type EncodeT; \
|
||||||
|
@ -95,7 +95,7 @@ struct PtrToArg {};
|
||||||
}; \
|
}; \
|
||||||
template <> \
|
template <> \
|
||||||
struct PtrToArg<const m_type &> { \
|
struct PtrToArg<const m_type &> { \
|
||||||
_FORCE_INLINE_ static m_type convert(const void *p_ptr) { \
|
_FORCE_INLINE_ static const m_type &convert(const void *p_ptr) { \
|
||||||
return *reinterpret_cast<const m_type *>(p_ptr); \
|
return *reinterpret_cast<const m_type *>(p_ptr); \
|
||||||
} \
|
} \
|
||||||
typedef m_type EncodeT; \
|
typedef m_type EncodeT; \
|
||||||
|
|
|
@ -145,8 +145,7 @@ struct PtrToArg<TypedArray<T>> {
|
||||||
template <class T>
|
template <class T>
|
||||||
struct PtrToArg<const TypedArray<T> &> {
|
struct PtrToArg<const TypedArray<T> &> {
|
||||||
typedef Array EncodeT;
|
typedef Array EncodeT;
|
||||||
_FORCE_INLINE_ static TypedArray<T>
|
_FORCE_INLINE_ static TypedArray<T> convert(const void *p_ptr) {
|
||||||
convert(const void *p_ptr) {
|
|
||||||
return TypedArray<T>(*reinterpret_cast<const Array *>(p_ptr));
|
return TypedArray<T>(*reinterpret_cast<const Array *>(p_ptr));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -3235,8 +3235,11 @@ uint32_t Variant::recursive_hash(int recursion_count) const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define hash_compare_scalar_base(p_lhs, p_rhs, semantic_comparison) \
|
||||||
|
(((p_lhs) == (p_rhs)) || (semantic_comparison && Math::is_nan(p_lhs) && Math::is_nan(p_rhs)))
|
||||||
|
|
||||||
#define hash_compare_scalar(p_lhs, p_rhs) \
|
#define hash_compare_scalar(p_lhs, p_rhs) \
|
||||||
(((p_lhs) == (p_rhs)) || (Math::is_nan(p_lhs) && Math::is_nan(p_rhs)))
|
(hash_compare_scalar_base(p_lhs, p_rhs, true))
|
||||||
|
|
||||||
#define hash_compare_vector2(p_lhs, p_rhs) \
|
#define hash_compare_vector2(p_lhs, p_rhs) \
|
||||||
(hash_compare_scalar((p_lhs).x, (p_rhs).x) && \
|
(hash_compare_scalar((p_lhs).x, (p_rhs).x) && \
|
||||||
|
@ -3282,7 +3285,7 @@ uint32_t Variant::recursive_hash(int recursion_count) const {
|
||||||
\
|
\
|
||||||
return true
|
return true
|
||||||
|
|
||||||
bool Variant::hash_compare(const Variant &p_variant, int recursion_count) const {
|
bool Variant::hash_compare(const Variant &p_variant, int recursion_count, bool semantic_comparison) const {
|
||||||
if (type != p_variant.type) {
|
if (type != p_variant.type) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3293,7 +3296,7 @@ bool Variant::hash_compare(const Variant &p_variant, int recursion_count) const
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case FLOAT: {
|
case FLOAT: {
|
||||||
return hash_compare_scalar(_data._float, p_variant._data._float);
|
return hash_compare_scalar_base(_data._float, p_variant._data._float, semantic_comparison);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case STRING: {
|
case STRING: {
|
||||||
|
|
|
@ -751,7 +751,8 @@ public:
|
||||||
uint32_t hash() const;
|
uint32_t hash() const;
|
||||||
uint32_t recursive_hash(int recursion_count) const;
|
uint32_t recursive_hash(int recursion_count) const;
|
||||||
|
|
||||||
bool hash_compare(const Variant &p_variant, int recursion_count = 0) const;
|
// By default, performs a semantic comparison. Otherwise, numeric/binary comparison (if appropriate).
|
||||||
|
bool hash_compare(const Variant &p_variant, int recursion_count = 0, bool semantic_comparison = true) const;
|
||||||
bool identity_compare(const Variant &p_variant) const;
|
bool identity_compare(const Variant &p_variant) const;
|
||||||
bool booleanize() const;
|
bool booleanize() const;
|
||||||
String stringify(int recursion_count = 0) const;
|
String stringify(int recursion_count = 0) const;
|
||||||
|
@ -832,6 +833,20 @@ String vformat(const String &p_text, const VarArgs... p_args) {
|
||||||
return fmt;
|
return fmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename... VarArgs>
|
||||||
|
Variant Callable::call(VarArgs... p_args) const {
|
||||||
|
Variant args[sizeof...(p_args) + 1] = { p_args..., 0 }; // +1 makes sure zero sized arrays are also supported.
|
||||||
|
const Variant *argptrs[sizeof...(p_args) + 1];
|
||||||
|
for (uint32_t i = 0; i < sizeof...(p_args); i++) {
|
||||||
|
argptrs[i] = &args[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant ret;
|
||||||
|
CallError ce;
|
||||||
|
callp(sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args), ret, ce);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename... VarArgs>
|
template <typename... VarArgs>
|
||||||
Callable Callable::bind(VarArgs... p_args) {
|
Callable Callable::bind(VarArgs... p_args) {
|
||||||
Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported.
|
Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported.
|
||||||
|
|
|
@ -1037,9 +1037,7 @@ struct _VariantCall {
|
||||||
static void func_Callable_rpc_id(Variant *v, const Variant **p_args, int p_argcount, Variant &r_ret, Callable::CallError &r_error) {
|
static void func_Callable_rpc_id(Variant *v, const Variant **p_args, int p_argcount, Variant &r_ret, Callable::CallError &r_error) {
|
||||||
if (p_argcount == 0) {
|
if (p_argcount == 0) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = 0;
|
|
||||||
r_error.expected = 1;
|
r_error.expected = 1;
|
||||||
|
|
||||||
} else if (p_args[0]->get_type() != Variant::INT) {
|
} else if (p_args[0]->get_type() != Variant::INT) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.argument = 0;
|
r_error.argument = 0;
|
||||||
|
@ -2076,6 +2074,7 @@ static void _register_variant_builtin_methods() {
|
||||||
bind_method(Transform2D, basis_xform, sarray("v"), varray());
|
bind_method(Transform2D, basis_xform, sarray("v"), varray());
|
||||||
bind_method(Transform2D, basis_xform_inv, sarray("v"), varray());
|
bind_method(Transform2D, basis_xform_inv, sarray("v"), varray());
|
||||||
bind_method(Transform2D, interpolate_with, sarray("xform", "weight"), varray());
|
bind_method(Transform2D, interpolate_with, sarray("xform", "weight"), varray());
|
||||||
|
bind_method(Transform2D, is_conformal, sarray(), varray());
|
||||||
bind_method(Transform2D, is_equal_approx, sarray("xform"), varray());
|
bind_method(Transform2D, is_equal_approx, sarray("xform"), varray());
|
||||||
bind_method(Transform2D, is_finite, sarray(), varray());
|
bind_method(Transform2D, is_finite, sarray(), varray());
|
||||||
// Do not bind functions like set_rotation, set_scale, set_skew, etc because this type is immutable and can't be modified.
|
// Do not bind functions like set_rotation, set_scale, set_skew, etc because this type is immutable and can't be modified.
|
||||||
|
@ -2095,6 +2094,7 @@ static void _register_variant_builtin_methods() {
|
||||||
bind_method(Basis, tdoty, sarray("with"), varray());
|
bind_method(Basis, tdoty, sarray("with"), varray());
|
||||||
bind_method(Basis, tdotz, sarray("with"), varray());
|
bind_method(Basis, tdotz, sarray("with"), varray());
|
||||||
bind_method(Basis, slerp, sarray("to", "weight"), varray());
|
bind_method(Basis, slerp, sarray("to", "weight"), varray());
|
||||||
|
bind_method(Basis, is_conformal, sarray(), varray());
|
||||||
bind_method(Basis, is_equal_approx, sarray("b"), varray());
|
bind_method(Basis, is_equal_approx, sarray("b"), varray());
|
||||||
bind_method(Basis, is_finite, sarray(), varray());
|
bind_method(Basis, is_finite, sarray(), varray());
|
||||||
bind_method(Basis, get_rotation_quaternion, sarray(), varray());
|
bind_method(Basis, get_rotation_quaternion, sarray(), varray());
|
||||||
|
@ -2569,9 +2569,13 @@ static void _register_variant_builtin_methods() {
|
||||||
|
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR4I, "ZERO", Vector4i(0, 0, 0, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR4I, "ZERO", Vector4i(0, 0, 0, 0));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR4I, "ONE", Vector4i(1, 1, 1, 1));
|
_VariantCall::add_variant_constant(Variant::VECTOR4I, "ONE", Vector4i(1, 1, 1, 1));
|
||||||
|
_VariantCall::add_variant_constant(Variant::VECTOR4I, "MIN", Vector4i(INT32_MIN, INT32_MIN, INT32_MIN, INT32_MIN));
|
||||||
|
_VariantCall::add_variant_constant(Variant::VECTOR4I, "MAX", Vector4i(INT32_MAX, INT32_MAX, INT32_MAX, INT32_MAX));
|
||||||
|
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR3I, "ZERO", Vector3i(0, 0, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR3I, "ZERO", Vector3i(0, 0, 0));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR3I, "ONE", Vector3i(1, 1, 1));
|
_VariantCall::add_variant_constant(Variant::VECTOR3I, "ONE", Vector3i(1, 1, 1));
|
||||||
|
_VariantCall::add_variant_constant(Variant::VECTOR3I, "MIN", Vector3i(INT32_MIN, INT32_MIN, INT32_MIN));
|
||||||
|
_VariantCall::add_variant_constant(Variant::VECTOR3I, "MAX", Vector3i(INT32_MAX, INT32_MAX, INT32_MAX));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR3I, "LEFT", Vector3i(-1, 0, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR3I, "LEFT", Vector3i(-1, 0, 0));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR3I, "RIGHT", Vector3i(1, 0, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR3I, "RIGHT", Vector3i(1, 0, 0));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR3I, "UP", Vector3i(0, 1, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR3I, "UP", Vector3i(0, 1, 0));
|
||||||
|
@ -2601,6 +2605,8 @@ static void _register_variant_builtin_methods() {
|
||||||
|
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR2I, "ZERO", Vector2i(0, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR2I, "ZERO", Vector2i(0, 0));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR2I, "ONE", Vector2i(1, 1));
|
_VariantCall::add_variant_constant(Variant::VECTOR2I, "ONE", Vector2i(1, 1));
|
||||||
|
_VariantCall::add_variant_constant(Variant::VECTOR2I, "MIN", Vector2i(INT32_MIN, INT32_MIN));
|
||||||
|
_VariantCall::add_variant_constant(Variant::VECTOR2I, "MAX", Vector2i(INT32_MAX, INT32_MAX));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR2I, "LEFT", Vector2i(-1, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR2I, "LEFT", Vector2i(-1, 0));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR2I, "RIGHT", Vector2i(1, 0));
|
_VariantCall::add_variant_constant(Variant::VECTOR2I, "RIGHT", Vector2i(1, 0));
|
||||||
_VariantCall::add_variant_constant(Variant::VECTOR2I, "UP", Vector2i(0, -1));
|
_VariantCall::add_variant_constant(Variant::VECTOR2I, "UP", Vector2i(0, -1));
|
||||||
|
|
|
@ -337,6 +337,7 @@ Variant VariantUtilityFunctions::snapped(const Variant &x, const Variant &step,
|
||||||
if (x.get_type() != step.get_type() && !((x.get_type() == Variant::INT && step.get_type() == Variant::FLOAT) || (x.get_type() == Variant::FLOAT && step.get_type() == Variant::INT))) {
|
if (x.get_type() != step.get_type() && !((x.get_type() == Variant::INT && step.get_type() == Variant::FLOAT) || (x.get_type() == Variant::FLOAT && step.get_type() == Variant::INT))) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.argument = 1;
|
r_error.argument = 1;
|
||||||
|
r_error.expected = x.get_type();
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,8 +385,8 @@ Variant VariantUtilityFunctions::lerp(const Variant &from, const Variant &to, do
|
||||||
r_error.error = Callable::CallError::CALL_OK;
|
r_error.error = Callable::CallError::CALL_OK;
|
||||||
if (from.get_type() != to.get_type()) {
|
if (from.get_type() != to.get_type()) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.expected = from.get_type();
|
|
||||||
r_error.argument = 1;
|
r_error.argument = 1;
|
||||||
|
r_error.expected = from.get_type();
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,6 +452,10 @@ double VariantUtilityFunctions::bezier_derivative(double p_start, double p_contr
|
||||||
return Math::bezier_derivative(p_start, p_control_1, p_control_2, p_end, p_t);
|
return Math::bezier_derivative(p_start, p_control_1, p_control_2, p_end, p_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double VariantUtilityFunctions::angle_difference(double from, double to) {
|
||||||
|
return Math::angle_difference(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
double VariantUtilityFunctions::lerp_angle(double from, double to, double weight) {
|
double VariantUtilityFunctions::lerp_angle(double from, double to, double weight) {
|
||||||
return Math::lerp_angle(from, to, weight);
|
return Math::lerp_angle(from, to, weight);
|
||||||
}
|
}
|
||||||
|
@ -471,6 +476,10 @@ double VariantUtilityFunctions::move_toward(double from, double to, double delta
|
||||||
return Math::move_toward(from, to, delta);
|
return Math::move_toward(from, to, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double VariantUtilityFunctions::rotate_toward(double from, double to, double delta) {
|
||||||
|
return Math::rotate_toward(from, to, delta);
|
||||||
|
}
|
||||||
|
|
||||||
double VariantUtilityFunctions::deg_to_rad(double angle_deg) {
|
double VariantUtilityFunctions::deg_to_rad(double angle_deg) {
|
||||||
return Math::deg_to_rad(angle_deg);
|
return Math::deg_to_rad(angle_deg);
|
||||||
}
|
}
|
||||||
|
@ -492,7 +501,7 @@ Variant VariantUtilityFunctions::wrap(const Variant &p_x, const Variant &p_min,
|
||||||
if (x_type != Variant::INT && x_type != Variant::FLOAT) {
|
if (x_type != Variant::INT && x_type != Variant::FLOAT) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.argument = 0;
|
r_error.argument = 0;
|
||||||
r_error.expected = x_type;
|
r_error.expected = Variant::FLOAT;
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,8 +567,8 @@ Variant VariantUtilityFunctions::max(const Variant **p_args, int p_argcount, Cal
|
||||||
Variant::Type arg_type = p_args[i]->get_type();
|
Variant::Type arg_type = p_args[i]->get_type();
|
||||||
if (arg_type != Variant::INT && arg_type != Variant::FLOAT) {
|
if (arg_type != Variant::INT && arg_type != Variant::FLOAT) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.expected = Variant::FLOAT;
|
|
||||||
r_error.argument = i;
|
r_error.argument = i;
|
||||||
|
r_error.expected = Variant::FLOAT;
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
|
@ -569,8 +578,8 @@ Variant VariantUtilityFunctions::max(const Variant **p_args, int p_argcount, Cal
|
||||||
Variant::evaluate(Variant::OP_LESS, base, *p_args[i], ret, valid);
|
Variant::evaluate(Variant::OP_LESS, base, *p_args[i], ret, valid);
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.expected = base.get_type();
|
|
||||||
r_error.argument = i;
|
r_error.argument = i;
|
||||||
|
r_error.expected = base.get_type();
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
if (ret.booleanize()) {
|
if (ret.booleanize()) {
|
||||||
|
@ -602,8 +611,8 @@ Variant VariantUtilityFunctions::min(const Variant **p_args, int p_argcount, Cal
|
||||||
Variant::Type arg_type = p_args[i]->get_type();
|
Variant::Type arg_type = p_args[i]->get_type();
|
||||||
if (arg_type != Variant::INT && arg_type != Variant::FLOAT) {
|
if (arg_type != Variant::INT && arg_type != Variant::FLOAT) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.expected = Variant::FLOAT;
|
|
||||||
r_error.argument = i;
|
r_error.argument = i;
|
||||||
|
r_error.expected = Variant::FLOAT;
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
|
@ -613,8 +622,8 @@ Variant VariantUtilityFunctions::min(const Variant **p_args, int p_argcount, Cal
|
||||||
Variant::evaluate(Variant::OP_GREATER, base, *p_args[i], ret, valid);
|
Variant::evaluate(Variant::OP_GREATER, base, *p_args[i], ret, valid);
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.expected = base.get_type();
|
|
||||||
r_error.argument = i;
|
r_error.argument = i;
|
||||||
|
r_error.expected = base.get_type();
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
if (ret.booleanize()) {
|
if (ret.booleanize()) {
|
||||||
|
@ -642,8 +651,8 @@ Variant VariantUtilityFunctions::clamp(const Variant &x, const Variant &min, con
|
||||||
Variant::evaluate(Variant::OP_LESS, value, min, ret, valid);
|
Variant::evaluate(Variant::OP_LESS, value, min, ret, valid);
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.expected = value.get_type();
|
|
||||||
r_error.argument = 1;
|
r_error.argument = 1;
|
||||||
|
r_error.expected = value.get_type();
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
if (ret.booleanize()) {
|
if (ret.booleanize()) {
|
||||||
|
@ -652,8 +661,8 @@ Variant VariantUtilityFunctions::clamp(const Variant &x, const Variant &min, con
|
||||||
Variant::evaluate(Variant::OP_GREATER, value, max, ret, valid);
|
Variant::evaluate(Variant::OP_GREATER, value, max, ret, valid);
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||||
r_error.expected = value.get_type();
|
|
||||||
r_error.argument = 2;
|
r_error.argument = 2;
|
||||||
|
r_error.expected = value.get_type();
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
if (ret.booleanize()) {
|
if (ret.booleanize()) {
|
||||||
|
@ -839,7 +848,7 @@ Variant VariantUtilityFunctions::type_convert(const Variant &p_variant, const Va
|
||||||
String VariantUtilityFunctions::str(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
String VariantUtilityFunctions::str(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
||||||
if (p_arg_count < 1) {
|
if (p_arg_count < 1) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = 1;
|
r_error.expected = 1;
|
||||||
return String();
|
return String();
|
||||||
}
|
}
|
||||||
String s;
|
String s;
|
||||||
|
@ -866,6 +875,11 @@ String VariantUtilityFunctions::error_string(Error error) {
|
||||||
return String(error_names[error]);
|
return String(error_names[error]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String VariantUtilityFunctions::type_string(Variant::Type p_type) {
|
||||||
|
ERR_FAIL_INDEX_V_MSG((int)p_type, (int)Variant::VARIANT_MAX, "<invalid type>", "Invalid type argument to type_string(), use the TYPE_* constants.");
|
||||||
|
return Variant::get_type_name(p_type);
|
||||||
|
}
|
||||||
|
|
||||||
void VariantUtilityFunctions::print(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
void VariantUtilityFunctions::print(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
||||||
String s;
|
String s;
|
||||||
for (int i = 0; i < p_arg_count; i++) {
|
for (int i = 0; i < p_arg_count; i++) {
|
||||||
|
@ -983,7 +997,7 @@ void VariantUtilityFunctions::printraw(const Variant **p_args, int p_arg_count,
|
||||||
void VariantUtilityFunctions::push_error(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
void VariantUtilityFunctions::push_error(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
||||||
if (p_arg_count < 1) {
|
if (p_arg_count < 1) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = 1;
|
r_error.expected = 1;
|
||||||
}
|
}
|
||||||
String s;
|
String s;
|
||||||
for (int i = 0; i < p_arg_count; i++) {
|
for (int i = 0; i < p_arg_count; i++) {
|
||||||
|
@ -1003,7 +1017,7 @@ void VariantUtilityFunctions::push_error(const Variant **p_args, int p_arg_count
|
||||||
void VariantUtilityFunctions::push_warning(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
void VariantUtilityFunctions::push_warning(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
||||||
if (p_arg_count < 1) {
|
if (p_arg_count < 1) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = 1;
|
r_error.expected = 1;
|
||||||
}
|
}
|
||||||
String s;
|
String s;
|
||||||
for (int i = 0; i < p_arg_count; i++) {
|
for (int i = 0; i < p_arg_count; i++) {
|
||||||
|
@ -1653,12 +1667,14 @@ void Variant::_register_variant_utility_functions() {
|
||||||
FUNCBINDR(cubic_interpolate_angle_in_time, sarray("from", "to", "pre", "post", "weight", "to_t", "pre_t", "post_t"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(cubic_interpolate_angle_in_time, sarray("from", "to", "pre", "post", "weight", "to_t", "pre_t", "post_t"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
FUNCBINDR(bezier_interpolate, sarray("start", "control_1", "control_2", "end", "t"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(bezier_interpolate, sarray("start", "control_1", "control_2", "end", "t"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
FUNCBINDR(bezier_derivative, sarray("start", "control_1", "control_2", "end", "t"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(bezier_derivative, sarray("start", "control_1", "control_2", "end", "t"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
|
FUNCBINDR(angle_difference, sarray("from", "to"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
FUNCBINDR(lerp_angle, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(lerp_angle, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
FUNCBINDR(inverse_lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(inverse_lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
FUNCBINDR(remap, sarray("value", "istart", "istop", "ostart", "ostop"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(remap, sarray("value", "istart", "istop", "ostart", "ostop"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
|
|
||||||
FUNCBINDR(smoothstep, sarray("from", "to", "x"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(smoothstep, sarray("from", "to", "x"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
FUNCBINDR(move_toward, sarray("from", "to", "delta"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(move_toward, sarray("from", "to", "delta"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
|
FUNCBINDR(rotate_toward, sarray("from", "to", "delta"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
|
|
||||||
FUNCBINDR(deg_to_rad, sarray("deg"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(deg_to_rad, sarray("deg"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
FUNCBINDR(rad_to_deg, sarray("rad"), Variant::UTILITY_FUNC_TYPE_MATH);
|
FUNCBINDR(rad_to_deg, sarray("rad"), Variant::UTILITY_FUNC_TYPE_MATH);
|
||||||
|
@ -1702,6 +1718,7 @@ void Variant::_register_variant_utility_functions() {
|
||||||
FUNCBINDR(type_convert, sarray("variant", "type"), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
FUNCBINDR(type_convert, sarray("variant", "type"), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
||||||
FUNCBINDVARARGS(str, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
FUNCBINDVARARGS(str, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
||||||
FUNCBINDR(error_string, sarray("error"), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
FUNCBINDR(error_string, sarray("error"), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
||||||
|
FUNCBINDR(type_string, sarray("type"), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
||||||
FUNCBINDVARARGV(print, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
FUNCBINDVARARGV(print, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
||||||
FUNCBINDVARARGV(print_rich, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
FUNCBINDVARARGV(print_rich, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
||||||
FUNCBINDVARARGV(printerr, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
FUNCBINDVARARGV(printerr, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
|
||||||
|
@ -1749,14 +1766,12 @@ void Variant::call_utility_function(const StringName &p_name, Variant *r_ret, co
|
||||||
|
|
||||||
if (unlikely(!bfi->is_vararg && p_argcount < bfi->argcount)) {
|
if (unlikely(!bfi->is_vararg && p_argcount < bfi->argcount)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||||
r_error.argument = 0;
|
|
||||||
r_error.expected = bfi->argcount;
|
r_error.expected = bfi->argcount;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(!bfi->is_vararg && p_argcount > bfi->argcount)) {
|
if (unlikely(!bfi->is_vararg && p_argcount > bfi->argcount)) {
|
||||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||||
r_error.argument = 0;
|
|
||||||
r_error.expected = bfi->argcount;
|
r_error.expected = bfi->argcount;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,11 +90,13 @@ struct VariantUtilityFunctions {
|
||||||
double to_t, double pre_t, double post_t);
|
double to_t, double pre_t, double post_t);
|
||||||
static double bezier_interpolate(double p_start, double p_control_1, double p_control_2, double p_end, double p_t);
|
static double bezier_interpolate(double p_start, double p_control_1, double p_control_2, double p_end, double p_t);
|
||||||
static double bezier_derivative(double p_start, double p_control_1, double p_control_2, double p_end, double p_t);
|
static double bezier_derivative(double p_start, double p_control_1, double p_control_2, double p_end, double p_t);
|
||||||
|
static double angle_difference(double from, double to);
|
||||||
static double lerp_angle(double from, double to, double weight);
|
static double lerp_angle(double from, double to, double weight);
|
||||||
static double inverse_lerp(double from, double to, double weight);
|
static double inverse_lerp(double from, double to, double weight);
|
||||||
static double remap(double value, double istart, double istop, double ostart, double ostop);
|
static double remap(double value, double istart, double istop, double ostart, double ostop);
|
||||||
static double smoothstep(double from, double to, double val);
|
static double smoothstep(double from, double to, double val);
|
||||||
static double move_toward(double from, double to, double delta);
|
static double move_toward(double from, double to, double delta);
|
||||||
|
static double rotate_toward(double from, double to, double delta);
|
||||||
static double deg_to_rad(double angle_deg);
|
static double deg_to_rad(double angle_deg);
|
||||||
static double rad_to_deg(double angle_rad);
|
static double rad_to_deg(double angle_rad);
|
||||||
static double linear_to_db(double linear);
|
static double linear_to_db(double linear);
|
||||||
|
@ -128,6 +130,7 @@ struct VariantUtilityFunctions {
|
||||||
static Variant type_convert(const Variant &p_variant, const Variant::Type p_type);
|
static Variant type_convert(const Variant &p_variant, const Variant::Type p_type);
|
||||||
static String str(const Variant **p_args, int p_arg_count, Callable::CallError &r_error);
|
static String str(const Variant **p_args, int p_arg_count, Callable::CallError &r_error);
|
||||||
static String error_string(Error error);
|
static String error_string(Error error);
|
||||||
|
static String type_string(Variant::Type p_type);
|
||||||
static void print(const Variant **p_args, int p_arg_count, Callable::CallError &r_error);
|
static void print(const Variant **p_args, int p_arg_count, Callable::CallError &r_error);
|
||||||
static void print_rich(const Variant **p_args, int p_arg_count, Callable::CallError &r_error);
|
static void print_rich(const Variant **p_args, int p_arg_count, Callable::CallError &r_error);
|
||||||
#undef print_verbose
|
#undef print_verbose
|
||||||
|
|
|
@ -85,6 +85,14 @@
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="angle_difference">
|
||||||
|
<return type="float" />
|
||||||
|
<param index="0" name="from" type="float" />
|
||||||
|
<param index="1" name="to" type="float" />
|
||||||
|
<description>
|
||||||
|
Returns the difference between the two angles, in the range of [code][-PI, +PI][/code]. When [param from] and [param to] are opposite, returns [code]-PI[/code] if [param from] is smaller than [param to], or [code]PI[/code] otherwise.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="asin">
|
<method name="asin">
|
||||||
<return type="float" />
|
<return type="float" />
|
||||||
<param index="0" name="x" type="float" />
|
<param index="0" name="x" type="float" />
|
||||||
|
@ -112,7 +120,7 @@
|
||||||
<param index="0" name="x" type="float" />
|
<param index="0" name="x" type="float" />
|
||||||
<description>
|
<description>
|
||||||
Returns the arc tangent of [param x] in radians. Use it to get the angle from an angle's tangent in trigonometry.
|
Returns the arc tangent of [param x] in radians. Use it to get the angle from an angle's tangent in trigonometry.
|
||||||
The method cannot know in which quadrant the angle should fall. See [method atan2] if you have both [code]y[/code] and [code]x[/code].
|
The method cannot know in which quadrant the angle should fall. See [method atan2] if you have both [code]y[/code] and [code skip-lint]x[/code].
|
||||||
[codeblock]
|
[codeblock]
|
||||||
var a = atan(0.5) # a is 0.463648
|
var a = atan(0.5) # a is 0.463648
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
|
@ -330,7 +338,7 @@
|
||||||
<param index="7" name="post_t" type="float" />
|
<param index="7" name="post_t" type="float" />
|
||||||
<description>
|
<description>
|
||||||
Cubic interpolates between two rotation values with shortest path by the factor defined in [param weight] with [param pre] and [param post] values. See also [method lerp_angle].
|
Cubic interpolates between two rotation values with shortest path by the factor defined in [param weight] with [param pre] and [param post] values. See also [method lerp_angle].
|
||||||
It can perform smoother interpolation than [code]cubic_interpolate()[/code] by the time values.
|
It can perform smoother interpolation than [method cubic_interpolate] by the time values.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="cubic_interpolate_in_time">
|
<method name="cubic_interpolate_in_time">
|
||||||
|
@ -871,10 +879,10 @@
|
||||||
URL tags only support URLs wrapped by a URL tag, not URLs with a different title.
|
URL tags only support URLs wrapped by a URL tag, not URLs with a different title.
|
||||||
When printing to standard output, the supported subset of BBCode is converted to ANSI escape codes for the terminal emulator to display. Support for ANSI escape codes varies across terminal emulators, especially for italic and strikethrough. In standard output, [code]code[/code] is represented with faint text but without any font change. Unsupported tags are left as-is in standard output.
|
When printing to standard output, the supported subset of BBCode is converted to ANSI escape codes for the terminal emulator to display. Support for ANSI escape codes varies across terminal emulators, especially for italic and strikethrough. In standard output, [code]code[/code] is represented with faint text but without any font change. Unsupported tags are left as-is in standard output.
|
||||||
[codeblocks]
|
[codeblocks]
|
||||||
[gdscript]
|
[gdscript skip-lint]
|
||||||
print_rich("[color=green][b]Hello world![/b][/color]") # Prints out "Hello world!" in green with a bold font
|
print_rich("[color=green][b]Hello world![/b][/color]") # Prints out "Hello world!" in green with a bold font
|
||||||
[/gdscript]
|
[/gdscript]
|
||||||
[csharp]
|
[csharp skip-lint]
|
||||||
GD.PrintRich("[color=green][b]Hello world![/b][/color]"); // Prints out "Hello world!" in green with a bold font
|
GD.PrintRich("[color=green][b]Hello world![/b][/color]"); // Prints out "Hello world!" in green with a bold font
|
||||||
[/csharp]
|
[/csharp]
|
||||||
[/codeblocks]
|
[/codeblocks]
|
||||||
|
@ -1110,6 +1118,17 @@
|
||||||
Creates a RID from a [param base]. This is used mainly from native extensions to build servers.
|
Creates a RID from a [param base]. This is used mainly from native extensions to build servers.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="rotate_toward">
|
||||||
|
<return type="float" />
|
||||||
|
<param index="0" name="from" type="float" />
|
||||||
|
<param index="1" name="to" type="float" />
|
||||||
|
<param index="2" name="delta" type="float" />
|
||||||
|
<description>
|
||||||
|
Rotates [param from] toward [param to] by the [param delta] amount. Will not go past [param to].
|
||||||
|
Similar to [method move_toward], but interpolates correctly when the angles wrap around [constant @GDScript.TAU].
|
||||||
|
If [param delta] is negative, this function will rotate away from [param to], toward the opposite angle, and will not go past the opposite angle.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="round">
|
<method name="round">
|
||||||
<return type="Variant" />
|
<return type="Variant" />
|
||||||
<param index="0" name="x" type="Variant" />
|
<param index="0" name="x" type="Variant" />
|
||||||
|
@ -1373,7 +1392,7 @@
|
||||||
<param index="1" name="type" type="int" />
|
<param index="1" name="type" type="int" />
|
||||||
<description>
|
<description>
|
||||||
Converts the given [param variant] to the given [param type], using the [enum Variant.Type] values. This method is generous with how it handles types, it can automatically convert between array types, convert numeric [String]s to [int], and converting most things to [String].
|
Converts the given [param variant] to the given [param type], using the [enum Variant.Type] values. This method is generous with how it handles types, it can automatically convert between array types, convert numeric [String]s to [int], and converting most things to [String].
|
||||||
If the type conversion cannot be done, this method will return the default value for that type, for example converting [Rect2] to [Vector2] will always return [code]Vector2.ZERO[/code]. This method will never show error messages as long as [param type] is a valid Variant type.
|
If the type conversion cannot be done, this method will return the default value for that type, for example converting [Rect2] to [Vector2] will always return [constant Vector2.ZERO]. This method will never show error messages as long as [param type] is a valid Variant type.
|
||||||
The returned value is a [Variant], but the data inside and the [enum Variant.Type] will be the same as the requested type.
|
The returned value is a [Variant], but the data inside and the [enum Variant.Type] will be the same as the requested type.
|
||||||
[codeblock]
|
[codeblock]
|
||||||
type_convert("Hi!", TYPE_INT) # Returns 0
|
type_convert("Hi!", TYPE_INT) # Returns 0
|
||||||
|
@ -1384,6 +1403,19 @@
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="type_string">
|
||||||
|
<return type="String" />
|
||||||
|
<param index="0" name="type" type="int" />
|
||||||
|
<description>
|
||||||
|
Returns a human-readable name of the given [param type], using the [enum Variant.Type] values.
|
||||||
|
[codeblock]
|
||||||
|
print(TYPE_INT) # Prints 2.
|
||||||
|
print(type_string(TYPE_INT)) # Prints "int".
|
||||||
|
print(type_string(TYPE_STRING)) # Prints "String".
|
||||||
|
[/codeblock]
|
||||||
|
See also [method typeof].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="typeof">
|
<method name="typeof">
|
||||||
<return type="int" />
|
<return type="int" />
|
||||||
<param index="0" name="variable" type="Variant" />
|
<param index="0" name="variable" type="Variant" />
|
||||||
|
@ -1398,6 +1430,7 @@
|
||||||
else:
|
else:
|
||||||
print("Unexpected result")
|
print("Unexpected result")
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
|
See also [method type_string].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="var_to_bytes">
|
<method name="var_to_bytes">
|
||||||
|
@ -1488,7 +1521,7 @@
|
||||||
angle = wrapf(angle + 0.1, -PI, PI)
|
angle = wrapf(angle + 0.1, -PI, PI)
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
[b]Note:[/b] If [param min] is [code]0[/code], this is equivalent to [method fposmod], so prefer using that instead.
|
[b]Note:[/b] If [param min] is [code]0[/code], this is equivalent to [method fposmod], so prefer using that instead.
|
||||||
[code]wrapf[/code] is more flexible than using the [method fposmod] approach by giving the user control over the minimum value.
|
[method wrapf] is more flexible than using the [method fposmod] approach by giving the user control over the minimum value.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="wrapi">
|
<method name="wrapi">
|
||||||
|
@ -2719,7 +2752,7 @@
|
||||||
<constant name="PROPERTY_HINT_RANGE" value="1" enum="PropertyHint">
|
<constant name="PROPERTY_HINT_RANGE" value="1" enum="PropertyHint">
|
||||||
Hints that an [int] or [float] property should be within a range specified via the hint string [code]"min,max"[/code] or [code]"min,max,step"[/code]. The hint string can optionally include [code]"or_greater"[/code] and/or [code]"or_less"[/code] to allow manual input going respectively above the max or below the min values.
|
Hints that an [int] or [float] property should be within a range specified via the hint string [code]"min,max"[/code] or [code]"min,max,step"[/code]. The hint string can optionally include [code]"or_greater"[/code] and/or [code]"or_less"[/code] to allow manual input going respectively above the max or below the min values.
|
||||||
[b]Example:[/b] [code]"-360,360,1,or_greater,or_less"[/code].
|
[b]Example:[/b] [code]"-360,360,1,or_greater,or_less"[/code].
|
||||||
Additionally, other keywords can be included: [code]"exp"[/code] for exponential range editing, [code]"radians"[/code] for editing radian angles in degrees, [code]"degrees"[/code] to hint at an angle and [code]"hide_slider"[/code] to hide the slider.
|
Additionally, other keywords can be included: [code]"exp"[/code] for exponential range editing, [code]"radians_as_degrees"[/code] for editing radian angles in degrees (the range values are also in degrees), [code]"degrees"[/code] to hint at an angle and [code]"hide_slider"[/code] to hide the slider.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="PROPERTY_HINT_ENUM" value="2" enum="PropertyHint">
|
<constant name="PROPERTY_HINT_ENUM" value="2" enum="PropertyHint">
|
||||||
Hints that an [int] or [String] property is an enumerated value to pick in a list specified via a hint string.
|
Hints that an [int] or [String] property is an enumerated value to pick in a list specified via a hint string.
|
||||||
|
|
|
@ -126,7 +126,7 @@
|
||||||
<return type="Vector3" />
|
<return type="Vector3" />
|
||||||
<param index="0" name="dir" type="Vector3" />
|
<param index="0" name="dir" type="Vector3" />
|
||||||
<description>
|
<description>
|
||||||
Returns the support point in a given direction. This is useful for collision detection algorithms.
|
Returns the vertex of the AABB that's the farthest in a given direction. This point is commonly known as the support point in collision detection algorithms.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_volume" qualifiers="const">
|
<method name="get_volume" qualifiers="const">
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<description>
|
<description>
|
||||||
A* (A star) is a computer algorithm used in pathfinding and graph traversal, the process of plotting short paths among vertices (points), passing through a given set of edges (segments). It enjoys widespread use due to its performance and accuracy. Godot's A* implementation uses points in 3D space and Euclidean distances by default.
|
A* (A star) is a computer algorithm used in pathfinding and graph traversal, the process of plotting short paths among vertices (points), passing through a given set of edges (segments). It enjoys widespread use due to its performance and accuracy. Godot's A* implementation uses points in 3D space and Euclidean distances by default.
|
||||||
You must add points manually with [method add_point] and create segments manually with [method connect_points]. Once done, you can test if there is a path between two points with the [method are_points_connected] function, get a path containing indices by [method get_id_path], or one containing actual coordinates with [method get_point_path].
|
You must add points manually with [method add_point] and create segments manually with [method connect_points]. Once done, you can test if there is a path between two points with the [method are_points_connected] function, get a path containing indices by [method get_id_path], or one containing actual coordinates with [method get_point_path].
|
||||||
It is also possible to use non-Euclidean distances. To do so, create a class that extends [code]AStar3D[/code] and override methods [method _compute_cost] and [method _estimate_cost]. Both take two indices and return a length, as is shown in the following example.
|
It is also possible to use non-Euclidean distances. To do so, create a class that extends [AStar3D] and override methods [method _compute_cost] and [method _estimate_cost]. Both take two indices and return a length, as is shown in the following example.
|
||||||
[codeblocks]
|
[codeblocks]
|
||||||
[gdscript]
|
[gdscript]
|
||||||
class MyAStar:
|
class MyAStar:
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
}
|
}
|
||||||
[/csharp]
|
[/csharp]
|
||||||
[/codeblocks]
|
[/codeblocks]
|
||||||
[method _estimate_cost] should return a lower bound of the distance, i.e. [code]_estimate_cost(u, v) <= _compute_cost(u, v)[/code]. This serves as a hint to the algorithm because the custom [code]_compute_cost[/code] might be computation-heavy. If this is not the case, make [method _estimate_cost] return the same value as [method _compute_cost] to provide the algorithm with the most accurate information.
|
[method _estimate_cost] should return a lower bound of the distance, i.e. [code]_estimate_cost(u, v) <= _compute_cost(u, v)[/code]. This serves as a hint to the algorithm because the custom [method _compute_cost] might be computation-heavy. If this is not the case, make [method _estimate_cost] return the same value as [method _compute_cost] to provide the algorithm with the most accurate information.
|
||||||
If the default [method _estimate_cost] and [method _compute_cost] methods are used, or if the supplied [method _estimate_cost] method returns a lower bound of the cost, then the paths returned by A* will be the lowest-cost paths. Here, the cost of a path equals the sum of the [method _compute_cost] results of all segments in the path multiplied by the [code]weight_scale[/code]s of the endpoints of the respective segments. If the default methods are used and the [code]weight_scale[/code]s of all points are set to [code]1.0[/code], then this equals the sum of Euclidean distances of all segments in the path.
|
If the default [method _estimate_cost] and [method _compute_cost] methods are used, or if the supplied [method _estimate_cost] method returns a lower bound of the cost, then the paths returned by A* will be the lowest-cost paths. Here, the cost of a path equals the sum of the [method _compute_cost] results of all segments in the path multiplied by the [code]weight_scale[/code]s of the endpoints of the respective segments. If the default methods are used and the [code]weight_scale[/code]s of all points are set to [code]1.0[/code], then this equals the sum of Euclidean distances of all segments in the path.
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
<param index="1" name="to_id" type="int" />
|
<param index="1" name="to_id" type="int" />
|
||||||
<description>
|
<description>
|
||||||
Called when computing the cost between two connected points.
|
Called when computing the cost between two connected points.
|
||||||
Note that this function is hidden in the default [code]AStar3D[/code] class.
|
Note that this function is hidden in the default [AStar3D] class.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="_estimate_cost" qualifiers="virtual const">
|
<method name="_estimate_cost" qualifiers="virtual const">
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
<param index="1" name="to_id" type="int" />
|
<param index="1" name="to_id" type="int" />
|
||||||
<description>
|
<description>
|
||||||
Called when estimating the cost between a point and the path's ending point.
|
Called when estimating the cost between a point and the path's ending point.
|
||||||
Note that this function is hidden in the default [code]AStar3D[/code] class.
|
Note that this function is hidden in the default [AStar3D] class.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="add_point">
|
<method name="add_point">
|
||||||
|
@ -204,7 +204,7 @@
|
||||||
<method name="get_point_capacity" qualifiers="const">
|
<method name="get_point_capacity" qualifiers="const">
|
||||||
<return type="int" />
|
<return type="int" />
|
||||||
<description>
|
<description>
|
||||||
Returns the capacity of the structure backing the points, useful in conjunction with [code]reserve_space[/code].
|
Returns the capacity of the structure backing the points, useful in conjunction with [method reserve_space].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_point_connections">
|
<method name="get_point_connections">
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
<param index="1" name="to_id" type="Vector2i" />
|
<param index="1" name="to_id" type="Vector2i" />
|
||||||
<description>
|
<description>
|
||||||
Called when computing the cost between two connected points.
|
Called when computing the cost between two connected points.
|
||||||
Note that this function is hidden in the default [code]AStarGrid2D[/code] class.
|
Note that this function is hidden in the default [AStarGrid2D] class.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="_estimate_cost" qualifiers="virtual const">
|
<method name="_estimate_cost" qualifiers="virtual const">
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
<param index="1" name="to_id" type="Vector2i" />
|
<param index="1" name="to_id" type="Vector2i" />
|
||||||
<description>
|
<description>
|
||||||
Called when estimating the cost between a point and the path's ending point.
|
Called when estimating the cost between a point and the path's ending point.
|
||||||
Note that this function is hidden in the default [code]AStarGrid2D[/code] class.
|
Note that this function is hidden in the default [AStarGrid2D] class.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="clear">
|
<method name="clear">
|
||||||
|
@ -84,7 +84,7 @@
|
||||||
<param index="0" name="from_id" type="Vector2i" />
|
<param index="0" name="from_id" type="Vector2i" />
|
||||||
<param index="1" name="to_id" type="Vector2i" />
|
<param index="1" name="to_id" type="Vector2i" />
|
||||||
<description>
|
<description>
|
||||||
Returns an array with the points that are in the path found by AStarGrid2D between the given points. The array is ordered from the starting point to the ending point of the path.
|
Returns an array with the points that are in the path found by [AStarGrid2D] between the given points. The array is ordered from the starting point to the ending point of the path.
|
||||||
[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it will return an empty [PackedVector3Array] and will print an error message.
|
[b]Note:[/b] This method is not thread-safe. If called from a [Thread], it will return an empty [PackedVector3Array] and will print an error message.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
@ -113,14 +113,14 @@
|
||||||
<param index="0" name="x" type="int" />
|
<param index="0" name="x" type="int" />
|
||||||
<param index="1" name="y" type="int" />
|
<param index="1" name="y" type="int" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if the [param x] and [param y] is a valid grid coordinate (id).
|
Returns [code]true[/code] if the [param x] and [param y] is a valid grid coordinate (id), i.e. if it is inside [member region]. Equivalent to [code]region.has_point(Vector2i(x, y))[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="is_in_boundsv" qualifiers="const">
|
<method name="is_in_boundsv" qualifiers="const">
|
||||||
<return type="bool" />
|
<return type="bool" />
|
||||||
<param index="0" name="id" type="Vector2i" />
|
<param index="0" name="id" type="Vector2i" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if the [param id] vector is a valid grid coordinate.
|
Returns [code]true[/code] if the [param id] vector is a valid grid coordinate, i.e. if it is inside [member region]. Equivalent to [code]region.has_point(id)[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="is_point_solid" qualifiers="const">
|
<method name="is_point_solid" qualifiers="const">
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
The text displayed by the dialog.
|
The text displayed by the dialog.
|
||||||
</member>
|
</member>
|
||||||
<member name="exclusive" type="bool" setter="set_exclusive" getter="is_exclusive" overrides="Window" default="true" />
|
<member name="exclusive" type="bool" setter="set_exclusive" getter="is_exclusive" overrides="Window" default="true" />
|
||||||
|
<member name="keep_title_visible" type="bool" setter="set_keep_title_visible" getter="get_keep_title_visible" overrides="Window" default="true" />
|
||||||
<member name="ok_button_text" type="String" setter="set_ok_button_text" getter="get_ok_button_text" default=""OK"">
|
<member name="ok_button_text" type="String" setter="set_ok_button_text" getter="get_ok_button_text" default=""OK"">
|
||||||
The text displayed by the OK button (see [method get_ok_button]).
|
The text displayed by the OK button (see [method get_ok_button]).
|
||||||
</member>
|
</member>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
A 2D physics body that can't be moved by external forces. When moved manually, it affects other bodies in its path.
|
A 2D physics body that can't be moved by external forces. When moved manually, it affects other bodies in its path.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
An animatable 2D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, [AnimationPlayer]s (with [member AnimationPlayer.playback_process_mode] set to [constant AnimationPlayer.ANIMATION_PROCESS_PHYSICS]), and [RemoteTransform2D].
|
An animatable 2D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, [AnimationMixer]s (with [member AnimationMixer.callback_mode_process] set to [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS]), and [RemoteTransform2D].
|
||||||
When [AnimatableBody2D] is moved, its linear and angular velocity are estimated and used to affect other physics bodies in its path. This makes it useful for moving platforms, doors, and other moving objects.
|
When [AnimatableBody2D] is moved, its linear and angular velocity are estimated and used to affect other physics bodies in its path. This makes it useful for moving platforms, doors, and other moving objects.
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
A 3D physics body that can't be moved by external forces. When moved manually, it affects other bodies in its path.
|
A 3D physics body that can't be moved by external forces. When moved manually, it affects other bodies in its path.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
An animatable 3D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, [AnimationPlayer]s (with [member AnimationPlayer.playback_process_mode] set to [constant AnimationPlayer.ANIMATION_PROCESS_PHYSICS]), and [RemoteTransform3D].
|
An animatable 3D physics body. It can't be moved by external forces or contacts, but can be moved manually by other means such as code, [AnimationMixer]s (with [member AnimationMixer.callback_mode_process] set to [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS]), and [RemoteTransform3D].
|
||||||
When [AnimatableBody3D] is moved, its linear and angular velocity are estimated and used to affect other physics bodies in its path. This makes it useful for moving platforms, doors, and other moving objects.
|
When [AnimatableBody3D] is moved, its linear and angular velocity are estimated and used to affect other physics bodies in its path. This makes it useful for moving platforms, doors, and other moving objects.
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
|
|
342
godot/doc/classes/AnimationMixer.xml
Normal file
342
godot/doc/classes/AnimationMixer.xml
Normal file
|
@ -0,0 +1,342 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<class name="AnimationMixer" inherits="Node" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
||||||
|
<brief_description>
|
||||||
|
Base class for [AnimationPlayer] and [AnimationTree].
|
||||||
|
</brief_description>
|
||||||
|
<description>
|
||||||
|
Base class for [AnimationPlayer] and [AnimationTree] to manage animation lists. It also has general properties and methods for playback and blending.
|
||||||
|
After instantiating the playback information data within the extended class, the blending is processed by the [AnimationMixer].
|
||||||
|
</description>
|
||||||
|
<tutorials>
|
||||||
|
</tutorials>
|
||||||
|
<methods>
|
||||||
|
<method name="_post_process_key_value" qualifiers="virtual const">
|
||||||
|
<return type="Variant" />
|
||||||
|
<param index="0" name="animation" type="Animation" />
|
||||||
|
<param index="1" name="track" type="int" />
|
||||||
|
<param index="2" name="value" type="Variant" />
|
||||||
|
<param index="3" name="object" type="Object" />
|
||||||
|
<param index="4" name="object_idx" type="int" />
|
||||||
|
<description>
|
||||||
|
A virtual function for processing after key getting during playback.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="add_animation_library">
|
||||||
|
<return type="int" enum="Error" />
|
||||||
|
<param index="0" name="name" type="StringName" />
|
||||||
|
<param index="1" name="library" type="AnimationLibrary" />
|
||||||
|
<description>
|
||||||
|
Adds [param library] to the animation player, under the key [param name].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="advance">
|
||||||
|
<return type="void" />
|
||||||
|
<param index="0" name="delta" type="float" />
|
||||||
|
<description>
|
||||||
|
Manually advance the animations by the specified time (in seconds).
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="clear_caches">
|
||||||
|
<return type="void" />
|
||||||
|
<description>
|
||||||
|
[AnimationMixer] caches animated nodes. It may not notice if a node disappears; [method clear_caches] forces it to update the cache again.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="find_animation" qualifiers="const">
|
||||||
|
<return type="StringName" />
|
||||||
|
<param index="0" name="animation" type="Animation" />
|
||||||
|
<description>
|
||||||
|
Returns the key of [param animation] or an empty [StringName] if not found.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="find_animation_library" qualifiers="const">
|
||||||
|
<return type="StringName" />
|
||||||
|
<param index="0" name="animation" type="Animation" />
|
||||||
|
<description>
|
||||||
|
Returns the key for the [AnimationLibrary] that contains [param animation] or an empty [StringName] if not found.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_animation" qualifiers="const">
|
||||||
|
<return type="Animation" />
|
||||||
|
<param index="0" name="name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Returns the [Animation] with the key [param name]. If the animation does not exist, [code]null[/code] is returned and an error is logged.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_animation_library" qualifiers="const">
|
||||||
|
<return type="AnimationLibrary" />
|
||||||
|
<param index="0" name="name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Returns the first [AnimationLibrary] with key [param name] or [code]null[/code] if not found.
|
||||||
|
To get the [AnimationPlayer]'s global animation library, use [code]get_animation_library("")[/code].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_animation_library_list" qualifiers="const">
|
||||||
|
<return type="StringName[]" />
|
||||||
|
<description>
|
||||||
|
Returns the list of stored library keys.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_animation_list" qualifiers="const">
|
||||||
|
<return type="PackedStringArray" />
|
||||||
|
<description>
|
||||||
|
Returns the list of stored animation keys.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_root_motion_position" qualifiers="const">
|
||||||
|
<return type="Vector3" />
|
||||||
|
<description>
|
||||||
|
Retrieve the motion delta of position with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
||||||
|
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_POSITION_3D], returns [code]Vector3(0, 0, 0)[/code].
|
||||||
|
See also [member root_motion_track] and [RootMotionView].
|
||||||
|
The most basic example is applying position to [CharacterBody3D]:
|
||||||
|
[codeblocks]
|
||||||
|
[gdscript]
|
||||||
|
var current_rotation: Quaternion
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
if Input.is_action_just_pressed("animate"):
|
||||||
|
current_rotation = get_quaternion()
|
||||||
|
state_machine.travel("Animate")
|
||||||
|
var velocity: Vector3 = current_rotation * animation_tree.get_root_motion_position() / delta
|
||||||
|
set_velocity(velocity)
|
||||||
|
move_and_slide()
|
||||||
|
[/gdscript]
|
||||||
|
[/codeblocks]
|
||||||
|
By using this in combination with [method get_root_motion_position_accumulator], you can apply the root motion position more correctly to account for the rotation of the node.
|
||||||
|
[codeblocks]
|
||||||
|
[gdscript]
|
||||||
|
func _process(delta):
|
||||||
|
if Input.is_action_just_pressed("animate"):
|
||||||
|
state_machine.travel("Animate")
|
||||||
|
set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
|
||||||
|
var velocity: Vector3 = (animation_tree.get_root_motion_rotation_accumulator().inverse() * get_quaternion()) * animation_tree.get_root_motion_position() / delta
|
||||||
|
set_velocity(velocity)
|
||||||
|
move_and_slide()
|
||||||
|
[/gdscript]
|
||||||
|
[/codeblocks]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_root_motion_position_accumulator" qualifiers="const">
|
||||||
|
<return type="Vector3" />
|
||||||
|
<description>
|
||||||
|
Retrieve the blended value of the position tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
||||||
|
This is useful in cases where you want to respect the initial key values of the animation.
|
||||||
|
For example, if an animation with only one key [code]Vector3(0, 0, 0)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(1, 0, 1)[/code] is played in the next frame, the difference can be calculated as follows:
|
||||||
|
[codeblocks]
|
||||||
|
[gdscript]
|
||||||
|
var prev_root_motion_position_accumulator: Vector3
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
if Input.is_action_just_pressed("animate"):
|
||||||
|
state_machine.travel("Animate")
|
||||||
|
var current_root_motion_position_accumulator: Vector3 = animation_tree.get_root_motion_position_accumulator()
|
||||||
|
var difference: Vector3 = current_root_motion_position_accumulator - prev_root_motion_position_accumulator
|
||||||
|
prev_root_motion_position_accumulator = current_root_motion_position_accumulator
|
||||||
|
transform.origin += difference
|
||||||
|
[/gdscript]
|
||||||
|
[/codeblocks]
|
||||||
|
However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_root_motion_rotation" qualifiers="const">
|
||||||
|
<return type="Quaternion" />
|
||||||
|
<description>
|
||||||
|
Retrieve the motion delta of rotation with the [member root_motion_track] as a [Quaternion] that can be used elsewhere.
|
||||||
|
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_ROTATION_3D], returns [code]Quaternion(0, 0, 0, 1)[/code].
|
||||||
|
See also [member root_motion_track] and [RootMotionView].
|
||||||
|
The most basic example is applying rotation to [CharacterBody3D]:
|
||||||
|
[codeblocks]
|
||||||
|
[gdscript]
|
||||||
|
func _process(delta):
|
||||||
|
if Input.is_action_just_pressed("animate"):
|
||||||
|
state_machine.travel("Animate")
|
||||||
|
set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
|
||||||
|
[/gdscript]
|
||||||
|
[/codeblocks]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_root_motion_rotation_accumulator" qualifiers="const">
|
||||||
|
<return type="Quaternion" />
|
||||||
|
<description>
|
||||||
|
Retrieve the blended value of the rotation tracks with the [member root_motion_track] as a [Quaternion] that can be used elsewhere.
|
||||||
|
This is necessary to apply the root motion position correctly, taking rotation into account. See also [method get_root_motion_position].
|
||||||
|
Also, this is useful in cases where you want to respect the initial key values of the animation.
|
||||||
|
For example, if an animation with only one key [code]Quaternion(0, 0, 0, 1)[/code] is played in the previous frame and then an animation with only one key [code]Quaternion(0, 0.707, 0, 0.707)[/code] is played in the next frame, the difference can be calculated as follows:
|
||||||
|
[codeblocks]
|
||||||
|
[gdscript]
|
||||||
|
var prev_root_motion_rotation_accumulator: Quaternion
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
if Input.is_action_just_pressed("animate"):
|
||||||
|
state_machine.travel("Animate")
|
||||||
|
var current_root_motion_rotation_accumulator: Quaternion = animation_tree.get_root_motion_Quaternion_accumulator()
|
||||||
|
var difference: Quaternion = prev_root_motion_rotation_accumulator.inverse() * current_root_motion_rotation_accumulator
|
||||||
|
prev_root_motion_rotation_accumulator = current_root_motion_rotation_accumulator
|
||||||
|
transform.basis *= difference
|
||||||
|
[/gdscript]
|
||||||
|
[/codeblocks]
|
||||||
|
However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_root_motion_scale" qualifiers="const">
|
||||||
|
<return type="Vector3" />
|
||||||
|
<description>
|
||||||
|
Retrieve the motion delta of scale with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
||||||
|
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_SCALE_3D], returns [code]Vector3(0, 0, 0)[/code].
|
||||||
|
See also [member root_motion_track] and [RootMotionView].
|
||||||
|
The most basic example is applying scale to [CharacterBody3D]:
|
||||||
|
[codeblocks]
|
||||||
|
[gdscript]
|
||||||
|
var current_scale: Vector3 = Vector3(1, 1, 1)
|
||||||
|
var scale_accum: Vector3 = Vector3(1, 1, 1)
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
if Input.is_action_just_pressed("animate"):
|
||||||
|
current_scale = get_scale()
|
||||||
|
scale_accum = Vector3(1, 1, 1)
|
||||||
|
state_machine.travel("Animate")
|
||||||
|
scale_accum += animation_tree.get_root_motion_scale()
|
||||||
|
set_scale(current_scale * scale_accum)
|
||||||
|
[/gdscript]
|
||||||
|
[/codeblocks]
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_root_motion_scale_accumulator" qualifiers="const">
|
||||||
|
<return type="Vector3" />
|
||||||
|
<description>
|
||||||
|
Retrieve the blended value of the scale tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
||||||
|
For example, if an animation with only one key [code]Vector3(1, 1, 1)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(2, 2, 2)[/code] is played in the next frame, the difference can be calculated as follows:
|
||||||
|
[codeblocks]
|
||||||
|
[gdscript]
|
||||||
|
var prev_root_motion_scale_accumulator: Vector3
|
||||||
|
|
||||||
|
func _process(delta):
|
||||||
|
if Input.is_action_just_pressed("animate"):
|
||||||
|
state_machine.travel("Animate")
|
||||||
|
var current_root_motion_scale_accumulator: Vector3 = animation_tree.get_root_motion_scale_accumulator()
|
||||||
|
var difference: Vector3 = current_root_motion_scale_accumulator - prev_root_motion_scale_accumulator
|
||||||
|
prev_root_motion_scale_accumulator = current_root_motion_scale_accumulator
|
||||||
|
transform.basis = transform.basis.scaled(difference)
|
||||||
|
[/gdscript]
|
||||||
|
[/codeblocks]
|
||||||
|
However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="has_animation" qualifiers="const">
|
||||||
|
<return type="bool" />
|
||||||
|
<param index="0" name="name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Returns [code]true[/code] if the [AnimationPlayer] stores an [Animation] with key [param name].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="has_animation_library" qualifiers="const">
|
||||||
|
<return type="bool" />
|
||||||
|
<param index="0" name="name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Returns [code]true[/code] if the [AnimationPlayer] stores an [AnimationLibrary] with key [param name].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="remove_animation_library">
|
||||||
|
<return type="void" />
|
||||||
|
<param index="0" name="name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Removes the [AnimationLibrary] associated with the key [param name].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="rename_animation_library">
|
||||||
|
<return type="void" />
|
||||||
|
<param index="0" name="name" type="StringName" />
|
||||||
|
<param index="1" name="newname" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Moves the [AnimationLibrary] associated with the key [param name] to the key [param newname].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
</methods>
|
||||||
|
<members>
|
||||||
|
<member name="active" type="bool" setter="set_active" getter="is_active" default="true">
|
||||||
|
If [code]true[/code], the [AnimationMixer] will be processing.
|
||||||
|
</member>
|
||||||
|
<member name="audio_max_polyphony" type="int" setter="set_audio_max_polyphony" getter="get_audio_max_polyphony" default="32">
|
||||||
|
The number of possible simultaneous sounds for each of the assigned AudioStreamPlayers.
|
||||||
|
For example, if this value is [code]32[/code] and the animation has two audio tracks, the two [AudioStreamPlayer]s assigned can play simultaneously up to [code]32[/code] voices each.
|
||||||
|
</member>
|
||||||
|
<member name="callback_mode_method" type="int" setter="set_callback_mode_method" getter="get_callback_mode_method" enum="AnimationMixer.AnimationCallbackModeMethod" default="0">
|
||||||
|
The call mode to use for Call Method tracks.
|
||||||
|
</member>
|
||||||
|
<member name="callback_mode_process" type="int" setter="set_callback_mode_process" getter="get_callback_mode_process" enum="AnimationMixer.AnimationCallbackModeProcess" default="1">
|
||||||
|
The process notification in which to update animations.
|
||||||
|
</member>
|
||||||
|
<member name="deterministic" type="bool" setter="set_deterministic" getter="is_deterministic" default="false">
|
||||||
|
If [code]true[/code], the blending uses the deterministic algorithm. The total weight is not normalized and the result is accumulated with an initial value ([code]0[/code] or a [code]"RESET"[/code] animation if present).
|
||||||
|
This means that if the total amount of blending is [code]0.0[/code], the result is equal to the [code]"RESET"[/code] animation.
|
||||||
|
If the number of tracks between the blended animations is different, the animation with the missing track is treated as if it had the initial value.
|
||||||
|
If [code]false[/code], The blend does not use the deterministic algorithm. The total weight is normalized and always [code]1.0[/code]. If the number of tracks between the blended animations is different, nothing is done about the animation that is missing a track.
|
||||||
|
[b]Note:[/b] In [AnimationTree], the blending with [AnimationNodeAdd2], [AnimationNodeAdd3], [AnimationNodeSub2] or the weight greater than [code]1.0[/code] may produce unexpected results.
|
||||||
|
For example, if [AnimationNodeAdd2] blends two nodes with the amount [code]1.0[/code], then total weight is [code]2.0[/code] but it will be normalized to make the total amount [code]1.0[/code] and the result will be equal to [AnimationNodeBlend2] with the amount [code]0.5[/code].
|
||||||
|
</member>
|
||||||
|
<member name="reset_on_save" type="bool" setter="set_reset_on_save_enabled" getter="is_reset_on_save_enabled" default="true">
|
||||||
|
This is used by the editor. If set to [code]true[/code], the scene will be saved with the effects of the reset animation (the animation with the key [code]"RESET"[/code]) applied as if it had been seeked to time 0, with the editor keeping the values that the scene had before saving.
|
||||||
|
This makes it more convenient to preview and edit animations in the editor, as changes to the scene will not be saved as long as they are set in the reset animation.
|
||||||
|
</member>
|
||||||
|
<member name="root_motion_track" type="NodePath" setter="set_root_motion_track" getter="get_root_motion_track" default="NodePath("")">
|
||||||
|
The path to the Animation track used for root motion. Paths must be valid scene-tree paths to a node, and must be specified starting from the parent node of the node that will reproduce the animation. To specify a track that controls properties or bones, append its name after the path, separated by [code]":"[/code]. For example, [code]"character/skeleton:ankle"[/code] or [code]"character/mesh:transform/local"[/code].
|
||||||
|
If the track has type [constant Animation.TYPE_POSITION_3D], [constant Animation.TYPE_ROTATION_3D] or [constant Animation.TYPE_SCALE_3D] the transformation will be canceled visually, and the animation will appear to stay in place. See also [method get_root_motion_position], [method get_root_motion_rotation], [method get_root_motion_scale] and [RootMotionView].
|
||||||
|
</member>
|
||||||
|
<member name="root_node" type="NodePath" setter="set_root_node" getter="get_root_node" default="NodePath("..")">
|
||||||
|
The node from which node path references will travel.
|
||||||
|
</member>
|
||||||
|
</members>
|
||||||
|
<signals>
|
||||||
|
<signal name="animation_finished">
|
||||||
|
<param index="0" name="anim_name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Notifies when an animation finished playing.
|
||||||
|
[b]Note:[/b] This signal is not emitted if an animation is looping.
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
<signal name="animation_libraries_updated">
|
||||||
|
<description>
|
||||||
|
Notifies when the animation libraries have changed.
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
<signal name="animation_list_changed">
|
||||||
|
<description>
|
||||||
|
Notifies when an animation list is changed.
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
<signal name="animation_started">
|
||||||
|
<param index="0" name="anim_name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Notifies when an animation starts playing.
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
<signal name="caches_cleared">
|
||||||
|
<description>
|
||||||
|
Notifies when the caches have been cleared, either automatically, or manually via [method clear_caches].
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
<signal name="mixer_updated">
|
||||||
|
<description>
|
||||||
|
Editor only. Notifies when the property have been updated to update dummy [AnimationPlayer] in animation player editor.
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
</signals>
|
||||||
|
<constants>
|
||||||
|
<constant name="ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS" value="0" enum="AnimationCallbackModeProcess">
|
||||||
|
Process animation during physics frames (see [constant Node.NOTIFICATION_INTERNAL_PHYSICS_PROCESS]). This is especially useful when animating physics bodies.
|
||||||
|
</constant>
|
||||||
|
<constant name="ANIMATION_CALLBACK_MODE_PROCESS_IDLE" value="1" enum="AnimationCallbackModeProcess">
|
||||||
|
Process animation during process frames (see [constant Node.NOTIFICATION_INTERNAL_PROCESS]).
|
||||||
|
</constant>
|
||||||
|
<constant name="ANIMATION_CALLBACK_MODE_PROCESS_MANUAL" value="2" enum="AnimationCallbackModeProcess">
|
||||||
|
Do not process animation. Use [method advance] to process the animation manually.
|
||||||
|
</constant>
|
||||||
|
<constant name="ANIMATION_CALLBACK_MODE_METHOD_DEFERRED" value="0" enum="AnimationCallbackModeMethod">
|
||||||
|
Batch method calls during the animation process, then do the calls after events are processed. This avoids bugs involving deleting nodes or modifying the AnimationPlayer while playing.
|
||||||
|
</constant>
|
||||||
|
<constant name="ANIMATION_CALLBACK_MODE_METHOD_IMMEDIATE" value="1" enum="AnimationCallbackModeMethod">
|
||||||
|
Make method calls immediately when reached in the animation.
|
||||||
|
</constant>
|
||||||
|
</constants>
|
||||||
|
</class>
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AnimationPlayer" inherits="Node" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
<class name="AnimationPlayer" inherits="AnimationMixer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
A node used for animation playback.
|
A node used for animation playback.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@ -15,51 +15,19 @@
|
||||||
<link title="Third Person Shooter Demo">https://godotengine.org/asset-library/asset/678</link>
|
<link title="Third Person Shooter Demo">https://godotengine.org/asset-library/asset/678</link>
|
||||||
</tutorials>
|
</tutorials>
|
||||||
<methods>
|
<methods>
|
||||||
<method name="_post_process_key_value" qualifiers="virtual const">
|
|
||||||
<return type="Variant" />
|
|
||||||
<param index="0" name="animation" type="Animation" />
|
|
||||||
<param index="1" name="track" type="int" />
|
|
||||||
<param index="2" name="value" type="Variant" />
|
|
||||||
<param index="3" name="object" type="Object" />
|
|
||||||
<param index="4" name="object_idx" type="int" />
|
|
||||||
<description>
|
|
||||||
A virtual function for processing after key getting during playback.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="add_animation_library">
|
|
||||||
<return type="int" enum="Error" />
|
|
||||||
<param index="0" name="name" type="StringName" />
|
|
||||||
<param index="1" name="library" type="AnimationLibrary" />
|
|
||||||
<description>
|
|
||||||
Adds [param library] to the animation player, under the key [param name].
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="advance">
|
|
||||||
<return type="void" />
|
|
||||||
<param index="0" name="delta" type="float" />
|
|
||||||
<description>
|
|
||||||
Shifts position in the animation timeline and immediately updates the animation. [param delta] is the time in seconds to shift. Events between the current frame and [param delta] are handled.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="animation_get_next" qualifiers="const">
|
<method name="animation_get_next" qualifiers="const">
|
||||||
<return type="StringName" />
|
<return type="StringName" />
|
||||||
<param index="0" name="anim_from" type="StringName" />
|
<param index="0" name="animation_from" type="StringName" />
|
||||||
<description>
|
<description>
|
||||||
Returns the key of the animation which is queued to play after the [param anim_from] animation.
|
Returns the key of the animation which is queued to play after the [param animation_from] animation.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="animation_set_next">
|
<method name="animation_set_next">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<param index="0" name="anim_from" type="StringName" />
|
<param index="0" name="animation_from" type="StringName" />
|
||||||
<param index="1" name="anim_to" type="StringName" />
|
<param index="1" name="animation_to" type="StringName" />
|
||||||
<description>
|
<description>
|
||||||
Triggers the [param anim_to] animation when the [param anim_from] animation completes.
|
Triggers the [param animation_to] animation when the [param animation_from] animation completes.
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="clear_caches">
|
|
||||||
<return type="void" />
|
|
||||||
<description>
|
|
||||||
[AnimationPlayer] caches animated nodes. It may not notice if a node disappears; [method clear_caches] forces it to update the cache again.
|
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="clear_queue">
|
<method name="clear_queue">
|
||||||
|
@ -68,55 +36,20 @@
|
||||||
Clears all queued, unplayed animations.
|
Clears all queued, unplayed animations.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="find_animation" qualifiers="const">
|
|
||||||
<return type="StringName" />
|
|
||||||
<param index="0" name="animation" type="Animation" />
|
|
||||||
<description>
|
|
||||||
Returns the key of [param animation] or an empty [StringName] if not found.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="find_animation_library" qualifiers="const">
|
|
||||||
<return type="StringName" />
|
|
||||||
<param index="0" name="animation" type="Animation" />
|
|
||||||
<description>
|
|
||||||
Returns the key for the [AnimationLibrary] that contains [param animation] or an empty [StringName] if not found.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_animation" qualifiers="const">
|
|
||||||
<return type="Animation" />
|
|
||||||
<param index="0" name="name" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Returns the [Animation] with the key [param name]. If the animation does not exist, [code]null[/code] is returned and an error is logged.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_animation_library" qualifiers="const">
|
|
||||||
<return type="AnimationLibrary" />
|
|
||||||
<param index="0" name="name" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Returns the first [AnimationLibrary] with key [param name] or [code]null[/code] if not found.
|
|
||||||
To get the [AnimationPlayer]'s global animation library, use [code]get_animation_library("")[/code].
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_animation_library_list" qualifiers="const">
|
|
||||||
<return type="StringName[]" />
|
|
||||||
<description>
|
|
||||||
Returns the list of stored library keys.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_animation_list" qualifiers="const">
|
|
||||||
<return type="PackedStringArray" />
|
|
||||||
<description>
|
|
||||||
Returns the list of stored animation keys.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_blend_time" qualifiers="const">
|
<method name="get_blend_time" qualifiers="const">
|
||||||
<return type="float" />
|
<return type="float" />
|
||||||
<param index="0" name="anim_from" type="StringName" />
|
<param index="0" name="animation_from" type="StringName" />
|
||||||
<param index="1" name="anim_to" type="StringName" />
|
<param index="1" name="animation_to" type="StringName" />
|
||||||
<description>
|
<description>
|
||||||
Returns the blend time (in seconds) between two animations, referenced by their keys.
|
Returns the blend time (in seconds) between two animations, referenced by their keys.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="get_method_call_mode" qualifiers="const" is_deprecated="true">
|
||||||
|
<return type="int" enum="AnimationPlayer.AnimationMethodCallMode" />
|
||||||
|
<description>
|
||||||
|
For backward compatibility. See [enum AnimationMixer.AnimationCallbackModeMethod].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="get_playing_speed" qualifiers="const">
|
<method name="get_playing_speed" qualifiers="const">
|
||||||
<return type="float" />
|
<return type="float" />
|
||||||
<description>
|
<description>
|
||||||
|
@ -124,24 +57,22 @@
|
||||||
Returns a negative value if the current animation is playing backwards.
|
Returns a negative value if the current animation is playing backwards.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="get_process_callback" qualifiers="const" is_deprecated="true">
|
||||||
|
<return type="int" enum="AnimationPlayer.AnimationProcessCallback" />
|
||||||
|
<description>
|
||||||
|
For backward compatibility. See [enum AnimationMixer.AnimationCallbackModeProcess].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="get_queue">
|
<method name="get_queue">
|
||||||
<return type="PackedStringArray" />
|
<return type="PackedStringArray" />
|
||||||
<description>
|
<description>
|
||||||
Returns a list of the animation keys that are currently queued to play.
|
Returns a list of the animation keys that are currently queued to play.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="has_animation" qualifiers="const">
|
<method name="get_root" qualifiers="const" is_deprecated="true">
|
||||||
<return type="bool" />
|
<return type="NodePath" />
|
||||||
<param index="0" name="name" type="StringName" />
|
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if the [AnimationPlayer] stores an [Animation] with key [param name].
|
For backward compatibility. See [member AnimationMixer.root_node].
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="has_animation_library" qualifiers="const">
|
|
||||||
<return type="bool" />
|
|
||||||
<param index="0" name="name" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Returns [code]true[/code] if the [AnimationPlayer] stores an [AnimationLibrary] with key [param name].
|
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="is_playing" qualifiers="const">
|
<method name="is_playing" qualifiers="const">
|
||||||
|
@ -187,39 +118,47 @@
|
||||||
[b]Note:[/b] If a looped animation is currently playing, the queued animation will never play unless the looped animation is stopped somehow.
|
[b]Note:[/b] If a looped animation is currently playing, the queued animation will never play unless the looped animation is stopped somehow.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="remove_animation_library">
|
|
||||||
<return type="void" />
|
|
||||||
<param index="0" name="name" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Removes the [AnimationLibrary] associated with the key [param name].
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="rename_animation_library">
|
|
||||||
<return type="void" />
|
|
||||||
<param index="0" name="name" type="StringName" />
|
|
||||||
<param index="1" name="newname" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Moves the [AnimationLibrary] associated with the key [param name] to the key [param newname].
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="seek">
|
<method name="seek">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<param index="0" name="seconds" type="float" />
|
<param index="0" name="seconds" type="float" />
|
||||||
<param index="1" name="update" type="bool" default="false" />
|
<param index="1" name="update" type="bool" default="false" />
|
||||||
|
<param index="2" name="update_only" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Seeks the animation to the [param seconds] point in time (in seconds). If [param update] is [code]true[/code], the animation updates too, otherwise it updates at process time. Events between the current frame and [param seconds] are skipped.
|
Seeks the animation to the [param seconds] point in time (in seconds). If [param update] is [code]true[/code], the animation updates too, otherwise it updates at process time. Events between the current frame and [param seconds] are skipped.
|
||||||
[b]Note:[/b] Seeking to the end of the animation doesn't emit [signal animation_finished]. If you want to skip animation and emit the signal, use [method advance].
|
If [param update_only] is true, the method / audio / animation playback tracks will not be processed.
|
||||||
|
[b]Note:[/b] Seeking to the end of the animation doesn't emit [signal AnimationMixer.animation_finished]. If you want to skip animation and emit the signal, use [method AnimationMixer.advance].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="set_blend_time">
|
<method name="set_blend_time">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<param index="0" name="anim_from" type="StringName" />
|
<param index="0" name="animation_from" type="StringName" />
|
||||||
<param index="1" name="anim_to" type="StringName" />
|
<param index="1" name="animation_to" type="StringName" />
|
||||||
<param index="2" name="sec" type="float" />
|
<param index="2" name="sec" type="float" />
|
||||||
<description>
|
<description>
|
||||||
Specifies a blend time (in seconds) between two animations, referenced by their keys.
|
Specifies a blend time (in seconds) between two animations, referenced by their keys.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="set_method_call_mode" is_deprecated="true">
|
||||||
|
<return type="void" />
|
||||||
|
<param index="0" name="mode" type="int" enum="AnimationPlayer.AnimationMethodCallMode" />
|
||||||
|
<description>
|
||||||
|
For backward compatibility. See [enum AnimationMixer.AnimationCallbackModeMethod].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="set_process_callback" is_deprecated="true">
|
||||||
|
<return type="void" />
|
||||||
|
<param index="0" name="mode" type="int" enum="AnimationPlayer.AnimationProcessCallback" />
|
||||||
|
<description>
|
||||||
|
For backward compatibility. See [enum AnimationMixer.AnimationCallbackModeProcess].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="set_root" is_deprecated="true">
|
||||||
|
<return type="void" />
|
||||||
|
<param index="0" name="path" type="NodePath" />
|
||||||
|
<description>
|
||||||
|
For backward compatibility. See [member AnimationMixer.root_node].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="stop">
|
<method name="stop">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<param index="0" name="keep_state" type="bool" default="false" />
|
<param index="0" name="keep_state" type="bool" default="false" />
|
||||||
|
@ -234,10 +173,6 @@
|
||||||
<member name="assigned_animation" type="String" setter="set_assigned_animation" getter="get_assigned_animation">
|
<member name="assigned_animation" type="String" setter="set_assigned_animation" getter="get_assigned_animation">
|
||||||
If playing, the current animation's key, otherwise, the animation last played. When set, this changes the animation, but will not play it unless already playing. See also [member current_animation].
|
If playing, the current animation's key, otherwise, the animation last played. When set, this changes the animation, but will not play it unless already playing. See also [member current_animation].
|
||||||
</member>
|
</member>
|
||||||
<member name="audio_max_polyphony" type="int" setter="set_audio_max_polyphony" getter="get_audio_max_polyphony" default="32">
|
|
||||||
The number of possible simultaneous sounds for each of the assigned AudioStreamPlayers.
|
|
||||||
For example, if this value is [code]32[/code] and the animation has two audio tracks, the two [AudioStreamPlayer]s assigned can play simultaneously up to [code]32[/code] voices each.
|
|
||||||
</member>
|
|
||||||
<member name="autoplay" type="String" setter="set_autoplay" getter="get_autoplay" default="""">
|
<member name="autoplay" type="String" setter="set_autoplay" getter="get_autoplay" default="""">
|
||||||
The key of the animation to play when the scene loads.
|
The key of the animation to play when the scene loads.
|
||||||
</member>
|
</member>
|
||||||
|
@ -251,29 +186,13 @@
|
||||||
<member name="current_animation_position" type="float" setter="" getter="get_current_animation_position">
|
<member name="current_animation_position" type="float" setter="" getter="get_current_animation_position">
|
||||||
The position (in seconds) of the currently playing animation.
|
The position (in seconds) of the currently playing animation.
|
||||||
</member>
|
</member>
|
||||||
<member name="method_call_mode" type="int" setter="set_method_call_mode" getter="get_method_call_mode" enum="AnimationPlayer.AnimationMethodCallMode" default="0">
|
|
||||||
The call mode to use for Call Method tracks.
|
|
||||||
</member>
|
|
||||||
<member name="movie_quit_on_finish" type="bool" setter="set_movie_quit_on_finish_enabled" getter="is_movie_quit_on_finish_enabled" default="false">
|
<member name="movie_quit_on_finish" type="bool" setter="set_movie_quit_on_finish_enabled" getter="is_movie_quit_on_finish_enabled" default="false">
|
||||||
If [code]true[/code] and the engine is running in Movie Maker mode (see [MovieWriter]), exits the engine with [method SceneTree.quit] as soon as an animation is done playing in this [AnimationPlayer]. A message is printed when the engine quits for this reason.
|
If [code]true[/code] and the engine is running in Movie Maker mode (see [MovieWriter]), exits the engine with [method SceneTree.quit] as soon as an animation is done playing in this [AnimationPlayer]. A message is printed when the engine quits for this reason.
|
||||||
[b]Note:[/b] This obeys the same logic as the [signal animation_finished] signal, so it will not quit the engine if the animation is set to be looping.
|
[b]Note:[/b] This obeys the same logic as the [signal AnimationMixer.animation_finished] signal, so it will not quit the engine if the animation is set to be looping.
|
||||||
</member>
|
|
||||||
<member name="playback_active" type="bool" setter="set_active" getter="is_active">
|
|
||||||
If [code]true[/code], updates animations in response to process-related notifications.
|
|
||||||
</member>
|
</member>
|
||||||
<member name="playback_default_blend_time" type="float" setter="set_default_blend_time" getter="get_default_blend_time" default="0.0">
|
<member name="playback_default_blend_time" type="float" setter="set_default_blend_time" getter="get_default_blend_time" default="0.0">
|
||||||
The default time in which to blend animations. Ranges from 0 to 4096 with 0.01 precision.
|
The default time in which to blend animations. Ranges from 0 to 4096 with 0.01 precision.
|
||||||
</member>
|
</member>
|
||||||
<member name="playback_process_mode" type="int" setter="set_process_callback" getter="get_process_callback" enum="AnimationPlayer.AnimationProcessCallback" default="1">
|
|
||||||
The process notification in which to update animations.
|
|
||||||
</member>
|
|
||||||
<member name="reset_on_save" type="bool" setter="set_reset_on_save_enabled" getter="is_reset_on_save_enabled" default="true">
|
|
||||||
This is used by the editor. If set to [code]true[/code], the scene will be saved with the effects of the reset animation (the animation with the key [code]"RESET"[/code]) applied as if it had been seeked to time 0, with the editor keeping the values that the scene had before saving.
|
|
||||||
This makes it more convenient to preview and edit animations in the editor, as changes to the scene will not be saved as long as they are set in the reset animation.
|
|
||||||
</member>
|
|
||||||
<member name="root_node" type="NodePath" setter="set_root" getter="get_root" default="NodePath("..")">
|
|
||||||
The node from which node path references will travel.
|
|
||||||
</member>
|
|
||||||
<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0">
|
<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0">
|
||||||
The speed scaling ratio. For example, if this value is [code]1[/code], then the animation plays at normal speed. If it's [code]0.5[/code], then it plays at half speed. If it's [code]2[/code], then it plays at double speed.
|
The speed scaling ratio. For example, if this value is [code]1[/code], then the animation plays at normal speed. If it's [code]0.5[/code], then it plays at half speed. If it's [code]2[/code], then it plays at double speed.
|
||||||
If set to a negative value, the animation is played in reverse. If set to [code]0[/code], the animation will not advance.
|
If set to a negative value, the animation is played in reverse. If set to [code]0[/code], the animation will not advance.
|
||||||
|
@ -284,54 +203,32 @@
|
||||||
<param index="0" name="old_name" type="StringName" />
|
<param index="0" name="old_name" type="StringName" />
|
||||||
<param index="1" name="new_name" type="StringName" />
|
<param index="1" name="new_name" type="StringName" />
|
||||||
<description>
|
<description>
|
||||||
Emitted when a queued animation plays after the previous animation finished. See [method queue].
|
Emitted when a queued animation plays after the previous animation finished. See also [method AnimationPlayer.queue].
|
||||||
[b]Note:[/b] The signal is not emitted when the animation is changed via [method play] or by an [AnimationTree].
|
[b]Note:[/b] The signal is not emitted when the animation is changed via [method AnimationPlayer.play] or by an [AnimationTree].
|
||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="animation_finished">
|
<signal name="current_animation_changed">
|
||||||
<param index="0" name="anim_name" type="StringName" />
|
<param index="0" name="name" type="String" />
|
||||||
<description>
|
<description>
|
||||||
Notifies when an animation finished playing.
|
Emitted when [member current_animation] changes.
|
||||||
[b]Note:[/b] This signal is not emitted if an animation is looping.
|
|
||||||
</description>
|
|
||||||
</signal>
|
|
||||||
<signal name="animation_libraries_updated">
|
|
||||||
<description>
|
|
||||||
Notifies when the animation libraries have changed.
|
|
||||||
</description>
|
|
||||||
</signal>
|
|
||||||
<signal name="animation_list_changed">
|
|
||||||
<description>
|
|
||||||
Notifies when an animation list is changed.
|
|
||||||
</description>
|
|
||||||
</signal>
|
|
||||||
<signal name="animation_started">
|
|
||||||
<param index="0" name="anim_name" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Notifies when an animation starts playing.
|
|
||||||
</description>
|
|
||||||
</signal>
|
|
||||||
<signal name="caches_cleared">
|
|
||||||
<description>
|
|
||||||
Notifies when the caches have been cleared, either automatically, or manually via [method clear_caches].
|
|
||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
</signals>
|
</signals>
|
||||||
<constants>
|
<constants>
|
||||||
<constant name="ANIMATION_PROCESS_PHYSICS" value="0" enum="AnimationProcessCallback">
|
<constant name="ANIMATION_PROCESS_PHYSICS" value="0" enum="AnimationProcessCallback" is_deprecated="true">
|
||||||
Process animation during physics frames (see [constant Node.NOTIFICATION_INTERNAL_PHYSICS_PROCESS]). This is especially useful when animating physics bodies.
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ANIMATION_PROCESS_IDLE" value="1" enum="AnimationProcessCallback">
|
<constant name="ANIMATION_PROCESS_IDLE" value="1" enum="AnimationProcessCallback" is_deprecated="true">
|
||||||
Process animation during process frames (see [constant Node.NOTIFICATION_INTERNAL_PROCESS]).
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_IDLE].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ANIMATION_PROCESS_MANUAL" value="2" enum="AnimationProcessCallback">
|
<constant name="ANIMATION_PROCESS_MANUAL" value="2" enum="AnimationProcessCallback" is_deprecated="true">
|
||||||
Do not process animation. Use [method advance] to process the animation manually.
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_MANUAL].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ANIMATION_METHOD_CALL_DEFERRED" value="0" enum="AnimationMethodCallMode">
|
<constant name="ANIMATION_METHOD_CALL_DEFERRED" value="0" enum="AnimationMethodCallMode" is_deprecated="true">
|
||||||
Batch method calls during the animation process, then do the calls after events are processed. This avoids bugs involving deleting nodes or modifying the AnimationPlayer while playing.
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_METHOD_DEFERRED].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ANIMATION_METHOD_CALL_IMMEDIATE" value="1" enum="AnimationMethodCallMode">
|
<constant name="ANIMATION_METHOD_CALL_IMMEDIATE" value="1" enum="AnimationMethodCallMode" is_deprecated="true">
|
||||||
Make method calls immediately when reached in the animation.
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_METHOD_IMMEDIATE].
|
||||||
</constant>
|
</constant>
|
||||||
</constants>
|
</constants>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AnimationTree" inherits="Node" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
<class name="AnimationTree" inherits="AnimationMixer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
A node used for advanced animation transitions in an [AnimationPlayer].
|
A node used for advanced animation transitions in an [AnimationPlayer].
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@ -12,220 +12,48 @@
|
||||||
<link title="Third Person Shooter Demo">https://godotengine.org/asset-library/asset/678</link>
|
<link title="Third Person Shooter Demo">https://godotengine.org/asset-library/asset/678</link>
|
||||||
</tutorials>
|
</tutorials>
|
||||||
<methods>
|
<methods>
|
||||||
<method name="_post_process_key_value" qualifiers="virtual const">
|
<method name="get_process_callback" qualifiers="const" is_deprecated="true">
|
||||||
<return type="Variant" />
|
<return type="int" enum="AnimationTree.AnimationProcessCallback" />
|
||||||
<param index="0" name="animation" type="Animation" />
|
|
||||||
<param index="1" name="track" type="int" />
|
|
||||||
<param index="2" name="value" type="Variant" />
|
|
||||||
<param index="3" name="object" type="Object" />
|
|
||||||
<param index="4" name="object_idx" type="int" />
|
|
||||||
<description>
|
<description>
|
||||||
A virtual function for processing after key getting during playback.
|
For backward compatibility. See [enum AnimationMixer.AnimationCallbackModeProcess].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="advance">
|
<method name="set_process_callback" is_deprecated="true">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<param index="0" name="delta" type="float" />
|
<param index="0" name="mode" type="int" enum="AnimationTree.AnimationProcessCallback" />
|
||||||
<description>
|
<description>
|
||||||
Manually advance the animations by the specified time (in seconds).
|
For backward compatibility. See [enum AnimationMixer.AnimationCallbackModeProcess].
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_root_motion_position" qualifiers="const">
|
|
||||||
<return type="Vector3" />
|
|
||||||
<description>
|
|
||||||
Retrieve the motion delta of position with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
|
||||||
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_POSITION_3D], returns [code]Vector3(0, 0, 0)[/code].
|
|
||||||
See also [member root_motion_track] and [RootMotionView].
|
|
||||||
The most basic example is applying position to [CharacterBody3D]:
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
var current_rotation: Quaternion
|
|
||||||
|
|
||||||
func _process(delta):
|
|
||||||
if Input.is_action_just_pressed("animate"):
|
|
||||||
current_rotation = get_quaternion()
|
|
||||||
state_machine.travel("Animate")
|
|
||||||
var velocity: Vector3 = current_rotation * animation_tree.get_root_motion_position() / delta
|
|
||||||
set_velocity(velocity)
|
|
||||||
move_and_slide()
|
|
||||||
[/gdscript]
|
|
||||||
[/codeblocks]
|
|
||||||
By using this in combination with [method get_root_motion_position_accumulator], you can apply the root motion position more correctly to account for the rotation of the node.
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
func _process(delta):
|
|
||||||
if Input.is_action_just_pressed("animate"):
|
|
||||||
state_machine.travel("Animate")
|
|
||||||
set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
|
|
||||||
var velocity: Vector3 = (animation_tree.get_root_motion_rotation_accumulator().inverse() * get_quaternion()) * animation_tree.get_root_motion_position() / delta
|
|
||||||
set_velocity(velocity)
|
|
||||||
move_and_slide()
|
|
||||||
[/gdscript]
|
|
||||||
[/codeblocks]
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_root_motion_position_accumulator" qualifiers="const">
|
|
||||||
<return type="Vector3" />
|
|
||||||
<description>
|
|
||||||
Retrieve the blended value of the position tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
|
||||||
This is useful in cases where you want to respect the initial key values of the animation.
|
|
||||||
For example, if an animation with only one key [code]Vector3(0, 0, 0)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(1, 0, 1)[/code] is played in the next frame, the difference can be calculated as follows:
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
var prev_root_motion_position_accumulator: Vector3
|
|
||||||
|
|
||||||
func _process(delta):
|
|
||||||
if Input.is_action_just_pressed("animate"):
|
|
||||||
state_machine.travel("Animate")
|
|
||||||
var current_root_motion_position_accumulator: Vector3 = animation_tree.get_root_motion_position_accumulator()
|
|
||||||
var difference: Vector3 = current_root_motion_position_accumulator - prev_root_motion_position_accumulator
|
|
||||||
prev_root_motion_position_accumulator = current_root_motion_position_accumulator
|
|
||||||
transform.origin += difference
|
|
||||||
[/gdscript]
|
|
||||||
[/codeblocks]
|
|
||||||
However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_root_motion_rotation" qualifiers="const">
|
|
||||||
<return type="Quaternion" />
|
|
||||||
<description>
|
|
||||||
Retrieve the motion delta of rotation with the [member root_motion_track] as a [Quaternion] that can be used elsewhere.
|
|
||||||
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_ROTATION_3D], returns [code]Quaternion(0, 0, 0, 1)[/code].
|
|
||||||
See also [member root_motion_track] and [RootMotionView].
|
|
||||||
The most basic example is applying rotation to [CharacterBody3D]:
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
func _process(delta):
|
|
||||||
if Input.is_action_just_pressed("animate"):
|
|
||||||
state_machine.travel("Animate")
|
|
||||||
set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
|
|
||||||
[/gdscript]
|
|
||||||
[/codeblocks]
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_root_motion_rotation_accumulator" qualifiers="const">
|
|
||||||
<return type="Quaternion" />
|
|
||||||
<description>
|
|
||||||
Retrieve the blended value of the rotation tracks with the [member root_motion_track] as a [Quaternion] that can be used elsewhere.
|
|
||||||
This is necessary to apply the root motion position correctly, taking rotation into account. See also [method get_root_motion_position].
|
|
||||||
Also, this is useful in cases where you want to respect the initial key values of the animation.
|
|
||||||
For example, if an animation with only one key [code]Quaternion(0, 0, 0, 1)[/code] is played in the previous frame and then an animation with only one key [code]Quaternion(0, 0.707, 0, 0.707)[/code] is played in the next frame, the difference can be calculated as follows:
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
var prev_root_motion_rotation_accumulator: Quaternion
|
|
||||||
|
|
||||||
func _process(delta):
|
|
||||||
if Input.is_action_just_pressed("animate"):
|
|
||||||
state_machine.travel("Animate")
|
|
||||||
var current_root_motion_rotation_accumulator: Quaternion = animation_tree.get_root_motion_Quaternion_accumulator()
|
|
||||||
var difference: Quaternion = prev_root_motion_rotation_accumulator.inverse() * current_root_motion_rotation_accumulator
|
|
||||||
prev_root_motion_rotation_accumulator = current_root_motion_rotation_accumulator
|
|
||||||
transform.basis *= difference
|
|
||||||
[/gdscript]
|
|
||||||
[/codeblocks]
|
|
||||||
However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_root_motion_scale" qualifiers="const">
|
|
||||||
<return type="Vector3" />
|
|
||||||
<description>
|
|
||||||
Retrieve the motion delta of scale with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
|
||||||
If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_SCALE_3D], returns [code]Vector3(0, 0, 0)[/code].
|
|
||||||
See also [member root_motion_track] and [RootMotionView].
|
|
||||||
The most basic example is applying scale to [CharacterBody3D]:
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
var current_scale: Vector3 = Vector3(1, 1, 1)
|
|
||||||
var scale_accum: Vector3 = Vector3(1, 1, 1)
|
|
||||||
|
|
||||||
func _process(delta):
|
|
||||||
if Input.is_action_just_pressed("animate"):
|
|
||||||
current_scale = get_scale()
|
|
||||||
scale_accum = Vector3(1, 1, 1)
|
|
||||||
state_machine.travel("Animate")
|
|
||||||
scale_accum += animation_tree.get_root_motion_scale()
|
|
||||||
set_scale(current_scale * scale_accum)
|
|
||||||
[/gdscript]
|
|
||||||
[/codeblocks]
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_root_motion_scale_accumulator" qualifiers="const">
|
|
||||||
<return type="Vector3" />
|
|
||||||
<description>
|
|
||||||
Retrieve the blended value of the scale tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere.
|
|
||||||
For example, if an animation with only one key [code]Vector3(1, 1, 1)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(2, 2, 2)[/code] is played in the next frame, the difference can be calculated as follows:
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
var prev_root_motion_scale_accumulator: Vector3
|
|
||||||
|
|
||||||
func _process(delta):
|
|
||||||
if Input.is_action_just_pressed("animate"):
|
|
||||||
state_machine.travel("Animate")
|
|
||||||
var current_root_motion_scale_accumulator: Vector3 = animation_tree.get_root_motion_scale_accumulator()
|
|
||||||
var difference: Vector3 = current_root_motion_scale_accumulator - prev_root_motion_scale_accumulator
|
|
||||||
prev_root_motion_scale_accumulator = current_root_motion_scale_accumulator
|
|
||||||
transform.basis = transform.basis.scaled(difference)
|
|
||||||
[/gdscript]
|
|
||||||
[/codeblocks]
|
|
||||||
However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases.
|
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
</methods>
|
</methods>
|
||||||
<members>
|
<members>
|
||||||
<member name="active" type="bool" setter="set_active" getter="is_active" default="false">
|
|
||||||
If [code]true[/code], the [AnimationTree] will be processing.
|
|
||||||
</member>
|
|
||||||
<member name="advance_expression_base_node" type="NodePath" setter="set_advance_expression_base_node" getter="get_advance_expression_base_node" default="NodePath(".")">
|
<member name="advance_expression_base_node" type="NodePath" setter="set_advance_expression_base_node" getter="get_advance_expression_base_node" default="NodePath(".")">
|
||||||
The path to the [Node] used to evaluate the AnimationNode [Expression] if one is not explicitly specified internally.
|
The path to the [Node] used to evaluate the [AnimationNode] [Expression] if one is not explicitly specified internally.
|
||||||
</member>
|
</member>
|
||||||
<member name="anim_player" type="NodePath" setter="set_animation_player" getter="get_animation_player" default="NodePath("")">
|
<member name="anim_player" type="NodePath" setter="set_animation_player" getter="get_animation_player" default="NodePath("")">
|
||||||
The path to the [AnimationPlayer] used for animating.
|
The path to the [AnimationPlayer] used for animating.
|
||||||
</member>
|
</member>
|
||||||
<member name="audio_max_polyphony" type="int" setter="set_audio_max_polyphony" getter="get_audio_max_polyphony" default="32">
|
<member name="deterministic" type="bool" setter="set_deterministic" getter="is_deterministic" overrides="AnimationMixer" default="true" />
|
||||||
The number of possible simultaneous sounds for each of the assigned AudioStreamPlayers.
|
<member name="tree_root" type="AnimationRootNode" setter="set_tree_root" getter="get_tree_root">
|
||||||
For example, if this value is [code]32[/code] and the animation has two audio tracks, the two [AudioStreamPlayer]s assigned can play simultaneously up to [code]32[/code] voices each.
|
The root animation node of this [AnimationTree]. See [AnimationRootNode].
|
||||||
</member>
|
|
||||||
<member name="process_callback" type="int" setter="set_process_callback" getter="get_process_callback" enum="AnimationTree.AnimationProcessCallback" default="1">
|
|
||||||
The process mode of this [AnimationTree]. See [enum AnimationProcessCallback] for available modes.
|
|
||||||
</member>
|
|
||||||
<member name="root_motion_track" type="NodePath" setter="set_root_motion_track" getter="get_root_motion_track" default="NodePath("")">
|
|
||||||
The path to the Animation track used for root motion. Paths must be valid scene-tree paths to a node, and must be specified starting from the parent node of the node that will reproduce the animation. To specify a track that controls properties or bones, append its name after the path, separated by [code]":"[/code]. For example, [code]"character/skeleton:ankle"[/code] or [code]"character/mesh:transform/local"[/code].
|
|
||||||
If the track has type [constant Animation.TYPE_POSITION_3D], [constant Animation.TYPE_ROTATION_3D] or [constant Animation.TYPE_SCALE_3D] the transformation will be canceled visually, and the animation will appear to stay in place. See also [method get_root_motion_position], [method get_root_motion_rotation], [method get_root_motion_scale] and [RootMotionView].
|
|
||||||
</member>
|
|
||||||
<member name="tree_root" type="AnimationNode" setter="set_tree_root" getter="get_tree_root">
|
|
||||||
The root animation node of this [AnimationTree]. See [AnimationNode].
|
|
||||||
</member>
|
</member>
|
||||||
</members>
|
</members>
|
||||||
<signals>
|
<signals>
|
||||||
<signal name="animation_finished">
|
|
||||||
<param index="0" name="anim_name" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Notifies when an animation finished playing.
|
|
||||||
[b]Note:[/b] This signal is not emitted if an animation is looping or aborted. Also be aware of the possibility of unseen playback by sync and xfade.
|
|
||||||
</description>
|
|
||||||
</signal>
|
|
||||||
<signal name="animation_player_changed">
|
<signal name="animation_player_changed">
|
||||||
<description>
|
<description>
|
||||||
Emitted when the [member anim_player] is changed.
|
Emitted when the [member anim_player] is changed.
|
||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="animation_started">
|
|
||||||
<param index="0" name="anim_name" type="StringName" />
|
|
||||||
<description>
|
|
||||||
Notifies when an animation starts playing.
|
|
||||||
[b]Note:[/b] This signal is not emitted if an animation is looping or playbacked from the middle. Also be aware of the possibility of unseen playback by sync and xfade.
|
|
||||||
</description>
|
|
||||||
</signal>
|
|
||||||
</signals>
|
</signals>
|
||||||
<constants>
|
<constants>
|
||||||
<constant name="ANIMATION_PROCESS_PHYSICS" value="0" enum="AnimationProcessCallback">
|
<constant name="ANIMATION_PROCESS_PHYSICS" value="0" enum="AnimationProcessCallback" is_deprecated="true">
|
||||||
The animations will progress during physics frames (see [constant Node.NOTIFICATION_INTERNAL_PHYSICS_PROCESS]).
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ANIMATION_PROCESS_IDLE" value="1" enum="AnimationProcessCallback">
|
<constant name="ANIMATION_PROCESS_IDLE" value="1" enum="AnimationProcessCallback" is_deprecated="true">
|
||||||
The animations will progress during process frames (see [constant Node.NOTIFICATION_INTERNAL_PROCESS]).
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_IDLE].
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ANIMATION_PROCESS_MANUAL" value="2" enum="AnimationProcessCallback">
|
<constant name="ANIMATION_PROCESS_MANUAL" value="2" enum="AnimationProcessCallback" is_deprecated="true">
|
||||||
The animations will only progress manually (see [method advance]).
|
For backward compatibility. See [constant AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_MANUAL].
|
||||||
</constant>
|
</constant>
|
||||||
</constants>
|
</constants>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -317,7 +317,15 @@
|
||||||
<signals>
|
<signals>
|
||||||
<signal name="bus_layout_changed">
|
<signal name="bus_layout_changed">
|
||||||
<description>
|
<description>
|
||||||
Emitted when the [AudioBusLayout] changes.
|
Emitted when an audio bus is added, deleted, or moved.
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
<signal name="bus_renamed">
|
||||||
|
<param index="0" name="bus_index" type="int" />
|
||||||
|
<param index="1" name="old_name" type="StringName" />
|
||||||
|
<param index="2" name="new_name" type="StringName" />
|
||||||
|
<description>
|
||||||
|
Emitted when the audio bus at [param bus_index] is renamed from [param old_name] to [param new_name].
|
||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
</signals>
|
</signals>
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
The [AudioStream] object to be played.
|
The [AudioStream] object to be played.
|
||||||
</member>
|
</member>
|
||||||
<member name="stream_paused" type="bool" setter="set_stream_paused" getter="get_stream_paused" default="false">
|
<member name="stream_paused" type="bool" setter="set_stream_paused" getter="get_stream_paused" default="false">
|
||||||
If [code]true[/code], the playback is paused. You can resume it by setting [code]stream_paused[/code] to [code]false[/code].
|
If [code]true[/code], the playback is paused. You can resume it by setting [member stream_paused] to [code]false[/code].
|
||||||
</member>
|
</member>
|
||||||
<member name="volume_db" type="float" setter="set_volume_db" getter="get_volume_db" default="0.0">
|
<member name="volume_db" type="float" setter="set_volume_db" getter="get_volume_db" default="0.0">
|
||||||
Volume of sound, in dB.
|
Volume of sound, in dB.
|
||||||
|
|
|
@ -85,7 +85,7 @@
|
||||||
The [AudioStream] object to be played.
|
The [AudioStream] object to be played.
|
||||||
</member>
|
</member>
|
||||||
<member name="stream_paused" type="bool" setter="set_stream_paused" getter="get_stream_paused" default="false">
|
<member name="stream_paused" type="bool" setter="set_stream_paused" getter="get_stream_paused" default="false">
|
||||||
If [code]true[/code], the playback is paused. You can resume it by setting [code]stream_paused[/code] to [code]false[/code].
|
If [code]true[/code], the playback is paused. You can resume it by setting [member stream_paused] to [code]false[/code].
|
||||||
</member>
|
</member>
|
||||||
<member name="volume_db" type="float" setter="set_volume_db" getter="get_volume_db" default="0.0">
|
<member name="volume_db" type="float" setter="set_volume_db" getter="get_volume_db" default="0.0">
|
||||||
Base volume before attenuation.
|
Base volume before attenuation.
|
||||||
|
|
|
@ -184,11 +184,11 @@
|
||||||
</member>
|
</member>
|
||||||
<member name="distance_fade_max_distance" type="float" setter="set_distance_fade_max_distance" getter="get_distance_fade_max_distance" default="10.0">
|
<member name="distance_fade_max_distance" type="float" setter="set_distance_fade_max_distance" getter="get_distance_fade_max_distance" default="10.0">
|
||||||
Distance at which the object appears fully opaque.
|
Distance at which the object appears fully opaque.
|
||||||
[b]Note:[/b] If [code]distance_fade_max_distance[/code] is less than [code]distance_fade_min_distance[/code], the behavior will be reversed. The object will start to fade away at [code]distance_fade_max_distance[/code] and will fully disappear once it reaches [code]distance_fade_min_distance[/code].
|
[b]Note:[/b] If [member distance_fade_max_distance] is less than [member distance_fade_min_distance], the behavior will be reversed. The object will start to fade away at [member distance_fade_max_distance] and will fully disappear once it reaches [member distance_fade_min_distance].
|
||||||
</member>
|
</member>
|
||||||
<member name="distance_fade_min_distance" type="float" setter="set_distance_fade_min_distance" getter="get_distance_fade_min_distance" default="0.0">
|
<member name="distance_fade_min_distance" type="float" setter="set_distance_fade_min_distance" getter="get_distance_fade_min_distance" default="0.0">
|
||||||
Distance at which the object starts to become visible. If the object is less than this distance away, it will be invisible.
|
Distance at which the object starts to become visible. If the object is less than this distance away, it will be invisible.
|
||||||
[b]Note:[/b] If [code]distance_fade_min_distance[/code] is greater than [code]distance_fade_max_distance[/code], the behavior will be reversed. The object will start to fade away at [code]distance_fade_max_distance[/code] and will fully disappear once it reaches [code]distance_fade_min_distance[/code].
|
[b]Note:[/b] If [member distance_fade_min_distance] is greater than [member distance_fade_max_distance], the behavior will be reversed. The object will start to fade away at [member distance_fade_max_distance] and will fully disappear once it reaches [member distance_fade_min_distance].
|
||||||
</member>
|
</member>
|
||||||
<member name="distance_fade_mode" type="int" setter="set_distance_fade" getter="get_distance_fade" enum="BaseMaterial3D.DistanceFadeMode" default="0">
|
<member name="distance_fade_mode" type="int" setter="set_distance_fade" getter="get_distance_fade" enum="BaseMaterial3D.DistanceFadeMode" default="0">
|
||||||
Specifies which type of fade to use. Can be any of the [enum DistanceFadeMode]s.
|
Specifies which type of fade to use. Can be any of the [enum DistanceFadeMode]s.
|
||||||
|
|
|
@ -106,6 +106,12 @@
|
||||||
Returns the inverse of the matrix.
|
Returns the inverse of the matrix.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="is_conformal" qualifiers="const">
|
||||||
|
<return type="bool" />
|
||||||
|
<description>
|
||||||
|
Returns [code]true[/code] if the basis is conformal, meaning it preserves angles and distance ratios, and may only be composed of rotation and uniform scale. Returns [code]false[/code] if the basis has non-uniform scale or shear/skew. This can be used to validate if the basis is non-distorted, which is important for physics and other use cases.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="is_equal_approx" qualifiers="const">
|
<method name="is_equal_approx" qualifiers="const">
|
||||||
<return type="bool" />
|
<return type="bool" />
|
||||||
<param index="0" name="b" type="Basis" />
|
<param index="0" name="b" type="Basis" />
|
||||||
|
@ -201,7 +207,7 @@
|
||||||
<constants>
|
<constants>
|
||||||
<constant name="IDENTITY" value="Basis(1, 0, 0, 0, 1, 0, 0, 0, 1)">
|
<constant name="IDENTITY" value="Basis(1, 0, 0, 0, 1, 0, 0, 0, 1)">
|
||||||
The identity basis, with no rotation or scaling applied.
|
The identity basis, with no rotation or scaling applied.
|
||||||
This is identical to calling [code]Basis()[/code] without any parameters. This constant can be used to make your code clearer, and for consistency with C#.
|
This is identical to creating [constructor Basis] without any parameters. This constant can be used to make your code clearer, and for consistency with C#.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="FLIP_X" value="Basis(-1, 0, 0, 0, 1, 0, 0, 0, 1)">
|
<constant name="FLIP_X" value="Basis(-1, 0, 0, 0, 1, 0, 0, 0, 1)">
|
||||||
The basis that will flip something along the X axis when used in a transformation.
|
The basis that will flip something along the X axis when used in a transformation.
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<method name="get_skeleton_rest" qualifiers="const">
|
<method name="get_skeleton_rest" qualifiers="const">
|
||||||
<return type="Transform2D" />
|
<return type="Transform2D" />
|
||||||
<description>
|
<description>
|
||||||
Returns the node's [member rest] [code]Transform2D[/code] if it doesn't have a parent, or its rest pose relative to its parent.
|
Returns the node's [member rest] [Transform2D] if it doesn't have a parent, or its rest pose relative to its parent.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="set_autocalculate_length_and_angle">
|
<method name="set_autocalculate_length_and_angle">
|
||||||
|
|
|
@ -131,20 +131,40 @@
|
||||||
<theme_item name="font_size" data_type="font_size" type="int">
|
<theme_item name="font_size" data_type="font_size" type="int">
|
||||||
Font size of the [Button]'s text.
|
Font size of the [Button]'s text.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
<theme_item name="icon" data_type="icon" type="Texture2D">
|
||||||
|
</theme_item>
|
||||||
<theme_item name="disabled" data_type="style" type="StyleBox">
|
<theme_item name="disabled" data_type="style" type="StyleBox">
|
||||||
[StyleBox] used when the [Button] is disabled.
|
[StyleBox] used when the [Button] is disabled.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
<theme_item name="disabled_mirrored" data_type="style" type="StyleBox">
|
||||||
|
[StyleBox] used when the [Button] is disabled (for right-to-left layouts).
|
||||||
|
</theme_item>
|
||||||
<theme_item name="focus" data_type="style" type="StyleBox">
|
<theme_item name="focus" data_type="style" type="StyleBox">
|
||||||
[StyleBox] used when the [Button] is focused. The [code]focus[/code] [StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially transparent [StyleBox] should be used to ensure the base [StyleBox] remains visible. A [StyleBox] that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a [StyleBoxEmpty] resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons.
|
[StyleBox] used when the [Button] is focused. The [theme_item focus] [StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially transparent [StyleBox] should be used to ensure the base [StyleBox] remains visible. A [StyleBox] that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a [StyleBoxEmpty] resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="hover" data_type="style" type="StyleBox">
|
<theme_item name="hover" data_type="style" type="StyleBox">
|
||||||
[StyleBox] used when the [Button] is being hovered.
|
[StyleBox] used when the [Button] is being hovered.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
<theme_item name="hover_mirrored" data_type="style" type="StyleBox">
|
||||||
|
[StyleBox] used when the [Button] is being hovered (for right-to-left layouts).
|
||||||
|
</theme_item>
|
||||||
|
<theme_item name="hover_pressed" data_type="style" type="StyleBox">
|
||||||
|
[StyleBox] used when the [Button] is being pressed and hovered at the same time.
|
||||||
|
</theme_item>
|
||||||
|
<theme_item name="hover_pressed_mirrored" data_type="style" type="StyleBox">
|
||||||
|
[StyleBox] used when the [Button] is being pressed and hovered at the same time (for right-to-left layouts).
|
||||||
|
</theme_item>
|
||||||
<theme_item name="normal" data_type="style" type="StyleBox">
|
<theme_item name="normal" data_type="style" type="StyleBox">
|
||||||
Default [StyleBox] for the [Button].
|
Default [StyleBox] for the [Button].
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
<theme_item name="normal_mirrored" data_type="style" type="StyleBox">
|
||||||
|
Default [StyleBox] for the [Button] (for right-to-left layouts).
|
||||||
|
</theme_item>
|
||||||
<theme_item name="pressed" data_type="style" type="StyleBox">
|
<theme_item name="pressed" data_type="style" type="StyleBox">
|
||||||
[StyleBox] used when the [Button] is being pressed.
|
[StyleBox] used when the [Button] is being pressed.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
<theme_item name="pressed_mirrored" data_type="style" type="StyleBox">
|
||||||
|
[StyleBox] used when the [Button] is being pressed (for right-to-left layouts).
|
||||||
|
</theme_item>
|
||||||
</theme_items>
|
</theme_items>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -179,7 +179,7 @@
|
||||||
The distance to the far culling boundary for this camera relative to its local Z axis. Higher values allow the camera to see further away, while decreasing [member far] can improve performance if it results in objects being partially or fully culled.
|
The distance to the far culling boundary for this camera relative to its local Z axis. Higher values allow the camera to see further away, while decreasing [member far] can improve performance if it results in objects being partially or fully culled.
|
||||||
</member>
|
</member>
|
||||||
<member name="fov" type="float" setter="set_fov" getter="get_fov" default="75.0">
|
<member name="fov" type="float" setter="set_fov" getter="get_fov" default="75.0">
|
||||||
The camera's field of view angle (in degrees). Only applicable in perspective mode. Since [member keep_aspect] locks one axis, [code]fov[/code] sets the other axis' field of view angle.
|
The camera's field of view angle (in degrees). Only applicable in perspective mode. Since [member keep_aspect] locks one axis, [member fov] sets the other axis' field of view angle.
|
||||||
For reference, the default vertical field of view value ([code]75.0[/code]) is equivalent to a horizontal FOV of:
|
For reference, the default vertical field of view value ([code]75.0[/code]) is equivalent to a horizontal FOV of:
|
||||||
- ~91.31 degrees in a 4:3 viewport
|
- ~91.31 degrees in a 4:3 viewport
|
||||||
- ~101.67 degrees in a 16:10 viewport
|
- ~101.67 degrees in a 16:10 viewport
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<description>
|
<description>
|
||||||
Abstract base class for everything in 2D space. Canvas items are laid out in a tree; children inherit and extend their parent's transform. [CanvasItem] is extended by [Control] for GUI-related nodes, and by [Node2D] for 2D game objects.
|
Abstract base class for everything in 2D space. Canvas items are laid out in a tree; children inherit and extend their parent's transform. [CanvasItem] is extended by [Control] for GUI-related nodes, and by [Node2D] for 2D game objects.
|
||||||
Any [CanvasItem] can draw. For this, [method queue_redraw] is called by the engine, then [constant NOTIFICATION_DRAW] will be received on idle time to request a redraw. Because of this, canvas items don't need to be redrawn on every frame, improving the performance significantly. Several functions for drawing on the [CanvasItem] are provided (see [code]draw_*[/code] functions). However, they can only be used inside [method _draw], its corresponding [method Object._notification] or methods connected to the [signal draw] signal.
|
Any [CanvasItem] can draw. For this, [method queue_redraw] is called by the engine, then [constant NOTIFICATION_DRAW] will be received on idle time to request a redraw. Because of this, canvas items don't need to be redrawn on every frame, improving the performance significantly. Several functions for drawing on the [CanvasItem] are provided (see [code]draw_*[/code] functions). However, they can only be used inside [method _draw], its corresponding [method Object._notification] or methods connected to the [signal draw] signal.
|
||||||
Canvas items are drawn in tree order. By default, children are on top of their parents, so a root [CanvasItem] will be drawn behind everything. This behavior can be changed on a per-item basis.
|
Canvas items are drawn in tree order on their canvas layer. By default, children are on top of their parents, so a root [CanvasItem] will be drawn behind everything. This behavior can be changed on a per-item basis.
|
||||||
A [CanvasItem] can be hidden, which will also hide its children. By adjusting various other properties of a [CanvasItem], you can also modulate its color (via [member modulate] or [member self_modulate]), change its Z-index, blend mode, and more.
|
A [CanvasItem] can be hidden, which will also hide its children. By adjusting various other properties of a [CanvasItem], you can also modulate its color (via [member modulate] or [member self_modulate]), change its Z-index, blend mode, and more.
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
</member>
|
</member>
|
||||||
<member name="layer" type="int" setter="set_layer" getter="get_layer" default="1">
|
<member name="layer" type="int" setter="set_layer" getter="get_layer" default="1">
|
||||||
Layer index for draw order. Lower values are drawn behind higher values.
|
Layer index for draw order. Lower values are drawn behind higher values.
|
||||||
|
[b]Note:[/b] If multiple CanvasLayers have the same layer index, [CanvasItem] children of one CanvasLayer are drawn behind the [CanvasItem] children of the other CanvasLayer. Which CanvasLayer is drawn in front is non-deterministic.
|
||||||
</member>
|
</member>
|
||||||
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2(0, 0)">
|
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2(0, 0)">
|
||||||
The layer's base offset.
|
The layer's base offset.
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
[b]Note:[/b] [CanvasTexture] cannot be used in 3D rendering. For physically-based materials in 3D, use [BaseMaterial3D] instead.
|
[b]Note:[/b] [CanvasTexture] cannot be used in 3D rendering. For physically-based materials in 3D, use [BaseMaterial3D] instead.
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
|
<link title="2D Lights and Shadows">$DOCS_URL/tutorials/2d/2d_lights_and_shadows.html</link>
|
||||||
</tutorials>
|
</tutorials>
|
||||||
<members>
|
<members>
|
||||||
<member name="diffuse_texture" type="Texture2D" setter="set_diffuse_texture" getter="get_diffuse_texture">
|
<member name="diffuse_texture" type="Texture2D" setter="set_diffuse_texture" getter="get_diffuse_texture">
|
||||||
|
|
|
@ -49,6 +49,9 @@
|
||||||
<member name="relative_index" type="int" setter="set_relative_index" getter="get_relative_index" default="0">
|
<member name="relative_index" type="int" setter="set_relative_index" getter="get_relative_index" default="0">
|
||||||
The character offset of the glyph, relative to the current [RichTextEffect] custom block. Setting this property won't affect drawing.
|
The character offset of the glyph, relative to the current [RichTextEffect] custom block. Setting this property won't affect drawing.
|
||||||
</member>
|
</member>
|
||||||
|
<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform" default="Transform2D(1, 0, 0, 1, 0, 0)">
|
||||||
|
The current transform of the current glyph. It can be overridden (for example, by driving the position and rotation from a curve). You can also alter the existing value to apply transforms on top of other effects.
|
||||||
|
</member>
|
||||||
<member name="visible" type="bool" setter="set_visibility" getter="is_visible" default="true">
|
<member name="visible" type="bool" setter="set_visibility" getter="is_visible" default="true">
|
||||||
If [code]true[/code], the character will be drawn. If [code]false[/code], the character will be hidden. Characters around hidden characters will reflow to take the space of hidden characters. If this is not desired, set their [member color] to [code]Color(1, 1, 1, 0)[/code] instead.
|
If [code]true[/code], the character will be drawn. If [code]false[/code], the character will be hidden. Characters around hidden characters will reflow to take the space of hidden characters. If this is not desired, set their [member color] to [code]Color(1, 1, 1, 0)[/code] instead.
|
||||||
</member>
|
</member>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<return type="float" />
|
<return type="float" />
|
||||||
<param index="0" name="up_direction" type="Vector2" default="Vector2(0, -1)" />
|
<param index="0" name="up_direction" type="Vector2" default="Vector2(0, -1)" />
|
||||||
<description>
|
<description>
|
||||||
Returns the floor's collision angle at the last collision point according to [param up_direction], which is [code]Vector2.UP[/code] by default. This value is always positive and only valid after calling [method move_and_slide] and when [method is_on_floor] returns [code]true[/code].
|
Returns the floor's collision angle at the last collision point according to [param up_direction], which is [constant Vector2.UP] by default. This value is always positive and only valid after calling [method move_and_slide] and when [method is_on_floor] returns [code]true[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_floor_normal" qualifiers="const">
|
<method name="get_floor_normal" qualifiers="const">
|
||||||
|
@ -188,7 +188,7 @@
|
||||||
If [code]true[/code], during a jump against the ceiling, the body will slide, if [code]false[/code] it will be stopped and will fall vertically.
|
If [code]true[/code], during a jump against the ceiling, the body will slide, if [code]false[/code] it will be stopped and will fall vertically.
|
||||||
</member>
|
</member>
|
||||||
<member name="up_direction" type="Vector2" setter="set_up_direction" getter="get_up_direction" default="Vector2(0, -1)">
|
<member name="up_direction" type="Vector2" setter="set_up_direction" getter="get_up_direction" default="Vector2(0, -1)">
|
||||||
Vector pointing upwards, used to determine what is a wall and what is a floor (or a ceiling) when calling [method move_and_slide]. Defaults to [code]Vector2.UP[/code]. As the vector will be normalized it can't be equal to [constant Vector2.ZERO], if you want all collisions to be reported as walls, consider using [constant MOTION_MODE_FLOATING] as [member motion_mode].
|
Vector pointing upwards, used to determine what is a wall and what is a floor (or a ceiling) when calling [method move_and_slide]. Defaults to [constant Vector2.UP]. As the vector will be normalized it can't be equal to [constant Vector2.ZERO], if you want all collisions to be reported as walls, consider using [constant MOTION_MODE_FLOATING] as [member motion_mode].
|
||||||
</member>
|
</member>
|
||||||
<member name="velocity" type="Vector2" setter="set_velocity" getter="get_velocity" default="Vector2(0, 0)">
|
<member name="velocity" type="Vector2" setter="set_velocity" getter="get_velocity" default="Vector2(0, 0)">
|
||||||
Current velocity vector in pixels per second, used and modified during calls to [method move_and_slide].
|
Current velocity vector in pixels per second, used and modified during calls to [method move_and_slide].
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
<return type="float" />
|
<return type="float" />
|
||||||
<param index="0" name="up_direction" type="Vector3" default="Vector3(0, 1, 0)" />
|
<param index="0" name="up_direction" type="Vector3" default="Vector3(0, 1, 0)" />
|
||||||
<description>
|
<description>
|
||||||
Returns the floor's collision angle at the last collision point according to [param up_direction], which is [code]Vector3.UP[/code] by default. This value is always positive and only valid after calling [method move_and_slide] and when [method is_on_floor] returns [code]true[/code].
|
Returns the floor's collision angle at the last collision point according to [param up_direction], which is [constant Vector3.UP] by default. This value is always positive and only valid after calling [method move_and_slide] and when [method is_on_floor] returns [code]true[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_floor_normal" qualifiers="const">
|
<method name="get_floor_normal" qualifiers="const">
|
||||||
|
@ -179,7 +179,7 @@
|
||||||
If [code]true[/code], during a jump against the ceiling, the body will slide, if [code]false[/code] it will be stopped and will fall vertically.
|
If [code]true[/code], during a jump against the ceiling, the body will slide, if [code]false[/code] it will be stopped and will fall vertically.
|
||||||
</member>
|
</member>
|
||||||
<member name="up_direction" type="Vector3" setter="set_up_direction" getter="get_up_direction" default="Vector3(0, 1, 0)">
|
<member name="up_direction" type="Vector3" setter="set_up_direction" getter="get_up_direction" default="Vector3(0, 1, 0)">
|
||||||
Vector pointing upwards, used to determine what is a wall and what is a floor (or a ceiling) when calling [method move_and_slide]. Defaults to [code]Vector3.UP[/code]. As the vector will be normalized it can't be equal to [constant Vector3.ZERO], if you want all collisions to be reported as walls, consider using [constant MOTION_MODE_FLOATING] as [member motion_mode].
|
Vector pointing upwards, used to determine what is a wall and what is a floor (or a ceiling) when calling [method move_and_slide]. Defaults to [constant Vector3.UP]. As the vector will be normalized it can't be equal to [constant Vector3.ZERO], if you want all collisions to be reported as walls, consider using [constant MOTION_MODE_FLOATING] as [member motion_mode].
|
||||||
</member>
|
</member>
|
||||||
<member name="velocity" type="Vector3" setter="set_velocity" getter="get_velocity" default="Vector3(0, 0, 0)">
|
<member name="velocity" type="Vector3" setter="set_velocity" getter="get_velocity" default="Vector3(0, 0, 0)">
|
||||||
Current velocity vector (typically meters per second), used and modified during calls to [method move_and_slide].
|
Current velocity vector (typically meters per second), used and modified during calls to [method move_and_slide].
|
||||||
|
|
|
@ -15,43 +15,9 @@
|
||||||
<member name="toggle_mode" type="bool" setter="set_toggle_mode" getter="is_toggle_mode" overrides="BaseButton" default="true" />
|
<member name="toggle_mode" type="bool" setter="set_toggle_mode" getter="is_toggle_mode" overrides="BaseButton" default="true" />
|
||||||
</members>
|
</members>
|
||||||
<theme_items>
|
<theme_items>
|
||||||
<theme_item name="font_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 1)">
|
|
||||||
The [CheckBox] text's font color.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_disabled_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 0.5)">
|
|
||||||
The [CheckBox] text's font color when it's disabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_focus_color" data_type="color" type="Color" default="Color(0.95, 0.95, 0.95, 1)">
|
|
||||||
The [CheckBox] text's font color when it's focused. Only replaces the normal text color of the checkbox. Disabled, hovered, and pressed states take precedence over this color.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_hover_color" data_type="color" type="Color" default="Color(0.95, 0.95, 0.95, 1)">
|
|
||||||
The [CheckBox] text's font color when it's hovered.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_hover_pressed_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The [CheckBox] text's font color when it's hovered and pressed.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_outline_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The tint of text outline of the [CheckBox].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_pressed_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The [CheckBox] text's font color when it's pressed.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="check_v_offset" data_type="constant" type="int" default="0">
|
<theme_item name="check_v_offset" data_type="constant" type="int" default="0">
|
||||||
The vertical offset used when rendering the check icons (in pixels).
|
The vertical offset used when rendering the check icons (in pixels).
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="h_separation" data_type="constant" type="int" default="4">
|
|
||||||
The separation between the check icon and the text (in pixels). Negative values will be treated as [code]0[/code] when used.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="outline_size" data_type="constant" type="int" default="0">
|
|
||||||
The size of the text outline.
|
|
||||||
[b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font" data_type="font" type="Font">
|
|
||||||
The [Font] to use for the [CheckBox] text.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_size" data_type="font_size" type="int">
|
|
||||||
Font size of the [CheckBox]'s text.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="checked" data_type="icon" type="Texture2D">
|
<theme_item name="checked" data_type="icon" type="Texture2D">
|
||||||
The check icon to display when the [CheckBox] is checked.
|
The check icon to display when the [CheckBox] is checked.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
@ -76,23 +42,5 @@
|
||||||
<theme_item name="unchecked_disabled" data_type="icon" type="Texture2D">
|
<theme_item name="unchecked_disabled" data_type="icon" type="Texture2D">
|
||||||
The check icon to display when the [CheckBox] is unchecked and is disabled.
|
The check icon to display when the [CheckBox] is unchecked and is disabled.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="disabled" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckBox] is disabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="focus" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckBox] is focused. The [code]focus[/code] [StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially transparent [StyleBox] should be used to ensure the base [StyleBox] remains visible. A [StyleBox] that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a [StyleBoxEmpty] resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="hover" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckBox] is hovered.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="hover_pressed" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckBox] is hovered and pressed.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="normal" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="pressed" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckBox] is pressed.
|
|
||||||
</theme_item>
|
|
||||||
</theme_items>
|
</theme_items>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -14,43 +14,9 @@
|
||||||
<member name="toggle_mode" type="bool" setter="set_toggle_mode" getter="is_toggle_mode" overrides="BaseButton" default="true" />
|
<member name="toggle_mode" type="bool" setter="set_toggle_mode" getter="is_toggle_mode" overrides="BaseButton" default="true" />
|
||||||
</members>
|
</members>
|
||||||
<theme_items>
|
<theme_items>
|
||||||
<theme_item name="font_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 1)">
|
|
||||||
The [CheckButton] text's font color.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_disabled_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 0.5)">
|
|
||||||
The [CheckButton] text's font color when it's disabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_focus_color" data_type="color" type="Color" default="Color(0.95, 0.95, 0.95, 1)">
|
|
||||||
The [CheckButton] text's font color when it's focused. Only replaces the normal text color of the button. Disabled, hovered, and pressed states take precedence over this color.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_hover_color" data_type="color" type="Color" default="Color(0.95, 0.95, 0.95, 1)">
|
|
||||||
The [CheckButton] text's font color when it's hovered.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_hover_pressed_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The [CheckButton] text's font color when it's hovered and pressed.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_outline_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The tint of text outline of the [CheckButton].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_pressed_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The [CheckButton] text's font color when it's pressed.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="check_v_offset" data_type="constant" type="int" default="0">
|
<theme_item name="check_v_offset" data_type="constant" type="int" default="0">
|
||||||
The vertical offset used when rendering the toggle icons (in pixels).
|
The vertical offset used when rendering the toggle icons (in pixels).
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="h_separation" data_type="constant" type="int" default="4">
|
|
||||||
The separation between the toggle icon and the text (in pixels). Negative values will be treated as [code]0[/code] when used.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="outline_size" data_type="constant" type="int" default="0">
|
|
||||||
The size of the text outline.
|
|
||||||
[b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font" data_type="font" type="Font">
|
|
||||||
The [Font] to use for the [CheckButton] text.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_size" data_type="font_size" type="int">
|
|
||||||
Font size of the [CheckButton]'s text.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="checked" data_type="icon" type="Texture2D">
|
<theme_item name="checked" data_type="icon" type="Texture2D">
|
||||||
The icon to display when the [CheckButton] is checked (for left-to-right layouts).
|
The icon to display when the [CheckButton] is checked (for left-to-right layouts).
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
@ -75,23 +41,5 @@
|
||||||
<theme_item name="unchecked_mirrored" data_type="icon" type="Texture2D">
|
<theme_item name="unchecked_mirrored" data_type="icon" type="Texture2D">
|
||||||
The icon to display when the [CheckButton] is unchecked (for right-to-left layouts).
|
The icon to display when the [CheckButton] is unchecked (for right-to-left layouts).
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="disabled" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckButton] is disabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="focus" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckButton] is focused. The [code]focus[/code] [StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially transparent [StyleBox] should be used to ensure the base [StyleBox] remains visible. A [StyleBox] that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a [StyleBoxEmpty] resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="hover" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckButton] is hovered.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="hover_pressed" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckButton] is hovered and pressed.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="normal" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="pressed" data_type="style" type="StyleBox">
|
|
||||||
The [StyleBox] to display as a background when the [CheckButton] is pressed.
|
|
||||||
</theme_item>
|
|
||||||
</theme_items>
|
</theme_items>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -125,7 +125,7 @@
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<param index="0" name="replace" type="bool" default="false" />
|
<param index="0" name="replace" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Inserts the selected entry into the text. If [param replace] is true, any existing text is replaced rather then merged.
|
Inserts the selected entry into the text. If [param replace] is true, any existing text is replaced rather than merged.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="convert_indent">
|
<method name="convert_indent">
|
||||||
|
@ -152,6 +152,12 @@
|
||||||
Perform an indent as if the user activated the "ui_text_indent" action.
|
Perform an indent as if the user activated the "ui_text_indent" action.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="duplicate_lines">
|
||||||
|
<return type="void" />
|
||||||
|
<description>
|
||||||
|
Duplicates all lines currently selected with any caret. Duplicates the entire line beneath the current one no matter where the caret is within the line.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="fold_all_lines">
|
<method name="fold_all_lines">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<description>
|
<description>
|
||||||
|
@ -538,7 +544,7 @@
|
||||||
Prefixes to trigger an automatic indent.
|
Prefixes to trigger an automatic indent.
|
||||||
</member>
|
</member>
|
||||||
<member name="indent_size" type="int" setter="set_indent_size" getter="get_indent_size" default="4">
|
<member name="indent_size" type="int" setter="set_indent_size" getter="get_indent_size" default="4">
|
||||||
Size of tabs, if [code]indent_use_spaces[/code] is enabled the number of spaces to use.
|
Size of the tabulation indent (one [kbd]Tab[/kbd] press) in characters. If [member indent_use_spaces] is enabled the number of spaces to use.
|
||||||
</member>
|
</member>
|
||||||
<member name="indent_use_spaces" type="bool" setter="set_indent_using_spaces" getter="is_indent_using_spaces" default="false">
|
<member name="indent_use_spaces" type="bool" setter="set_indent_using_spaces" getter="is_indent_using_spaces" default="false">
|
||||||
Use spaces instead of tabs for indentation.
|
Use spaces instead of tabs for indentation.
|
||||||
|
@ -627,9 +633,6 @@
|
||||||
</constant>
|
</constant>
|
||||||
</constants>
|
</constants>
|
||||||
<theme_items>
|
<theme_items>
|
||||||
<theme_item name="background_color" data_type="color" type="Color" default="Color(0, 0, 0, 0)">
|
|
||||||
Sets the background [Color].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="bookmark_color" data_type="color" type="Color" default="Color(0.5, 0.64, 1, 0.8)">
|
<theme_item name="bookmark_color" data_type="color" type="Color" default="Color(0.5, 0.64, 1, 0.8)">
|
||||||
[Color] of the bookmark icon for bookmarked lines.
|
[Color] of the bookmark icon for bookmarked lines.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
@ -639,12 +642,6 @@
|
||||||
<theme_item name="breakpoint_color" data_type="color" type="Color" default="Color(0.9, 0.29, 0.3, 1)">
|
<theme_item name="breakpoint_color" data_type="color" type="Color" default="Color(0.9, 0.29, 0.3, 1)">
|
||||||
[Color] of the breakpoint icon for bookmarked lines.
|
[Color] of the breakpoint icon for bookmarked lines.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="caret_background_color" data_type="color" type="Color" default="Color(0, 0, 0, 1)">
|
|
||||||
[Color] of the text behind the caret when block caret is enabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="caret_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 1)">
|
|
||||||
[Color] of the caret.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="code_folding_color" data_type="color" type="Color" default="Color(0.8, 0.8, 0.8, 0.8)">
|
<theme_item name="code_folding_color" data_type="color" type="Color" default="Color(0.8, 0.8, 0.8, 0.8)">
|
||||||
[Color] for all icons related to line folding.
|
[Color] for all icons related to line folding.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
@ -654,9 +651,6 @@
|
||||||
<theme_item name="completion_existing_color" data_type="color" type="Color" default="Color(0.87, 0.87, 0.87, 0.13)">
|
<theme_item name="completion_existing_color" data_type="color" type="Color" default="Color(0.87, 0.87, 0.87, 0.13)">
|
||||||
Background highlight [Color] for matching text in code completion options.
|
Background highlight [Color] for matching text in code completion options.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="completion_font_color" data_type="color" type="Color" default="Color(0.67, 0.67, 0.67, 1)">
|
|
||||||
Font [Color] for the code completion popup.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="completion_scroll_color" data_type="color" type="Color" default="Color(1, 1, 1, 0.29)">
|
<theme_item name="completion_scroll_color" data_type="color" type="Color" default="Color(1, 1, 1, 0.29)">
|
||||||
[Color] of the scrollbar in the code completion popup.
|
[Color] of the scrollbar in the code completion popup.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
@ -666,70 +660,27 @@
|
||||||
<theme_item name="completion_selected_color" data_type="color" type="Color" default="Color(0.26, 0.26, 0.27, 1)">
|
<theme_item name="completion_selected_color" data_type="color" type="Color" default="Color(0.26, 0.26, 0.27, 1)">
|
||||||
Background highlight [Color] for the current selected option item in the code completion popup.
|
Background highlight [Color] for the current selected option item in the code completion popup.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="current_line_color" data_type="color" type="Color" default="Color(0.25, 0.25, 0.26, 0.8)">
|
|
||||||
Background [Color] of the line containing the caret.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="executing_line_color" data_type="color" type="Color" default="Color(0.98, 0.89, 0.27, 1)">
|
<theme_item name="executing_line_color" data_type="color" type="Color" default="Color(0.98, 0.89, 0.27, 1)">
|
||||||
[Color] of the executing icon for executing lines.
|
[Color] of the executing icon for executing lines.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="folded_code_region_color" data_type="color" type="Color" default="Color(0.68, 0.46, 0.77, 0.2)">
|
<theme_item name="folded_code_region_color" data_type="color" type="Color" default="Color(0.68, 0.46, 0.77, 0.2)">
|
||||||
[Color] of background line highlight for folded code region.
|
[Color] of background line highlight for folded code region.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="font_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 1)">
|
|
||||||
Sets the font [Color].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_outline_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The tint of text outline of the [CodeEdit].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_placeholder_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 0.6)">
|
|
||||||
Font color for [member TextEdit.placeholder_text].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_readonly_color" data_type="color" type="Color" default="Color(0.875, 0.875, 0.875, 0.5)">
|
|
||||||
Sets the font [Color] when [member TextEdit.editable] is disabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_selected_color" data_type="color" type="Color" default="Color(0, 0, 0, 0)">
|
|
||||||
Sets the [Color] of the selected text. If equal to [code]Color(0, 0, 0, 0)[/code], it will be ignored.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="line_length_guideline_color" data_type="color" type="Color" default="Color(0.3, 0.5, 0.8, 0.1)">
|
<theme_item name="line_length_guideline_color" data_type="color" type="Color" default="Color(0.3, 0.5, 0.8, 0.1)">
|
||||||
[Color] of the main line length guideline, secondary guidelines will have 50% alpha applied.
|
[Color] of the main line length guideline, secondary guidelines will have 50% alpha applied.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="line_number_color" data_type="color" type="Color" default="Color(0.67, 0.67, 0.67, 0.4)">
|
<theme_item name="line_number_color" data_type="color" type="Color" default="Color(0.67, 0.67, 0.67, 0.4)">
|
||||||
Sets the [Color] of line numbers.
|
Sets the [Color] of line numbers.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="search_result_border_color" data_type="color" type="Color" default="Color(0.3, 0.3, 0.3, 0.4)">
|
|
||||||
[Color] of the border around text that matches the search query.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="search_result_color" data_type="color" type="Color" default="Color(0.3, 0.3, 0.3, 1)">
|
|
||||||
[Color] behind the text that matches the search query.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="selection_color" data_type="color" type="Color" default="Color(0.5, 0.5, 0.5, 1)">
|
|
||||||
Sets the highlight [Color] of text selections.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="word_highlighted_color" data_type="color" type="Color" default="Color(0.8, 0.9, 0.9, 0.15)">
|
|
||||||
Sets the highlight [Color] of multiple occurrences. [member TextEdit.highlight_all_occurrences] has to be enabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="completion_lines" data_type="constant" type="int" default="7">
|
<theme_item name="completion_lines" data_type="constant" type="int" default="7">
|
||||||
Max number of options to display in the code completion popup at any one time.
|
Max number of options to display in the code completion popup at any one time.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="completion_max_width" data_type="constant" type="int" default="50">
|
<theme_item name="completion_max_width" data_type="constant" type="int" default="50">
|
||||||
Max width of options in the code completion popup. Options longer then this will be cut off.
|
Max width of options in the code completion popup. Options longer than this will be cut off.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="completion_scroll_width" data_type="constant" type="int" default="6">
|
<theme_item name="completion_scroll_width" data_type="constant" type="int" default="6">
|
||||||
Width of the scrollbar in the code completion popup.
|
Width of the scrollbar in the code completion popup.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="line_spacing" data_type="constant" type="int" default="4">
|
|
||||||
Sets the spacing between the lines.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="outline_size" data_type="constant" type="int" default="0">
|
|
||||||
The size of the text outline.
|
|
||||||
[b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font" data_type="font" type="Font">
|
|
||||||
Sets the default [Font].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_size" data_type="font_size" type="int">
|
|
||||||
Sets default font size.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="bookmark" data_type="icon" type="Texture2D">
|
<theme_item name="bookmark" data_type="icon" type="Texture2D">
|
||||||
Sets a custom [Texture2D] to draw in the bookmark gutter for bookmarked lines.
|
Sets a custom [Texture2D] to draw in the bookmark gutter for bookmarked lines.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
|
@ -754,23 +705,8 @@
|
||||||
<theme_item name="folded_eol_icon" data_type="icon" type="Texture2D">
|
<theme_item name="folded_eol_icon" data_type="icon" type="Texture2D">
|
||||||
Sets a custom [Texture2D] to draw at the end of a folded line.
|
Sets a custom [Texture2D] to draw at the end of a folded line.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="space" data_type="icon" type="Texture2D">
|
|
||||||
Sets a custom [Texture2D] for space text characters.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="tab" data_type="icon" type="Texture2D">
|
|
||||||
Sets a custom [Texture2D] for tab text characters.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="completion" data_type="style" type="StyleBox">
|
<theme_item name="completion" data_type="style" type="StyleBox">
|
||||||
[StyleBox] for the code completion popup.
|
[StyleBox] for the code completion popup.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="focus" data_type="style" type="StyleBox">
|
|
||||||
Sets the [StyleBox] when in focus. The [code]focus[/code] [StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially transparent [StyleBox] should be used to ensure the base [StyleBox] remains visible. A [StyleBox] that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a [StyleBoxEmpty] resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="normal" data_type="style" type="StyleBox">
|
|
||||||
Sets the [StyleBox].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="read_only" data_type="style" type="StyleBox">
|
|
||||||
Sets the [StyleBox] when [member TextEdit.editable] is disabled.
|
|
||||||
</theme_item>
|
|
||||||
</theme_items>
|
</theme_items>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<param index="1" name="event" type="InputEvent" />
|
<param index="1" name="event" type="InputEvent" />
|
||||||
<param index="2" name="shape_idx" type="int" />
|
<param index="2" name="shape_idx" type="int" />
|
||||||
<description>
|
<description>
|
||||||
Accepts unhandled [InputEvent]s. [param shape_idx] is the child index of the clicked [Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up these events.
|
Accepts unhandled [InputEvent]s. [param shape_idx] is the child index of the clicked [Shape2D]. Connect to [signal input_event] to easily pick up these events.
|
||||||
[b]Note:[/b] [method _input_event] requires [member input_pickable] to be [code]true[/code] and at least one [member collision_layer] bit to be set.
|
[b]Note:[/b] [method _input_event] requires [member input_pickable] to be [code]true[/code] and at least one [member collision_layer] bit to be set.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
</member>
|
</member>
|
||||||
<member name="polygon" type="PackedVector2Array" setter="set_polygon" getter="get_polygon" default="PackedVector2Array()">
|
<member name="polygon" type="PackedVector2Array" setter="set_polygon" getter="get_polygon" default="PackedVector2Array()">
|
||||||
Array of vertices which define the 2D polygon in the local XY plane.
|
Array of vertices which define the 2D polygon in the local XY plane.
|
||||||
[b]Note:[/b] The returned value is a copy of the original. Methods which mutate the size or properties of the return value will not impact the original polygon. To change properties of the polygon, assign it to a temporary variable and make changes before reassigning the [code]polygon[/code] member.
|
[b]Note:[/b] The returned value is a copy of the original. Methods which mutate the size or properties of the return value will not impact the original polygon. To change properties of the polygon, assign it to a temporary variable and make changes before reassigning the class property.
|
||||||
</member>
|
</member>
|
||||||
</members>
|
</members>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -142,7 +142,7 @@
|
||||||
</constants>
|
</constants>
|
||||||
<theme_items>
|
<theme_items>
|
||||||
<theme_item name="center_slider_grabbers" data_type="constant" type="int" default="1">
|
<theme_item name="center_slider_grabbers" data_type="constant" type="int" default="1">
|
||||||
Overrides the [theme_item HSlider.center_grabber] theme property of the sliders.
|
Overrides the [theme_item Slider.center_grabber] theme property of the sliders.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="h_width" data_type="constant" type="int" default="30">
|
<theme_item name="h_width" data_type="constant" type="int" default="30">
|
||||||
The width of the hue selection slider.
|
The width of the hue selection slider.
|
||||||
|
|
|
@ -56,54 +56,8 @@
|
||||||
</signal>
|
</signal>
|
||||||
</signals>
|
</signals>
|
||||||
<theme_items>
|
<theme_items>
|
||||||
<theme_item name="font_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
Default text [Color] of the [ColorPickerButton].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_disabled_color" data_type="color" type="Color" default="Color(0.9, 0.9, 0.9, 0.3)">
|
|
||||||
Text [Color] used when the [ColorPickerButton] is disabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_focus_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
Text [Color] used when the [ColorPickerButton] is focused. Only replaces the normal text color of the button. Disabled, hovered, and pressed states take precedence over this color.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_hover_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
Text [Color] used when the [ColorPickerButton] is being hovered.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_outline_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)">
|
|
||||||
The tint of text outline of the [ColorPickerButton].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_pressed_color" data_type="color" type="Color" default="Color(0.8, 0.8, 0.8, 1)">
|
|
||||||
Text [Color] used when the [ColorPickerButton] is being pressed.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="h_separation" data_type="constant" type="int" default="4">
|
|
||||||
The horizontal space between [ColorPickerButton]'s icon and text.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="outline_size" data_type="constant" type="int" default="0">
|
|
||||||
The size of the text outline.
|
|
||||||
[b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font" data_type="font" type="Font">
|
|
||||||
[Font] of the [ColorPickerButton]'s text.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="font_size" data_type="font_size" type="int">
|
|
||||||
Font size of the [ColorPickerButton]'s text.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="bg" data_type="icon" type="Texture2D">
|
<theme_item name="bg" data_type="icon" type="Texture2D">
|
||||||
The background of the color preview rect on the button.
|
The background of the color preview rect on the button.
|
||||||
</theme_item>
|
</theme_item>
|
||||||
<theme_item name="disabled" data_type="style" type="StyleBox">
|
|
||||||
[StyleBox] used when the [ColorPickerButton] is disabled.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="focus" data_type="style" type="StyleBox">
|
|
||||||
[StyleBox] used when the [ColorPickerButton] is focused. The [code]focus[/code] [StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially transparent [StyleBox] should be used to ensure the base [StyleBox] remains visible. A [StyleBox] that represents an outline or an underline works well for this purpose. To disable the focus visual effect, assign a [StyleBoxEmpty] resource. Note that disabling the focus visual effect will harm keyboard/controller navigation usability, so this is not recommended for accessibility reasons.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="hover" data_type="style" type="StyleBox">
|
|
||||||
[StyleBox] used when the [ColorPickerButton] is being hovered.
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="normal" data_type="style" type="StyleBox">
|
|
||||||
Default [StyleBox] for the [ColorPickerButton].
|
|
||||||
</theme_item>
|
|
||||||
<theme_item name="pressed" data_type="style" type="StyleBox">
|
|
||||||
[StyleBox] used when the [ColorPickerButton] is being pressed.
|
|
||||||
</theme_item>
|
|
||||||
</theme_items>
|
</theme_items>
|
||||||
</class>
|
</class>
|
||||||
|
|
|
@ -163,7 +163,7 @@
|
||||||
<param index="0" name="path" type="String" />
|
<param index="0" name="path" type="String" />
|
||||||
<description>
|
<description>
|
||||||
Loads the config file specified as a parameter. The file's contents are parsed and loaded in the [ConfigFile] object which the method was called on.
|
Loads the config file specified as a parameter. The file's contents are parsed and loaded in the [ConfigFile] object which the method was called on.
|
||||||
Returns one of the [enum Error] code constants ([constant OK] on success).
|
Returns [constant OK] on success, or one of the other [enum Error] values if the operation failed.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="load_encrypted">
|
<method name="load_encrypted">
|
||||||
|
@ -172,7 +172,7 @@
|
||||||
<param index="1" name="key" type="PackedByteArray" />
|
<param index="1" name="key" type="PackedByteArray" />
|
||||||
<description>
|
<description>
|
||||||
Loads the encrypted config file specified as a parameter, using the provided [param key] to decrypt it. The file's contents are parsed and loaded in the [ConfigFile] object which the method was called on.
|
Loads the encrypted config file specified as a parameter, using the provided [param key] to decrypt it. The file's contents are parsed and loaded in the [ConfigFile] object which the method was called on.
|
||||||
Returns one of the [enum Error] code constants ([constant OK] on success).
|
Returns [constant OK] on success, or one of the other [enum Error] values if the operation failed.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="load_encrypted_pass">
|
<method name="load_encrypted_pass">
|
||||||
|
@ -181,7 +181,7 @@
|
||||||
<param index="1" name="password" type="String" />
|
<param index="1" name="password" type="String" />
|
||||||
<description>
|
<description>
|
||||||
Loads the encrypted config file specified as a parameter, using the provided [param password] to decrypt it. The file's contents are parsed and loaded in the [ConfigFile] object which the method was called on.
|
Loads the encrypted config file specified as a parameter, using the provided [param password] to decrypt it. The file's contents are parsed and loaded in the [ConfigFile] object which the method was called on.
|
||||||
Returns one of the [enum Error] code constants ([constant OK] on success).
|
Returns [constant OK] on success, or one of the other [enum Error] values if the operation failed.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="parse">
|
<method name="parse">
|
||||||
|
@ -189,7 +189,7 @@
|
||||||
<param index="0" name="data" type="String" />
|
<param index="0" name="data" type="String" />
|
||||||
<description>
|
<description>
|
||||||
Parses the passed string as the contents of a config file. The string is parsed and loaded in the ConfigFile object which the method was called on.
|
Parses the passed string as the contents of a config file. The string is parsed and loaded in the ConfigFile object which the method was called on.
|
||||||
Returns one of the [enum Error] code constants ([constant OK] on success).
|
Returns [constant OK] on success, or one of the other [enum Error] values if the operation failed.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="save">
|
<method name="save">
|
||||||
|
@ -197,7 +197,7 @@
|
||||||
<param index="0" name="path" type="String" />
|
<param index="0" name="path" type="String" />
|
||||||
<description>
|
<description>
|
||||||
Saves the contents of the [ConfigFile] object to the file specified as a parameter. The output file uses an INI-style structure.
|
Saves the contents of the [ConfigFile] object to the file specified as a parameter. The output file uses an INI-style structure.
|
||||||
Returns one of the [enum Error] code constants ([constant OK] on success).
|
Returns [constant OK] on success, or one of the other [enum Error] values if the operation failed.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="save_encrypted">
|
<method name="save_encrypted">
|
||||||
|
@ -206,7 +206,7 @@
|
||||||
<param index="1" name="key" type="PackedByteArray" />
|
<param index="1" name="key" type="PackedByteArray" />
|
||||||
<description>
|
<description>
|
||||||
Saves the contents of the [ConfigFile] object to the AES-256 encrypted file specified as a parameter, using the provided [param key] to encrypt it. The output file uses an INI-style structure.
|
Saves the contents of the [ConfigFile] object to the AES-256 encrypted file specified as a parameter, using the provided [param key] to encrypt it. The output file uses an INI-style structure.
|
||||||
Returns one of the [enum Error] code constants ([constant OK] on success).
|
Returns [constant OK] on success, or one of the other [enum Error] values if the operation failed.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="save_encrypted_pass">
|
<method name="save_encrypted_pass">
|
||||||
|
@ -215,7 +215,7 @@
|
||||||
<param index="1" name="password" type="String" />
|
<param index="1" name="password" type="String" />
|
||||||
<description>
|
<description>
|
||||||
Saves the contents of the [ConfigFile] object to the AES-256 encrypted file specified as a parameter, using the provided [param password] to encrypt it. The output file uses an INI-style structure.
|
Saves the contents of the [ConfigFile] object to the AES-256 encrypted file specified as a parameter, using the provided [param password] to encrypt it. The output file uses an INI-style structure.
|
||||||
Returns one of the [enum Error] code constants ([constant OK] on success).
|
Returns [constant OK] on success, or one of the other [enum Error] values if the operation failed.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="set_value">
|
<method name="set_value">
|
||||||
|
|
|
@ -343,6 +343,14 @@
|
||||||
Finds the previous (above in the tree) [Control] that can receive the focus.
|
Finds the previous (above in the tree) [Control] that can receive the focus.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="find_valid_focus_neighbor" qualifiers="const">
|
||||||
|
<return type="Control" />
|
||||||
|
<param index="0" name="side" type="int" enum="Side" />
|
||||||
|
<description>
|
||||||
|
Finds the next [Control] that can receive the focus on the specified [enum Side].
|
||||||
|
[b]Note:[/b] This is different from [method get_focus_neighbor], which returns the path of a specified focus neighbor.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="force_drag">
|
<method name="force_drag">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<param index="0" name="data" type="Variant" />
|
<param index="0" name="data" type="Variant" />
|
||||||
|
@ -389,6 +397,7 @@
|
||||||
<param index="0" name="side" type="int" enum="Side" />
|
<param index="0" name="side" type="int" enum="Side" />
|
||||||
<description>
|
<description>
|
||||||
Returns the focus neighbor for the specified [enum Side]. A getter method for [member focus_neighbor_bottom], [member focus_neighbor_left], [member focus_neighbor_right] and [member focus_neighbor_top].
|
Returns the focus neighbor for the specified [enum Side]. A getter method for [member focus_neighbor_bottom], [member focus_neighbor_left], [member focus_neighbor_right] and [member focus_neighbor_top].
|
||||||
|
[b]Note:[/b] To find the next [Control] on the specific [enum Side], even if a neighbor is not assigned, use [method find_valid_focus_neighbor].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_global_rect" qualifiers="const">
|
<method name="get_global_rect" qualifiers="const">
|
||||||
|
@ -1043,7 +1052,7 @@
|
||||||
[b]Note:[/b] [Window] styles will have no effect unless the window is embedded.
|
[b]Note:[/b] [Window] styles will have no effect unless the window is embedded.
|
||||||
</member>
|
</member>
|
||||||
<member name="theme_type_variation" type="StringName" setter="set_theme_type_variation" getter="get_theme_type_variation" default="&""">
|
<member name="theme_type_variation" type="StringName" setter="set_theme_type_variation" getter="get_theme_type_variation" default="&""">
|
||||||
The name of a theme type variation used by this [Control] to look up its own theme items. When empty, the class name of the node is used (e.g. [code]Button[/code] for the [Button] control), as well as the class names of all parent classes (in order of inheritance).
|
The name of a theme type variation used by this [Control] to look up its own theme items. When empty, the class name of the node is used (e.g. [code skip-lint]Button[/code] for the [Button] control), as well as the class names of all parent classes (in order of inheritance).
|
||||||
When set, this property gives the highest priority to the type of the specified name. This type can in turn extend another type, forming a dependency chain. See [method Theme.set_type_variation]. If the theme item cannot be found using this type or its base types, lookup falls back on the class names.
|
When set, this property gives the highest priority to the type of the specified name. This type can in turn extend another type, forming a dependency chain. See [method Theme.set_type_variation]. If the theme item cannot be found using this type or its base types, lookup falls back on the class names.
|
||||||
[b]Note:[/b] To look up [Control]'s own items use various [code]get_theme_*[/code] methods without specifying [code]theme_type[/code].
|
[b]Note:[/b] To look up [Control]'s own items use various [code]get_theme_*[/code] methods without specifying [code]theme_type[/code].
|
||||||
[b]Note:[/b] Theme items are looked for in the tree order, from branch to root, where each [Control] node is checked for its [member theme] property. The earliest match against any type/class name is returned. The project-level Theme and the default Theme are checked last.
|
[b]Note:[/b] Theme items are looked for in the tree order, from branch to root, where each [Control] node is checked for its [member theme] property. The earliest match against any type/class name is returned. The project-level Theme and the default Theme are checked last.
|
||||||
|
|
|
@ -117,8 +117,7 @@
|
||||||
<param index="0" name="offset" type="float" default="0.0" />
|
<param index="0" name="offset" type="float" default="0.0" />
|
||||||
<param index="1" name="cubic" type="bool" default="false" />
|
<param index="1" name="cubic" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns a point within the curve at position [param offset], where [param offset] is measured as a distance in 3D units along the curve.
|
Returns a point within the curve at position [param offset], where [param offset] is measured as a distance in 3D units along the curve. To do that, it finds the two cached points where the [param offset] lies between, then interpolates the values. This interpolation is cubic if [param cubic] is set to [code]true[/code], or linear if set to [code]false[/code].
|
||||||
To do that, it finds the two cached points where the [param offset] lies between, then interpolates the values. This interpolation is cubic if [param cubic] is set to [code]true[/code], or linear if set to [code]false[/code].
|
|
||||||
Cubic interpolation tends to follow the curves better, but linear is faster (and often, precise enough).
|
Cubic interpolation tends to follow the curves better, but linear is faster (and often, precise enough).
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
@ -127,8 +126,7 @@
|
||||||
<param index="0" name="offset" type="float" />
|
<param index="0" name="offset" type="float" />
|
||||||
<param index="1" name="apply_tilt" type="bool" default="false" />
|
<param index="1" name="apply_tilt" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns an up vector within the curve at position [param offset], where [param offset] is measured as a distance in 3D units along the curve.
|
Returns an up vector within the curve at position [param offset], where [param offset] is measured as a distance in 3D units along the curve. To do that, it finds the two cached up vectors where the [param offset] lies between, then interpolates the values. If [param apply_tilt] is [code]true[/code], an interpolated tilt is applied to the interpolated up vector.
|
||||||
To do that, it finds the two cached up vectors where the [param offset] lies between, then interpolates the values. If [param apply_tilt] is [code]true[/code], an interpolated tilt is applied to the interpolated up vector.
|
|
||||||
If the curve has no up vectors, the function sends an error to the console, and returns [code](0, 1, 0)[/code].
|
If the curve has no up vectors, the function sends an error to the console, and returns [code](0, 1, 0)[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
@ -138,7 +136,7 @@
|
||||||
<param index="1" name="cubic" type="bool" default="false" />
|
<param index="1" name="cubic" type="bool" default="false" />
|
||||||
<param index="2" name="apply_tilt" type="bool" default="false" />
|
<param index="2" name="apply_tilt" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Similar with [code]interpolate_baked()[/code]. The return value is [code]Transform3D[/code], with [code]origin[/code] as point position, [code]basis.x[/code] as sideway vector, [code]basis.y[/code] as up vector, [code]basis.z[/code] as forward vector. When the curve length is 0, there is no reasonable way to calculate the rotation, all vectors aligned with global space axes.
|
Returns a [Transform3D] with [code]origin[/code] as point position, [code]basis.x[/code] as sideway vector, [code]basis.y[/code] as up vector, [code]basis.z[/code] as forward vector. When the curve length is 0, there is no reasonable way to calculate the rotation, all vectors aligned with global space axes. See also [method sample_baked].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="samplef" qualifiers="const">
|
<method name="samplef" qualifiers="const">
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue