[Method Bind] Add support for default argument values and static method binding. Sync headers.

This commit is contained in:
bruvzg
2022-05-04 14:27:08 +03:00
parent 24e4aeb2c6
commit 031a83b0ea
11 changed files with 794 additions and 115 deletions

View File

@@ -95,9 +95,9 @@ void ClassDB::add_property(const char *p_class, const PropertyInfo &p_pinfo, con
// register with Godot
GDNativePropertyInfo prop_info = {
(uint32_t)p_pinfo.type, //uint32_t type;
p_pinfo.name, //const char *name;
p_pinfo.class_name, //const char *class_name;
(uint32_t)p_pinfo.type, // uint32_t type;
p_pinfo.name, // const char *name;
p_pinfo.class_name, // const char *class_name;
p_pinfo.hint, // NONE //uint32_t hint;
p_pinfo.hint_string, // const char *hint_string;
p_pinfo.usage, // DEFAULT //uint32_t usage;
@@ -169,6 +169,16 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M
p_bind->set_argument_names(args);
std::vector<Variant> defvals;
defvals.resize(p_defcount);
for (int i = 0; i < p_defcount; i++) {
defvals[i] = *static_cast<const Variant *>(p_defs[i]);
}
p_bind->set_default_arguments(defvals);
p_bind->set_hint_flags(p_flags);
// register our method bind within our plugin
type.method_map[method_name.name] = p_bind;
@@ -179,19 +189,27 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M
}
void ClassDB::bind_method_godot(const char *p_class_name, MethodBind *p_method) {
std::vector<GDNativeVariantPtr> def_args;
const std::vector<Variant> &def_args_val = p_method->get_default_arguments();
def_args.resize(def_args_val.size());
for (int i = 0; i < def_args_val.size(); i++) {
def_args[i] = (GDNativeVariantPtr)&def_args_val[i];
}
GDNativeExtensionClassMethodInfo method_info = {
p_method->get_name(), //const char *name;
p_method, //void *method_userdata;
MethodBind::bind_call, //GDNativeExtensionClassMethodCall call_func;
MethodBind::bind_ptrcall, //GDNativeExtensionClassMethodPtrCall ptrcall_func;
GDNATIVE_EXTENSION_METHOD_FLAGS_DEFAULT, //uint32_t method_flags; /* GDNativeExtensionClassMethodFlags */
(uint32_t)p_method->get_argument_count(), //uint32_t argument_count;
(GDNativeBool)p_method->has_return(), //GDNativeBool has_return_value;
p_method->get_name(), // const char *name;
p_method, // void *method_userdata;
MethodBind::bind_call, // GDNativeExtensionClassMethodCall call_func;
MethodBind::bind_ptrcall, // GDNativeExtensionClassMethodPtrCall ptrcall_func;
p_method->get_hint_flags(), // uint32_t method_flags; /* GDNativeExtensionClassMethodFlags */
(uint32_t)p_method->get_argument_count(), // uint32_t argument_count;
(GDNativeBool)p_method->has_return(), // GDNativeBool has_return_value;
MethodBind::bind_get_argument_type, //(GDNativeExtensionClassMethodGetArgumentType) get_argument_type_func;
MethodBind::bind_get_argument_info, //GDNativeExtensionClassMethodGetArgumentInfo get_argument_info_func; /* name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies. */
MethodBind::bind_get_argument_metadata, //GDNativeExtensionClassMethodGetArgumentMetadata get_argument_metadata_func;
p_method->get_hint_flags(), //uint32_t default_argument_count;
nullptr, //GDNativeVariantPtr *default_arguments;
MethodBind::bind_get_argument_info, // GDNativeExtensionClassMethodGetArgumentInfo get_argument_info_func; /* name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies. */
MethodBind::bind_get_argument_metadata, // GDNativeExtensionClassMethodGetArgumentMetadata get_argument_metadata_func;
(uint32_t)p_method->get_default_argument_count(), // uint32_t default_argument_count;
def_args.data(), // GDNativeVariantPtr *default_arguments;
};
internal::gdn_interface->classdb_register_extension_class_method(internal::library, p_class_name, &method_info);
}

View File

@@ -52,6 +52,14 @@ void MethodBind::set_return(bool p_return) {
_has_return = p_return;
}
void MethodBind::set_static(bool p_static) {
_static = p_static;
}
void MethodBind::set_vararg(bool p_vararg) {
_vararg = p_vararg;
}
void MethodBind::set_argument_names(const std::vector<std::string> &p_names) {
argument_names = p_names;
}

View File

@@ -33,22 +33,22 @@
namespace godot {
MethodInfo::MethodInfo() :
flags(METHOD_FLAG_NORMAL) {}
flags(GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL) {}
MethodInfo::MethodInfo(const char *p_name) :
name(p_name), flags(METHOD_FLAG_NORMAL) {}
name(p_name), flags(GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL) {}
MethodInfo::MethodInfo(Variant::Type ret) :
flags(METHOD_FLAG_NORMAL) {
flags(GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL) {
return_val.type = ret;
}
MethodInfo::MethodInfo(Variant::Type ret, const char *p_name) :
name(p_name), flags(METHOD_FLAG_NORMAL) {
name(p_name), flags(GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL) {
return_val.type = ret;
}
MethodInfo::MethodInfo(const PropertyInfo &p_ret, const char *p_name) :
name(p_name), return_val(p_ret), flags(METHOD_FLAG_NORMAL) {}
name(p_name), return_val(p_ret), flags(GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL) {}
} // namespace godot