diff options
-rw-r--r-- | doc/classes/AnimatedSprite3D.xml | 5 | ||||
-rw-r--r-- | drivers/dummy/rasterizer_dummy.h | 35 | ||||
-rwxr-xr-x | misc/hooks/pre-commit-clang-format | 3 | ||||
-rwxr-xr-x | misc/scripts/file_format.sh | 11 | ||||
-rw-r--r-- | modules/gltf/gltf_skin.cpp | 2 | ||||
-rw-r--r-- | platform/javascript/detect.py | 16 | ||||
-rw-r--r-- | platform/javascript/godot_js.h | 1 | ||||
-rw-r--r-- | platform/javascript/js/libs/library_godot_os.js | 5 | ||||
-rw-r--r-- | platform/javascript/os_javascript.cpp | 4 | ||||
-rw-r--r-- | platform/javascript/os_javascript.h | 1 | ||||
-rw-r--r-- | platform/linuxbsd/SCsub | 3 | ||||
-rw-r--r-- | platform/linuxbsd/detect.py | 4 | ||||
-rw-r--r-- | platform/linuxbsd/joypad_linux.cpp | 36 | ||||
-rw-r--r-- | platform/linuxbsd/joypad_linux.h | 7 | ||||
-rw-r--r-- | platform/linuxbsd/libudev-so_wrap.c | 828 | ||||
-rw-r--r-- | platform/linuxbsd/libudev-so_wrap.h | 285 | ||||
-rw-r--r-- | scene/3d/sprite_3d.cpp | 3 | ||||
-rw-r--r-- | servers/rendering/renderer_rd/shaders/skeleton.glsl | 2 |
18 files changed, 1218 insertions, 33 deletions
diff --git a/doc/classes/AnimatedSprite3D.xml b/doc/classes/AnimatedSprite3D.xml index e1fb78e5b5..02ccab4e05 100644 --- a/doc/classes/AnimatedSprite3D.xml +++ b/doc/classes/AnimatedSprite3D.xml @@ -49,6 +49,11 @@ </member> </members> <signals> + <signal name="animation_finished"> + <description> + Emitted when the animation is finished (when it plays the last frame). If the animation is looping, this signal is emitted every time the last frame is drawn. + </description> + </signal> <signal name="frame_changed"> <description> Emitted when [member frame] changed. diff --git a/drivers/dummy/rasterizer_dummy.h b/drivers/dummy/rasterizer_dummy.h index 082f247476..a76520dcdb 100644 --- a/drivers/dummy/rasterizer_dummy.h +++ b/drivers/dummy/rasterizer_dummy.h @@ -210,8 +210,22 @@ public: bool can_create_resources_async() const override { return false; } /* TEXTURE API */ - RID texture_allocate() override { return RID(); } - void texture_2d_initialize(RID p_texture, const Ref<Image> &p_image) override {} + struct DummyTexture { + Ref<Image> image; + }; + mutable RID_PtrOwner<DummyTexture> texture_owner; + + RID texture_allocate() override { + DummyTexture *texture = memnew(DummyTexture); + ERR_FAIL_COND_V(!texture, RID()); + return texture_owner.make_rid(texture); + } + void texture_2d_initialize(RID p_texture, const Ref<Image> &p_image) override { + DummyTexture *t = texture_owner.getornull(p_texture); + ERR_FAIL_COND(!t); + t->image = p_image->duplicate(); + } + void texture_2d_layered_initialize(RID p_texture, const Vector<Ref<Image>> &p_layers, RS::TextureLayeredType p_layered_type) override {} void texture_2d_update_immediate(RID p_texture, const Ref<Image> &p_image, int p_layer = 0) override {} void texture_2d_update(RID p_texture, const Ref<Image> &p_image, int p_layer = 0) override {} @@ -224,7 +238,12 @@ public: void texture_2d_layered_placeholder_initialize(RID p_texture, RenderingServer::TextureLayeredType p_layered_type) override {} void texture_3d_placeholder_initialize(RID p_texture) override {} - Ref<Image> texture_2d_get(RID p_texture) const override { return Ref<Image>(); } + Ref<Image> texture_2d_get(RID p_texture) const override { + DummyTexture *t = texture_owner.getornull(p_texture); + ERR_FAIL_COND_V(!t, Ref<Image>()); + return t->image; + } + Ref<Image> texture_2d_layer_get(RID p_texture, int p_layer) const override { return Ref<Image>(); } Vector<Ref<Image>> texture_3d_get(RID p_texture) const override { return Vector<Ref<Image>>(); } @@ -635,7 +654,15 @@ public: Rect2i render_target_get_sdf_rect(RID p_render_target) const override { return Rect2i(); } RS::InstanceType get_base_type(RID p_rid) const override { return RS::INSTANCE_NONE; } - bool free(RID p_rid) override { return true; } + bool free(RID p_rid) override { + if (texture_owner.owns(p_rid)) { + // delete the texture + DummyTexture *texture = texture_owner.getornull(p_rid); + texture_owner.free(p_rid); + memdelete(texture); + } + return true; + } bool has_os_feature(const String &p_feature) const override { return false; } diff --git a/misc/hooks/pre-commit-clang-format b/misc/hooks/pre-commit-clang-format index 6467efe22e..1cbc576565 100755 --- a/misc/hooks/pre-commit-clang-format +++ b/misc/hooks/pre-commit-clang-format @@ -125,6 +125,9 @@ do if grep -q "platform/android/java/lib/src/com" <<< $file; then continue; fi + if grep -q "\-so_wrap." <<< $file; then + continue; + fi # ignore file if we do check for file extensions and the file # does not match any of the extensions specified in $FILE_EXTS diff --git a/misc/scripts/file_format.sh b/misc/scripts/file_format.sh index 0e9db68a90..795431cd28 100755 --- a/misc/scripts/file_format.sh +++ b/misc/scripts/file_format.sh @@ -30,6 +30,8 @@ while IFS= read -rd '' f; do continue elif [[ "$f" == "platform/android/java/lib/src/com/google"* ]]; then continue + elif [[ "$f" == *"-so_wrap."* ]]; then + continue fi # Ensure that files are UTF-8 formatted. recode UTF-8 "$f" 2> /dev/null @@ -38,15 +40,6 @@ while IFS= read -rd '' f; do # Remove trailing space characters and ensures that files end # with newline characters. -l option handles newlines conveniently. perl -i -ple 's/\s*$//g' "$f" - # Remove the character sequence "== true" if it has a leading space. - perl -i -pe 's/\x20== true//g' "$f" - - if [[ $(uname) == "Linux" ]] && [[ "$f" != *"xml" ]]; then - # Remove empty lines after the opening brace of indented blocks. - sed -z -i 's/\x7B\x0A\x0A\x09/\x7B\x0A\x09/g' "$f" - # Remove empty lines before the closing brace (in some cases). - sed -z -i 's/\x0A\x0A\x7D/\x0A\x7D/g' "$f" - fi done git diff > patch.patch diff --git a/modules/gltf/gltf_skin.cpp b/modules/gltf/gltf_skin.cpp index fd39e4f45a..5a61e5778c 100644 --- a/modules/gltf/gltf_skin.cpp +++ b/modules/gltf/gltf_skin.cpp @@ -142,7 +142,7 @@ void GLTFSkin::set_joint_i_to_name(Dictionary p_joint_i_to_name) { joint_i_to_name = Map<int, StringName>(); Array keys = p_joint_i_to_name.keys(); for (int i = 0; i < keys.size(); i++) { - joint_i_to_name[keys[i]] = joint_i_to_name[keys[i]]; + joint_i_to_name[keys[i]] = p_joint_i_to_name[keys[i]]; } } diff --git a/platform/javascript/detect.py b/platform/javascript/detect.py index 653d18f791..4297088c09 100644 --- a/platform/javascript/detect.py +++ b/platform/javascript/detect.py @@ -92,9 +92,9 @@ def configure(env): if not env["threads_enabled"]: print("Threads must be enabled to build the editor. Please add the 'threads_enabled=yes' option") sys.exit(255) - if env["initial_memory"] < 32: - print("Editor build requires at least 32MiB of initial memory. Forcing it.") - env["initial_memory"] = 32 + if env["initial_memory"] < 64: + print("Editor build requires at least 64MiB of initial memory. Forcing it.") + env["initial_memory"] = 64 elif env["builtin_icu"]: env.Append(CCFLAGS=["-frtti"]) else: @@ -229,7 +229,15 @@ def configure(env): env.Append(LINKFLAGS=["-s", "OFFSCREEN_FRAMEBUFFER=1"]) # callMain for manual start. - env.Append(LINKFLAGS=["-s", "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain']"]) + env.Append(LINKFLAGS=["-s", "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain','cwrap']"]) # Add code that allow exiting runtime. env.Append(LINKFLAGS=["-s", "EXIT_RUNTIME=1"]) + + # TODO remove once we have GLES support back (temporary fix undefined symbols due to dead code elimination). + env.Append( + LINKFLAGS=[ + "-s", + "EXPORTED_FUNCTIONS=['_main', '_emscripten_webgl_get_current_context', '_emscripten_webgl_commit_frame', '_emscripten_webgl_create_context']", + ] + ) diff --git a/platform/javascript/godot_js.h b/platform/javascript/godot_js.h index d2a2fbd6db..f0da8b7ca3 100644 --- a/platform/javascript/godot_js.h +++ b/platform/javascript/godot_js.h @@ -49,6 +49,7 @@ extern int godot_js_os_fs_is_persistent(); extern void godot_js_os_fs_sync(void (*p_callback)()); extern int godot_js_os_execute(const char *p_json); extern void godot_js_os_shell_open(const char *p_uri); +extern int godot_js_os_hw_concurrency_get(); // Display extern int godot_js_display_screen_dpi_get(); diff --git a/platform/javascript/js/libs/library_godot_os.js b/platform/javascript/js/libs/library_godot_os.js index 9fde4a84e1..3ffcd655b7 100644 --- a/platform/javascript/js/libs/library_godot_os.js +++ b/platform/javascript/js/libs/library_godot_os.js @@ -282,6 +282,11 @@ const GodotOS = { godot_js_os_shell_open: function (p_uri) { window.open(GodotRuntime.parseString(p_uri), '_blank'); }, + + godot_js_os_hw_concurrency_get__sig: 'i', + godot_js_os_hw_concurrency_get: function () { + return navigator.hardwareConcurrency || 1; + }, }; autoAddDeps(GodotOS, '$GodotOS'); diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index b922b2ba91..0b1650076c 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -129,6 +129,10 @@ int OS_JavaScript::get_process_id() const { ERR_FAIL_V_MSG(0, "OS::get_process_id() is not available on the HTML5 platform."); } +int OS_JavaScript::get_processor_count() const { + return godot_js_os_hw_concurrency_get(); +} + bool OS_JavaScript::_check_internal_feature_support(const String &p_feature) { if (p_feature == "HTML5" || p_feature == "web") { return true; diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h index 8db62d9d1c..81bb9c5f3d 100644 --- a/platform/javascript/os_javascript.h +++ b/platform/javascript/os_javascript.h @@ -74,6 +74,7 @@ public: Error create_process(const String &p_path, const List<String> &p_arguments, ProcessID *r_child_id = nullptr) override; Error kill(const ProcessID &p_pid) override; int get_process_id() const override; + int get_processor_count() const override; String get_executable_path() const override; Error shell_open(String p_uri) override; diff --git a/platform/linuxbsd/SCsub b/platform/linuxbsd/SCsub index ddc698a55b..46714e9502 100644 --- a/platform/linuxbsd/SCsub +++ b/platform/linuxbsd/SCsub @@ -16,6 +16,9 @@ common_x11 = [ "key_mapping_x11.cpp", ] +if "udev" in env and env["udev"]: + common_x11.append("libudev-so_wrap.c") + prog = env.add_program("#bin/godot", ["godot_linuxbsd.cpp"] + common_x11) if env["debug_symbols"] and env["separate_debug_symbols"]: diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index 40d2078ebb..f87e9cf886 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -325,14 +325,14 @@ def configure(env): if platform.system() == "Linux": env.Append(CPPDEFINES=["JOYDEV_ENABLED"]) - if env["udev"]: if os.system("pkg-config --exists libudev") == 0: # 0 means found print("Enabling udev support") env.Append(CPPDEFINES=["UDEV_ENABLED"]) - env.ParseConfig("pkg-config libudev --cflags --libs") else: print("libudev development libraries not found, disabling udev support") + else: + env["udev"] = False # Linux specific # Linkflags below this line should typically stay the last ones if not env["builtin_zlib"]: diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index 4e96e6d687..d1115b146b 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -39,7 +39,7 @@ #include <unistd.h> #ifdef UDEV_ENABLED -#include <libudev.h> +#include "libudev-so_wrap.h" #endif #define LONG_BITS (sizeof(long) * 8) @@ -72,13 +72,22 @@ void JoypadLinux::Joypad::reset() { } JoypadLinux::JoypadLinux(Input *in) { - exit_udev = false; +#ifdef UDEV_ENABLED + use_udev = initialize_libudev() == 0; + if (use_udev) { + print_verbose("JoypadLinux: udev enabled and loaded successfully."); + } else { + print_verbose("JoypadLinux: udev enabled, but couldn't be loaded. Falling back to /dev/input to detect joypads."); + } +#else + print_verbose("JoypadLinux: udev disabled, parsing /dev/input to detect joypads."); +#endif input = in; joy_thread.start(joy_thread_func, this); } JoypadLinux::~JoypadLinux() { - exit_udev = true; + exit_monitor = true; joy_thread.wait_to_finish(); close_joypad(); } @@ -92,11 +101,18 @@ void JoypadLinux::joy_thread_func(void *p_user) { void JoypadLinux::run_joypad_thread() { #ifdef UDEV_ENABLED - udev *_udev = udev_new(); - ERR_FAIL_COND(!_udev); - enumerate_joypads(_udev); - monitor_joypads(_udev); - udev_unref(_udev); + if (use_udev) { + udev *_udev = udev_new(); + if (!_udev) { + use_udev = false; + ERR_FAIL_MSG("Failed getting an udev context, falling back to parsing /dev/input."); + } + enumerate_joypads(_udev); + monitor_joypads(_udev); + udev_unref(_udev); + } else { + monitor_joypads(); + } #else monitor_joypads(); #endif @@ -137,7 +153,7 @@ void JoypadLinux::monitor_joypads(udev *p_udev) { udev_monitor_enable_receiving(mon); int fd = udev_monitor_get_fd(mon); - while (!exit_udev) { + while (!exit_monitor) { fd_set fds; struct timeval tv; int ret; @@ -179,7 +195,7 @@ void JoypadLinux::monitor_joypads(udev *p_udev) { #endif void JoypadLinux::monitor_joypads() { - while (!exit_udev) { + while (!exit_monitor) { { MutexLock lock(joy_mutex); diff --git a/platform/linuxbsd/joypad_linux.h b/platform/linuxbsd/joypad_linux.h index bf343b7ceb..2cca0700d6 100644 --- a/platform/linuxbsd/joypad_linux.h +++ b/platform/linuxbsd/joypad_linux.h @@ -70,10 +70,13 @@ private: void reset(); }; - bool exit_udev; +#ifdef UDEV_ENABLED + bool use_udev = false; +#endif + bool exit_monitor = false; Mutex joy_mutex; Thread joy_thread; - Input *input; + Input *input = nullptr; Joypad joypads[JOYPADS_MAX]; Vector<String> attached_devices; diff --git a/platform/linuxbsd/libudev-so_wrap.c b/platform/linuxbsd/libudev-so_wrap.c new file mode 100644 index 0000000000..7ffac1ee08 --- /dev/null +++ b/platform/linuxbsd/libudev-so_wrap.c @@ -0,0 +1,828 @@ +// This file is generated. Do not edit! +// see https://github.com/hpvb/dynload-wrapper for details +// generated by ./generate-wrapper.py 0.1 on 2021-02-17 13:14:24 +// flags: ./generate-wrapper.py --include /usr/include/libudev.h --sys-include <libudev.h> --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header libudev-so_wrap.h --output-implementation libudev-so_wrap.c +// +#include <dlfcn.h> +#include <stdio.h> +#define udev_ref udev_ref_orig +#define udev_unref udev_unref_orig +#define udev_new udev_new_orig +#define udev_set_log_fn udev_set_log_fn_orig +#define udev_get_log_priority udev_get_log_priority_orig +#define udev_set_log_priority udev_set_log_priority_orig +#define udev_get_userdata udev_get_userdata_orig +#define udev_set_userdata udev_set_userdata_orig +#define udev_list_entry_get_next udev_list_entry_get_next_orig +#define udev_list_entry_get_by_name udev_list_entry_get_by_name_orig +#define udev_list_entry_get_name udev_list_entry_get_name_orig +#define udev_list_entry_get_value udev_list_entry_get_value_orig +#define udev_device_ref udev_device_ref_orig +#define udev_device_unref udev_device_unref_orig +#define udev_device_get_udev udev_device_get_udev_orig +#define udev_device_new_from_syspath udev_device_new_from_syspath_orig +#define udev_device_new_from_devnum udev_device_new_from_devnum_orig +#define udev_device_new_from_subsystem_sysname udev_device_new_from_subsystem_sysname_orig +#define udev_device_new_from_device_id udev_device_new_from_device_id_orig +#define udev_device_new_from_environment udev_device_new_from_environment_orig +#define udev_device_get_parent udev_device_get_parent_orig +#define udev_device_get_parent_with_subsystem_devtype udev_device_get_parent_with_subsystem_devtype_orig +#define udev_device_get_devpath udev_device_get_devpath_orig +#define udev_device_get_subsystem udev_device_get_subsystem_orig +#define udev_device_get_devtype udev_device_get_devtype_orig +#define udev_device_get_syspath udev_device_get_syspath_orig +#define udev_device_get_sysname udev_device_get_sysname_orig +#define udev_device_get_sysnum udev_device_get_sysnum_orig +#define udev_device_get_devnode udev_device_get_devnode_orig +#define udev_device_get_is_initialized udev_device_get_is_initialized_orig +#define udev_device_get_devlinks_list_entry udev_device_get_devlinks_list_entry_orig +#define udev_device_get_properties_list_entry udev_device_get_properties_list_entry_orig +#define udev_device_get_tags_list_entry udev_device_get_tags_list_entry_orig +#define udev_device_get_sysattr_list_entry udev_device_get_sysattr_list_entry_orig +#define udev_device_get_property_value udev_device_get_property_value_orig +#define udev_device_get_driver udev_device_get_driver_orig +#define udev_device_get_devnum udev_device_get_devnum_orig +#define udev_device_get_action udev_device_get_action_orig +#define udev_device_get_seqnum udev_device_get_seqnum_orig +#define udev_device_get_usec_since_initialized udev_device_get_usec_since_initialized_orig +#define udev_device_get_sysattr_value udev_device_get_sysattr_value_orig +#define udev_device_set_sysattr_value udev_device_set_sysattr_value_orig +#define udev_device_has_tag udev_device_has_tag_orig +#define udev_monitor_ref udev_monitor_ref_orig +#define udev_monitor_unref udev_monitor_unref_orig +#define udev_monitor_get_udev udev_monitor_get_udev_orig +#define udev_monitor_new_from_netlink udev_monitor_new_from_netlink_orig +#define udev_monitor_enable_receiving udev_monitor_enable_receiving_orig +#define udev_monitor_set_receive_buffer_size udev_monitor_set_receive_buffer_size_orig +#define udev_monitor_get_fd udev_monitor_get_fd_orig +#define udev_monitor_receive_device udev_monitor_receive_device_orig +#define udev_monitor_filter_add_match_subsystem_devtype udev_monitor_filter_add_match_subsystem_devtype_orig +#define udev_monitor_filter_add_match_tag udev_monitor_filter_add_match_tag_orig +#define udev_monitor_filter_update udev_monitor_filter_update_orig +#define udev_monitor_filter_remove udev_monitor_filter_remove_orig +#define udev_enumerate_ref udev_enumerate_ref_orig +#define udev_enumerate_unref udev_enumerate_unref_orig +#define udev_enumerate_get_udev udev_enumerate_get_udev_orig +#define udev_enumerate_new udev_enumerate_new_orig +#define udev_enumerate_add_match_subsystem udev_enumerate_add_match_subsystem_orig +#define udev_enumerate_add_nomatch_subsystem udev_enumerate_add_nomatch_subsystem_orig +#define udev_enumerate_add_match_sysattr udev_enumerate_add_match_sysattr_orig +#define udev_enumerate_add_nomatch_sysattr udev_enumerate_add_nomatch_sysattr_orig +#define udev_enumerate_add_match_property udev_enumerate_add_match_property_orig +#define udev_enumerate_add_match_sysname udev_enumerate_add_match_sysname_orig +#define udev_enumerate_add_match_tag udev_enumerate_add_match_tag_orig +#define udev_enumerate_add_match_parent udev_enumerate_add_match_parent_orig +#define udev_enumerate_add_match_is_initialized udev_enumerate_add_match_is_initialized_orig +#define udev_enumerate_add_syspath udev_enumerate_add_syspath_orig +#define udev_enumerate_scan_devices udev_enumerate_scan_devices_orig +#define udev_enumerate_scan_subsystems udev_enumerate_scan_subsystems_orig +#define udev_enumerate_get_list_entry udev_enumerate_get_list_entry_orig +#define udev_queue_ref udev_queue_ref_orig +#define udev_queue_unref udev_queue_unref_orig +#define udev_queue_get_udev udev_queue_get_udev_orig +#define udev_queue_new udev_queue_new_orig +#define udev_queue_get_kernel_seqnum udev_queue_get_kernel_seqnum_orig +#define udev_queue_get_udev_seqnum udev_queue_get_udev_seqnum_orig +#define udev_queue_get_udev_is_active udev_queue_get_udev_is_active_orig +#define udev_queue_get_queue_is_empty udev_queue_get_queue_is_empty_orig +#define udev_queue_get_seqnum_is_finished udev_queue_get_seqnum_is_finished_orig +#define udev_queue_get_seqnum_sequence_is_finished udev_queue_get_seqnum_sequence_is_finished_orig +#define udev_queue_get_fd udev_queue_get_fd_orig +#define udev_queue_flush udev_queue_flush_orig +#define udev_queue_get_queued_list_entry udev_queue_get_queued_list_entry_orig +#define udev_hwdb_new udev_hwdb_new_orig +#define udev_hwdb_ref udev_hwdb_ref_orig +#define udev_hwdb_unref udev_hwdb_unref_orig +#define udev_hwdb_get_properties_list_entry udev_hwdb_get_properties_list_entry_orig +#define udev_util_encode_string udev_util_encode_string_orig +#include <libudev.h> +#undef udev_ref +#undef udev_unref +#undef udev_new +#undef udev_set_log_fn +#undef udev_get_log_priority +#undef udev_set_log_priority +#undef udev_get_userdata +#undef udev_set_userdata +#undef udev_list_entry_get_next +#undef udev_list_entry_get_by_name +#undef udev_list_entry_get_name +#undef udev_list_entry_get_value +#undef udev_device_ref +#undef udev_device_unref +#undef udev_device_get_udev +#undef udev_device_new_from_syspath +#undef udev_device_new_from_devnum +#undef udev_device_new_from_subsystem_sysname +#undef udev_device_new_from_device_id +#undef udev_device_new_from_environment +#undef udev_device_get_parent +#undef udev_device_get_parent_with_subsystem_devtype +#undef udev_device_get_devpath +#undef udev_device_get_subsystem +#undef udev_device_get_devtype +#undef udev_device_get_syspath +#undef udev_device_get_sysname +#undef udev_device_get_sysnum +#undef udev_device_get_devnode +#undef udev_device_get_is_initialized +#undef udev_device_get_devlinks_list_entry +#undef udev_device_get_properties_list_entry +#undef udev_device_get_tags_list_entry +#undef udev_device_get_sysattr_list_entry +#undef udev_device_get_property_value +#undef udev_device_get_driver +#undef udev_device_get_devnum +#undef udev_device_get_action +#undef udev_device_get_seqnum +#undef udev_device_get_usec_since_initialized +#undef udev_device_get_sysattr_value +#undef udev_device_set_sysattr_value +#undef udev_device_has_tag +#undef udev_monitor_ref +#undef udev_monitor_unref +#undef udev_monitor_get_udev +#undef udev_monitor_new_from_netlink +#undef udev_monitor_enable_receiving +#undef udev_monitor_set_receive_buffer_size +#undef udev_monitor_get_fd +#undef udev_monitor_receive_device +#undef udev_monitor_filter_add_match_subsystem_devtype +#undef udev_monitor_filter_add_match_tag +#undef udev_monitor_filter_update +#undef udev_monitor_filter_remove +#undef udev_enumerate_ref +#undef udev_enumerate_unref +#undef udev_enumerate_get_udev +#undef udev_enumerate_new +#undef udev_enumerate_add_match_subsystem +#undef udev_enumerate_add_nomatch_subsystem +#undef udev_enumerate_add_match_sysattr +#undef udev_enumerate_add_nomatch_sysattr +#undef udev_enumerate_add_match_property +#undef udev_enumerate_add_match_sysname +#undef udev_enumerate_add_match_tag +#undef udev_enumerate_add_match_parent +#undef udev_enumerate_add_match_is_initialized +#undef udev_enumerate_add_syspath +#undef udev_enumerate_scan_devices +#undef udev_enumerate_scan_subsystems +#undef udev_enumerate_get_list_entry +#undef udev_queue_ref +#undef udev_queue_unref +#undef udev_queue_get_udev +#undef udev_queue_new +#undef udev_queue_get_kernel_seqnum +#undef udev_queue_get_udev_seqnum +#undef udev_queue_get_udev_is_active +#undef udev_queue_get_queue_is_empty +#undef udev_queue_get_seqnum_is_finished +#undef udev_queue_get_seqnum_sequence_is_finished +#undef udev_queue_get_fd +#undef udev_queue_flush +#undef udev_queue_get_queued_list_entry +#undef udev_hwdb_new +#undef udev_hwdb_ref +#undef udev_hwdb_unref +#undef udev_hwdb_get_properties_list_entry +#undef udev_util_encode_string +struct udev* (*udev_ref)(struct udev*); +struct udev* (*udev_unref)(struct udev*); +struct udev* (*udev_new)( void); +void (*udev_set_log_fn)(struct udev*, void*); +int (*udev_get_log_priority)(struct udev*); +void (*udev_set_log_priority)(struct udev*, int); +void* (*udev_get_userdata)(struct udev*); +void (*udev_set_userdata)(struct udev*, void*); +struct udev_list_entry* (*udev_list_entry_get_next)(struct udev_list_entry*); +struct udev_list_entry* (*udev_list_entry_get_by_name)(struct udev_list_entry*,const char*); +const char* (*udev_list_entry_get_name)(struct udev_list_entry*); +const char* (*udev_list_entry_get_value)(struct udev_list_entry*); +struct udev_device* (*udev_device_ref)(struct udev_device*); +struct udev_device* (*udev_device_unref)(struct udev_device*); +struct udev* (*udev_device_get_udev)(struct udev_device*); +struct udev_device* (*udev_device_new_from_syspath)(struct udev*,const char*); +struct udev_device* (*udev_device_new_from_devnum)(struct udev*, char, dev_t); +struct udev_device* (*udev_device_new_from_subsystem_sysname)(struct udev*,const char*,const char*); +struct udev_device* (*udev_device_new_from_device_id)(struct udev*,const char*); +struct udev_device* (*udev_device_new_from_environment)(struct udev*); +struct udev_device* (*udev_device_get_parent)(struct udev_device*); +struct udev_device* (*udev_device_get_parent_with_subsystem_devtype)(struct udev_device*,const char*,const char*); +const char* (*udev_device_get_devpath)(struct udev_device*); +const char* (*udev_device_get_subsystem)(struct udev_device*); +const char* (*udev_device_get_devtype)(struct udev_device*); +const char* (*udev_device_get_syspath)(struct udev_device*); +const char* (*udev_device_get_sysname)(struct udev_device*); +const char* (*udev_device_get_sysnum)(struct udev_device*); +const char* (*udev_device_get_devnode)(struct udev_device*); +int (*udev_device_get_is_initialized)(struct udev_device*); +struct udev_list_entry* (*udev_device_get_devlinks_list_entry)(struct udev_device*); +struct udev_list_entry* (*udev_device_get_properties_list_entry)(struct udev_device*); +struct udev_list_entry* (*udev_device_get_tags_list_entry)(struct udev_device*); +struct udev_list_entry* (*udev_device_get_sysattr_list_entry)(struct udev_device*); +const char* (*udev_device_get_property_value)(struct udev_device*,const char*); +const char* (*udev_device_get_driver)(struct udev_device*); +dev_t (*udev_device_get_devnum)(struct udev_device*); +const char* (*udev_device_get_action)(struct udev_device*); +unsigned long long int (*udev_device_get_seqnum)(struct udev_device*); +unsigned long long int (*udev_device_get_usec_since_initialized)(struct udev_device*); +const char* (*udev_device_get_sysattr_value)(struct udev_device*,const char*); +int (*udev_device_set_sysattr_value)(struct udev_device*,const char*,const char*); +int (*udev_device_has_tag)(struct udev_device*,const char*); +struct udev_monitor* (*udev_monitor_ref)(struct udev_monitor*); +struct udev_monitor* (*udev_monitor_unref)(struct udev_monitor*); +struct udev* (*udev_monitor_get_udev)(struct udev_monitor*); +struct udev_monitor* (*udev_monitor_new_from_netlink)(struct udev*,const char*); +int (*udev_monitor_enable_receiving)(struct udev_monitor*); +int (*udev_monitor_set_receive_buffer_size)(struct udev_monitor*, int); +int (*udev_monitor_get_fd)(struct udev_monitor*); +struct udev_device* (*udev_monitor_receive_device)(struct udev_monitor*); +int (*udev_monitor_filter_add_match_subsystem_devtype)(struct udev_monitor*,const char*,const char*); +int (*udev_monitor_filter_add_match_tag)(struct udev_monitor*,const char*); +int (*udev_monitor_filter_update)(struct udev_monitor*); +int (*udev_monitor_filter_remove)(struct udev_monitor*); +struct udev_enumerate* (*udev_enumerate_ref)(struct udev_enumerate*); +struct udev_enumerate* (*udev_enumerate_unref)(struct udev_enumerate*); +struct udev* (*udev_enumerate_get_udev)(struct udev_enumerate*); +struct udev_enumerate* (*udev_enumerate_new)(struct udev*); +int (*udev_enumerate_add_match_subsystem)(struct udev_enumerate*,const char*); +int (*udev_enumerate_add_nomatch_subsystem)(struct udev_enumerate*,const char*); +int (*udev_enumerate_add_match_sysattr)(struct udev_enumerate*,const char*,const char*); +int (*udev_enumerate_add_nomatch_sysattr)(struct udev_enumerate*,const char*,const char*); +int (*udev_enumerate_add_match_property)(struct udev_enumerate*,const char*,const char*); +int (*udev_enumerate_add_match_sysname)(struct udev_enumerate*,const char*); +int (*udev_enumerate_add_match_tag)(struct udev_enumerate*,const char*); +int (*udev_enumerate_add_match_parent)(struct udev_enumerate*,struct udev_device*); +int (*udev_enumerate_add_match_is_initialized)(struct udev_enumerate*); +int (*udev_enumerate_add_syspath)(struct udev_enumerate*,const char*); +int (*udev_enumerate_scan_devices)(struct udev_enumerate*); +int (*udev_enumerate_scan_subsystems)(struct udev_enumerate*); +struct udev_list_entry* (*udev_enumerate_get_list_entry)(struct udev_enumerate*); +struct udev_queue* (*udev_queue_ref)(struct udev_queue*); +struct udev_queue* (*udev_queue_unref)(struct udev_queue*); +struct udev* (*udev_queue_get_udev)(struct udev_queue*); +struct udev_queue* (*udev_queue_new)(struct udev*); +unsigned long long int (*udev_queue_get_kernel_seqnum)(struct udev_queue*); +unsigned long long int (*udev_queue_get_udev_seqnum)(struct udev_queue*); +int (*udev_queue_get_udev_is_active)(struct udev_queue*); +int (*udev_queue_get_queue_is_empty)(struct udev_queue*); +int (*udev_queue_get_seqnum_is_finished)(struct udev_queue*, unsigned long long int); +int (*udev_queue_get_seqnum_sequence_is_finished)(struct udev_queue*, unsigned long long int, unsigned long long int); +int (*udev_queue_get_fd)(struct udev_queue*); +int (*udev_queue_flush)(struct udev_queue*); +struct udev_list_entry* (*udev_queue_get_queued_list_entry)(struct udev_queue*); +struct udev_hwdb* (*udev_hwdb_new)(struct udev*); +struct udev_hwdb* (*udev_hwdb_ref)(struct udev_hwdb*); +struct udev_hwdb* (*udev_hwdb_unref)(struct udev_hwdb*); +struct udev_list_entry* (*udev_hwdb_get_properties_list_entry)(struct udev_hwdb*,const char*, unsigned); +int (*udev_util_encode_string)(const char*, char*, size_t);int initialize_libudev() { + void *handle; + char *error; + handle = dlopen("libudev.so.1", RTLD_NOW | RTLD_DEEPBIND); + if (!handle) { + fprintf(stderr, "%s\n", dlerror()); + return(1); + } + dlerror(); +// udev_ref + *(void **) (&udev_ref) = dlsym(handle, "udev_ref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_unref + *(void **) (&udev_unref) = dlsym(handle, "udev_unref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_new + *(void **) (&udev_new) = dlsym(handle, "udev_new"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_set_log_fn + *(void **) (&udev_set_log_fn) = dlsym(handle, "udev_set_log_fn"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_get_log_priority + *(void **) (&udev_get_log_priority) = dlsym(handle, "udev_get_log_priority"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_set_log_priority + *(void **) (&udev_set_log_priority) = dlsym(handle, "udev_set_log_priority"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_get_userdata + *(void **) (&udev_get_userdata) = dlsym(handle, "udev_get_userdata"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_set_userdata + *(void **) (&udev_set_userdata) = dlsym(handle, "udev_set_userdata"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_list_entry_get_next + *(void **) (&udev_list_entry_get_next) = dlsym(handle, "udev_list_entry_get_next"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_list_entry_get_by_name + *(void **) (&udev_list_entry_get_by_name) = dlsym(handle, "udev_list_entry_get_by_name"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_list_entry_get_name + *(void **) (&udev_list_entry_get_name) = dlsym(handle, "udev_list_entry_get_name"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_list_entry_get_value + *(void **) (&udev_list_entry_get_value) = dlsym(handle, "udev_list_entry_get_value"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_ref + *(void **) (&udev_device_ref) = dlsym(handle, "udev_device_ref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_unref + *(void **) (&udev_device_unref) = dlsym(handle, "udev_device_unref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_udev + *(void **) (&udev_device_get_udev) = dlsym(handle, "udev_device_get_udev"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_new_from_syspath + *(void **) (&udev_device_new_from_syspath) = dlsym(handle, "udev_device_new_from_syspath"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_new_from_devnum + *(void **) (&udev_device_new_from_devnum) = dlsym(handle, "udev_device_new_from_devnum"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_new_from_subsystem_sysname + *(void **) (&udev_device_new_from_subsystem_sysname) = dlsym(handle, "udev_device_new_from_subsystem_sysname"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_new_from_device_id + *(void **) (&udev_device_new_from_device_id) = dlsym(handle, "udev_device_new_from_device_id"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_new_from_environment + *(void **) (&udev_device_new_from_environment) = dlsym(handle, "udev_device_new_from_environment"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_parent + *(void **) (&udev_device_get_parent) = dlsym(handle, "udev_device_get_parent"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_parent_with_subsystem_devtype + *(void **) (&udev_device_get_parent_with_subsystem_devtype) = dlsym(handle, "udev_device_get_parent_with_subsystem_devtype"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_devpath + *(void **) (&udev_device_get_devpath) = dlsym(handle, "udev_device_get_devpath"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_subsystem + *(void **) (&udev_device_get_subsystem) = dlsym(handle, "udev_device_get_subsystem"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_devtype + *(void **) (&udev_device_get_devtype) = dlsym(handle, "udev_device_get_devtype"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_syspath + *(void **) (&udev_device_get_syspath) = dlsym(handle, "udev_device_get_syspath"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_sysname + *(void **) (&udev_device_get_sysname) = dlsym(handle, "udev_device_get_sysname"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_sysnum + *(void **) (&udev_device_get_sysnum) = dlsym(handle, "udev_device_get_sysnum"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_devnode + *(void **) (&udev_device_get_devnode) = dlsym(handle, "udev_device_get_devnode"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_is_initialized + *(void **) (&udev_device_get_is_initialized) = dlsym(handle, "udev_device_get_is_initialized"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_devlinks_list_entry + *(void **) (&udev_device_get_devlinks_list_entry) = dlsym(handle, "udev_device_get_devlinks_list_entry"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_properties_list_entry + *(void **) (&udev_device_get_properties_list_entry) = dlsym(handle, "udev_device_get_properties_list_entry"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_tags_list_entry + *(void **) (&udev_device_get_tags_list_entry) = dlsym(handle, "udev_device_get_tags_list_entry"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_sysattr_list_entry + *(void **) (&udev_device_get_sysattr_list_entry) = dlsym(handle, "udev_device_get_sysattr_list_entry"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_property_value + *(void **) (&udev_device_get_property_value) = dlsym(handle, "udev_device_get_property_value"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_driver + *(void **) (&udev_device_get_driver) = dlsym(handle, "udev_device_get_driver"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_devnum + *(void **) (&udev_device_get_devnum) = dlsym(handle, "udev_device_get_devnum"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_action + *(void **) (&udev_device_get_action) = dlsym(handle, "udev_device_get_action"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_seqnum + *(void **) (&udev_device_get_seqnum) = dlsym(handle, "udev_device_get_seqnum"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_usec_since_initialized + *(void **) (&udev_device_get_usec_since_initialized) = dlsym(handle, "udev_device_get_usec_since_initialized"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_get_sysattr_value + *(void **) (&udev_device_get_sysattr_value) = dlsym(handle, "udev_device_get_sysattr_value"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_set_sysattr_value + *(void **) (&udev_device_set_sysattr_value) = dlsym(handle, "udev_device_set_sysattr_value"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_device_has_tag + *(void **) (&udev_device_has_tag) = dlsym(handle, "udev_device_has_tag"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_ref + *(void **) (&udev_monitor_ref) = dlsym(handle, "udev_monitor_ref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_unref + *(void **) (&udev_monitor_unref) = dlsym(handle, "udev_monitor_unref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_get_udev + *(void **) (&udev_monitor_get_udev) = dlsym(handle, "udev_monitor_get_udev"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_new_from_netlink + *(void **) (&udev_monitor_new_from_netlink) = dlsym(handle, "udev_monitor_new_from_netlink"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_enable_receiving + *(void **) (&udev_monitor_enable_receiving) = dlsym(handle, "udev_monitor_enable_receiving"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_set_receive_buffer_size + *(void **) (&udev_monitor_set_receive_buffer_size) = dlsym(handle, "udev_monitor_set_receive_buffer_size"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_get_fd + *(void **) (&udev_monitor_get_fd) = dlsym(handle, "udev_monitor_get_fd"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_receive_device + *(void **) (&udev_monitor_receive_device) = dlsym(handle, "udev_monitor_receive_device"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_filter_add_match_subsystem_devtype + *(void **) (&udev_monitor_filter_add_match_subsystem_devtype) = dlsym(handle, "udev_monitor_filter_add_match_subsystem_devtype"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_filter_add_match_tag + *(void **) (&udev_monitor_filter_add_match_tag) = dlsym(handle, "udev_monitor_filter_add_match_tag"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_filter_update + *(void **) (&udev_monitor_filter_update) = dlsym(handle, "udev_monitor_filter_update"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_monitor_filter_remove + *(void **) (&udev_monitor_filter_remove) = dlsym(handle, "udev_monitor_filter_remove"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_ref + *(void **) (&udev_enumerate_ref) = dlsym(handle, "udev_enumerate_ref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_unref + *(void **) (&udev_enumerate_unref) = dlsym(handle, "udev_enumerate_unref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_get_udev + *(void **) (&udev_enumerate_get_udev) = dlsym(handle, "udev_enumerate_get_udev"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_new + *(void **) (&udev_enumerate_new) = dlsym(handle, "udev_enumerate_new"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_match_subsystem + *(void **) (&udev_enumerate_add_match_subsystem) = dlsym(handle, "udev_enumerate_add_match_subsystem"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_nomatch_subsystem + *(void **) (&udev_enumerate_add_nomatch_subsystem) = dlsym(handle, "udev_enumerate_add_nomatch_subsystem"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_match_sysattr + *(void **) (&udev_enumerate_add_match_sysattr) = dlsym(handle, "udev_enumerate_add_match_sysattr"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_nomatch_sysattr + *(void **) (&udev_enumerate_add_nomatch_sysattr) = dlsym(handle, "udev_enumerate_add_nomatch_sysattr"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_match_property + *(void **) (&udev_enumerate_add_match_property) = dlsym(handle, "udev_enumerate_add_match_property"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_match_sysname + *(void **) (&udev_enumerate_add_match_sysname) = dlsym(handle, "udev_enumerate_add_match_sysname"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_match_tag + *(void **) (&udev_enumerate_add_match_tag) = dlsym(handle, "udev_enumerate_add_match_tag"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_match_parent + *(void **) (&udev_enumerate_add_match_parent) = dlsym(handle, "udev_enumerate_add_match_parent"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_match_is_initialized + *(void **) (&udev_enumerate_add_match_is_initialized) = dlsym(handle, "udev_enumerate_add_match_is_initialized"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_add_syspath + *(void **) (&udev_enumerate_add_syspath) = dlsym(handle, "udev_enumerate_add_syspath"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_scan_devices + *(void **) (&udev_enumerate_scan_devices) = dlsym(handle, "udev_enumerate_scan_devices"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_scan_subsystems + *(void **) (&udev_enumerate_scan_subsystems) = dlsym(handle, "udev_enumerate_scan_subsystems"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_enumerate_get_list_entry + *(void **) (&udev_enumerate_get_list_entry) = dlsym(handle, "udev_enumerate_get_list_entry"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_ref + *(void **) (&udev_queue_ref) = dlsym(handle, "udev_queue_ref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_unref + *(void **) (&udev_queue_unref) = dlsym(handle, "udev_queue_unref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_udev + *(void **) (&udev_queue_get_udev) = dlsym(handle, "udev_queue_get_udev"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_new + *(void **) (&udev_queue_new) = dlsym(handle, "udev_queue_new"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_kernel_seqnum + *(void **) (&udev_queue_get_kernel_seqnum) = dlsym(handle, "udev_queue_get_kernel_seqnum"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_udev_seqnum + *(void **) (&udev_queue_get_udev_seqnum) = dlsym(handle, "udev_queue_get_udev_seqnum"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_udev_is_active + *(void **) (&udev_queue_get_udev_is_active) = dlsym(handle, "udev_queue_get_udev_is_active"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_queue_is_empty + *(void **) (&udev_queue_get_queue_is_empty) = dlsym(handle, "udev_queue_get_queue_is_empty"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_seqnum_is_finished + *(void **) (&udev_queue_get_seqnum_is_finished) = dlsym(handle, "udev_queue_get_seqnum_is_finished"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_seqnum_sequence_is_finished + *(void **) (&udev_queue_get_seqnum_sequence_is_finished) = dlsym(handle, "udev_queue_get_seqnum_sequence_is_finished"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_fd + *(void **) (&udev_queue_get_fd) = dlsym(handle, "udev_queue_get_fd"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_flush + *(void **) (&udev_queue_flush) = dlsym(handle, "udev_queue_flush"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_queue_get_queued_list_entry + *(void **) (&udev_queue_get_queued_list_entry) = dlsym(handle, "udev_queue_get_queued_list_entry"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_hwdb_new + *(void **) (&udev_hwdb_new) = dlsym(handle, "udev_hwdb_new"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_hwdb_ref + *(void **) (&udev_hwdb_ref) = dlsym(handle, "udev_hwdb_ref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_hwdb_unref + *(void **) (&udev_hwdb_unref) = dlsym(handle, "udev_hwdb_unref"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_hwdb_get_properties_list_entry + *(void **) (&udev_hwdb_get_properties_list_entry) = dlsym(handle, "udev_hwdb_get_properties_list_entry"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +// udev_util_encode_string + *(void **) (&udev_util_encode_string) = dlsym(handle, "udev_util_encode_string"); + error = dlerror(); + if (error != NULL) { + fprintf(stderr, "%s\n", error); + } +return 0; +} diff --git a/platform/linuxbsd/libudev-so_wrap.h b/platform/linuxbsd/libudev-so_wrap.h new file mode 100644 index 0000000000..360e2d287a --- /dev/null +++ b/platform/linuxbsd/libudev-so_wrap.h @@ -0,0 +1,285 @@ +// This file is generated. Do not edit! +// see https://github.com/hpvb/dynload-wrapper for details +// generated by ./generate-wrapper.py 0.1 on 2021-02-17 13:14:24 +// flags: ./generate-wrapper.py --include /usr/include/libudev.h --sys-include <libudev.h> --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header libudev-so_wrap.h --output-implementation libudev-so_wrap.c +// +#include <dlfcn.h> +#include <stdio.h> +#define udev_ref udev_ref_orig +#define udev_unref udev_unref_orig +#define udev_new udev_new_orig +#define udev_set_log_fn udev_set_log_fn_orig +#define udev_get_log_priority udev_get_log_priority_orig +#define udev_set_log_priority udev_set_log_priority_orig +#define udev_get_userdata udev_get_userdata_orig +#define udev_set_userdata udev_set_userdata_orig +#define udev_list_entry_get_next udev_list_entry_get_next_orig +#define udev_list_entry_get_by_name udev_list_entry_get_by_name_orig +#define udev_list_entry_get_name udev_list_entry_get_name_orig +#define udev_list_entry_get_value udev_list_entry_get_value_orig +#define udev_device_ref udev_device_ref_orig +#define udev_device_unref udev_device_unref_orig +#define udev_device_get_udev udev_device_get_udev_orig +#define udev_device_new_from_syspath udev_device_new_from_syspath_orig +#define udev_device_new_from_devnum udev_device_new_from_devnum_orig +#define udev_device_new_from_subsystem_sysname udev_device_new_from_subsystem_sysname_orig +#define udev_device_new_from_device_id udev_device_new_from_device_id_orig +#define udev_device_new_from_environment udev_device_new_from_environment_orig +#define udev_device_get_parent udev_device_get_parent_orig +#define udev_device_get_parent_with_subsystem_devtype udev_device_get_parent_with_subsystem_devtype_orig +#define udev_device_get_devpath udev_device_get_devpath_orig +#define udev_device_get_subsystem udev_device_get_subsystem_orig +#define udev_device_get_devtype udev_device_get_devtype_orig +#define udev_device_get_syspath udev_device_get_syspath_orig +#define udev_device_get_sysname udev_device_get_sysname_orig +#define udev_device_get_sysnum udev_device_get_sysnum_orig +#define udev_device_get_devnode udev_device_get_devnode_orig +#define udev_device_get_is_initialized udev_device_get_is_initialized_orig +#define udev_device_get_devlinks_list_entry udev_device_get_devlinks_list_entry_orig +#define udev_device_get_properties_list_entry udev_device_get_properties_list_entry_orig +#define udev_device_get_tags_list_entry udev_device_get_tags_list_entry_orig +#define udev_device_get_sysattr_list_entry udev_device_get_sysattr_list_entry_orig +#define udev_device_get_property_value udev_device_get_property_value_orig +#define udev_device_get_driver udev_device_get_driver_orig +#define udev_device_get_devnum udev_device_get_devnum_orig +#define udev_device_get_action udev_device_get_action_orig +#define udev_device_get_seqnum udev_device_get_seqnum_orig +#define udev_device_get_usec_since_initialized udev_device_get_usec_since_initialized_orig +#define udev_device_get_sysattr_value udev_device_get_sysattr_value_orig +#define udev_device_set_sysattr_value udev_device_set_sysattr_value_orig +#define udev_device_has_tag udev_device_has_tag_orig +#define udev_monitor_ref udev_monitor_ref_orig +#define udev_monitor_unref udev_monitor_unref_orig +#define udev_monitor_get_udev udev_monitor_get_udev_orig +#define udev_monitor_new_from_netlink udev_monitor_new_from_netlink_orig +#define udev_monitor_enable_receiving udev_monitor_enable_receiving_orig +#define udev_monitor_set_receive_buffer_size udev_monitor_set_receive_buffer_size_orig +#define udev_monitor_get_fd udev_monitor_get_fd_orig +#define udev_monitor_receive_device udev_monitor_receive_device_orig +#define udev_monitor_filter_add_match_subsystem_devtype udev_monitor_filter_add_match_subsystem_devtype_orig +#define udev_monitor_filter_add_match_tag udev_monitor_filter_add_match_tag_orig +#define udev_monitor_filter_update udev_monitor_filter_update_orig +#define udev_monitor_filter_remove udev_monitor_filter_remove_orig +#define udev_enumerate_ref udev_enumerate_ref_orig +#define udev_enumerate_unref udev_enumerate_unref_orig +#define udev_enumerate_get_udev udev_enumerate_get_udev_orig +#define udev_enumerate_new udev_enumerate_new_orig +#define udev_enumerate_add_match_subsystem udev_enumerate_add_match_subsystem_orig +#define udev_enumerate_add_nomatch_subsystem udev_enumerate_add_nomatch_subsystem_orig +#define udev_enumerate_add_match_sysattr udev_enumerate_add_match_sysattr_orig +#define udev_enumerate_add_nomatch_sysattr udev_enumerate_add_nomatch_sysattr_orig +#define udev_enumerate_add_match_property udev_enumerate_add_match_property_orig +#define udev_enumerate_add_match_sysname udev_enumerate_add_match_sysname_orig +#define udev_enumerate_add_match_tag udev_enumerate_add_match_tag_orig +#define udev_enumerate_add_match_parent udev_enumerate_add_match_parent_orig +#define udev_enumerate_add_match_is_initialized udev_enumerate_add_match_is_initialized_orig +#define udev_enumerate_add_syspath udev_enumerate_add_syspath_orig +#define udev_enumerate_scan_devices udev_enumerate_scan_devices_orig +#define udev_enumerate_scan_subsystems udev_enumerate_scan_subsystems_orig +#define udev_enumerate_get_list_entry udev_enumerate_get_list_entry_orig +#define udev_queue_ref udev_queue_ref_orig +#define udev_queue_unref udev_queue_unref_orig +#define udev_queue_get_udev udev_queue_get_udev_orig +#define udev_queue_new udev_queue_new_orig +#define udev_queue_get_kernel_seqnum udev_queue_get_kernel_seqnum_orig +#define udev_queue_get_udev_seqnum udev_queue_get_udev_seqnum_orig +#define udev_queue_get_udev_is_active udev_queue_get_udev_is_active_orig +#define udev_queue_get_queue_is_empty udev_queue_get_queue_is_empty_orig +#define udev_queue_get_seqnum_is_finished udev_queue_get_seqnum_is_finished_orig +#define udev_queue_get_seqnum_sequence_is_finished udev_queue_get_seqnum_sequence_is_finished_orig +#define udev_queue_get_fd udev_queue_get_fd_orig +#define udev_queue_flush udev_queue_flush_orig +#define udev_queue_get_queued_list_entry udev_queue_get_queued_list_entry_orig +#define udev_hwdb_new udev_hwdb_new_orig +#define udev_hwdb_ref udev_hwdb_ref_orig +#define udev_hwdb_unref udev_hwdb_unref_orig +#define udev_hwdb_get_properties_list_entry udev_hwdb_get_properties_list_entry_orig +#define udev_util_encode_string udev_util_encode_string_orig +#include <libudev.h> +#undef udev_ref +#undef udev_unref +#undef udev_new +#undef udev_set_log_fn +#undef udev_get_log_priority +#undef udev_set_log_priority +#undef udev_get_userdata +#undef udev_set_userdata +#undef udev_list_entry_get_next +#undef udev_list_entry_get_by_name +#undef udev_list_entry_get_name +#undef udev_list_entry_get_value +#undef udev_device_ref +#undef udev_device_unref +#undef udev_device_get_udev +#undef udev_device_new_from_syspath +#undef udev_device_new_from_devnum +#undef udev_device_new_from_subsystem_sysname +#undef udev_device_new_from_device_id +#undef udev_device_new_from_environment +#undef udev_device_get_parent +#undef udev_device_get_parent_with_subsystem_devtype +#undef udev_device_get_devpath +#undef udev_device_get_subsystem +#undef udev_device_get_devtype +#undef udev_device_get_syspath +#undef udev_device_get_sysname +#undef udev_device_get_sysnum +#undef udev_device_get_devnode +#undef udev_device_get_is_initialized +#undef udev_device_get_devlinks_list_entry +#undef udev_device_get_properties_list_entry +#undef udev_device_get_tags_list_entry +#undef udev_device_get_sysattr_list_entry +#undef udev_device_get_property_value +#undef udev_device_get_driver +#undef udev_device_get_devnum +#undef udev_device_get_action +#undef udev_device_get_seqnum +#undef udev_device_get_usec_since_initialized +#undef udev_device_get_sysattr_value +#undef udev_device_set_sysattr_value +#undef udev_device_has_tag +#undef udev_monitor_ref +#undef udev_monitor_unref +#undef udev_monitor_get_udev +#undef udev_monitor_new_from_netlink +#undef udev_monitor_enable_receiving +#undef udev_monitor_set_receive_buffer_size +#undef udev_monitor_get_fd +#undef udev_monitor_receive_device +#undef udev_monitor_filter_add_match_subsystem_devtype +#undef udev_monitor_filter_add_match_tag +#undef udev_monitor_filter_update +#undef udev_monitor_filter_remove +#undef udev_enumerate_ref +#undef udev_enumerate_unref +#undef udev_enumerate_get_udev +#undef udev_enumerate_new +#undef udev_enumerate_add_match_subsystem +#undef udev_enumerate_add_nomatch_subsystem +#undef udev_enumerate_add_match_sysattr +#undef udev_enumerate_add_nomatch_sysattr +#undef udev_enumerate_add_match_property +#undef udev_enumerate_add_match_sysname +#undef udev_enumerate_add_match_tag +#undef udev_enumerate_add_match_parent +#undef udev_enumerate_add_match_is_initialized +#undef udev_enumerate_add_syspath +#undef udev_enumerate_scan_devices +#undef udev_enumerate_scan_subsystems +#undef udev_enumerate_get_list_entry +#undef udev_queue_ref +#undef udev_queue_unref +#undef udev_queue_get_udev +#undef udev_queue_new +#undef udev_queue_get_kernel_seqnum +#undef udev_queue_get_udev_seqnum +#undef udev_queue_get_udev_is_active +#undef udev_queue_get_queue_is_empty +#undef udev_queue_get_seqnum_is_finished +#undef udev_queue_get_seqnum_sequence_is_finished +#undef udev_queue_get_fd +#undef udev_queue_flush +#undef udev_queue_get_queued_list_entry +#undef udev_hwdb_new +#undef udev_hwdb_ref +#undef udev_hwdb_unref +#undef udev_hwdb_get_properties_list_entry +#undef udev_util_encode_string +#ifdef __cplusplus +extern "C" { +#endif +extern struct udev* (*udev_ref)(struct udev*); +extern struct udev* (*udev_unref)(struct udev*); +extern struct udev* (*udev_new)( void); +extern void (*udev_set_log_fn)(struct udev*, void*); +extern int (*udev_get_log_priority)(struct udev*); +extern void (*udev_set_log_priority)(struct udev*, int); +extern void* (*udev_get_userdata)(struct udev*); +extern void (*udev_set_userdata)(struct udev*, void*); +extern struct udev_list_entry* (*udev_list_entry_get_next)(struct udev_list_entry*); +extern struct udev_list_entry* (*udev_list_entry_get_by_name)(struct udev_list_entry*,const char*); +extern const char* (*udev_list_entry_get_name)(struct udev_list_entry*); +extern const char* (*udev_list_entry_get_value)(struct udev_list_entry*); +extern struct udev_device* (*udev_device_ref)(struct udev_device*); +extern struct udev_device* (*udev_device_unref)(struct udev_device*); +extern struct udev* (*udev_device_get_udev)(struct udev_device*); +extern struct udev_device* (*udev_device_new_from_syspath)(struct udev*,const char*); +extern struct udev_device* (*udev_device_new_from_devnum)(struct udev*, char, dev_t); +extern struct udev_device* (*udev_device_new_from_subsystem_sysname)(struct udev*,const char*,const char*); +extern struct udev_device* (*udev_device_new_from_device_id)(struct udev*,const char*); +extern struct udev_device* (*udev_device_new_from_environment)(struct udev*); +extern struct udev_device* (*udev_device_get_parent)(struct udev_device*); +extern struct udev_device* (*udev_device_get_parent_with_subsystem_devtype)(struct udev_device*,const char*,const char*); +extern const char* (*udev_device_get_devpath)(struct udev_device*); +extern const char* (*udev_device_get_subsystem)(struct udev_device*); +extern const char* (*udev_device_get_devtype)(struct udev_device*); +extern const char* (*udev_device_get_syspath)(struct udev_device*); +extern const char* (*udev_device_get_sysname)(struct udev_device*); +extern const char* (*udev_device_get_sysnum)(struct udev_device*); +extern const char* (*udev_device_get_devnode)(struct udev_device*); +extern int (*udev_device_get_is_initialized)(struct udev_device*); +extern struct udev_list_entry* (*udev_device_get_devlinks_list_entry)(struct udev_device*); +extern struct udev_list_entry* (*udev_device_get_properties_list_entry)(struct udev_device*); +extern struct udev_list_entry* (*udev_device_get_tags_list_entry)(struct udev_device*); +extern struct udev_list_entry* (*udev_device_get_sysattr_list_entry)(struct udev_device*); +extern const char* (*udev_device_get_property_value)(struct udev_device*,const char*); +extern const char* (*udev_device_get_driver)(struct udev_device*); +extern dev_t (*udev_device_get_devnum)(struct udev_device*); +extern const char* (*udev_device_get_action)(struct udev_device*); +extern unsigned long long int (*udev_device_get_seqnum)(struct udev_device*); +extern unsigned long long int (*udev_device_get_usec_since_initialized)(struct udev_device*); +extern const char* (*udev_device_get_sysattr_value)(struct udev_device*,const char*); +extern int (*udev_device_set_sysattr_value)(struct udev_device*,const char*,const char*); +extern int (*udev_device_has_tag)(struct udev_device*,const char*); +extern struct udev_monitor* (*udev_monitor_ref)(struct udev_monitor*); +extern struct udev_monitor* (*udev_monitor_unref)(struct udev_monitor*); +extern struct udev* (*udev_monitor_get_udev)(struct udev_monitor*); +extern struct udev_monitor* (*udev_monitor_new_from_netlink)(struct udev*,const char*); +extern int (*udev_monitor_enable_receiving)(struct udev_monitor*); +extern int (*udev_monitor_set_receive_buffer_size)(struct udev_monitor*, int); +extern int (*udev_monitor_get_fd)(struct udev_monitor*); +extern struct udev_device* (*udev_monitor_receive_device)(struct udev_monitor*); +extern int (*udev_monitor_filter_add_match_subsystem_devtype)(struct udev_monitor*,const char*,const char*); +extern int (*udev_monitor_filter_add_match_tag)(struct udev_monitor*,const char*); +extern int (*udev_monitor_filter_update)(struct udev_monitor*); +extern int (*udev_monitor_filter_remove)(struct udev_monitor*); +extern struct udev_enumerate* (*udev_enumerate_ref)(struct udev_enumerate*); +extern struct udev_enumerate* (*udev_enumerate_unref)(struct udev_enumerate*); +extern struct udev* (*udev_enumerate_get_udev)(struct udev_enumerate*); +extern struct udev_enumerate* (*udev_enumerate_new)(struct udev*); +extern int (*udev_enumerate_add_match_subsystem)(struct udev_enumerate*,const char*); +extern int (*udev_enumerate_add_nomatch_subsystem)(struct udev_enumerate*,const char*); +extern int (*udev_enumerate_add_match_sysattr)(struct udev_enumerate*,const char*,const char*); +extern int (*udev_enumerate_add_nomatch_sysattr)(struct udev_enumerate*,const char*,const char*); +extern int (*udev_enumerate_add_match_property)(struct udev_enumerate*,const char*,const char*); +extern int (*udev_enumerate_add_match_sysname)(struct udev_enumerate*,const char*); +extern int (*udev_enumerate_add_match_tag)(struct udev_enumerate*,const char*); +extern int (*udev_enumerate_add_match_parent)(struct udev_enumerate*,struct udev_device*); +extern int (*udev_enumerate_add_match_is_initialized)(struct udev_enumerate*); +extern int (*udev_enumerate_add_syspath)(struct udev_enumerate*,const char*); +extern int (*udev_enumerate_scan_devices)(struct udev_enumerate*); +extern int (*udev_enumerate_scan_subsystems)(struct udev_enumerate*); +extern struct udev_list_entry* (*udev_enumerate_get_list_entry)(struct udev_enumerate*); +extern struct udev_queue* (*udev_queue_ref)(struct udev_queue*); +extern struct udev_queue* (*udev_queue_unref)(struct udev_queue*); +extern struct udev* (*udev_queue_get_udev)(struct udev_queue*); +extern struct udev_queue* (*udev_queue_new)(struct udev*); +extern unsigned long long int (*udev_queue_get_kernel_seqnum)(struct udev_queue*); +extern unsigned long long int (*udev_queue_get_udev_seqnum)(struct udev_queue*); +extern int (*udev_queue_get_udev_is_active)(struct udev_queue*); +extern int (*udev_queue_get_queue_is_empty)(struct udev_queue*); +extern int (*udev_queue_get_seqnum_is_finished)(struct udev_queue*, unsigned long long int); +extern int (*udev_queue_get_seqnum_sequence_is_finished)(struct udev_queue*, unsigned long long int, unsigned long long int); +extern int (*udev_queue_get_fd)(struct udev_queue*); +extern int (*udev_queue_flush)(struct udev_queue*); +extern struct udev_list_entry* (*udev_queue_get_queued_list_entry)(struct udev_queue*); +extern struct udev_hwdb* (*udev_hwdb_new)(struct udev*); +extern struct udev_hwdb* (*udev_hwdb_ref)(struct udev_hwdb*); +extern struct udev_hwdb* (*udev_hwdb_unref)(struct udev_hwdb*); +extern struct udev_list_entry* (*udev_hwdb_get_properties_list_entry)(struct udev_hwdb*,const char*, unsigned); +extern int (*udev_util_encode_string)(const char*, char*, size_t); +int initialize_libudev(); +#ifdef __cplusplus +} +#endif diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index c26224d0e3..cb2df9130f 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -888,11 +888,13 @@ void AnimatedSprite3D::_notification(int p_what) { } else { frame = fc - 1; } + emit_signal(SceneStringNames::get_singleton()->animation_finished); } else { frame++; } _queue_update(); + emit_signal(SceneStringNames::get_singleton()->frame_changed); } float to_process = MIN(timeout, remaining); @@ -1082,6 +1084,7 @@ void AnimatedSprite3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_frame"), &AnimatedSprite3D::get_frame); ADD_SIGNAL(MethodInfo("frame_changed")); + ADD_SIGNAL(MethodInfo("animation_finished")); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "animation"), "set_animation", "get_animation"); diff --git a/servers/rendering/renderer_rd/shaders/skeleton.glsl b/servers/rendering/renderer_rd/shaders/skeleton.glsl index d675e548d7..680d1045cd 100644 --- a/servers/rendering/renderer_rd/shaders/skeleton.glsl +++ b/servers/rendering/renderer_rd/shaders/skeleton.glsl @@ -100,7 +100,7 @@ void main() { for (uint i = 0; i < params.blend_shape_count; i++) { float w = blend_shape_weights.data[i]; - if ((w < 0.0001) || (w > 0.0001)) { + if (abs(w) > 0.0001) { uint base_offset = (params.vertex_count * i + index) * params.vertex_stride; blend_vertex += uintBitsToFloat(uvec3(src_blend_shapes.data[base_offset + 0], src_blend_shapes.data[base_offset + 1], src_blend_shapes.data[base_offset + 2])) * w; |