You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-08 12:40:44 +00:00
Allow GDExtensions to register virtual methods and call them on scripts
This commit is contained in:
@@ -1194,6 +1194,33 @@ static GDObjectInstanceID gdextension_object_get_instance_id(GDExtensionConstObj
|
||||
return (GDObjectInstanceID)o->get_instance_id();
|
||||
}
|
||||
|
||||
static GDExtensionBool gdextension_object_has_script_method(GDExtensionConstObjectPtr p_object, GDExtensionConstStringNamePtr p_method) {
|
||||
Object *o = (Object *)p_object;
|
||||
const StringName method = *reinterpret_cast<const StringName *>(p_method);
|
||||
|
||||
ScriptInstance *script_instance = o->get_script_instance();
|
||||
if (script_instance) {
|
||||
return script_instance->has_method(method);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void gdextension_object_call_script_method(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) {
|
||||
Object *o = (Object *)p_object;
|
||||
const StringName method = *reinterpret_cast<const StringName *>(p_method);
|
||||
const Variant **args = (const Variant **)p_args;
|
||||
|
||||
Callable::CallError error;
|
||||
memnew_placement(r_return, Variant);
|
||||
*(Variant *)r_return = o->callp(method, args, p_argument_count, error);
|
||||
|
||||
if (r_error) {
|
||||
r_error->error = (GDExtensionCallErrorType)(error.error);
|
||||
r_error->argument = error.argument;
|
||||
r_error->expected = error.expected;
|
||||
}
|
||||
}
|
||||
|
||||
static GDExtensionObjectPtr gdextension_ref_get_object(GDExtensionConstRefPtr p_ref) {
|
||||
const Ref<RefCounted> *ref = (const Ref<RefCounted> *)p_ref;
|
||||
if (ref == nullptr || ref->is_null()) {
|
||||
@@ -1515,6 +1542,8 @@ void gdextension_setup_interface() {
|
||||
REGISTER_INTERFACE_FUNC(object_cast_to);
|
||||
REGISTER_INTERFACE_FUNC(object_get_instance_from_id);
|
||||
REGISTER_INTERFACE_FUNC(object_get_instance_id);
|
||||
REGISTER_INTERFACE_FUNC(object_has_script_method);
|
||||
REGISTER_INTERFACE_FUNC(object_call_script_method);
|
||||
REGISTER_INTERFACE_FUNC(ref_get_object);
|
||||
REGISTER_INTERFACE_FUNC(ref_set_object);
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
|
||||
Reference in New Issue
Block a user