Merge pull request #1246 from dsnopek/virtual-call-data
Update for addition of `get_virtual_call_data_func` and `call_virtual_func` to `GDExtensionClassCreationInfo2`pull/1248/head
commit
a963b8b7c7
|
@ -265,9 +265,11 @@ 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 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 +308,17 @@ 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.
|
// 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;
|
||||||
|
|
|
@ -198,6 +198,8 @@ void ClassDB::_register_class(bool p_virtual, bool p_exposed) {
|
||||||
T::create, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */
|
T::create, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */
|
||||||
T::free, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */
|
T::free, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */
|
||||||
&ClassDB::get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
|
&ClassDB::get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
|
||||||
|
nullptr, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func;
|
||||||
|
nullptr, // GDExtensionClassCallVirtualWithData call_virtual_func;
|
||||||
nullptr, // GDExtensionClassGetRID get_rid;
|
nullptr, // GDExtensionClassGetRID get_rid;
|
||||||
(void *)&T::get_class_static(), // void *class_userdata;
|
(void *)&T::get_class_static(), // void *class_userdata;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue