mirror of
https://github.com/godotengine/godot.git
synced 2024-11-24 05:04:10 +00:00
Merge pull request #69718 from groud/finally_rename_gdnative_to_gdextension
Rename all gdnative occurences to gdextension
This commit is contained in:
commit
f1edd03d4c
3
.github/CODEOWNERS
vendored
3
.github/CODEOWNERS
vendored
@ -118,13 +118,12 @@ doc_classes/* @godotengine/documentation
|
||||
|
||||
## Text
|
||||
/modules/freetype/ @godotengine/buildsystem
|
||||
/modules/gdnative/text/ @godotengine/gui-nodes
|
||||
/modules/text_server_adv/ @godotengine/gui-nodes
|
||||
/modules/text_server_fb/ @godotengine/gui-nodes
|
||||
|
||||
## XR
|
||||
/modules/camera/ @godotengine/xr
|
||||
/modules/gdnative/xr/ @godotengine/xr
|
||||
/modules/gdextension/xr/ @godotengine/xr
|
||||
/modules/mobile_vr/ @godotengine/xr
|
||||
/modules/webxr/ @godotengine/xr
|
||||
|
||||
|
2
.github/workflows/linux_builds.yml
vendored
2
.github/workflows/linux_builds.yml
vendored
@ -211,7 +211,7 @@ jobs:
|
||||
if: ${{ matrix.godot-cpp-test }}
|
||||
run: |
|
||||
cp -f extension_api.json godot-cpp/godot-headers/
|
||||
cp -f core/extension/gdnative_interface.h godot-cpp/godot-headers/godot/
|
||||
cp -f core/extension/gdextension_interface.h godot-cpp/godot-headers/godot/
|
||||
|
||||
# Build godot-cpp test extension
|
||||
- name: Build godot-cpp test extension
|
||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -37,7 +37,7 @@ platform/windows/godot_res.res
|
||||
|
||||
# Generated by Godot binary
|
||||
.import/
|
||||
/gdnative_interface.h
|
||||
/gdextension_interface.h
|
||||
extension_api.json
|
||||
logs/
|
||||
|
||||
|
@ -8,8 +8,8 @@ from platform_methods import run_in_subprocess
|
||||
|
||||
env.CommandNoCache(["ext_wrappers.gen.inc"], "make_wrappers.py", run_in_subprocess(make_wrappers.run))
|
||||
env.CommandNoCache(
|
||||
"gdnative_interface_dump.gen.h",
|
||||
["gdnative_interface.h", "make_interface_dumper.py"],
|
||||
"gdextension_interface_dump.gen.h",
|
||||
["gdextension_interface.h", "make_interface_dumper.py"],
|
||||
run_in_subprocess(make_interface_dumper.run),
|
||||
)
|
||||
|
||||
|
@ -82,7 +82,7 @@ static String get_property_info_type_name(const PropertyInfo &p_info) {
|
||||
return get_builtin_or_variant_type_name(p_info.type);
|
||||
}
|
||||
|
||||
Dictionary NativeExtensionAPIDump::generate_extension_api() {
|
||||
Dictionary GDExtensionAPIDump::generate_extension_api() {
|
||||
Dictionary api_dump;
|
||||
|
||||
{
|
||||
@ -177,8 +177,8 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
|
||||
};
|
||||
|
||||
// Validate sizes at compile time for the current build configuration.
|
||||
static_assert(type_size_array[Variant::BOOL][sizeof(void *)] == sizeof(GDNativeBool), "Size of bool mismatch");
|
||||
static_assert(type_size_array[Variant::INT][sizeof(void *)] == sizeof(GDNativeInt), "Size of int mismatch");
|
||||
static_assert(type_size_array[Variant::BOOL][sizeof(void *)] == sizeof(GDExtensionBool), "Size of bool mismatch");
|
||||
static_assert(type_size_array[Variant::INT][sizeof(void *)] == sizeof(GDExtensionInt), "Size of int mismatch");
|
||||
static_assert(type_size_array[Variant::FLOAT][sizeof(void *)] == sizeof(double), "Size of float mismatch");
|
||||
static_assert(type_size_array[Variant::STRING][sizeof(void *)] == sizeof(String), "Size of String mismatch");
|
||||
static_assert(type_size_array[Variant::VECTOR2][sizeof(void *)] == sizeof(Vector2), "Size of Vector2 mismatch");
|
||||
@ -943,7 +943,7 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
|
||||
return api_dump;
|
||||
}
|
||||
|
||||
void NativeExtensionAPIDump::generate_extension_json_file(const String &p_path) {
|
||||
void GDExtensionAPIDump::generate_extension_json_file(const String &p_path) {
|
||||
Dictionary api = generate_extension_api();
|
||||
Ref<JSON> json;
|
||||
json.instantiate();
|
||||
|
@ -31,11 +31,11 @@
|
||||
#ifndef EXTENSION_API_DUMP_H
|
||||
#define EXTENSION_API_DUMP_H
|
||||
|
||||
#include "core/extension/native_extension.h"
|
||||
#include "core/extension/gdextension.h"
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
|
||||
class NativeExtensionAPIDump {
|
||||
class GDExtensionAPIDump {
|
||||
public:
|
||||
static Dictionary generate_extension_api();
|
||||
static void generate_extension_json_file(const String &p_path);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*************************************************************************/
|
||||
/* native_extension.cpp */
|
||||
/* gdextension.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@ -28,18 +28,18 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "native_extension.h"
|
||||
#include "gdextension.h"
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/io/dir_access.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/object/method_bind.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
String NativeExtension::get_extension_list_config_file() {
|
||||
String GDExtension::get_extension_list_config_file() {
|
||||
return ProjectSettings::get_singleton()->get_project_data_path().path_join("extension_list.cfg");
|
||||
}
|
||||
|
||||
String NativeExtension::find_extension_library(const String &p_path, Ref<ConfigFile> p_config, std::function<bool(String)> p_has_feature, PackedStringArray *r_tags) {
|
||||
String GDExtension::find_extension_library(const String &p_path, Ref<ConfigFile> p_config, std::function<bool(String)> p_has_feature, PackedStringArray *r_tags) {
|
||||
// First, check the explicit libraries.
|
||||
if (p_config->has_section("libraries")) {
|
||||
List<String> libraries;
|
||||
@ -144,9 +144,9 @@ String NativeExtension::find_extension_library(const String &p_path, Ref<ConfigF
|
||||
return String();
|
||||
}
|
||||
|
||||
class NativeExtensionMethodBind : public MethodBind {
|
||||
GDNativeExtensionClassMethodCall call_func;
|
||||
GDNativeExtensionClassMethodPtrCall ptrcall_func;
|
||||
class GDExtensionMethodBind : public MethodBind {
|
||||
GDExtensionClassMethodCall call_func;
|
||||
GDExtensionClassMethodPtrCall ptrcall_func;
|
||||
void *method_userdata;
|
||||
bool vararg;
|
||||
PropertyInfo return_value_info;
|
||||
@ -184,8 +184,8 @@ public:
|
||||
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const override {
|
||||
Variant ret;
|
||||
GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance();
|
||||
GDNativeCallError ce{ GDNATIVE_CALL_OK, 0, 0 };
|
||||
call_func(method_userdata, extension_instance, reinterpret_cast<GDNativeConstVariantPtr *>(p_args), p_arg_count, (GDNativeVariantPtr)&ret, &ce);
|
||||
GDExtensionCallError ce{ GDEXTENSION_CALL_OK, 0, 0 };
|
||||
call_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstVariantPtr *>(p_args), p_arg_count, (GDExtensionVariantPtr)&ret, &ce);
|
||||
r_error.error = Callable::CallError::Error(ce.error);
|
||||
r_error.argument = ce.argument;
|
||||
r_error.expected = ce.expected;
|
||||
@ -194,14 +194,14 @@ public:
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
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();
|
||||
ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDNativeConstTypePtr *>(p_args), (GDNativeTypePtr)r_ret);
|
||||
ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstTypePtr *>(p_args), (GDExtensionTypePtr)r_ret);
|
||||
}
|
||||
|
||||
virtual bool is_vararg() const override {
|
||||
return false;
|
||||
}
|
||||
|
||||
explicit NativeExtensionMethodBind(const GDNativeExtensionClassMethodInfo *p_method_info) {
|
||||
explicit GDExtensionMethodBind(const GDExtensionClassMethodInfo *p_method_info) {
|
||||
method_userdata = p_method_info->method_userdata;
|
||||
call_func = p_method_info->call_func;
|
||||
ptrcall_func = p_method_info->ptrcall_func;
|
||||
@ -219,10 +219,10 @@ public:
|
||||
|
||||
set_hint_flags(p_method_info->method_flags);
|
||||
|
||||
vararg = p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_VARARG;
|
||||
vararg = p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_VARARG;
|
||||
_set_returns(p_method_info->has_return_value);
|
||||
_set_const(p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_CONST);
|
||||
_set_static(p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_STATIC);
|
||||
_set_const(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_CONST);
|
||||
_set_static(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_STATIC);
|
||||
#ifdef DEBUG_METHODS_ENABLED
|
||||
_generate_argument_types(p_method_info->argument_count);
|
||||
#endif
|
||||
@ -238,10 +238,10 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
static GDNativeInterface gdnative_interface;
|
||||
static GDExtensionInterface gdextension_interface;
|
||||
|
||||
void NativeExtension::_register_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||
StringName parent_class_name = *reinterpret_cast<const StringName *>(p_parent_class_name);
|
||||
@ -268,35 +268,35 @@ void NativeExtension::_register_extension_class(GDNativeExtensionClassLibraryPtr
|
||||
Extension *extension = &self->extension_classes[class_name];
|
||||
|
||||
if (parent_extension) {
|
||||
extension->native_extension.parent = &parent_extension->native_extension;
|
||||
parent_extension->native_extension.children.push_back(&extension->native_extension);
|
||||
extension->gdextension.parent = &parent_extension->gdextension;
|
||||
parent_extension->gdextension.children.push_back(&extension->gdextension);
|
||||
}
|
||||
|
||||
extension->native_extension.parent_class_name = parent_class_name;
|
||||
extension->native_extension.class_name = class_name;
|
||||
extension->native_extension.editor_class = self->level_initialized == INITIALIZATION_LEVEL_EDITOR;
|
||||
extension->native_extension.is_virtual = p_extension_funcs->is_virtual;
|
||||
extension->native_extension.is_abstract = p_extension_funcs->is_abstract;
|
||||
extension->native_extension.set = p_extension_funcs->set_func;
|
||||
extension->native_extension.get = p_extension_funcs->get_func;
|
||||
extension->native_extension.get_property_list = p_extension_funcs->get_property_list_func;
|
||||
extension->native_extension.free_property_list = p_extension_funcs->free_property_list_func;
|
||||
extension->native_extension.property_can_revert = p_extension_funcs->property_can_revert_func;
|
||||
extension->native_extension.property_get_revert = p_extension_funcs->property_get_revert_func;
|
||||
extension->native_extension.notification = p_extension_funcs->notification_func;
|
||||
extension->native_extension.to_string = p_extension_funcs->to_string_func;
|
||||
extension->native_extension.reference = p_extension_funcs->reference_func;
|
||||
extension->native_extension.unreference = p_extension_funcs->unreference_func;
|
||||
extension->native_extension.class_userdata = p_extension_funcs->class_userdata;
|
||||
extension->native_extension.create_instance = p_extension_funcs->create_instance_func;
|
||||
extension->native_extension.free_instance = p_extension_funcs->free_instance_func;
|
||||
extension->native_extension.get_virtual = p_extension_funcs->get_virtual_func;
|
||||
extension->native_extension.get_rid = p_extension_funcs->get_rid_func;
|
||||
extension->gdextension.parent_class_name = parent_class_name;
|
||||
extension->gdextension.class_name = class_name;
|
||||
extension->gdextension.editor_class = self->level_initialized == INITIALIZATION_LEVEL_EDITOR;
|
||||
extension->gdextension.is_virtual = p_extension_funcs->is_virtual;
|
||||
extension->gdextension.is_abstract = p_extension_funcs->is_abstract;
|
||||
extension->gdextension.set = p_extension_funcs->set_func;
|
||||
extension->gdextension.get = p_extension_funcs->get_func;
|
||||
extension->gdextension.get_property_list = p_extension_funcs->get_property_list_func;
|
||||
extension->gdextension.free_property_list = p_extension_funcs->free_property_list_func;
|
||||
extension->gdextension.property_can_revert = p_extension_funcs->property_can_revert_func;
|
||||
extension->gdextension.property_get_revert = p_extension_funcs->property_get_revert_func;
|
||||
extension->gdextension.notification = p_extension_funcs->notification_func;
|
||||
extension->gdextension.to_string = p_extension_funcs->to_string_func;
|
||||
extension->gdextension.reference = p_extension_funcs->reference_func;
|
||||
extension->gdextension.unreference = p_extension_funcs->unreference_func;
|
||||
extension->gdextension.class_userdata = p_extension_funcs->class_userdata;
|
||||
extension->gdextension.create_instance = p_extension_funcs->create_instance_func;
|
||||
extension->gdextension.free_instance = p_extension_funcs->free_instance_func;
|
||||
extension->gdextension.get_virtual = p_extension_funcs->get_virtual_func;
|
||||
extension->gdextension.get_rid = p_extension_funcs->get_rid_func;
|
||||
|
||||
ClassDB::register_extension_class(&extension->native_extension);
|
||||
ClassDB::register_extension_class(&extension->gdextension);
|
||||
}
|
||||
void NativeExtension::_register_extension_class_method(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||
StringName method_name = *reinterpret_cast<const StringName *>(p_method_info->name);
|
||||
@ -304,13 +304,13 @@ void NativeExtension::_register_extension_class_method(GDNativeExtensionClassLib
|
||||
|
||||
//Extension *extension = &self->extension_classes[class_name];
|
||||
|
||||
NativeExtensionMethodBind *method = memnew(NativeExtensionMethodBind(p_method_info));
|
||||
GDExtensionMethodBind *method = memnew(GDExtensionMethodBind(p_method_info));
|
||||
method->set_instance_class(class_name);
|
||||
|
||||
ClassDB::bind_method_custom(class_name, method);
|
||||
}
|
||||
void NativeExtension::_register_extension_class_integer_constant(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_register_extension_class_integer_constant(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||
StringName enum_name = *reinterpret_cast<const StringName *>(p_enum_name);
|
||||
@ -320,8 +320,8 @@ void NativeExtension::_register_extension_class_integer_constant(GDNativeExtensi
|
||||
ClassDB::bind_integer_constant(class_name, enum_name, constant_name, p_constant_value, p_is_bitfield);
|
||||
}
|
||||
|
||||
void NativeExtension::_register_extension_class_property(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_register_extension_class_property(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||
StringName setter = *reinterpret_cast<const StringName *>(p_setter);
|
||||
@ -335,8 +335,8 @@ void NativeExtension::_register_extension_class_property(GDNativeExtensionClassL
|
||||
ClassDB::add_property(class_name, pinfo, setter, getter);
|
||||
}
|
||||
|
||||
void NativeExtension::_register_extension_class_property_group(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_group_name, GDNativeConstStringPtr p_prefix) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_register_extension_class_property_group(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_group_name, GDExtensionConstStringPtr p_prefix) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||
String group_name = *reinterpret_cast<const String *>(p_group_name);
|
||||
@ -346,8 +346,8 @@ void NativeExtension::_register_extension_class_property_group(GDNativeExtension
|
||||
ClassDB::add_property_group(class_name, group_name, prefix);
|
||||
}
|
||||
|
||||
void NativeExtension::_register_extension_class_property_subgroup(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_subgroup_name, GDNativeConstStringPtr p_prefix) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_register_extension_class_property_subgroup(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_subgroup_name, GDExtensionConstStringPtr p_prefix) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||
String subgroup_name = *reinterpret_cast<const String *>(p_subgroup_name);
|
||||
@ -357,8 +357,8 @@ void NativeExtension::_register_extension_class_property_subgroup(GDNativeExtens
|
||||
ClassDB::add_property_subgroup(class_name, subgroup_name, prefix);
|
||||
}
|
||||
|
||||
void NativeExtension::_register_extension_class_signal(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_register_extension_class_signal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
|
||||
StringName signal_name = *reinterpret_cast<const StringName *>(p_signal_name);
|
||||
@ -373,28 +373,28 @@ void NativeExtension::_register_extension_class_signal(GDNativeExtensionClassLib
|
||||
ClassDB::add_signal(class_name, s);
|
||||
}
|
||||
|
||||
void NativeExtension::_unregister_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
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 + "'.");
|
||||
Extension *ext = &self->extension_classes[class_name];
|
||||
ERR_FAIL_COND_MSG(ext->native_extension.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.");
|
||||
|
||||
ClassDB::unregister_extension_class(class_name);
|
||||
if (ext->native_extension.parent != nullptr) {
|
||||
ext->native_extension.parent->children.erase(&ext->native_extension);
|
||||
if (ext->gdextension.parent != nullptr) {
|
||||
ext->gdextension.parent->children.erase(&ext->gdextension);
|
||||
}
|
||||
self->extension_classes.erase(class_name);
|
||||
}
|
||||
|
||||
void NativeExtension::_get_library_path(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path) {
|
||||
NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
|
||||
void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path) {
|
||||
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
|
||||
|
||||
*(String *)r_path = self->library_path;
|
||||
}
|
||||
|
||||
Error NativeExtension::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);
|
||||
if (err != OK) {
|
||||
ERR_PRINT("GDExtension dynamic library not found: " + p_path);
|
||||
@ -411,9 +411,9 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_
|
||||
return err;
|
||||
}
|
||||
|
||||
GDNativeInitializationFunction initialization_function = (GDNativeInitializationFunction)entry_funcptr;
|
||||
GDExtensionInitializationFunction initialization_function = (GDExtensionInitializationFunction)entry_funcptr;
|
||||
|
||||
if (initialization_function(&gdnative_interface, this, &initialization)) {
|
||||
if (initialization_function(&gdextension_interface, this, &initialization)) {
|
||||
level_initialized = -1;
|
||||
return OK;
|
||||
} else {
|
||||
@ -422,23 +422,23 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_
|
||||
}
|
||||
}
|
||||
|
||||
void NativeExtension::close_library() {
|
||||
void GDExtension::close_library() {
|
||||
ERR_FAIL_COND(library == nullptr);
|
||||
OS::get_singleton()->close_dynamic_library(library);
|
||||
|
||||
library = nullptr;
|
||||
}
|
||||
|
||||
bool NativeExtension::is_library_open() const {
|
||||
bool GDExtension::is_library_open() const {
|
||||
return library != nullptr;
|
||||
}
|
||||
|
||||
NativeExtension::InitializationLevel NativeExtension::get_minimum_library_initialization_level() const {
|
||||
GDExtension::InitializationLevel GDExtension::get_minimum_library_initialization_level() const {
|
||||
ERR_FAIL_COND_V(library == nullptr, INITIALIZATION_LEVEL_CORE);
|
||||
return InitializationLevel(initialization.minimum_initialization_level);
|
||||
}
|
||||
|
||||
void NativeExtension::initialize_library(InitializationLevel p_level) {
|
||||
void GDExtension::initialize_library(InitializationLevel p_level) {
|
||||
ERR_FAIL_COND(library == nullptr);
|
||||
ERR_FAIL_COND_MSG(p_level <= int32_t(level_initialized), vformat("Level '%d' must be higher than the current level '%d'", p_level, level_initialized));
|
||||
|
||||
@ -446,23 +446,23 @@ void NativeExtension::initialize_library(InitializationLevel p_level) {
|
||||
|
||||
ERR_FAIL_COND(initialization.initialize == nullptr);
|
||||
|
||||
initialization.initialize(initialization.userdata, GDNativeInitializationLevel(p_level));
|
||||
initialization.initialize(initialization.userdata, GDExtensionInitializationLevel(p_level));
|
||||
}
|
||||
void NativeExtension::deinitialize_library(InitializationLevel p_level) {
|
||||
void GDExtension::deinitialize_library(InitializationLevel p_level) {
|
||||
ERR_FAIL_COND(library == nullptr);
|
||||
ERR_FAIL_COND(p_level > int32_t(level_initialized));
|
||||
|
||||
level_initialized = int32_t(p_level) - 1;
|
||||
initialization.deinitialize(initialization.userdata, GDNativeInitializationLevel(p_level));
|
||||
initialization.deinitialize(initialization.userdata, GDExtensionInitializationLevel(p_level));
|
||||
}
|
||||
|
||||
void NativeExtension::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("open_library", "path", "entry_symbol"), &NativeExtension::open_library);
|
||||
ClassDB::bind_method(D_METHOD("close_library"), &NativeExtension::close_library);
|
||||
ClassDB::bind_method(D_METHOD("is_library_open"), &NativeExtension::is_library_open);
|
||||
void GDExtension::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("open_library", "path", "entry_symbol"), &GDExtension::open_library);
|
||||
ClassDB::bind_method(D_METHOD("close_library"), &GDExtension::close_library);
|
||||
ClassDB::bind_method(D_METHOD("is_library_open"), &GDExtension::is_library_open);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_minimum_library_initialization_level"), &NativeExtension::get_minimum_library_initialization_level);
|
||||
ClassDB::bind_method(D_METHOD("initialize_library", "level"), &NativeExtension::initialize_library);
|
||||
ClassDB::bind_method(D_METHOD("get_minimum_library_initialization_level"), &GDExtension::get_minimum_library_initialization_level);
|
||||
ClassDB::bind_method(D_METHOD("initialize_library", "level"), &GDExtension::initialize_library);
|
||||
|
||||
BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_CORE);
|
||||
BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_SERVERS);
|
||||
@ -470,32 +470,32 @@ void NativeExtension::_bind_methods() {
|
||||
BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_EDITOR);
|
||||
}
|
||||
|
||||
NativeExtension::NativeExtension() {
|
||||
GDExtension::GDExtension() {
|
||||
}
|
||||
|
||||
NativeExtension::~NativeExtension() {
|
||||
GDExtension::~GDExtension() {
|
||||
if (library != nullptr) {
|
||||
close_library();
|
||||
}
|
||||
}
|
||||
|
||||
extern void gdnative_setup_interface(GDNativeInterface *p_interface);
|
||||
extern void gdextension_setup_interface(GDExtensionInterface *p_interface);
|
||||
|
||||
void NativeExtension::initialize_native_extensions() {
|
||||
gdnative_setup_interface(&gdnative_interface);
|
||||
void GDExtension::initialize_gdextensions() {
|
||||
gdextension_setup_interface(&gdextension_interface);
|
||||
|
||||
gdnative_interface.classdb_register_extension_class = _register_extension_class;
|
||||
gdnative_interface.classdb_register_extension_class_method = _register_extension_class_method;
|
||||
gdnative_interface.classdb_register_extension_class_integer_constant = _register_extension_class_integer_constant;
|
||||
gdnative_interface.classdb_register_extension_class_property = _register_extension_class_property;
|
||||
gdnative_interface.classdb_register_extension_class_property_group = _register_extension_class_property_group;
|
||||
gdnative_interface.classdb_register_extension_class_property_subgroup = _register_extension_class_property_subgroup;
|
||||
gdnative_interface.classdb_register_extension_class_signal = _register_extension_class_signal;
|
||||
gdnative_interface.classdb_unregister_extension_class = _unregister_extension_class;
|
||||
gdnative_interface.get_library_path = _get_library_path;
|
||||
gdextension_interface.classdb_register_extension_class = _register_extension_class;
|
||||
gdextension_interface.classdb_register_extension_class_method = _register_extension_class_method;
|
||||
gdextension_interface.classdb_register_extension_class_integer_constant = _register_extension_class_integer_constant;
|
||||
gdextension_interface.classdb_register_extension_class_property = _register_extension_class_property;
|
||||
gdextension_interface.classdb_register_extension_class_property_group = _register_extension_class_property_group;
|
||||
gdextension_interface.classdb_register_extension_class_property_subgroup = _register_extension_class_property_subgroup;
|
||||
gdextension_interface.classdb_register_extension_class_signal = _register_extension_class_signal;
|
||||
gdextension_interface.classdb_unregister_extension_class = _unregister_extension_class;
|
||||
gdextension_interface.get_library_path = _get_library_path;
|
||||
}
|
||||
|
||||
Ref<Resource> NativeExtensionResourceLoader::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<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<ConfigFile> config;
|
||||
config.instantiate();
|
||||
|
||||
@ -520,7 +520,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
|
||||
|
||||
String entry_symbol = config->get_value("configuration", "entry_symbol");
|
||||
|
||||
String library_path = NativeExtension::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 (r_error) {
|
||||
@ -535,7 +535,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
|
||||
library_path = p_path.get_base_dir().path_join(library_path);
|
||||
}
|
||||
|
||||
Ref<NativeExtension> lib;
|
||||
Ref<GDExtension> lib;
|
||||
lib.instantiate();
|
||||
String abs_path = ProjectSettings::get_singleton()->globalize_path(library_path);
|
||||
err = lib->open_library(abs_path, entry_symbol);
|
||||
@ -552,18 +552,18 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
|
||||
return lib;
|
||||
}
|
||||
|
||||
void NativeExtensionResourceLoader::get_recognized_extensions(List<String> *p_extensions) const {
|
||||
void GDExtensionResourceLoader::get_recognized_extensions(List<String> *p_extensions) const {
|
||||
p_extensions->push_back("gdextension");
|
||||
}
|
||||
|
||||
bool NativeExtensionResourceLoader::handles_type(const String &p_type) const {
|
||||
return p_type == "NativeExtension";
|
||||
bool GDExtensionResourceLoader::handles_type(const String &p_type) const {
|
||||
return p_type == "GDExtension";
|
||||
}
|
||||
|
||||
String NativeExtensionResourceLoader::get_resource_type(const String &p_path) const {
|
||||
String GDExtensionResourceLoader::get_resource_type(const String &p_path) const {
|
||||
String el = p_path.get_extension().to_lower();
|
||||
if (el == "gdextension") {
|
||||
return "NativeExtension";
|
||||
return "GDExtension";
|
||||
}
|
||||
return "";
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*************************************************************************/
|
||||
/* native_extension.h */
|
||||
/* gdextension.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@ -28,39 +28,39 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef NATIVE_EXTENSION_H
|
||||
#define NATIVE_EXTENSION_H
|
||||
#ifndef GDEXTENSION_H
|
||||
#define GDEXTENSION_H
|
||||
|
||||
#include <functional>
|
||||
|
||||
#include "core/extension/gdnative_interface.h"
|
||||
#include "core/extension/gdextension_interface.h"
|
||||
#include "core/io/config_file.h"
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/object/ref_counted.h"
|
||||
|
||||
class NativeExtension : public Resource {
|
||||
GDCLASS(NativeExtension, Resource)
|
||||
class GDExtension : public Resource {
|
||||
GDCLASS(GDExtension, Resource)
|
||||
|
||||
void *library = nullptr; // pointer if valid,
|
||||
String library_path;
|
||||
|
||||
struct Extension {
|
||||
ObjectNativeExtension native_extension;
|
||||
ObjectGDExtension gdextension;
|
||||
};
|
||||
|
||||
HashMap<StringName, Extension> extension_classes;
|
||||
|
||||
static void _register_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs);
|
||||
static void _register_extension_class_method(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
|
||||
static void _register_extension_class_integer_constant(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield);
|
||||
static void _register_extension_class_property(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter);
|
||||
static void _register_extension_class_property_group(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_group_name, GDNativeConstStringNamePtr p_prefix);
|
||||
static void _register_extension_class_property_subgroup(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_subgroup_name, GDNativeConstStringNamePtr p_prefix);
|
||||
static void _register_extension_class_signal(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count);
|
||||
static void _unregister_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name);
|
||||
static void _get_library_path(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path);
|
||||
static void _register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs);
|
||||
static void _register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info);
|
||||
static void _register_extension_class_integer_constant(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield);
|
||||
static void _register_extension_class_property(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter);
|
||||
static void _register_extension_class_property_group(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_group_name, GDExtensionConstStringNamePtr p_prefix);
|
||||
static void _register_extension_class_property_subgroup(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_subgroup_name, GDExtensionConstStringNamePtr p_prefix);
|
||||
static void _register_extension_class_signal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count);
|
||||
static void _unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name);
|
||||
static void _get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path);
|
||||
|
||||
GDNativeInitialization initialization;
|
||||
GDExtensionInitialization initialization;
|
||||
int32_t level_initialized = -1;
|
||||
|
||||
protected:
|
||||
@ -74,10 +74,10 @@ public:
|
||||
void close_library();
|
||||
|
||||
enum InitializationLevel {
|
||||
INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE,
|
||||
INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS,
|
||||
INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE,
|
||||
INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR
|
||||
INITIALIZATION_LEVEL_CORE = GDEXTENSION_INITIALIZATION_CORE,
|
||||
INITIALIZATION_LEVEL_SERVERS = GDEXTENSION_INITIALIZATION_SERVERS,
|
||||
INITIALIZATION_LEVEL_SCENE = GDEXTENSION_INITIALIZATION_SCENE,
|
||||
INITIALIZATION_LEVEL_EDITOR = GDEXTENSION_INITIALIZATION_EDITOR
|
||||
};
|
||||
|
||||
bool is_library_open() const;
|
||||
@ -86,14 +86,14 @@ public:
|
||||
void initialize_library(InitializationLevel p_level);
|
||||
void deinitialize_library(InitializationLevel p_level);
|
||||
|
||||
static void initialize_native_extensions();
|
||||
NativeExtension();
|
||||
~NativeExtension();
|
||||
static void initialize_gdextensions();
|
||||
GDExtension();
|
||||
~GDExtension();
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(NativeExtension::InitializationLevel)
|
||||
VARIANT_ENUM_CAST(GDExtension::InitializationLevel)
|
||||
|
||||
class NativeExtensionResourceLoader : public ResourceFormatLoader {
|
||||
class GDExtensionResourceLoader : public ResourceFormatLoader {
|
||||
public:
|
||||
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;
|
||||
@ -101,4 +101,4 @@ public:
|
||||
virtual String get_resource_type(const String &p_path) const;
|
||||
};
|
||||
|
||||
#endif // NATIVE_EXTENSION_H
|
||||
#endif // GDEXTENSION_H
|
1083
core/extension/gdextension_interface.cpp
Normal file
1083
core/extension/gdextension_interface.cpp
Normal file
File diff suppressed because it is too large
Load Diff
612
core/extension/gdextension_interface.h
Normal file
612
core/extension/gdextension_interface.h
Normal file
@ -0,0 +1,612 @@
|
||||
/*************************************************************************/
|
||||
/* gdextension_interface.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* 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_INTERFACE_H
|
||||
#define GDEXTENSION_INTERFACE_H
|
||||
|
||||
/* This is a C class header, you can copy it and use it directly in your own binders.
|
||||
* Together with the JSON file, you should be able to generate any binder.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef __cplusplus
|
||||
typedef uint32_t char32_t;
|
||||
typedef uint16_t char16_t;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* VARIANT TYPES */
|
||||
|
||||
typedef enum {
|
||||
GDEXTENSION_VARIANT_TYPE_NIL,
|
||||
|
||||
/* atomic types */
|
||||
GDEXTENSION_VARIANT_TYPE_BOOL,
|
||||
GDEXTENSION_VARIANT_TYPE_INT,
|
||||
GDEXTENSION_VARIANT_TYPE_FLOAT,
|
||||
GDEXTENSION_VARIANT_TYPE_STRING,
|
||||
|
||||
/* math types */
|
||||
GDEXTENSION_VARIANT_TYPE_VECTOR2,
|
||||
GDEXTENSION_VARIANT_TYPE_VECTOR2I,
|
||||
GDEXTENSION_VARIANT_TYPE_RECT2,
|
||||
GDEXTENSION_VARIANT_TYPE_RECT2I,
|
||||
GDEXTENSION_VARIANT_TYPE_VECTOR3,
|
||||
GDEXTENSION_VARIANT_TYPE_VECTOR3I,
|
||||
GDEXTENSION_VARIANT_TYPE_TRANSFORM2D,
|
||||
GDEXTENSION_VARIANT_TYPE_VECTOR4,
|
||||
GDEXTENSION_VARIANT_TYPE_VECTOR4I,
|
||||
GDEXTENSION_VARIANT_TYPE_PLANE,
|
||||
GDEXTENSION_VARIANT_TYPE_QUATERNION,
|
||||
GDEXTENSION_VARIANT_TYPE_AABB,
|
||||
GDEXTENSION_VARIANT_TYPE_BASIS,
|
||||
GDEXTENSION_VARIANT_TYPE_TRANSFORM3D,
|
||||
GDEXTENSION_VARIANT_TYPE_PROJECTION,
|
||||
|
||||
/* misc types */
|
||||
GDEXTENSION_VARIANT_TYPE_COLOR,
|
||||
GDEXTENSION_VARIANT_TYPE_STRING_NAME,
|
||||
GDEXTENSION_VARIANT_TYPE_NODE_PATH,
|
||||
GDEXTENSION_VARIANT_TYPE_RID,
|
||||
GDEXTENSION_VARIANT_TYPE_OBJECT,
|
||||
GDEXTENSION_VARIANT_TYPE_CALLABLE,
|
||||
GDEXTENSION_VARIANT_TYPE_SIGNAL,
|
||||
GDEXTENSION_VARIANT_TYPE_DICTIONARY,
|
||||
GDEXTENSION_VARIANT_TYPE_ARRAY,
|
||||
|
||||
/* typed arrays */
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY,
|
||||
GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY,
|
||||
|
||||
GDEXTENSION_VARIANT_TYPE_VARIANT_MAX
|
||||
} GDExtensionVariantType;
|
||||
|
||||
typedef enum {
|
||||
/* comparison */
|
||||
GDEXTENSION_VARIANT_OP_EQUAL,
|
||||
GDEXTENSION_VARIANT_OP_NOT_EQUAL,
|
||||
GDEXTENSION_VARIANT_OP_LESS,
|
||||
GDEXTENSION_VARIANT_OP_LESS_EQUAL,
|
||||
GDEXTENSION_VARIANT_OP_GREATER,
|
||||
GDEXTENSION_VARIANT_OP_GREATER_EQUAL,
|
||||
|
||||
/* mathematic */
|
||||
GDEXTENSION_VARIANT_OP_ADD,
|
||||
GDEXTENSION_VARIANT_OP_SUBTRACT,
|
||||
GDEXTENSION_VARIANT_OP_MULTIPLY,
|
||||
GDEXTENSION_VARIANT_OP_DIVIDE,
|
||||
GDEXTENSION_VARIANT_OP_NEGATE,
|
||||
GDEXTENSION_VARIANT_OP_POSITIVE,
|
||||
GDEXTENSION_VARIANT_OP_MODULE,
|
||||
GDEXTENSION_VARIANT_OP_POWER,
|
||||
|
||||
/* bitwise */
|
||||
GDEXTENSION_VARIANT_OP_SHIFT_LEFT,
|
||||
GDEXTENSION_VARIANT_OP_SHIFT_RIGHT,
|
||||
GDEXTENSION_VARIANT_OP_BIT_AND,
|
||||
GDEXTENSION_VARIANT_OP_BIT_OR,
|
||||
GDEXTENSION_VARIANT_OP_BIT_XOR,
|
||||
GDEXTENSION_VARIANT_OP_BIT_NEGATE,
|
||||
|
||||
/* logic */
|
||||
GDEXTENSION_VARIANT_OP_AND,
|
||||
GDEXTENSION_VARIANT_OP_OR,
|
||||
GDEXTENSION_VARIANT_OP_XOR,
|
||||
GDEXTENSION_VARIANT_OP_NOT,
|
||||
|
||||
/* containment */
|
||||
GDEXTENSION_VARIANT_OP_IN,
|
||||
GDEXTENSION_VARIANT_OP_MAX
|
||||
|
||||
} GDExtensionVariantOperator;
|
||||
|
||||
typedef void *GDExtensionVariantPtr;
|
||||
typedef const void *GDExtensionConstVariantPtr;
|
||||
typedef void *GDExtensionStringNamePtr;
|
||||
typedef const void *GDExtensionConstStringNamePtr;
|
||||
typedef void *GDExtensionStringPtr;
|
||||
typedef const void *GDExtensionConstStringPtr;
|
||||
typedef void *GDExtensionObjectPtr;
|
||||
typedef const void *GDExtensionConstObjectPtr;
|
||||
typedef void *GDExtensionTypePtr;
|
||||
typedef const void *GDExtensionConstTypePtr;
|
||||
typedef const void *GDExtensionMethodBindPtr;
|
||||
typedef int64_t GDExtensionInt;
|
||||
typedef uint8_t GDExtensionBool;
|
||||
typedef uint64_t GDObjectInstanceID;
|
||||
|
||||
/* VARIANT DATA I/O */
|
||||
|
||||
typedef enum {
|
||||
GDEXTENSION_CALL_OK,
|
||||
GDEXTENSION_CALL_ERROR_INVALID_METHOD,
|
||||
GDEXTENSION_CALL_ERROR_INVALID_ARGUMENT, // Expected a different variant type.
|
||||
GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS, // Expected lower number of arguments.
|
||||
GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS, // Expected higher number of arguments.
|
||||
GDEXTENSION_CALL_ERROR_INSTANCE_IS_NULL,
|
||||
GDEXTENSION_CALL_ERROR_METHOD_NOT_CONST, // Used for const call.
|
||||
} GDExtensionCallErrorType;
|
||||
|
||||
typedef struct {
|
||||
GDExtensionCallErrorType error;
|
||||
int32_t argument;
|
||||
int32_t expected;
|
||||
} GDExtensionCallError;
|
||||
|
||||
typedef void (*GDExtensionVariantFromTypeConstructorFunc)(GDExtensionVariantPtr, GDExtensionTypePtr);
|
||||
typedef void (*GDExtensionTypeFromVariantConstructorFunc)(GDExtensionTypePtr, GDExtensionVariantPtr);
|
||||
typedef void (*GDExtensionPtrOperatorEvaluator)(GDExtensionConstTypePtr p_left, GDExtensionConstTypePtr p_right, GDExtensionTypePtr r_result);
|
||||
typedef void (*GDExtensionPtrBuiltInMethod)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_return, int p_argument_count);
|
||||
typedef void (*GDExtensionPtrConstructor)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr *p_args);
|
||||
typedef void (*GDExtensionPtrDestructor)(GDExtensionTypePtr p_base);
|
||||
typedef void (*GDExtensionPtrSetter)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr p_value);
|
||||
typedef void (*GDExtensionPtrGetter)(GDExtensionConstTypePtr p_base, GDExtensionTypePtr r_value);
|
||||
typedef void (*GDExtensionPtrIndexedSetter)(GDExtensionTypePtr p_base, GDExtensionInt p_index, GDExtensionConstTypePtr p_value);
|
||||
typedef void (*GDExtensionPtrIndexedGetter)(GDExtensionConstTypePtr p_base, GDExtensionInt p_index, GDExtensionTypePtr r_value);
|
||||
typedef void (*GDExtensionPtrKeyedSetter)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr p_key, GDExtensionConstTypePtr p_value);
|
||||
typedef void (*GDExtensionPtrKeyedGetter)(GDExtensionConstTypePtr p_base, GDExtensionConstTypePtr p_key, GDExtensionTypePtr r_value);
|
||||
typedef uint32_t (*GDExtensionPtrKeyedChecker)(GDExtensionConstVariantPtr p_base, GDExtensionConstVariantPtr p_key);
|
||||
typedef void (*GDExtensionPtrUtilityFunction)(GDExtensionTypePtr r_return, GDExtensionConstTypePtr *p_arguments, int p_argument_count);
|
||||
|
||||
typedef GDExtensionObjectPtr (*GDExtensionClassConstructor)();
|
||||
|
||||
typedef void *(*GDExtensionInstanceBindingCreateCallback)(void *p_token, void *p_instance);
|
||||
typedef void (*GDExtensionInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding);
|
||||
typedef GDExtensionBool (*GDExtensionInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDExtensionBool p_reference);
|
||||
|
||||
typedef struct {
|
||||
GDExtensionInstanceBindingCreateCallback create_callback;
|
||||
GDExtensionInstanceBindingFreeCallback free_callback;
|
||||
GDExtensionInstanceBindingReferenceCallback reference_callback;
|
||||
} GDExtensionInstanceBindingCallbacks;
|
||||
|
||||
/* EXTENSION CLASSES */
|
||||
|
||||
typedef void *GDExtensionClassInstancePtr;
|
||||
|
||||
typedef GDExtensionBool (*GDExtensionClassSet)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value);
|
||||
typedef GDExtensionBool (*GDExtensionClassGet)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
|
||||
typedef uint64_t (*GDExtensionClassGetRID)(GDExtensionClassInstancePtr p_instance);
|
||||
|
||||
typedef struct {
|
||||
GDExtensionVariantType type;
|
||||
GDExtensionStringNamePtr name;
|
||||
GDExtensionStringNamePtr class_name;
|
||||
uint32_t hint; // Bitfield of `PropertyHint` (defined in `extension_api.json`).
|
||||
GDExtensionStringPtr hint_string;
|
||||
uint32_t usage; // Bitfield of `PropertyUsageFlags` (defined in `extension_api.json`).
|
||||
} GDExtensionPropertyInfo;
|
||||
|
||||
typedef struct {
|
||||
GDExtensionStringNamePtr name;
|
||||
GDExtensionPropertyInfo return_value;
|
||||
uint32_t flags; // Bitfield of `GDExtensionClassMethodFlags`.
|
||||
int32_t id;
|
||||
|
||||
/* Arguments: `default_arguments` is an array of size `argument_count`. */
|
||||
uint32_t argument_count;
|
||||
GDExtensionPropertyInfo *arguments;
|
||||
|
||||
/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
|
||||
uint32_t default_argument_count;
|
||||
GDExtensionVariantPtr *default_arguments;
|
||||
} GDExtensionMethodInfo;
|
||||
|
||||
typedef const GDExtensionPropertyInfo *(*GDExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count);
|
||||
typedef void (*GDExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDExtensionPropertyInfo *p_list);
|
||||
typedef GDExtensionBool (*GDExtensionClassPropertyCanRevert)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name);
|
||||
typedef GDExtensionBool (*GDExtensionClassPropertyGetRevert)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
|
||||
typedef void (*GDExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what);
|
||||
typedef void (*GDExtensionClassToString)(GDExtensionClassInstancePtr p_instance, GDExtensionBool *r_is_valid, GDExtensionStringPtr p_out);
|
||||
typedef void (*GDExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
|
||||
typedef void (*GDExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
|
||||
typedef void (*GDExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
|
||||
typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance)(void *p_userdata);
|
||||
typedef void (*GDExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
|
||||
typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual)(void *p_userdata, GDExtensionConstStringNamePtr p_name);
|
||||
|
||||
typedef struct {
|
||||
GDExtensionBool is_virtual;
|
||||
GDExtensionBool is_abstract;
|
||||
GDExtensionClassSet set_func;
|
||||
GDExtensionClassGet get_func;
|
||||
GDExtensionClassGetPropertyList get_property_list_func;
|
||||
GDExtensionClassFreePropertyList free_property_list_func;
|
||||
GDExtensionClassPropertyCanRevert property_can_revert_func;
|
||||
GDExtensionClassPropertyGetRevert property_get_revert_func;
|
||||
GDExtensionClassNotification notification_func;
|
||||
GDExtensionClassToString to_string_func;
|
||||
GDExtensionClassReference reference_func;
|
||||
GDExtensionClassUnreference unreference_func;
|
||||
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.
|
||||
GDExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function.
|
||||
GDExtensionClassGetRID get_rid_func;
|
||||
void *class_userdata; // Per-class user data, later accessible in instance bindings.
|
||||
} GDExtensionClassCreationInfo;
|
||||
|
||||
typedef void *GDExtensionClassLibraryPtr;
|
||||
|
||||
/* Method */
|
||||
|
||||
typedef enum {
|
||||
GDEXTENSION_METHOD_FLAG_NORMAL = 1,
|
||||
GDEXTENSION_METHOD_FLAG_EDITOR = 2,
|
||||
GDEXTENSION_METHOD_FLAG_CONST = 4,
|
||||
GDEXTENSION_METHOD_FLAG_VIRTUAL = 8,
|
||||
GDEXTENSION_METHOD_FLAG_VARARG = 16,
|
||||
GDEXTENSION_METHOD_FLAG_STATIC = 32,
|
||||
GDEXTENSION_METHOD_FLAGS_DEFAULT = GDEXTENSION_METHOD_FLAG_NORMAL,
|
||||
} GDExtensionClassMethodFlags;
|
||||
|
||||
typedef enum {
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT,
|
||||
GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE
|
||||
} GDExtensionClassMethodArgumentMetadata;
|
||||
|
||||
typedef void (*GDExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
|
||||
typedef void (*GDExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
|
||||
|
||||
typedef struct {
|
||||
GDExtensionStringNamePtr name;
|
||||
void *method_userdata;
|
||||
GDExtensionClassMethodCall call_func;
|
||||
GDExtensionClassMethodPtrCall ptrcall_func;
|
||||
uint32_t method_flags; // Bitfield of `GDExtensionClassMethodFlags`.
|
||||
|
||||
/* If `has_return_value` is false, `return_value_info` and `return_value_metadata` are ignored. */
|
||||
GDExtensionBool has_return_value;
|
||||
GDExtensionPropertyInfo *return_value_info;
|
||||
GDExtensionClassMethodArgumentMetadata return_value_metadata;
|
||||
|
||||
/* Arguments: `arguments_info` and `arguments_metadata` are array of size `argument_count`.
|
||||
* Name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies.
|
||||
*/
|
||||
uint32_t argument_count;
|
||||
GDExtensionPropertyInfo *arguments_info;
|
||||
GDExtensionClassMethodArgumentMetadata *arguments_metadata;
|
||||
|
||||
/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
|
||||
uint32_t default_argument_count;
|
||||
GDExtensionVariantPtr *default_arguments;
|
||||
} GDExtensionClassMethodInfo;
|
||||
|
||||
/* SCRIPT INSTANCE EXTENSION */
|
||||
|
||||
typedef void *GDExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation.
|
||||
|
||||
typedef GDExtensionBool (*GDExtensionScriptInstanceSet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value);
|
||||
typedef GDExtensionBool (*GDExtensionScriptInstanceGet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
|
||||
typedef const GDExtensionPropertyInfo *(*GDExtensionScriptInstanceGetPropertyList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
|
||||
typedef void (*GDExtensionScriptInstanceFreePropertyList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionPropertyInfo *p_list);
|
||||
typedef GDExtensionVariantType (*GDExtensionScriptInstanceGetPropertyType)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionBool *r_is_valid);
|
||||
|
||||
typedef GDExtensionBool (*GDExtensionScriptInstancePropertyCanRevert)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name);
|
||||
typedef GDExtensionBool (*GDExtensionScriptInstancePropertyGetRevert)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
|
||||
|
||||
typedef GDExtensionObjectPtr (*GDExtensionScriptInstanceGetOwner)(GDExtensionScriptInstanceDataPtr p_instance);
|
||||
typedef void (*GDExtensionScriptInstancePropertyStateAdd)(GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value, void *p_userdata);
|
||||
typedef void (*GDExtensionScriptInstanceGetPropertyState)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionScriptInstancePropertyStateAdd p_add_func, void *p_userdata);
|
||||
|
||||
typedef const GDExtensionMethodInfo *(*GDExtensionScriptInstanceGetMethodList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
|
||||
typedef void (*GDExtensionScriptInstanceFreeMethodList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionMethodInfo *p_list);
|
||||
|
||||
typedef GDExtensionBool (*GDExtensionScriptInstanceHasMethod)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name);
|
||||
|
||||
typedef void (*GDExtensionScriptInstanceCall)(GDExtensionScriptInstanceDataPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
|
||||
typedef void (*GDExtensionScriptInstanceNotification)(GDExtensionScriptInstanceDataPtr p_instance, int32_t p_what);
|
||||
typedef void (*GDExtensionScriptInstanceToString)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionBool *r_is_valid, GDExtensionStringPtr r_out);
|
||||
|
||||
typedef void (*GDExtensionScriptInstanceRefCountIncremented)(GDExtensionScriptInstanceDataPtr p_instance);
|
||||
typedef GDExtensionBool (*GDExtensionScriptInstanceRefCountDecremented)(GDExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef GDExtensionObjectPtr (*GDExtensionScriptInstanceGetScript)(GDExtensionScriptInstanceDataPtr p_instance);
|
||||
typedef GDExtensionBool (*GDExtensionScriptInstanceIsPlaceholder)(GDExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef void *GDExtensionScriptLanguagePtr;
|
||||
|
||||
typedef GDExtensionScriptLanguagePtr (*GDExtensionScriptInstanceGetLanguage)(GDExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef void (*GDExtensionScriptInstanceFree)(GDExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef void *GDExtensionScriptInstancePtr; // Pointer to ScriptInstance.
|
||||
|
||||
typedef struct {
|
||||
GDExtensionScriptInstanceSet set_func;
|
||||
GDExtensionScriptInstanceGet get_func;
|
||||
GDExtensionScriptInstanceGetPropertyList get_property_list_func;
|
||||
GDExtensionScriptInstanceFreePropertyList free_property_list_func;
|
||||
|
||||
GDExtensionScriptInstancePropertyCanRevert property_can_revert_func;
|
||||
GDExtensionScriptInstancePropertyGetRevert property_get_revert_func;
|
||||
|
||||
GDExtensionScriptInstanceGetOwner get_owner_func;
|
||||
GDExtensionScriptInstanceGetPropertyState get_property_state_func;
|
||||
|
||||
GDExtensionScriptInstanceGetMethodList get_method_list_func;
|
||||
GDExtensionScriptInstanceFreeMethodList free_method_list_func;
|
||||
GDExtensionScriptInstanceGetPropertyType get_property_type_func;
|
||||
|
||||
GDExtensionScriptInstanceHasMethod has_method_func;
|
||||
|
||||
GDExtensionScriptInstanceCall call_func;
|
||||
GDExtensionScriptInstanceNotification notification_func;
|
||||
|
||||
GDExtensionScriptInstanceToString to_string_func;
|
||||
|
||||
GDExtensionScriptInstanceRefCountIncremented refcount_incremented_func;
|
||||
GDExtensionScriptInstanceRefCountDecremented refcount_decremented_func;
|
||||
|
||||
GDExtensionScriptInstanceGetScript get_script_func;
|
||||
|
||||
GDExtensionScriptInstanceIsPlaceholder is_placeholder_func;
|
||||
|
||||
GDExtensionScriptInstanceSet set_fallback_func;
|
||||
GDExtensionScriptInstanceGet get_fallback_func;
|
||||
|
||||
GDExtensionScriptInstanceGetLanguage get_language_func;
|
||||
|
||||
GDExtensionScriptInstanceFree free_func;
|
||||
|
||||
} GDExtensionScriptInstanceInfo;
|
||||
|
||||
/* INTERFACE */
|
||||
|
||||
typedef struct {
|
||||
uint32_t version_major;
|
||||
uint32_t version_minor;
|
||||
uint32_t version_patch;
|
||||
const char *version_string;
|
||||
|
||||
/* GODOT CORE */
|
||||
|
||||
void *(*mem_alloc)(size_t p_bytes);
|
||||
void *(*mem_realloc)(void *p_ptr, size_t p_bytes);
|
||||
void (*mem_free)(void *p_ptr);
|
||||
|
||||
void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
|
||||
void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
|
||||
void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
|
||||
|
||||
uint64_t (*get_native_struct_size)(GDExtensionConstStringNamePtr p_name);
|
||||
|
||||
/* GODOT VARIANT */
|
||||
|
||||
/* variant general */
|
||||
void (*variant_new_copy)(GDExtensionVariantPtr r_dest, GDExtensionConstVariantPtr p_src);
|
||||
void (*variant_new_nil)(GDExtensionVariantPtr r_dest);
|
||||
void (*variant_destroy)(GDExtensionVariantPtr p_self);
|
||||
|
||||
/* variant type */
|
||||
void (*variant_call)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
|
||||
void (*variant_call_static)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
|
||||
void (*variant_evaluate)(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionVariantPtr r_return, GDExtensionBool *r_valid);
|
||||
void (*variant_set)(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid);
|
||||
void (*variant_set_named)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid);
|
||||
void (*variant_set_keyed)(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid);
|
||||
void (*variant_set_indexed)(GDExtensionVariantPtr p_self, GDExtensionInt p_index, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid, GDExtensionBool *r_oob);
|
||||
void (*variant_get)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
|
||||
void (*variant_get_named)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
|
||||
void (*variant_get_keyed)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
|
||||
void (*variant_get_indexed)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob);
|
||||
GDExtensionBool (*variant_iter_init)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid);
|
||||
GDExtensionBool (*variant_iter_next)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid);
|
||||
void (*variant_iter_get)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
|
||||
GDExtensionInt (*variant_hash)(GDExtensionConstVariantPtr p_self);
|
||||
GDExtensionInt (*variant_recursive_hash)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_recursion_count);
|
||||
GDExtensionBool (*variant_hash_compare)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_other);
|
||||
GDExtensionBool (*variant_booleanize)(GDExtensionConstVariantPtr p_self);
|
||||
void (*variant_duplicate)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_ret, GDExtensionBool p_deep);
|
||||
void (*variant_stringify)(GDExtensionConstVariantPtr p_self, GDExtensionStringPtr r_ret);
|
||||
|
||||
GDExtensionVariantType (*variant_get_type)(GDExtensionConstVariantPtr p_self);
|
||||
GDExtensionBool (*variant_has_method)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_method);
|
||||
GDExtensionBool (*variant_has_member)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member);
|
||||
GDExtensionBool (*variant_has_key)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid);
|
||||
void (*variant_get_type_name)(GDExtensionVariantType p_type, GDExtensionStringPtr r_name);
|
||||
GDExtensionBool (*variant_can_convert)(GDExtensionVariantType p_from, GDExtensionVariantType p_to);
|
||||
GDExtensionBool (*variant_can_convert_strict)(GDExtensionVariantType p_from, GDExtensionVariantType p_to);
|
||||
|
||||
/* ptrcalls */
|
||||
GDExtensionVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDExtensionVariantType p_type);
|
||||
GDExtensionTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDExtensionVariantType p_type);
|
||||
GDExtensionPtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDExtensionVariantOperator p_operator, GDExtensionVariantType p_type_a, GDExtensionVariantType p_type_b);
|
||||
GDExtensionPtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash);
|
||||
GDExtensionPtrConstructor (*variant_get_ptr_constructor)(GDExtensionVariantType p_type, int32_t p_constructor);
|
||||
GDExtensionPtrDestructor (*variant_get_ptr_destructor)(GDExtensionVariantType p_type);
|
||||
void (*variant_construct)(GDExtensionVariantType p_type, GDExtensionVariantPtr p_base, GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error);
|
||||
GDExtensionPtrSetter (*variant_get_ptr_setter)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member);
|
||||
GDExtensionPtrGetter (*variant_get_ptr_getter)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member);
|
||||
GDExtensionPtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDExtensionVariantType p_type);
|
||||
GDExtensionPtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDExtensionVariantType p_type);
|
||||
GDExtensionPtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDExtensionVariantType p_type);
|
||||
GDExtensionPtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDExtensionVariantType p_type);
|
||||
GDExtensionPtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDExtensionVariantType p_type);
|
||||
void (*variant_get_constant_value)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionVariantPtr r_ret);
|
||||
GDExtensionPtrUtilityFunction (*variant_get_ptr_utility_function)(GDExtensionConstStringNamePtr p_function, GDExtensionInt p_hash);
|
||||
|
||||
/* extra utilities */
|
||||
void (*string_new_with_latin1_chars)(GDExtensionStringPtr r_dest, const char *p_contents);
|
||||
void (*string_new_with_utf8_chars)(GDExtensionStringPtr r_dest, const char *p_contents);
|
||||
void (*string_new_with_utf16_chars)(GDExtensionStringPtr r_dest, const char16_t *p_contents);
|
||||
void (*string_new_with_utf32_chars)(GDExtensionStringPtr r_dest, const char32_t *p_contents);
|
||||
void (*string_new_with_wide_chars)(GDExtensionStringPtr r_dest, const wchar_t *p_contents);
|
||||
void (*string_new_with_latin1_chars_and_len)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
|
||||
void (*string_new_with_utf8_chars_and_len)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
|
||||
void (*string_new_with_utf16_chars_and_len)(GDExtensionStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size);
|
||||
void (*string_new_with_utf32_chars_and_len)(GDExtensionStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size);
|
||||
void (*string_new_with_wide_chars_and_len)(GDExtensionStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size);
|
||||
/* Information about the following functions:
|
||||
* - The return value is the resulting encoded string length.
|
||||
* - The length returned is in characters, not in bytes. It also does not include a trailing zero.
|
||||
* - These functions also do not write trailing zero, If you need it, write it yourself at the position indicated by the length (and make sure to allocate it).
|
||||
* - Passing NULL in r_text means only the length is computed (again, without including trailing zero).
|
||||
* - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL.
|
||||
* - p_max_write_length argument does not affect the return value, it's only to cap write length.
|
||||
*/
|
||||
GDExtensionInt (*string_to_latin1_chars)(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length);
|
||||
GDExtensionInt (*string_to_utf8_chars)(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length);
|
||||
GDExtensionInt (*string_to_utf16_chars)(GDExtensionConstStringPtr p_self, char16_t *r_text, GDExtensionInt p_max_write_length);
|
||||
GDExtensionInt (*string_to_utf32_chars)(GDExtensionConstStringPtr p_self, char32_t *r_text, GDExtensionInt p_max_write_length);
|
||||
GDExtensionInt (*string_to_wide_chars)(GDExtensionConstStringPtr p_self, wchar_t *r_text, GDExtensionInt p_max_write_length);
|
||||
char32_t *(*string_operator_index)(GDExtensionStringPtr p_self, GDExtensionInt p_index);
|
||||
const char32_t *(*string_operator_index_const)(GDExtensionConstStringPtr p_self, GDExtensionInt p_index);
|
||||
|
||||
/* Packed array functions */
|
||||
|
||||
uint8_t *(*packed_byte_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray
|
||||
const uint8_t *(*packed_byte_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray
|
||||
|
||||
GDExtensionTypePtr (*packed_color_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedColorArray, returns Color ptr
|
||||
GDExtensionTypePtr (*packed_color_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedColorArray, returns Color ptr
|
||||
|
||||
float *(*packed_float32_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat32Array
|
||||
const float *(*packed_float32_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat32Array
|
||||
double *(*packed_float64_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat64Array
|
||||
const double *(*packed_float64_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat64Array
|
||||
|
||||
int32_t *(*packed_int32_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
|
||||
const int32_t *(*packed_int32_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
|
||||
int64_t *(*packed_int64_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
|
||||
const int64_t *(*packed_int64_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
|
||||
|
||||
GDExtensionStringPtr (*packed_string_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedStringArray
|
||||
GDExtensionStringPtr (*packed_string_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedStringArray
|
||||
|
||||
GDExtensionTypePtr (*packed_vector2_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
|
||||
GDExtensionTypePtr (*packed_vector2_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
|
||||
GDExtensionTypePtr (*packed_vector3_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
|
||||
GDExtensionTypePtr (*packed_vector3_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
|
||||
|
||||
GDExtensionVariantPtr (*array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr
|
||||
GDExtensionVariantPtr (*array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr
|
||||
|
||||
/* Dictionary functions */
|
||||
|
||||
GDExtensionVariantPtr (*dictionary_operator_index)(GDExtensionTypePtr p_self, GDExtensionConstVariantPtr p_key); // p_self should be an Dictionary ptr
|
||||
GDExtensionVariantPtr (*dictionary_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key); // p_self should be an Dictionary ptr
|
||||
|
||||
/* OBJECT */
|
||||
|
||||
void (*object_method_bind_call)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionVariantPtr r_ret, GDExtensionCallError *r_error);
|
||||
void (*object_method_bind_ptrcall)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
|
||||
void (*object_destroy)(GDExtensionObjectPtr p_o);
|
||||
GDExtensionObjectPtr (*global_get_singleton)(GDExtensionConstStringNamePtr p_name);
|
||||
|
||||
void *(*object_get_instance_binding)(GDExtensionObjectPtr p_o, void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
||||
void (*object_set_instance_binding)(GDExtensionObjectPtr p_o, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
||||
|
||||
void (*object_set_instance)(GDExtensionObjectPtr p_o, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance); /* p_classname should be a registered extension class and should extend the p_o object's class. */
|
||||
|
||||
GDExtensionObjectPtr (*object_cast_to)(GDExtensionConstObjectPtr p_object, void *p_class_tag);
|
||||
GDExtensionObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id);
|
||||
GDObjectInstanceID (*object_get_instance_id)(GDExtensionConstObjectPtr p_object);
|
||||
|
||||
/* SCRIPT INSTANCE */
|
||||
|
||||
GDExtensionScriptInstancePtr (*script_instance_create)(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data);
|
||||
|
||||
/* CLASSDB */
|
||||
|
||||
GDExtensionObjectPtr (*classdb_construct_object)(GDExtensionConstStringNamePtr p_classname); /* The passed class must be a built-in godot class, or an already-registered extension class. In both case, object_set_instance should be called to fully initialize the object. */
|
||||
GDExtensionMethodBindPtr (*classdb_get_method_bind)(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash);
|
||||
void *(*classdb_get_class_tag)(GDExtensionConstStringNamePtr p_classname);
|
||||
|
||||
/* CLASSDB EXTENSION */
|
||||
|
||||
/* Provided parameters for `classdb_register_extension_*` can be safely freed once the function returns. */
|
||||
void (*classdb_register_extension_class)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs);
|
||||
void (*classdb_register_extension_class_method)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info);
|
||||
void (*classdb_register_extension_class_integer_constant)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield);
|
||||
void (*classdb_register_extension_class_property)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter);
|
||||
void (*classdb_register_extension_class_property_group)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_group_name, GDExtensionConstStringPtr p_prefix);
|
||||
void (*classdb_register_extension_class_property_subgroup)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_subgroup_name, GDExtensionConstStringPtr p_prefix);
|
||||
void (*classdb_register_extension_class_signal)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count);
|
||||
void (*classdb_unregister_extension_class)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */
|
||||
|
||||
void (*get_library_path)(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path);
|
||||
|
||||
} GDExtensionInterface;
|
||||
|
||||
/* INITIALIZATION */
|
||||
|
||||
typedef enum {
|
||||
GDEXTENSION_INITIALIZATION_CORE,
|
||||
GDEXTENSION_INITIALIZATION_SERVERS,
|
||||
GDEXTENSION_INITIALIZATION_SCENE,
|
||||
GDEXTENSION_INITIALIZATION_EDITOR,
|
||||
GDEXTENSION_MAX_INITIALIZATION_LEVEL,
|
||||
} GDExtensionInitializationLevel;
|
||||
|
||||
typedef struct {
|
||||
/* Minimum initialization level required.
|
||||
* If Core or Servers, the extension needs editor or game restart to take effect */
|
||||
GDExtensionInitializationLevel minimum_initialization_level;
|
||||
/* Up to the user to supply when initializing */
|
||||
void *userdata;
|
||||
/* This function will be called multiple times for each initialization level. */
|
||||
void (*initialize)(void *userdata, GDExtensionInitializationLevel p_level);
|
||||
void (*deinitialize)(void *userdata, GDExtensionInitializationLevel p_level);
|
||||
} GDExtensionInitialization;
|
||||
|
||||
/* Define a C function prototype that implements the function below and expose it to dlopen() (or similar).
|
||||
* This is the entry point of the GDExtension library and will be called on initialization.
|
||||
* It can be used to set up different init levels, which are called during various stages of initialization/shutdown.
|
||||
* The function name must be a unique one specified in the .gdextension config file.
|
||||
*/
|
||||
typedef GDExtensionBool (*GDExtensionInitializationFunction)(const GDExtensionInterface *p_interface, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // GDEXTENSION_INTERFACE_H
|
@ -1,5 +1,5 @@
|
||||
/*************************************************************************/
|
||||
/* native_extension_manager.cpp */
|
||||
/* gdextension_manager.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@ -28,91 +28,91 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "native_extension_manager.h"
|
||||
#include "gdextension_manager.h"
|
||||
#include "core/io/file_access.h"
|
||||
|
||||
NativeExtensionManager::LoadStatus NativeExtensionManager::load_extension(const String &p_path) {
|
||||
if (native_extension_map.has(p_path)) {
|
||||
GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &p_path) {
|
||||
if (gdextension_map.has(p_path)) {
|
||||
return LOAD_STATUS_ALREADY_LOADED;
|
||||
}
|
||||
Ref<NativeExtension> extension = ResourceLoader::load(p_path);
|
||||
Ref<GDExtension> extension = ResourceLoader::load(p_path);
|
||||
if (extension.is_null()) {
|
||||
return LOAD_STATUS_FAILED;
|
||||
}
|
||||
|
||||
if (level >= 0) { // Already initialized up to some level.
|
||||
int32_t minimum_level = extension->get_minimum_library_initialization_level();
|
||||
if (minimum_level < MIN(level, NativeExtension::INITIALIZATION_LEVEL_SCENE)) {
|
||||
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++) {
|
||||
extension->initialize_library(NativeExtension::InitializationLevel(i));
|
||||
extension->initialize_library(GDExtension::InitializationLevel(i));
|
||||
}
|
||||
}
|
||||
native_extension_map[p_path] = extension;
|
||||
gdextension_map[p_path] = extension;
|
||||
return LOAD_STATUS_OK;
|
||||
}
|
||||
|
||||
NativeExtensionManager::LoadStatus NativeExtensionManager::reload_extension(const String &p_path) {
|
||||
GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String &p_path) {
|
||||
return LOAD_STATUS_OK; //TODO
|
||||
}
|
||||
NativeExtensionManager::LoadStatus NativeExtensionManager::unload_extension(const String &p_path) {
|
||||
if (!native_extension_map.has(p_path)) {
|
||||
GDExtensionManager::LoadStatus GDExtensionManager::unload_extension(const String &p_path) {
|
||||
if (!gdextension_map.has(p_path)) {
|
||||
return LOAD_STATUS_NOT_LOADED;
|
||||
}
|
||||
|
||||
Ref<NativeExtension> extension = native_extension_map[p_path];
|
||||
Ref<GDExtension> extension = gdextension_map[p_path];
|
||||
|
||||
if (level >= 0) { // Already initialized up to some level.
|
||||
int32_t minimum_level = extension->get_minimum_library_initialization_level();
|
||||
if (minimum_level < MIN(level, NativeExtension::INITIALIZATION_LEVEL_SCENE)) {
|
||||
if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) {
|
||||
return LOAD_STATUS_NEEDS_RESTART;
|
||||
}
|
||||
// Deinitialize down to current level.
|
||||
for (int32_t i = level; i >= minimum_level; i--) {
|
||||
extension->deinitialize_library(NativeExtension::InitializationLevel(i));
|
||||
extension->deinitialize_library(GDExtension::InitializationLevel(i));
|
||||
}
|
||||
}
|
||||
native_extension_map.erase(p_path);
|
||||
gdextension_map.erase(p_path);
|
||||
return LOAD_STATUS_OK;
|
||||
}
|
||||
|
||||
bool NativeExtensionManager::is_extension_loaded(const String &p_path) const {
|
||||
return native_extension_map.has(p_path);
|
||||
bool GDExtensionManager::is_extension_loaded(const String &p_path) const {
|
||||
return gdextension_map.has(p_path);
|
||||
}
|
||||
|
||||
Vector<String> NativeExtensionManager::get_loaded_extensions() const {
|
||||
Vector<String> GDExtensionManager::get_loaded_extensions() const {
|
||||
Vector<String> ret;
|
||||
for (const KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
|
||||
for (const KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
|
||||
ret.push_back(E.key);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
Ref<NativeExtension> NativeExtensionManager::get_extension(const String &p_path) {
|
||||
HashMap<String, Ref<NativeExtension>>::Iterator E = native_extension_map.find(p_path);
|
||||
ERR_FAIL_COND_V(!E, Ref<NativeExtension>());
|
||||
Ref<GDExtension> GDExtensionManager::get_extension(const String &p_path) {
|
||||
HashMap<String, Ref<GDExtension>>::Iterator E = gdextension_map.find(p_path);
|
||||
ERR_FAIL_COND_V(!E, Ref<GDExtension>());
|
||||
return E->value;
|
||||
}
|
||||
|
||||
void NativeExtensionManager::initialize_extensions(NativeExtension::InitializationLevel p_level) {
|
||||
void GDExtensionManager::initialize_extensions(GDExtension::InitializationLevel p_level) {
|
||||
ERR_FAIL_COND(int32_t(p_level) - 1 != level);
|
||||
for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
|
||||
for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
|
||||
E.value->initialize_library(p_level);
|
||||
}
|
||||
level = p_level;
|
||||
}
|
||||
|
||||
void NativeExtensionManager::deinitialize_extensions(NativeExtension::InitializationLevel p_level) {
|
||||
void GDExtensionManager::deinitialize_extensions(GDExtension::InitializationLevel p_level) {
|
||||
ERR_FAIL_COND(int32_t(p_level) != level);
|
||||
for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
|
||||
for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
|
||||
E.value->deinitialize_library(p_level);
|
||||
}
|
||||
level = int32_t(p_level) - 1;
|
||||
}
|
||||
|
||||
void NativeExtensionManager::load_extensions() {
|
||||
Ref<FileAccess> f = FileAccess::open(NativeExtension::get_extension_list_config_file(), FileAccess::READ);
|
||||
void GDExtensionManager::load_extensions() {
|
||||
Ref<FileAccess> f = FileAccess::open(GDExtension::get_extension_list_config_file(), FileAccess::READ);
|
||||
while (f.is_valid() && !f->eof_reached()) {
|
||||
String s = f->get_line().strip_edges();
|
||||
if (!s.is_empty()) {
|
||||
@ -122,17 +122,17 @@ void NativeExtensionManager::load_extensions() {
|
||||
}
|
||||
}
|
||||
|
||||
NativeExtensionManager *NativeExtensionManager::get_singleton() {
|
||||
GDExtensionManager *GDExtensionManager::get_singleton() {
|
||||
return singleton;
|
||||
}
|
||||
void NativeExtensionManager::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("load_extension", "path"), &NativeExtensionManager::load_extension);
|
||||
ClassDB::bind_method(D_METHOD("reload_extension", "path"), &NativeExtensionManager::reload_extension);
|
||||
ClassDB::bind_method(D_METHOD("unload_extension", "path"), &NativeExtensionManager::unload_extension);
|
||||
ClassDB::bind_method(D_METHOD("is_extension_loaded", "path"), &NativeExtensionManager::is_extension_loaded);
|
||||
void GDExtensionManager::_bind_methods() {
|
||||
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("unload_extension", "path"), &GDExtensionManager::unload_extension);
|
||||
ClassDB::bind_method(D_METHOD("is_extension_loaded", "path"), &GDExtensionManager::is_extension_loaded);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_loaded_extensions"), &NativeExtensionManager::get_loaded_extensions);
|
||||
ClassDB::bind_method(D_METHOD("get_extension", "path"), &NativeExtensionManager::get_extension);
|
||||
ClassDB::bind_method(D_METHOD("get_loaded_extensions"), &GDExtensionManager::get_loaded_extensions);
|
||||
ClassDB::bind_method(D_METHOD("get_extension", "path"), &GDExtensionManager::get_extension);
|
||||
|
||||
BIND_ENUM_CONSTANT(LOAD_STATUS_OK);
|
||||
BIND_ENUM_CONSTANT(LOAD_STATUS_FAILED);
|
||||
@ -141,9 +141,9 @@ void NativeExtensionManager::_bind_methods() {
|
||||
BIND_ENUM_CONSTANT(LOAD_STATUS_NEEDS_RESTART);
|
||||
}
|
||||
|
||||
NativeExtensionManager *NativeExtensionManager::singleton = nullptr;
|
||||
GDExtensionManager *GDExtensionManager::singleton = nullptr;
|
||||
|
||||
NativeExtensionManager::NativeExtensionManager() {
|
||||
GDExtensionManager::GDExtensionManager() {
|
||||
ERR_FAIL_COND(singleton != nullptr);
|
||||
singleton = this;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*************************************************************************/
|
||||
/* native_extension_manager.h */
|
||||
/* gdextension_manager.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
@ -28,20 +28,20 @@
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef NATIVE_EXTENSION_MANAGER_H
|
||||
#define NATIVE_EXTENSION_MANAGER_H
|
||||
#ifndef GDEXTENSION_MANAGER_H
|
||||
#define GDEXTENSION_MANAGER_H
|
||||
|
||||
#include "core/extension/native_extension.h"
|
||||
#include "core/extension/gdextension.h"
|
||||
|
||||
class NativeExtensionManager : public Object {
|
||||
GDCLASS(NativeExtensionManager, Object);
|
||||
class GDExtensionManager : public Object {
|
||||
GDCLASS(GDExtensionManager, Object);
|
||||
|
||||
int32_t level = -1;
|
||||
HashMap<String, Ref<NativeExtension>> native_extension_map;
|
||||
HashMap<String, Ref<GDExtension>> gdextension_map;
|
||||
|
||||
static void _bind_methods();
|
||||
|
||||
static NativeExtensionManager *singleton;
|
||||
static GDExtensionManager *singleton;
|
||||
|
||||
public:
|
||||
enum LoadStatus {
|
||||
@ -57,18 +57,18 @@ public:
|
||||
LoadStatus unload_extension(const String &p_path);
|
||||
bool is_extension_loaded(const String &p_path) const;
|
||||
Vector<String> get_loaded_extensions() const;
|
||||
Ref<NativeExtension> get_extension(const String &p_path);
|
||||
Ref<GDExtension> get_extension(const String &p_path);
|
||||
|
||||
void initialize_extensions(NativeExtension::InitializationLevel p_level);
|
||||
void deinitialize_extensions(NativeExtension::InitializationLevel p_level);
|
||||
void initialize_extensions(GDExtension::InitializationLevel p_level);
|
||||
void deinitialize_extensions(GDExtension::InitializationLevel p_level);
|
||||
|
||||
static NativeExtensionManager *get_singleton();
|
||||
static GDExtensionManager *get_singleton();
|
||||
|
||||
void load_extensions();
|
||||
|
||||
NativeExtensionManager();
|
||||
GDExtensionManager();
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(NativeExtensionManager::LoadStatus)
|
||||
VARIANT_ENUM_CAST(GDExtensionManager::LoadStatus)
|
||||
|
||||
#endif // NATIVE_EXTENSION_MANAGER_H
|
||||
#endif // GDEXTENSION_MANAGER_H
|
File diff suppressed because it is too large
Load Diff
@ -1,612 +0,0 @@
|
||||
/*************************************************************************/
|
||||
/* gdnative_interface.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* 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 GDNATIVE_INTERFACE_H
|
||||
#define GDNATIVE_INTERFACE_H
|
||||
|
||||
/* This is a C class header, you can copy it and use it directly in your own binders.
|
||||
* Together with the JSON file, you should be able to generate any binder.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef __cplusplus
|
||||
typedef uint32_t char32_t;
|
||||
typedef uint16_t char16_t;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* VARIANT TYPES */
|
||||
|
||||
typedef enum {
|
||||
GDNATIVE_VARIANT_TYPE_NIL,
|
||||
|
||||
/* atomic types */
|
||||
GDNATIVE_VARIANT_TYPE_BOOL,
|
||||
GDNATIVE_VARIANT_TYPE_INT,
|
||||
GDNATIVE_VARIANT_TYPE_FLOAT,
|
||||
GDNATIVE_VARIANT_TYPE_STRING,
|
||||
|
||||
/* math types */
|
||||
GDNATIVE_VARIANT_TYPE_VECTOR2,
|
||||
GDNATIVE_VARIANT_TYPE_VECTOR2I,
|
||||
GDNATIVE_VARIANT_TYPE_RECT2,
|
||||
GDNATIVE_VARIANT_TYPE_RECT2I,
|
||||
GDNATIVE_VARIANT_TYPE_VECTOR3,
|
||||
GDNATIVE_VARIANT_TYPE_VECTOR3I,
|
||||
GDNATIVE_VARIANT_TYPE_TRANSFORM2D,
|
||||
GDNATIVE_VARIANT_TYPE_VECTOR4,
|
||||
GDNATIVE_VARIANT_TYPE_VECTOR4I,
|
||||
GDNATIVE_VARIANT_TYPE_PLANE,
|
||||
GDNATIVE_VARIANT_TYPE_QUATERNION,
|
||||
GDNATIVE_VARIANT_TYPE_AABB,
|
||||
GDNATIVE_VARIANT_TYPE_BASIS,
|
||||
GDNATIVE_VARIANT_TYPE_TRANSFORM3D,
|
||||
GDNATIVE_VARIANT_TYPE_PROJECTION,
|
||||
|
||||
/* misc types */
|
||||
GDNATIVE_VARIANT_TYPE_COLOR,
|
||||
GDNATIVE_VARIANT_TYPE_STRING_NAME,
|
||||
GDNATIVE_VARIANT_TYPE_NODE_PATH,
|
||||
GDNATIVE_VARIANT_TYPE_RID,
|
||||
GDNATIVE_VARIANT_TYPE_OBJECT,
|
||||
GDNATIVE_VARIANT_TYPE_CALLABLE,
|
||||
GDNATIVE_VARIANT_TYPE_SIGNAL,
|
||||
GDNATIVE_VARIANT_TYPE_DICTIONARY,
|
||||
GDNATIVE_VARIANT_TYPE_ARRAY,
|
||||
|
||||
/* typed arrays */
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY,
|
||||
GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY,
|
||||
|
||||
GDNATIVE_VARIANT_TYPE_VARIANT_MAX
|
||||
} GDNativeVariantType;
|
||||
|
||||
typedef enum {
|
||||
/* comparison */
|
||||
GDNATIVE_VARIANT_OP_EQUAL,
|
||||
GDNATIVE_VARIANT_OP_NOT_EQUAL,
|
||||
GDNATIVE_VARIANT_OP_LESS,
|
||||
GDNATIVE_VARIANT_OP_LESS_EQUAL,
|
||||
GDNATIVE_VARIANT_OP_GREATER,
|
||||
GDNATIVE_VARIANT_OP_GREATER_EQUAL,
|
||||
|
||||
/* mathematic */
|
||||
GDNATIVE_VARIANT_OP_ADD,
|
||||
GDNATIVE_VARIANT_OP_SUBTRACT,
|
||||
GDNATIVE_VARIANT_OP_MULTIPLY,
|
||||
GDNATIVE_VARIANT_OP_DIVIDE,
|
||||
GDNATIVE_VARIANT_OP_NEGATE,
|
||||
GDNATIVE_VARIANT_OP_POSITIVE,
|
||||
GDNATIVE_VARIANT_OP_MODULE,
|
||||
GDNATIVE_VARIANT_OP_POWER,
|
||||
|
||||
/* bitwise */
|
||||
GDNATIVE_VARIANT_OP_SHIFT_LEFT,
|
||||
GDNATIVE_VARIANT_OP_SHIFT_RIGHT,
|
||||
GDNATIVE_VARIANT_OP_BIT_AND,
|
||||
GDNATIVE_VARIANT_OP_BIT_OR,
|
||||
GDNATIVE_VARIANT_OP_BIT_XOR,
|
||||
GDNATIVE_VARIANT_OP_BIT_NEGATE,
|
||||
|
||||
/* logic */
|
||||
GDNATIVE_VARIANT_OP_AND,
|
||||
GDNATIVE_VARIANT_OP_OR,
|
||||
GDNATIVE_VARIANT_OP_XOR,
|
||||
GDNATIVE_VARIANT_OP_NOT,
|
||||
|
||||
/* containment */
|
||||
GDNATIVE_VARIANT_OP_IN,
|
||||
GDNATIVE_VARIANT_OP_MAX
|
||||
|
||||
} GDNativeVariantOperator;
|
||||
|
||||
typedef void *GDNativeVariantPtr;
|
||||
typedef const void *GDNativeConstVariantPtr;
|
||||
typedef void *GDNativeStringNamePtr;
|
||||
typedef const void *GDNativeConstStringNamePtr;
|
||||
typedef void *GDNativeStringPtr;
|
||||
typedef const void *GDNativeConstStringPtr;
|
||||
typedef void *GDNativeObjectPtr;
|
||||
typedef const void *GDNativeConstObjectPtr;
|
||||
typedef void *GDNativeTypePtr;
|
||||
typedef const void *GDNativeConstTypePtr;
|
||||
typedef const void *GDNativeMethodBindPtr;
|
||||
typedef int64_t GDNativeInt;
|
||||
typedef uint8_t GDNativeBool;
|
||||
typedef uint64_t GDObjectInstanceID;
|
||||
|
||||
/* VARIANT DATA I/O */
|
||||
|
||||
typedef enum {
|
||||
GDNATIVE_CALL_OK,
|
||||
GDNATIVE_CALL_ERROR_INVALID_METHOD,
|
||||
GDNATIVE_CALL_ERROR_INVALID_ARGUMENT, // Expected a different variant type.
|
||||
GDNATIVE_CALL_ERROR_TOO_MANY_ARGUMENTS, // Expected lower number of arguments.
|
||||
GDNATIVE_CALL_ERROR_TOO_FEW_ARGUMENTS, // Expected higher number of arguments.
|
||||
GDNATIVE_CALL_ERROR_INSTANCE_IS_NULL,
|
||||
GDNATIVE_CALL_ERROR_METHOD_NOT_CONST, // Used for const call.
|
||||
} GDNativeCallErrorType;
|
||||
|
||||
typedef struct {
|
||||
GDNativeCallErrorType error;
|
||||
int32_t argument;
|
||||
int32_t expected;
|
||||
} GDNativeCallError;
|
||||
|
||||
typedef void (*GDNativeVariantFromTypeConstructorFunc)(GDNativeVariantPtr, GDNativeTypePtr);
|
||||
typedef void (*GDNativeTypeFromVariantConstructorFunc)(GDNativeTypePtr, GDNativeVariantPtr);
|
||||
typedef void (*GDNativePtrOperatorEvaluator)(GDNativeConstTypePtr p_left, GDNativeConstTypePtr p_right, GDNativeTypePtr r_result);
|
||||
typedef void (*GDNativePtrBuiltInMethod)(GDNativeTypePtr p_base, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_return, int p_argument_count);
|
||||
typedef void (*GDNativePtrConstructor)(GDNativeTypePtr p_base, GDNativeConstTypePtr *p_args);
|
||||
typedef void (*GDNativePtrDestructor)(GDNativeTypePtr p_base);
|
||||
typedef void (*GDNativePtrSetter)(GDNativeTypePtr p_base, GDNativeConstTypePtr p_value);
|
||||
typedef void (*GDNativePtrGetter)(GDNativeConstTypePtr p_base, GDNativeTypePtr r_value);
|
||||
typedef void (*GDNativePtrIndexedSetter)(GDNativeTypePtr p_base, GDNativeInt p_index, GDNativeConstTypePtr p_value);
|
||||
typedef void (*GDNativePtrIndexedGetter)(GDNativeConstTypePtr p_base, GDNativeInt p_index, GDNativeTypePtr r_value);
|
||||
typedef void (*GDNativePtrKeyedSetter)(GDNativeTypePtr p_base, GDNativeConstTypePtr p_key, GDNativeConstTypePtr p_value);
|
||||
typedef void (*GDNativePtrKeyedGetter)(GDNativeConstTypePtr p_base, GDNativeConstTypePtr p_key, GDNativeTypePtr r_value);
|
||||
typedef uint32_t (*GDNativePtrKeyedChecker)(GDNativeConstVariantPtr p_base, GDNativeConstVariantPtr p_key);
|
||||
typedef void (*GDNativePtrUtilityFunction)(GDNativeTypePtr r_return, GDNativeConstTypePtr *p_arguments, int p_argument_count);
|
||||
|
||||
typedef GDNativeObjectPtr (*GDNativeClassConstructor)();
|
||||
|
||||
typedef void *(*GDNativeInstanceBindingCreateCallback)(void *p_token, void *p_instance);
|
||||
typedef void (*GDNativeInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding);
|
||||
typedef GDNativeBool (*GDNativeInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDNativeBool p_reference);
|
||||
|
||||
typedef struct {
|
||||
GDNativeInstanceBindingCreateCallback create_callback;
|
||||
GDNativeInstanceBindingFreeCallback free_callback;
|
||||
GDNativeInstanceBindingReferenceCallback reference_callback;
|
||||
} GDNativeInstanceBindingCallbacks;
|
||||
|
||||
/* EXTENSION CLASSES */
|
||||
|
||||
typedef void *GDExtensionClassInstancePtr;
|
||||
|
||||
typedef GDNativeBool (*GDNativeExtensionClassSet)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value);
|
||||
typedef GDNativeBool (*GDNativeExtensionClassGet)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
|
||||
typedef uint64_t (*GDNativeExtensionClassGetRID)(GDExtensionClassInstancePtr p_instance);
|
||||
|
||||
typedef struct {
|
||||
GDNativeVariantType type;
|
||||
GDNativeStringNamePtr name;
|
||||
GDNativeStringNamePtr class_name;
|
||||
uint32_t hint; // Bitfield of `PropertyHint` (defined in `extension_api.json`).
|
||||
GDNativeStringPtr hint_string;
|
||||
uint32_t usage; // Bitfield of `PropertyUsageFlags` (defined in `extension_api.json`).
|
||||
} GDNativePropertyInfo;
|
||||
|
||||
typedef struct {
|
||||
GDNativeStringNamePtr name;
|
||||
GDNativePropertyInfo return_value;
|
||||
uint32_t flags; // Bitfield of `GDNativeExtensionClassMethodFlags`.
|
||||
int32_t id;
|
||||
|
||||
/* Arguments: `default_arguments` is an array of size `argument_count`. */
|
||||
uint32_t argument_count;
|
||||
GDNativePropertyInfo *arguments;
|
||||
|
||||
/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
|
||||
uint32_t default_argument_count;
|
||||
GDNativeVariantPtr *default_arguments;
|
||||
} GDNativeMethodInfo;
|
||||
|
||||
typedef const GDNativePropertyInfo *(*GDNativeExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count);
|
||||
typedef void (*GDNativeExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list);
|
||||
typedef GDNativeBool (*GDNativeExtensionClassPropertyCanRevert)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name);
|
||||
typedef GDNativeBool (*GDNativeExtensionClassPropertyGetRevert)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
|
||||
typedef void (*GDNativeExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what);
|
||||
typedef void (*GDNativeExtensionClassToString)(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr p_out);
|
||||
typedef void (*GDNativeExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
|
||||
typedef void (*GDNativeExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
|
||||
typedef void (*GDNativeExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret);
|
||||
typedef GDNativeObjectPtr (*GDNativeExtensionClassCreateInstance)(void *p_userdata);
|
||||
typedef void (*GDNativeExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
|
||||
typedef GDNativeExtensionClassCallVirtual (*GDNativeExtensionClassGetVirtual)(void *p_userdata, GDNativeConstStringNamePtr p_name);
|
||||
|
||||
typedef struct {
|
||||
GDNativeBool is_virtual;
|
||||
GDNativeBool is_abstract;
|
||||
GDNativeExtensionClassSet set_func;
|
||||
GDNativeExtensionClassGet get_func;
|
||||
GDNativeExtensionClassGetPropertyList get_property_list_func;
|
||||
GDNativeExtensionClassFreePropertyList free_property_list_func;
|
||||
GDNativeExtensionClassPropertyCanRevert property_can_revert_func;
|
||||
GDNativeExtensionClassPropertyGetRevert property_get_revert_func;
|
||||
GDNativeExtensionClassNotification notification_func;
|
||||
GDNativeExtensionClassToString to_string_func;
|
||||
GDNativeExtensionClassReference reference_func;
|
||||
GDNativeExtensionClassUnreference unreference_func;
|
||||
GDNativeExtensionClassCreateInstance create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract.
|
||||
GDNativeExtensionClassFreeInstance free_instance_func; // Destructor; mandatory.
|
||||
GDNativeExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function.
|
||||
GDNativeExtensionClassGetRID get_rid_func;
|
||||
void *class_userdata; // Per-class user data, later accessible in instance bindings.
|
||||
} GDNativeExtensionClassCreationInfo;
|
||||
|
||||
typedef void *GDNativeExtensionClassLibraryPtr;
|
||||
|
||||
/* Method */
|
||||
|
||||
typedef enum {
|
||||
GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL = 1,
|
||||
GDNATIVE_EXTENSION_METHOD_FLAG_EDITOR = 2,
|
||||
GDNATIVE_EXTENSION_METHOD_FLAG_CONST = 4,
|
||||
GDNATIVE_EXTENSION_METHOD_FLAG_VIRTUAL = 8,
|
||||
GDNATIVE_EXTENSION_METHOD_FLAG_VARARG = 16,
|
||||
GDNATIVE_EXTENSION_METHOD_FLAG_STATIC = 32,
|
||||
GDNATIVE_EXTENSION_METHOD_FLAGS_DEFAULT = GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL,
|
||||
} GDNativeExtensionClassMethodFlags;
|
||||
|
||||
typedef enum {
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT,
|
||||
GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE
|
||||
} GDNativeExtensionClassMethodArgumentMetadata;
|
||||
|
||||
typedef void (*GDNativeExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
|
||||
typedef void (*GDNativeExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret);
|
||||
|
||||
typedef struct {
|
||||
GDNativeStringNamePtr name;
|
||||
void *method_userdata;
|
||||
GDNativeExtensionClassMethodCall call_func;
|
||||
GDNativeExtensionClassMethodPtrCall ptrcall_func;
|
||||
uint32_t method_flags; // Bitfield of `GDNativeExtensionClassMethodFlags`.
|
||||
|
||||
/* If `has_return_value` is false, `return_value_info` and `return_value_metadata` are ignored. */
|
||||
GDNativeBool has_return_value;
|
||||
GDNativePropertyInfo *return_value_info;
|
||||
GDNativeExtensionClassMethodArgumentMetadata return_value_metadata;
|
||||
|
||||
/* Arguments: `arguments_info` and `arguments_metadata` are array of size `argument_count`.
|
||||
* Name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies.
|
||||
*/
|
||||
uint32_t argument_count;
|
||||
GDNativePropertyInfo *arguments_info;
|
||||
GDNativeExtensionClassMethodArgumentMetadata *arguments_metadata;
|
||||
|
||||
/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
|
||||
uint32_t default_argument_count;
|
||||
GDNativeVariantPtr *default_arguments;
|
||||
} GDNativeExtensionClassMethodInfo;
|
||||
|
||||
/* SCRIPT INSTANCE EXTENSION */
|
||||
|
||||
typedef void *GDNativeExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation.
|
||||
|
||||
typedef GDNativeBool (*GDNativeExtensionScriptInstanceSet)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value);
|
||||
typedef GDNativeBool (*GDNativeExtensionScriptInstanceGet)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
|
||||
typedef const GDNativePropertyInfo *(*GDNativeExtensionScriptInstanceGetPropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
|
||||
typedef void (*GDNativeExtensionScriptInstanceFreePropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativePropertyInfo *p_list);
|
||||
typedef GDNativeVariantType (*GDNativeExtensionScriptInstanceGetPropertyType)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeBool *r_is_valid);
|
||||
|
||||
typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyCanRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name);
|
||||
typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyGetRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
|
||||
|
||||
typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetOwner)(GDNativeExtensionScriptInstanceDataPtr p_instance);
|
||||
typedef void (*GDNativeExtensionScriptInstancePropertyStateAdd)(GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value, void *p_userdata);
|
||||
typedef void (*GDNativeExtensionScriptInstanceGetPropertyState)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeExtensionScriptInstancePropertyStateAdd p_add_func, void *p_userdata);
|
||||
|
||||
typedef const GDNativeMethodInfo *(*GDNativeExtensionScriptInstanceGetMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
|
||||
typedef void (*GDNativeExtensionScriptInstanceFreeMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeMethodInfo *p_list);
|
||||
|
||||
typedef GDNativeBool (*GDNativeExtensionScriptInstanceHasMethod)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name);
|
||||
|
||||
typedef void (*GDNativeExtensionScriptInstanceCall)(GDNativeExtensionScriptInstanceDataPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
|
||||
typedef void (*GDNativeExtensionScriptInstanceNotification)(GDNativeExtensionScriptInstanceDataPtr p_instance, int32_t p_what);
|
||||
typedef void (*GDNativeExtensionScriptInstanceToString)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out);
|
||||
|
||||
typedef void (*GDNativeExtensionScriptInstanceRefCountIncremented)(GDNativeExtensionScriptInstanceDataPtr p_instance);
|
||||
typedef GDNativeBool (*GDNativeExtensionScriptInstanceRefCountDecremented)(GDNativeExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetScript)(GDNativeExtensionScriptInstanceDataPtr p_instance);
|
||||
typedef GDNativeBool (*GDNativeExtensionScriptInstanceIsPlaceholder)(GDNativeExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef void *GDNativeExtensionScriptLanguagePtr;
|
||||
|
||||
typedef GDNativeExtensionScriptLanguagePtr (*GDNativeExtensionScriptInstanceGetLanguage)(GDNativeExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef void (*GDNativeExtensionScriptInstanceFree)(GDNativeExtensionScriptInstanceDataPtr p_instance);
|
||||
|
||||
typedef void *GDNativeScriptInstancePtr; // Pointer to ScriptInstance.
|
||||
|
||||
typedef struct {
|
||||
GDNativeExtensionScriptInstanceSet set_func;
|
||||
GDNativeExtensionScriptInstanceGet get_func;
|
||||
GDNativeExtensionScriptInstanceGetPropertyList get_property_list_func;
|
||||
GDNativeExtensionScriptInstanceFreePropertyList free_property_list_func;
|
||||
|
||||
GDNativeExtensionScriptInstancePropertyCanRevert property_can_revert_func;
|
||||
GDNativeExtensionScriptInstancePropertyGetRevert property_get_revert_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceGetOwner get_owner_func;
|
||||
GDNativeExtensionScriptInstanceGetPropertyState get_property_state_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceGetMethodList get_method_list_func;
|
||||
GDNativeExtensionScriptInstanceFreeMethodList free_method_list_func;
|
||||
GDNativeExtensionScriptInstanceGetPropertyType get_property_type_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceHasMethod has_method_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceCall call_func;
|
||||
GDNativeExtensionScriptInstanceNotification notification_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceToString to_string_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceRefCountIncremented refcount_incremented_func;
|
||||
GDNativeExtensionScriptInstanceRefCountDecremented refcount_decremented_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceGetScript get_script_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceIsPlaceholder is_placeholder_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceSet set_fallback_func;
|
||||
GDNativeExtensionScriptInstanceGet get_fallback_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceGetLanguage get_language_func;
|
||||
|
||||
GDNativeExtensionScriptInstanceFree free_func;
|
||||
|
||||
} GDNativeExtensionScriptInstanceInfo;
|
||||
|
||||
/* INTERFACE */
|
||||
|
||||
typedef struct {
|
||||
uint32_t version_major;
|
||||
uint32_t version_minor;
|
||||
uint32_t version_patch;
|
||||
const char *version_string;
|
||||
|
||||
/* GODOT CORE */
|
||||
|
||||
void *(*mem_alloc)(size_t p_bytes);
|
||||
void *(*mem_realloc)(void *p_ptr, size_t p_bytes);
|
||||
void (*mem_free)(void *p_ptr);
|
||||
|
||||
void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
|
||||
void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
|
||||
void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
|
||||
|
||||
uint64_t (*get_native_struct_size)(GDNativeConstStringNamePtr p_name);
|
||||
|
||||
/* GODOT VARIANT */
|
||||
|
||||
/* variant general */
|
||||
void (*variant_new_copy)(GDNativeVariantPtr r_dest, GDNativeConstVariantPtr p_src);
|
||||
void (*variant_new_nil)(GDNativeVariantPtr r_dest);
|
||||
void (*variant_destroy)(GDNativeVariantPtr p_self);
|
||||
|
||||
/* variant type */
|
||||
void (*variant_call)(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
|
||||
void (*variant_call_static)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
|
||||
void (*variant_evaluate)(GDNativeVariantOperator p_op, GDNativeConstVariantPtr p_a, GDNativeConstVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid);
|
||||
void (*variant_set)(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid);
|
||||
void (*variant_set_named)(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid);
|
||||
void (*variant_set_keyed)(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid);
|
||||
void (*variant_set_indexed)(GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob);
|
||||
void (*variant_get)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
|
||||
void (*variant_get_named)(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
|
||||
void (*variant_get_keyed)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
|
||||
void (*variant_get_indexed)(GDNativeConstVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob);
|
||||
GDNativeBool (*variant_iter_init)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
|
||||
GDNativeBool (*variant_iter_next)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
|
||||
void (*variant_iter_get)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
|
||||
GDNativeInt (*variant_hash)(GDNativeConstVariantPtr p_self);
|
||||
GDNativeInt (*variant_recursive_hash)(GDNativeConstVariantPtr p_self, GDNativeInt p_recursion_count);
|
||||
GDNativeBool (*variant_hash_compare)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_other);
|
||||
GDNativeBool (*variant_booleanize)(GDNativeConstVariantPtr p_self);
|
||||
void (*variant_duplicate)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep);
|
||||
void (*variant_stringify)(GDNativeConstVariantPtr p_self, GDNativeStringPtr r_ret);
|
||||
|
||||
GDNativeVariantType (*variant_get_type)(GDNativeConstVariantPtr p_self);
|
||||
GDNativeBool (*variant_has_method)(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_method);
|
||||
GDNativeBool (*variant_has_member)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member);
|
||||
GDNativeBool (*variant_has_key)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeBool *r_valid);
|
||||
void (*variant_get_type_name)(GDNativeVariantType p_type, GDNativeStringPtr r_name);
|
||||
GDNativeBool (*variant_can_convert)(GDNativeVariantType p_from, GDNativeVariantType p_to);
|
||||
GDNativeBool (*variant_can_convert_strict)(GDNativeVariantType p_from, GDNativeVariantType p_to);
|
||||
|
||||
/* ptrcalls */
|
||||
GDNativeVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDNativeVariantType p_type);
|
||||
GDNativeTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDNativeVariantType p_type);
|
||||
GDNativePtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b);
|
||||
GDNativePtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeInt p_hash);
|
||||
GDNativePtrConstructor (*variant_get_ptr_constructor)(GDNativeVariantType p_type, int32_t p_constructor);
|
||||
GDNativePtrDestructor (*variant_get_ptr_destructor)(GDNativeVariantType p_type);
|
||||
void (*variant_construct)(GDNativeVariantType p_type, GDNativeVariantPtr p_base, GDNativeConstVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error);
|
||||
GDNativePtrSetter (*variant_get_ptr_setter)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member);
|
||||
GDNativePtrGetter (*variant_get_ptr_getter)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member);
|
||||
GDNativePtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDNativeVariantType p_type);
|
||||
GDNativePtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDNativeVariantType p_type);
|
||||
GDNativePtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDNativeVariantType p_type);
|
||||
GDNativePtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDNativeVariantType p_type);
|
||||
GDNativePtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDNativeVariantType p_type);
|
||||
void (*variant_get_constant_value)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_constant, GDNativeVariantPtr r_ret);
|
||||
GDNativePtrUtilityFunction (*variant_get_ptr_utility_function)(GDNativeConstStringNamePtr p_function, GDNativeInt p_hash);
|
||||
|
||||
/* extra utilities */
|
||||
void (*string_new_with_latin1_chars)(GDNativeStringPtr r_dest, const char *p_contents);
|
||||
void (*string_new_with_utf8_chars)(GDNativeStringPtr r_dest, const char *p_contents);
|
||||
void (*string_new_with_utf16_chars)(GDNativeStringPtr r_dest, const char16_t *p_contents);
|
||||
void (*string_new_with_utf32_chars)(GDNativeStringPtr r_dest, const char32_t *p_contents);
|
||||
void (*string_new_with_wide_chars)(GDNativeStringPtr r_dest, const wchar_t *p_contents);
|
||||
void (*string_new_with_latin1_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size);
|
||||
void (*string_new_with_utf8_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size);
|
||||
void (*string_new_with_utf16_chars_and_len)(GDNativeStringPtr r_dest, const char16_t *p_contents, GDNativeInt p_size);
|
||||
void (*string_new_with_utf32_chars_and_len)(GDNativeStringPtr r_dest, const char32_t *p_contents, GDNativeInt p_size);
|
||||
void (*string_new_with_wide_chars_and_len)(GDNativeStringPtr r_dest, const wchar_t *p_contents, GDNativeInt p_size);
|
||||
/* Information about the following functions:
|
||||
* - The return value is the resulting encoded string length.
|
||||
* - The length returned is in characters, not in bytes. It also does not include a trailing zero.
|
||||
* - These functions also do not write trailing zero, If you need it, write it yourself at the position indicated by the length (and make sure to allocate it).
|
||||
* - Passing NULL in r_text means only the length is computed (again, without including trailing zero).
|
||||
* - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL.
|
||||
* - p_max_write_length argument does not affect the return value, it's only to cap write length.
|
||||
*/
|
||||
GDNativeInt (*string_to_latin1_chars)(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
|
||||
GDNativeInt (*string_to_utf8_chars)(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
|
||||
GDNativeInt (*string_to_utf16_chars)(GDNativeConstStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length);
|
||||
GDNativeInt (*string_to_utf32_chars)(GDNativeConstStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length);
|
||||
GDNativeInt (*string_to_wide_chars)(GDNativeConstStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length);
|
||||
char32_t *(*string_operator_index)(GDNativeStringPtr p_self, GDNativeInt p_index);
|
||||
const char32_t *(*string_operator_index_const)(GDNativeConstStringPtr p_self, GDNativeInt p_index);
|
||||
|
||||
/* Packed array functions */
|
||||
|
||||
uint8_t *(*packed_byte_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
|
||||
const uint8_t *(*packed_byte_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
|
||||
|
||||
GDNativeTypePtr (*packed_color_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
|
||||
GDNativeTypePtr (*packed_color_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
|
||||
|
||||
float *(*packed_float32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
|
||||
const float *(*packed_float32_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
|
||||
double *(*packed_float64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
|
||||
const double *(*packed_float64_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
|
||||
|
||||
int32_t *(*packed_int32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
|
||||
const int32_t *(*packed_int32_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
|
||||
int64_t *(*packed_int64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
|
||||
const int64_t *(*packed_int64_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
|
||||
|
||||
GDNativeStringPtr (*packed_string_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
|
||||
GDNativeStringPtr (*packed_string_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
|
||||
|
||||
GDNativeTypePtr (*packed_vector2_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
|
||||
GDNativeTypePtr (*packed_vector2_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
|
||||
GDNativeTypePtr (*packed_vector3_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
|
||||
GDNativeTypePtr (*packed_vector3_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
|
||||
|
||||
GDNativeVariantPtr (*array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr
|
||||
GDNativeVariantPtr (*array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr
|
||||
|
||||
/* Dictionary functions */
|
||||
|
||||
GDNativeVariantPtr (*dictionary_operator_index)(GDNativeTypePtr p_self, GDNativeConstVariantPtr p_key); // p_self should be an Dictionary ptr
|
||||
GDNativeVariantPtr (*dictionary_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeConstVariantPtr p_key); // p_self should be an Dictionary ptr
|
||||
|
||||
/* OBJECT */
|
||||
|
||||
void (*object_method_bind_call)(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_arg_count, GDNativeVariantPtr r_ret, GDNativeCallError *r_error);
|
||||
void (*object_method_bind_ptrcall)(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret);
|
||||
void (*object_destroy)(GDNativeObjectPtr p_o);
|
||||
GDNativeObjectPtr (*global_get_singleton)(GDNativeConstStringNamePtr p_name);
|
||||
|
||||
void *(*object_get_instance_binding)(GDNativeObjectPtr p_o, void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks);
|
||||
void (*object_set_instance_binding)(GDNativeObjectPtr p_o, void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks);
|
||||
|
||||
void (*object_set_instance)(GDNativeObjectPtr p_o, GDNativeConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance); /* p_classname should be a registered extension class and should extend the p_o object's class. */
|
||||
|
||||
GDNativeObjectPtr (*object_cast_to)(GDNativeConstObjectPtr p_object, void *p_class_tag);
|
||||
GDNativeObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id);
|
||||
GDObjectInstanceID (*object_get_instance_id)(GDNativeConstObjectPtr p_object);
|
||||
|
||||
/* SCRIPT INSTANCE */
|
||||
|
||||
GDNativeScriptInstancePtr (*script_instance_create)(const GDNativeExtensionScriptInstanceInfo *p_info, GDNativeExtensionScriptInstanceDataPtr p_instance_data);
|
||||
|
||||
/* CLASSDB */
|
||||
|
||||
GDNativeObjectPtr (*classdb_construct_object)(GDNativeConstStringNamePtr p_classname); /* The passed class must be a built-in godot class, or an already-registered extension class. In both case, object_set_instance should be called to fully initialize the object. */
|
||||
GDNativeMethodBindPtr (*classdb_get_method_bind)(GDNativeConstStringNamePtr p_classname, GDNativeConstStringNamePtr p_methodname, GDNativeInt p_hash);
|
||||
void *(*classdb_get_class_tag)(GDNativeConstStringNamePtr p_classname);
|
||||
|
||||
/* CLASSDB EXTENSION */
|
||||
|
||||
/* Provided parameters for `classdb_register_extension_*` can be safely freed once the function returns. */
|
||||
void (*classdb_register_extension_class)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs);
|
||||
void (*classdb_register_extension_class_method)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
|
||||
void (*classdb_register_extension_class_integer_constant)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield);
|
||||
void (*classdb_register_extension_class_property)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter);
|
||||
void (*classdb_register_extension_class_property_group)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_group_name, GDNativeConstStringPtr p_prefix);
|
||||
void (*classdb_register_extension_class_property_subgroup)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_subgroup_name, GDNativeConstStringPtr p_prefix);
|
||||
void (*classdb_register_extension_class_signal)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count);
|
||||
void (*classdb_unregister_extension_class)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */
|
||||
|
||||
void (*get_library_path)(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path);
|
||||
|
||||
} GDNativeInterface;
|
||||
|
||||
/* INITIALIZATION */
|
||||
|
||||
typedef enum {
|
||||
GDNATIVE_INITIALIZATION_CORE,
|
||||
GDNATIVE_INITIALIZATION_SERVERS,
|
||||
GDNATIVE_INITIALIZATION_SCENE,
|
||||
GDNATIVE_INITIALIZATION_EDITOR,
|
||||
GDNATIVE_MAX_INITIALIZATION_LEVEL,
|
||||
} GDNativeInitializationLevel;
|
||||
|
||||
typedef struct {
|
||||
/* Minimum initialization level required.
|
||||
* If Core or Servers, the extension needs editor or game restart to take effect */
|
||||
GDNativeInitializationLevel minimum_initialization_level;
|
||||
/* Up to the user to supply when initializing */
|
||||
void *userdata;
|
||||
/* This function will be called multiple times for each initialization level. */
|
||||
void (*initialize)(void *userdata, GDNativeInitializationLevel p_level);
|
||||
void (*deinitialize)(void *userdata, GDNativeInitializationLevel p_level);
|
||||
} GDNativeInitialization;
|
||||
|
||||
/* Define a C function prototype that implements the function below and expose it to dlopen() (or similar).
|
||||
* This is the entry point of the GDExtension library and will be called on initialization.
|
||||
* It can be used to set up different init levels, which are called during various stages of initialization/shutdown.
|
||||
* The function name must be a unique one specified in the .gdextension config file.
|
||||
*/
|
||||
typedef GDNativeBool (*GDNativeInitializationFunction)(const GDNativeInterface *p_interface, GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // GDNATIVE_INTERFACE_H
|
@ -6,17 +6,17 @@ def run(target, source, env):
|
||||
|
||||
g.write(
|
||||
"""/* THIS FILE IS GENERATED DO NOT EDIT */
|
||||
#ifndef GDNATIVE_INTERFACE_DUMP_H
|
||||
#define GDNATIVE_INTERFACE_DUMP_H
|
||||
#ifndef GDEXTENSION_INTERFACE_DUMP_H
|
||||
#define GDEXTENSION_INTERFACE_DUMP_H
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
|
||||
#include "core/io/file_access.h"
|
||||
#include "core/string/ustring.h"
|
||||
|
||||
class GDNativeInterfaceDump {
|
||||
class GDExtensionInterfaceDump {
|
||||
private:
|
||||
static constexpr char const *gdnative_interface_dump ="""
|
||||
static constexpr char const *gdextension_interface_dump ="""
|
||||
)
|
||||
for line in f:
|
||||
g.write('"' + line.rstrip().replace('"', '\\"') + '\\n"\n')
|
||||
@ -25,16 +25,16 @@ class GDNativeInterfaceDump {
|
||||
g.write(
|
||||
"""
|
||||
public:
|
||||
static void generate_gdnative_interface_file(const String &p_path) {
|
||||
static void generate_gdextension_interface_file(const String &p_path) {
|
||||
Ref<FileAccess> fa = FileAccess::open(p_path, FileAccess::WRITE);
|
||||
CharString cs(gdnative_interface_dump);
|
||||
CharString cs(gdextension_interface_dump);
|
||||
fa->store_buffer((const uint8_t *)cs.ptr(), cs.length());
|
||||
};
|
||||
};
|
||||
|
||||
#endif // TOOLS_ENABLED
|
||||
|
||||
#endif // GDNATIVE_INTERFACE_DUMP_H
|
||||
#endif // GDEXTENSION_INTERFACE_DUMP_H
|
||||
"""
|
||||
)
|
||||
g.close()
|
||||
|
@ -86,10 +86,10 @@ protected:
|
||||
|
||||
public:
|
||||
virtual Error get_packet(const uint8_t **r_buffer, int &r_buffer_size) override; ///< buffer is GONE after next get_packet
|
||||
GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>);
|
||||
GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>);
|
||||
|
||||
virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override;
|
||||
GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int);
|
||||
GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int);
|
||||
|
||||
EXBIND0RC(int, get_available_packet_count);
|
||||
EXBIND0RC(int, get_max_packet_size);
|
||||
|
@ -105,16 +105,16 @@ protected:
|
||||
|
||||
public:
|
||||
virtual Error put_data(const uint8_t *p_data, int p_bytes) override;
|
||||
GDVIRTUAL3R(Error, _put_data, GDNativeConstPtr<const uint8_t>, int, GDNativePtr<int>);
|
||||
GDVIRTUAL3R(Error, _put_data, GDExtensionConstPtr<const uint8_t>, int, GDExtensionPtr<int>);
|
||||
|
||||
virtual Error put_partial_data(const uint8_t *p_data, int p_bytes, int &r_sent) override;
|
||||
GDVIRTUAL3R(Error, _put_partial_data, GDNativeConstPtr<const uint8_t>, int, GDNativePtr<int>);
|
||||
GDVIRTUAL3R(Error, _put_partial_data, GDExtensionConstPtr<const uint8_t>, int, GDExtensionPtr<int>);
|
||||
|
||||
virtual Error get_data(uint8_t *p_buffer, int p_bytes) override;
|
||||
GDVIRTUAL3R(Error, _get_data, GDNativePtr<uint8_t>, int, GDNativePtr<int>);
|
||||
GDVIRTUAL3R(Error, _get_data, GDExtensionPtr<uint8_t>, int, GDExtensionPtr<int>);
|
||||
|
||||
virtual Error get_partial_data(uint8_t *p_buffer, int p_bytes, int &r_received) override;
|
||||
GDVIRTUAL3R(Error, _get_partial_data, GDNativePtr<uint8_t>, int, GDNativePtr<int>);
|
||||
GDVIRTUAL3R(Error, _get_partial_data, GDExtensionPtr<uint8_t>, int, GDExtensionPtr<int>);
|
||||
|
||||
EXBIND0RC(int, get_available_bytes);
|
||||
};
|
||||
|
@ -318,7 +318,7 @@ Object *ClassDB::instantiate(const StringName &p_class) {
|
||||
{
|
||||
OBJTYPE_RLOCK;
|
||||
ti = classes.getptr(p_class);
|
||||
if (!ti || ti->disabled || !ti->creation_func || (ti->native_extension && !ti->native_extension->create_instance)) {
|
||||
if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) {
|
||||
if (compat_classes.has(p_class)) {
|
||||
ti = classes.getptr(compat_classes[p_class]);
|
||||
}
|
||||
@ -333,8 +333,8 @@ Object *ClassDB::instantiate(const StringName &p_class) {
|
||||
return nullptr;
|
||||
}
|
||||
#endif
|
||||
if (ti->native_extension && ti->native_extension->create_instance) {
|
||||
return (Object *)ti->native_extension->create_instance(ti->native_extension->class_userdata);
|
||||
if (ti->gdextension && ti->gdextension->create_instance) {
|
||||
return (Object *)ti->gdextension->create_instance(ti->gdextension->class_userdata);
|
||||
} else {
|
||||
return ti->creation_func();
|
||||
}
|
||||
@ -346,17 +346,17 @@ void ClassDB::set_object_extension_instance(Object *p_object, const StringName &
|
||||
{
|
||||
OBJTYPE_RLOCK;
|
||||
ti = classes.getptr(p_class);
|
||||
if (!ti || ti->disabled || !ti->creation_func || (ti->native_extension && !ti->native_extension->create_instance)) {
|
||||
if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) {
|
||||
if (compat_classes.has(p_class)) {
|
||||
ti = classes.getptr(compat_classes[p_class]);
|
||||
}
|
||||
}
|
||||
ERR_FAIL_COND_MSG(!ti, "Cannot get class '" + String(p_class) + "'.");
|
||||
ERR_FAIL_COND_MSG(ti->disabled, "Class '" + String(p_class) + "' is disabled.");
|
||||
ERR_FAIL_COND_MSG(!ti->native_extension, "Class '" + String(p_class) + "' has no native extension.");
|
||||
ERR_FAIL_COND_MSG(!ti->gdextension, "Class '" + String(p_class) + "' has no native extension.");
|
||||
}
|
||||
|
||||
p_object->_extension = ti->native_extension;
|
||||
p_object->_extension = ti->gdextension;
|
||||
p_object->_extension_instance = p_instance;
|
||||
}
|
||||
|
||||
@ -370,7 +370,7 @@ bool ClassDB::can_instantiate(const StringName &p_class) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
return (!ti->disabled && ti->creation_func != nullptr && !(ti->native_extension && !ti->native_extension->create_instance));
|
||||
return (!ti->disabled && ti->creation_func != nullptr && !(ti->gdextension && !ti->gdextension->create_instance));
|
||||
}
|
||||
|
||||
bool ClassDB::is_virtual(const StringName &p_class) {
|
||||
@ -388,7 +388,7 @@ bool ClassDB::is_virtual(const StringName &p_class) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
return (!ti->disabled && ti->creation_func != nullptr && !(ti->native_extension && !ti->native_extension->create_instance) && ti->is_virtual);
|
||||
return (!ti->disabled && ti->creation_func != nullptr && !(ti->gdextension && !ti->gdextension->create_instance) && ti->is_virtual);
|
||||
}
|
||||
|
||||
void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherits) {
|
||||
@ -1522,7 +1522,7 @@ Variant ClassDB::class_get_default_property_value(const StringName &p_class, con
|
||||
return var;
|
||||
}
|
||||
|
||||
void ClassDB::register_extension_class(ObjectNativeExtension *p_extension) {
|
||||
void ClassDB::register_extension_class(ObjectGDExtension *p_extension) {
|
||||
GLOBAL_LOCK_FUNCTION;
|
||||
|
||||
ERR_FAIL_COND_MSG(classes.has(p_extension->class_name), "Class already registered: " + String(p_extension->class_name));
|
||||
@ -1532,7 +1532,7 @@ void ClassDB::register_extension_class(ObjectNativeExtension *p_extension) {
|
||||
|
||||
ClassInfo c;
|
||||
c.api = p_extension->editor_class ? API_EDITOR_EXTENSION : API_EXTENSION;
|
||||
c.native_extension = p_extension;
|
||||
c.gdextension = p_extension;
|
||||
c.name = p_extension->class_name;
|
||||
c.is_virtual = p_extension->is_virtual;
|
||||
if (!p_extension->is_abstract) {
|
||||
|
@ -100,7 +100,7 @@ public:
|
||||
ClassInfo *inherits_ptr = nullptr;
|
||||
void *class_ptr = nullptr;
|
||||
|
||||
ObjectNativeExtension *native_extension = nullptr;
|
||||
ObjectGDExtension *gdextension = nullptr;
|
||||
|
||||
HashMap<StringName, MethodBind *> method_map;
|
||||
HashMap<StringName, int64_t> constant_map;
|
||||
@ -203,7 +203,7 @@ public:
|
||||
//nothing
|
||||
}
|
||||
|
||||
static void register_extension_class(ObjectNativeExtension *p_extension);
|
||||
static void register_extension_class(ObjectGDExtension *p_extension);
|
||||
static void unregister_extension_class(const StringName &p_class);
|
||||
|
||||
template <class T>
|
||||
|
@ -2,7 +2,7 @@ proto = """
|
||||
#define GDVIRTUAL$VER($RET m_name $ARG) \\
|
||||
StringName _gdvirtual_##m_name##_sn = #m_name;\\
|
||||
mutable bool _gdvirtual_##m_name##_initialized = false;\\
|
||||
mutable GDNativeExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\
|
||||
mutable GDExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\
|
||||
template<bool required>\\
|
||||
_FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
|
||||
ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\
|
||||
@ -16,8 +16,8 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
|
||||
} \\
|
||||
}\\
|
||||
if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
|
||||
/* TODO: C-style cast because GDNativeStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
|
||||
_gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDNativeStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDNativeExtensionClassCallVirtual) nullptr;\\
|
||||
/* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
|
||||
_gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\
|
||||
_gdvirtual_##m_name##_initialized = true;\\
|
||||
}\\
|
||||
if (_gdvirtual_##m_name) {\\
|
||||
@ -41,8 +41,8 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const { \\
|
||||
return _script_instance->has_method(_gdvirtual_##m_name##_sn);\\
|
||||
}\\
|
||||
if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
|
||||
/* TODO: C-style cast because GDNativeStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
|
||||
_gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDNativeStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDNativeExtensionClassCallVirtual) nullptr;\\
|
||||
/* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
|
||||
_gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\
|
||||
_gdvirtual_##m_name##_initialized = true;\\
|
||||
}\\
|
||||
if (_gdvirtual_##m_name) {\\
|
||||
@ -94,7 +94,7 @@ def generate_version(argcount, const=False, returns=False):
|
||||
argtext += ", "
|
||||
callsiargs = "Variant vargs[" + str(argcount) + "]={"
|
||||
callsiargptrs = "\t\tconst Variant *vargptrs[" + str(argcount) + "]={"
|
||||
callptrargsptr = "\t\tGDNativeConstTypePtr argptrs[" + str(argcount) + "]={"
|
||||
callptrargsptr = "\t\tGDExtensionConstTypePtr argptrs[" + str(argcount) + "]={"
|
||||
callptrargs = ""
|
||||
for i in range(argcount):
|
||||
if i > 0:
|
||||
@ -121,7 +121,7 @@ def generate_version(argcount, const=False, returns=False):
|
||||
s = s.replace("$CALLSIARGPASS", "(const Variant **)vargptrs," + str(argcount))
|
||||
callptrargsptr += "};\\\n"
|
||||
s = s.replace("$CALLPTRARGS", callptrargs + callptrargsptr)
|
||||
s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDNativeConstTypePtr*>(argptrs)")
|
||||
s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDExtensionConstTypePtr*>(argptrs)")
|
||||
else:
|
||||
s = s.replace("$CALLSIARGS", "")
|
||||
s = s.replace("$CALLSIARGPASS", "nullptr, 0")
|
||||
|
@ -233,7 +233,7 @@ void Object::set(const StringName &p_name, const Variant &p_value, bool *r_valid
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wignored-qualifiers"
|
||||
#endif
|
||||
if (_extension->set(_extension_instance, (const GDNativeStringNamePtr)&p_name, (const GDNativeVariantPtr)&p_value)) {
|
||||
if (_extension->set(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (const GDExtensionVariantPtr)&p_value)) {
|
||||
if (r_valid) {
|
||||
*r_valid = true;
|
||||
}
|
||||
@ -321,7 +321,7 @@ Variant Object::get(const StringName &p_name, bool *r_valid) const {
|
||||
#pragma GCC diagnostic ignored "-Wignored-qualifiers"
|
||||
#endif
|
||||
|
||||
if (_extension->get(_extension_instance, (const GDNativeStringNamePtr)&p_name, (GDNativeVariantPtr)&ret)) {
|
||||
if (_extension->get(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret)) {
|
||||
if (r_valid) {
|
||||
*r_valid = true;
|
||||
}
|
||||
@ -477,7 +477,7 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons
|
||||
}
|
||||
|
||||
if (_extension) {
|
||||
const ObjectNativeExtension *current_extension = _extension;
|
||||
const ObjectGDExtension *current_extension = _extension;
|
||||
while (current_extension) {
|
||||
p_list->push_back(PropertyInfo(Variant::NIL, current_extension->class_name, PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
|
||||
ClassDB::get_property_list(current_extension->class_name, p_list, true, this);
|
||||
@ -487,7 +487,7 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons
|
||||
|
||||
if (_extension && _extension->get_property_list) {
|
||||
uint32_t pcount;
|
||||
const GDNativePropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount);
|
||||
const GDExtensionPropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount);
|
||||
for (uint32_t i = 0; i < pcount; i++) {
|
||||
p_list->push_back(PropertyInfo(pinfo[i]));
|
||||
}
|
||||
@ -533,7 +533,7 @@ bool Object::property_can_revert(const StringName &p_name) const {
|
||||
#pragma GCC diagnostic ignored "-Wignored-qualifiers"
|
||||
#endif
|
||||
if (_extension && _extension->property_can_revert) {
|
||||
if (_extension->property_can_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name)) {
|
||||
if (_extension->property_can_revert(_extension_instance, (const GDExtensionStringNamePtr)&p_name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -559,7 +559,7 @@ Variant Object::property_get_revert(const StringName &p_name) const {
|
||||
#pragma GCC diagnostic ignored "-Wignored-qualifiers"
|
||||
#endif
|
||||
if (_extension && _extension->property_get_revert) {
|
||||
if (_extension->property_get_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name, (GDNativeVariantPtr)&ret)) {
|
||||
if (_extension->property_get_revert(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret)) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@ -808,7 +808,7 @@ String Object::to_string() {
|
||||
}
|
||||
if (_extension && _extension->to_string) {
|
||||
String ret;
|
||||
GDNativeBool is_valid;
|
||||
GDExtensionBool is_valid;
|
||||
_extension->to_string(_extension_instance, &is_valid, &ret);
|
||||
return ret;
|
||||
}
|
||||
@ -1701,7 +1701,7 @@ uint32_t Object::get_edited_version() const {
|
||||
}
|
||||
#endif
|
||||
|
||||
void Object::set_instance_binding(void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *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.
|
||||
ERR_FAIL_COND(_instance_bindings != nullptr);
|
||||
_instance_bindings = (InstanceBinding *)memalloc(sizeof(InstanceBinding));
|
||||
@ -1712,7 +1712,7 @@ void Object::set_instance_binding(void *p_token, void *p_binding, const GDNative
|
||||
_instance_binding_count = 1;
|
||||
}
|
||||
|
||||
void *Object::get_instance_binding(void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks) {
|
||||
void *Object::get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
|
||||
void *binding = nullptr;
|
||||
_instance_binding_mutex.lock();
|
||||
for (uint32_t i = 0; i < _instance_binding_count; i++) {
|
||||
|
@ -31,7 +31,7 @@
|
||||
#ifndef OBJECT_H
|
||||
#define OBJECT_H
|
||||
|
||||
#include "core/extension/gdnative_interface.h"
|
||||
#include "core/extension/gdextension_interface.h"
|
||||
#include "core/object/message_queue.h"
|
||||
#include "core/object/object_id.h"
|
||||
#include "core/os/rw_lock.h"
|
||||
@ -191,7 +191,7 @@ struct PropertyInfo {
|
||||
type(Variant::OBJECT),
|
||||
class_name(p_class_name) {}
|
||||
|
||||
explicit PropertyInfo(const GDNativePropertyInfo &pinfo) :
|
||||
explicit PropertyInfo(const GDExtensionPropertyInfo &pinfo) :
|
||||
type((Variant::Type)pinfo.type),
|
||||
name(*reinterpret_cast<StringName *>(pinfo.name)),
|
||||
class_name(*reinterpret_cast<StringName *>(pinfo.class_name)),
|
||||
@ -243,7 +243,7 @@ struct MethodInfo {
|
||||
|
||||
MethodInfo() {}
|
||||
|
||||
explicit MethodInfo(const GDNativeMethodInfo &pinfo) :
|
||||
explicit MethodInfo(const GDExtensionMethodInfo &pinfo) :
|
||||
name(*reinterpret_cast<StringName *>(pinfo.name)),
|
||||
return_val(PropertyInfo(pinfo.return_value)),
|
||||
flags(pinfo.flags),
|
||||
@ -301,31 +301,31 @@ struct MethodInfo {
|
||||
}
|
||||
};
|
||||
|
||||
// API used to extend in GDNative and other C compatible compiled languages.
|
||||
// API used to extend in GDExtension and other C compatible compiled languages.
|
||||
class MethodBind;
|
||||
|
||||
struct ObjectNativeExtension {
|
||||
ObjectNativeExtension *parent = nullptr;
|
||||
List<ObjectNativeExtension *> children;
|
||||
struct ObjectGDExtension {
|
||||
ObjectGDExtension *parent = nullptr;
|
||||
List<ObjectGDExtension *> children;
|
||||
StringName parent_class_name;
|
||||
StringName class_name;
|
||||
bool editor_class = false;
|
||||
bool is_virtual = false;
|
||||
bool is_abstract = false;
|
||||
GDNativeExtensionClassSet set;
|
||||
GDNativeExtensionClassGet get;
|
||||
GDNativeExtensionClassGetPropertyList get_property_list;
|
||||
GDNativeExtensionClassFreePropertyList free_property_list;
|
||||
GDNativeExtensionClassPropertyCanRevert property_can_revert;
|
||||
GDNativeExtensionClassPropertyGetRevert property_get_revert;
|
||||
GDNativeExtensionClassNotification notification;
|
||||
GDNativeExtensionClassToString to_string;
|
||||
GDNativeExtensionClassReference reference;
|
||||
GDNativeExtensionClassReference unreference;
|
||||
GDNativeExtensionClassGetRID get_rid;
|
||||
GDExtensionClassSet set;
|
||||
GDExtensionClassGet get;
|
||||
GDExtensionClassGetPropertyList get_property_list;
|
||||
GDExtensionClassFreePropertyList free_property_list;
|
||||
GDExtensionClassPropertyCanRevert property_can_revert;
|
||||
GDExtensionClassPropertyGetRevert property_get_revert;
|
||||
GDExtensionClassNotification notification;
|
||||
GDExtensionClassToString to_string;
|
||||
GDExtensionClassReference reference;
|
||||
GDExtensionClassReference unreference;
|
||||
GDExtensionClassGetRID get_rid;
|
||||
|
||||
_FORCE_INLINE_ bool is_class(const String &p_class) const {
|
||||
const ObjectNativeExtension *e = this;
|
||||
const ObjectGDExtension *e = this;
|
||||
while (e) {
|
||||
if (p_class == e->class_name.operator String()) {
|
||||
return true;
|
||||
@ -336,9 +336,9 @@ struct ObjectNativeExtension {
|
||||
}
|
||||
void *class_userdata = nullptr;
|
||||
|
||||
GDNativeExtensionClassCreateInstance create_instance;
|
||||
GDNativeExtensionClassFreeInstance free_instance;
|
||||
GDNativeExtensionClassGetVirtual get_virtual;
|
||||
GDExtensionClassCreateInstance create_instance;
|
||||
GDExtensionClassFreeInstance free_instance;
|
||||
GDExtensionClassGetVirtual get_virtual;
|
||||
};
|
||||
|
||||
#define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call<false>(__VA_ARGS__)
|
||||
@ -579,7 +579,7 @@ private:
|
||||
friend bool predelete_handler(Object *);
|
||||
friend void postinitialize_handler(Object *);
|
||||
|
||||
ObjectNativeExtension *_extension = nullptr;
|
||||
ObjectGDExtension *_extension = nullptr;
|
||||
GDExtensionClassInstancePtr _extension_instance = nullptr;
|
||||
|
||||
struct SignalData {
|
||||
@ -637,8 +637,8 @@ private:
|
||||
struct InstanceBinding {
|
||||
void *binding = nullptr;
|
||||
void *token = nullptr;
|
||||
GDNativeInstanceBindingFreeCallback free_callback = nullptr;
|
||||
GDNativeInstanceBindingReferenceCallback reference_callback = nullptr;
|
||||
GDExtensionInstanceBindingFreeCallback free_callback = nullptr;
|
||||
GDExtensionInstanceBindingReferenceCallback reference_callback = nullptr;
|
||||
};
|
||||
InstanceBinding *_instance_bindings = nullptr;
|
||||
uint32_t _instance_binding_count = 0;
|
||||
@ -662,8 +662,8 @@ protected:
|
||||
return can_die;
|
||||
}
|
||||
|
||||
friend class NativeExtensionMethodBind;
|
||||
_ALWAYS_INLINE_ const ObjectNativeExtension *_get_extension() const { return _extension; }
|
||||
friend class GDExtensionMethodBind;
|
||||
_ALWAYS_INLINE_ const ObjectGDExtension *_get_extension() const { return _extension; }
|
||||
_ALWAYS_INLINE_ GDExtensionClassInstancePtr _get_extension_instance() const { return _extension_instance; }
|
||||
virtual void _initialize_classv() { initialize_class(); }
|
||||
virtual bool _setv(const StringName &p_name, const Variant &p_property) { return false; };
|
||||
@ -917,9 +917,9 @@ public:
|
||||
#endif
|
||||
|
||||
// Used by script languages to store binding data.
|
||||
void *get_instance_binding(void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks);
|
||||
void *get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
||||
// Used on creation by binding only.
|
||||
void set_instance_binding(void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks);
|
||||
void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
|
||||
bool has_instance_binding(void *p_token);
|
||||
|
||||
void clear_internal_resource_paths();
|
||||
|
@ -43,7 +43,7 @@ class ScriptExtension : public Script {
|
||||
protected:
|
||||
EXBIND0R(bool, editor_can_reload_from_file)
|
||||
|
||||
GDVIRTUAL1(_placeholder_erased, GDNativePtr<void>)
|
||||
GDVIRTUAL1(_placeholder_erased, GDExtensionPtr<void>)
|
||||
virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) override {
|
||||
GDVIRTUAL_CALL(_placeholder_erased, p_placeholder);
|
||||
}
|
||||
@ -56,15 +56,15 @@ public:
|
||||
EXBIND1RC(bool, inherits_script, const Ref<Script> &)
|
||||
EXBIND0RC(StringName, get_instance_base_type)
|
||||
|
||||
GDVIRTUAL1RC(GDNativePtr<void>, _instance_create, Object *)
|
||||
GDVIRTUAL1RC(GDExtensionPtr<void>, _instance_create, Object *)
|
||||
virtual ScriptInstance *instance_create(Object *p_this) override {
|
||||
GDNativePtr<void> ret = nullptr;
|
||||
GDExtensionPtr<void> ret = nullptr;
|
||||
GDVIRTUAL_REQUIRED_CALL(_instance_create, p_this, ret);
|
||||
return reinterpret_cast<ScriptInstance *>(ret.operator void *());
|
||||
}
|
||||
GDVIRTUAL1RC(GDNativePtr<void>, _placeholder_instance_create, Object *)
|
||||
GDVIRTUAL1RC(GDExtensionPtr<void>, _placeholder_instance_create, Object *)
|
||||
PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this) override {
|
||||
GDNativePtr<void> ret = nullptr;
|
||||
GDExtensionPtr<void> ret = nullptr;
|
||||
GDVIRTUAL_REQUIRED_CALL(_placeholder_instance_create, p_this, ret);
|
||||
return reinterpret_cast<PlaceHolderScriptInstance *>(ret.operator void *());
|
||||
}
|
||||
@ -482,10 +482,10 @@ public:
|
||||
}
|
||||
}
|
||||
}
|
||||
GDVIRTUAL1R(GDNativePtr<void>, _debug_get_stack_level_instance, int)
|
||||
GDVIRTUAL1R(GDExtensionPtr<void>, _debug_get_stack_level_instance, int)
|
||||
|
||||
virtual ScriptInstance *debug_get_stack_level_instance(int p_level) override {
|
||||
GDNativePtr<void> ret = nullptr;
|
||||
GDExtensionPtr<void> ret = nullptr;
|
||||
GDVIRTUAL_REQUIRED_CALL(_debug_get_stack_level_instance, p_level, ret);
|
||||
return reinterpret_cast<ScriptInstance *>(ret.operator void *());
|
||||
}
|
||||
@ -578,7 +578,7 @@ public:
|
||||
EXBIND0(profiling_start)
|
||||
EXBIND0(profiling_stop)
|
||||
|
||||
GDVIRTUAL2R(int, _profiling_get_accumulated_data, GDNativePtr<ScriptLanguageExtensionProfilingInfo>, int)
|
||||
GDVIRTUAL2R(int, _profiling_get_accumulated_data, GDExtensionPtr<ScriptLanguageExtensionProfilingInfo>, int)
|
||||
|
||||
virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max) override {
|
||||
int ret = 0;
|
||||
@ -586,7 +586,7 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
GDVIRTUAL2R(int, _profiling_get_frame_data, GDNativePtr<ScriptLanguageExtensionProfilingInfo>, int)
|
||||
GDVIRTUAL2R(int, _profiling_get_frame_data, GDExtensionPtr<ScriptLanguageExtensionProfilingInfo>, int)
|
||||
|
||||
virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max) override {
|
||||
int ret = 0;
|
||||
@ -594,15 +594,15 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
GDVIRTUAL1R(GDNativePtr<void>, _alloc_instance_binding_data, Object *)
|
||||
GDVIRTUAL1R(GDExtensionPtr<void>, _alloc_instance_binding_data, Object *)
|
||||
|
||||
virtual void *alloc_instance_binding_data(Object *p_object) override {
|
||||
GDNativePtr<void> ret = nullptr;
|
||||
GDExtensionPtr<void> ret = nullptr;
|
||||
GDVIRTUAL_REQUIRED_CALL(_alloc_instance_binding_data, p_object, ret);
|
||||
return ret.operator void *();
|
||||
}
|
||||
|
||||
GDVIRTUAL1(_free_instance_binding_data, GDNativePtr<void>)
|
||||
GDVIRTUAL1(_free_instance_binding_data, GDExtensionPtr<void>)
|
||||
|
||||
virtual void free_instance_binding_data(void *p_data) override {
|
||||
GDVIRTUAL_REQUIRED_CALL(_free_instance_binding_data, p_data);
|
||||
@ -639,8 +639,8 @@ VARIANT_ENUM_CAST(ScriptLanguageExtension::CodeCompletionLocation)
|
||||
|
||||
class ScriptInstanceExtension : public ScriptInstance {
|
||||
public:
|
||||
const GDNativeExtensionScriptInstanceInfo *native_info;
|
||||
GDNativeExtensionScriptInstanceDataPtr instance = nullptr;
|
||||
const GDExtensionScriptInstanceInfo *native_info;
|
||||
GDExtensionScriptInstanceDataPtr instance = nullptr;
|
||||
|
||||
// There should not be warnings on explicit casts.
|
||||
#if defined(__GNUC__) && !defined(__clang__)
|
||||
@ -650,20 +650,20 @@ public:
|
||||
|
||||
virtual bool set(const StringName &p_name, const Variant &p_value) override {
|
||||
if (native_info->set_func) {
|
||||
return native_info->set_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeConstVariantPtr)&p_value);
|
||||
return native_info->set_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionConstVariantPtr)&p_value);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
virtual bool get(const StringName &p_name, Variant &r_ret) const override {
|
||||
if (native_info->get_func) {
|
||||
return native_info->get_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&r_ret);
|
||||
return native_info->get_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&r_ret);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
virtual void get_property_list(List<PropertyInfo> *p_list) const override {
|
||||
if (native_info->get_property_list_func) {
|
||||
uint32_t pcount;
|
||||
const GDNativePropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount);
|
||||
const GDExtensionPropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount);
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
Ref<Script> script = get_script();
|
||||
@ -682,8 +682,8 @@ public:
|
||||
}
|
||||
virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = nullptr) const override {
|
||||
if (native_info->get_property_type_func) {
|
||||
GDNativeBool is_valid = 0;
|
||||
GDNativeVariantType type = native_info->get_property_type_func(instance, (GDNativeConstStringNamePtr)&p_name, &is_valid);
|
||||
GDExtensionBool is_valid = 0;
|
||||
GDExtensionVariantType type = native_info->get_property_type_func(instance, (GDExtensionConstStringNamePtr)&p_name, &is_valid);
|
||||
if (r_is_valid) {
|
||||
*r_is_valid = is_valid != 0;
|
||||
}
|
||||
@ -694,13 +694,13 @@ public:
|
||||
|
||||
virtual bool property_can_revert(const StringName &p_name) const override {
|
||||
if (native_info->property_can_revert_func) {
|
||||
return native_info->property_can_revert_func(instance, (GDNativeConstStringNamePtr)&p_name);
|
||||
return native_info->property_can_revert_func(instance, (GDExtensionConstStringNamePtr)&p_name);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
virtual bool property_get_revert(const StringName &p_name, Variant &r_ret) const override {
|
||||
if (native_info->property_get_revert_func) {
|
||||
return native_info->property_get_revert_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&r_ret);
|
||||
return native_info->property_get_revert_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&r_ret);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -711,7 +711,7 @@ public:
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
static void _add_property_with_state(GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value, void *p_userdata) {
|
||||
static void _add_property_with_state(GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value, void *p_userdata) {
|
||||
List<Pair<StringName, Variant>> *state = (List<Pair<StringName, Variant>> *)p_userdata;
|
||||
state->push_back(Pair<StringName, Variant>(*(const StringName *)p_name, *(const Variant *)p_value));
|
||||
}
|
||||
@ -724,7 +724,7 @@ public:
|
||||
virtual void get_method_list(List<MethodInfo> *p_list) const override {
|
||||
if (native_info->get_method_list_func) {
|
||||
uint32_t mcount;
|
||||
const GDNativeMethodInfo *minfo = native_info->get_method_list_func(instance, &mcount);
|
||||
const GDExtensionMethodInfo *minfo = native_info->get_method_list_func(instance, &mcount);
|
||||
for (uint32_t i = 0; i < mcount; i++) {
|
||||
p_list->push_back(MethodInfo(minfo[i]));
|
||||
}
|
||||
@ -735,7 +735,7 @@ public:
|
||||
}
|
||||
virtual bool has_method(const StringName &p_method) const override {
|
||||
if (native_info->has_method_func) {
|
||||
return native_info->has_method_func(instance, (GDNativeStringNamePtr)&p_method);
|
||||
return native_info->has_method_func(instance, (GDExtensionStringNamePtr)&p_method);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -743,8 +743,8 @@ public:
|
||||
virtual Variant callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override {
|
||||
Variant ret;
|
||||
if (native_info->call_func) {
|
||||
GDNativeCallError ce;
|
||||
native_info->call_func(instance, (GDNativeConstStringNamePtr)&p_method, (GDNativeConstVariantPtr *)p_args, p_argcount, (GDNativeVariantPtr)&ret, &ce);
|
||||
GDExtensionCallError ce;
|
||||
native_info->call_func(instance, (GDExtensionConstStringNamePtr)&p_method, (GDExtensionConstVariantPtr *)p_args, p_argcount, (GDExtensionVariantPtr)&ret, &ce);
|
||||
r_error.error = Callable::CallError::Error(ce.error);
|
||||
r_error.argument = ce.argument;
|
||||
r_error.expected = ce.expected;
|
||||
@ -759,9 +759,9 @@ public:
|
||||
}
|
||||
virtual String to_string(bool *r_valid) override {
|
||||
if (native_info->to_string_func) {
|
||||
GDNativeBool valid;
|
||||
GDExtensionBool valid;
|
||||
String ret;
|
||||
native_info->to_string_func(instance, &valid, reinterpret_cast<GDNativeStringPtr>(&ret));
|
||||
native_info->to_string_func(instance, &valid, reinterpret_cast<GDExtensionStringPtr>(&ret));
|
||||
if (r_valid) {
|
||||
*r_valid = valid != 0;
|
||||
}
|
||||
@ -784,7 +784,7 @@ public:
|
||||
|
||||
virtual Ref<Script> get_script() const override {
|
||||
if (native_info->get_script_func) {
|
||||
GDNativeObjectPtr script = native_info->get_script_func(instance);
|
||||
GDExtensionObjectPtr script = native_info->get_script_func(instance);
|
||||
return Ref<Script>(reinterpret_cast<Script *>(script));
|
||||
}
|
||||
return Ref<Script>();
|
||||
@ -799,7 +799,7 @@ public:
|
||||
|
||||
virtual void property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid) override {
|
||||
if (native_info->set_fallback_func) {
|
||||
bool ret = native_info->set_fallback_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeConstVariantPtr)&p_value);
|
||||
bool ret = native_info->set_fallback_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionConstVariantPtr)&p_value);
|
||||
if (r_valid) {
|
||||
*r_valid = ret;
|
||||
}
|
||||
@ -808,7 +808,7 @@ public:
|
||||
virtual Variant property_get_fallback(const StringName &p_name, bool *r_valid) override {
|
||||
Variant ret;
|
||||
if (native_info->get_fallback_func) {
|
||||
bool valid = native_info->get_fallback_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&ret);
|
||||
bool valid = native_info->get_fallback_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret);
|
||||
if (r_valid) {
|
||||
*r_valid = valid;
|
||||
}
|
||||
@ -818,7 +818,7 @@ public:
|
||||
|
||||
virtual ScriptLanguage *get_language() override {
|
||||
if (native_info->get_language_func) {
|
||||
GDNativeExtensionScriptLanguagePtr lang = native_info->get_language_func(instance);
|
||||
GDExtensionScriptLanguagePtr lang = native_info->get_language_func(instance);
|
||||
return reinterpret_cast<ScriptLanguage *>(lang);
|
||||
}
|
||||
return nullptr;
|
||||
|
@ -38,8 +38,8 @@
|
||||
#include "core/crypto/crypto.h"
|
||||
#include "core/crypto/hashing_context.h"
|
||||
#include "core/debugger/engine_profiler.h"
|
||||
#include "core/extension/native_extension.h"
|
||||
#include "core/extension/native_extension_manager.h"
|
||||
#include "core/extension/gdextension.h"
|
||||
#include "core/extension/gdextension_manager.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/input/input_map.h"
|
||||
#include "core/input/shortcut.h"
|
||||
@ -88,7 +88,7 @@ static Ref<ResourceFormatLoaderImage> resource_format_image;
|
||||
static Ref<TranslationLoaderPO> resource_format_po;
|
||||
static Ref<ResourceFormatSaverCrypto> resource_format_saver_crypto;
|
||||
static Ref<ResourceFormatLoaderCrypto> resource_format_loader_crypto;
|
||||
static Ref<NativeExtensionResourceLoader> resource_loader_native_extension;
|
||||
static Ref<GDExtensionResourceLoader> resource_loader_gdextension;
|
||||
static Ref<ResourceFormatSaverJSON> resource_saver_json;
|
||||
static Ref<ResourceFormatLoaderJSON> resource_loader_json;
|
||||
|
||||
@ -109,7 +109,7 @@ static WorkerThreadPool *worker_thread_pool = nullptr;
|
||||
|
||||
extern Mutex _global_mutex;
|
||||
|
||||
static NativeExtensionManager *native_extension_manager = nullptr;
|
||||
static GDExtensionManager *gdextension_manager = nullptr;
|
||||
|
||||
extern void register_global_constants();
|
||||
extern void unregister_global_constants();
|
||||
@ -256,9 +256,9 @@ void register_core_types() {
|
||||
GDREGISTER_CLASS(ImageFormatLoaderExtension);
|
||||
GDREGISTER_ABSTRACT_CLASS(ResourceImporter);
|
||||
|
||||
GDREGISTER_CLASS(NativeExtension);
|
||||
GDREGISTER_CLASS(GDExtension);
|
||||
|
||||
GDREGISTER_ABSTRACT_CLASS(NativeExtensionManager);
|
||||
GDREGISTER_ABSTRACT_CLASS(GDExtensionManager);
|
||||
|
||||
GDREGISTER_ABSTRACT_CLASS(ResourceUID);
|
||||
|
||||
@ -266,10 +266,10 @@ void register_core_types() {
|
||||
|
||||
resource_uid = memnew(ResourceUID);
|
||||
|
||||
native_extension_manager = memnew(NativeExtensionManager);
|
||||
gdextension_manager = memnew(GDExtensionManager);
|
||||
|
||||
resource_loader_native_extension.instantiate();
|
||||
ResourceLoader::add_resource_format_loader(resource_loader_native_extension);
|
||||
resource_loader_gdextension.instantiate();
|
||||
ResourceLoader::add_resource_format_loader(resource_loader_gdextension);
|
||||
|
||||
ip = IP::create();
|
||||
|
||||
@ -344,27 +344,27 @@ void register_core_singletons() {
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("InputMap", InputMap::get_singleton()));
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("EngineDebugger", core_bind::EngineDebugger::get_singleton()));
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("Time", Time::get_singleton()));
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("NativeExtensionManager", NativeExtensionManager::get_singleton()));
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("GDExtensionManager", GDExtensionManager::get_singleton()));
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("ResourceUID", ResourceUID::get_singleton()));
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("WorkerThreadPool", worker_thread_pool));
|
||||
}
|
||||
|
||||
void register_core_extensions() {
|
||||
// Hardcoded for now.
|
||||
NativeExtension::initialize_native_extensions();
|
||||
native_extension_manager->load_extensions();
|
||||
native_extension_manager->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_CORE);
|
||||
GDExtension::initialize_gdextensions();
|
||||
gdextension_manager->load_extensions();
|
||||
gdextension_manager->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE);
|
||||
_is_core_extensions_registered = true;
|
||||
}
|
||||
|
||||
void unregister_core_extensions() {
|
||||
if (_is_core_extensions_registered) {
|
||||
native_extension_manager->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_CORE);
|
||||
gdextension_manager->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE);
|
||||
}
|
||||
}
|
||||
|
||||
void unregister_core_types() {
|
||||
memdelete(native_extension_manager);
|
||||
memdelete(gdextension_manager);
|
||||
|
||||
memdelete(resource_uid);
|
||||
memdelete(_resource_loader);
|
||||
@ -410,8 +410,8 @@ void unregister_core_types() {
|
||||
memdelete(ip);
|
||||
}
|
||||
|
||||
ResourceLoader::remove_resource_format_loader(resource_loader_native_extension);
|
||||
resource_loader_native_extension.unref();
|
||||
ResourceLoader::remove_resource_format_loader(resource_loader_gdextension);
|
||||
resource_loader_gdextension.unref();
|
||||
|
||||
ResourceLoader::finalize();
|
||||
|
||||
|
@ -36,90 +36,90 @@
|
||||
#include "core/variant/type_info.h"
|
||||
|
||||
template <class T>
|
||||
struct GDNativeConstPtr {
|
||||
struct GDExtensionConstPtr {
|
||||
const T *data = nullptr;
|
||||
GDNativeConstPtr(const T *p_assign) { data = p_assign; }
|
||||
GDExtensionConstPtr(const T *p_assign) { data = p_assign; }
|
||||
static const char *get_name() { return "const void"; }
|
||||
operator const T *() const { return data; }
|
||||
operator Variant() const { return uint64_t(data); }
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct GDNativePtr {
|
||||
struct GDExtensionPtr {
|
||||
T *data = nullptr;
|
||||
GDNativePtr(T *p_assign) { data = p_assign; }
|
||||
GDExtensionPtr(T *p_assign) { data = p_assign; }
|
||||
static const char *get_name() { return "void"; }
|
||||
operator T *() const { return data; }
|
||||
operator Variant() const { return uint64_t(data); }
|
||||
};
|
||||
|
||||
#define GDVIRTUAL_NATIVE_PTR(m_type) \
|
||||
template <> \
|
||||
struct GDNativeConstPtr<const m_type> { \
|
||||
const m_type *data = nullptr; \
|
||||
GDNativeConstPtr() {} \
|
||||
GDNativeConstPtr(const m_type *p_assign) { data = p_assign; } \
|
||||
static const char *get_name() { return "const " #m_type; } \
|
||||
operator const m_type *() const { return data; } \
|
||||
operator Variant() const { return uint64_t(data); } \
|
||||
}; \
|
||||
template <> \
|
||||
struct VariantCaster<GDNativeConstPtr<const m_type>> { \
|
||||
static _FORCE_INLINE_ GDNativeConstPtr<const m_type> cast(const Variant &p_variant) { \
|
||||
return GDNativeConstPtr<const m_type>((const m_type *)p_variant.operator uint64_t()); \
|
||||
} \
|
||||
}; \
|
||||
template <> \
|
||||
struct GDNativePtr<m_type> { \
|
||||
m_type *data = nullptr; \
|
||||
GDNativePtr() {} \
|
||||
GDNativePtr(m_type *p_assign) { data = p_assign; } \
|
||||
static const char *get_name() { return #m_type; } \
|
||||
operator m_type *() const { return data; } \
|
||||
operator Variant() const { return uint64_t(data); } \
|
||||
}; \
|
||||
template <> \
|
||||
struct VariantCaster<GDNativePtr<m_type>> { \
|
||||
static _FORCE_INLINE_ GDNativePtr<m_type> cast(const Variant &p_variant) { \
|
||||
return GDNativePtr<m_type>((m_type *)p_variant.operator uint64_t()); \
|
||||
} \
|
||||
#define GDVIRTUAL_NATIVE_PTR(m_type) \
|
||||
template <> \
|
||||
struct GDExtensionConstPtr<const m_type> { \
|
||||
const m_type *data = nullptr; \
|
||||
GDExtensionConstPtr() {} \
|
||||
GDExtensionConstPtr(const m_type *p_assign) { data = p_assign; } \
|
||||
static const char *get_name() { return "const " #m_type; } \
|
||||
operator const m_type *() const { return data; } \
|
||||
operator Variant() const { return uint64_t(data); } \
|
||||
}; \
|
||||
template <> \
|
||||
struct VariantCaster<GDExtensionConstPtr<const m_type>> { \
|
||||
static _FORCE_INLINE_ GDExtensionConstPtr<const m_type> cast(const Variant &p_variant) { \
|
||||
return GDExtensionConstPtr<const m_type>((const m_type *)p_variant.operator uint64_t()); \
|
||||
} \
|
||||
}; \
|
||||
template <> \
|
||||
struct GDExtensionPtr<m_type> { \
|
||||
m_type *data = nullptr; \
|
||||
GDExtensionPtr() {} \
|
||||
GDExtensionPtr(m_type *p_assign) { data = p_assign; } \
|
||||
static const char *get_name() { return #m_type; } \
|
||||
operator m_type *() const { return data; } \
|
||||
operator Variant() const { return uint64_t(data); } \
|
||||
}; \
|
||||
template <> \
|
||||
struct VariantCaster<GDExtensionPtr<m_type>> { \
|
||||
static _FORCE_INLINE_ GDExtensionPtr<m_type> cast(const Variant &p_variant) { \
|
||||
return GDExtensionPtr<m_type>((m_type *)p_variant.operator uint64_t()); \
|
||||
} \
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct GetTypeInfo<GDNativeConstPtr<T>> {
|
||||
struct GetTypeInfo<GDExtensionConstPtr<T>> {
|
||||
static const Variant::Type VARIANT_TYPE = Variant::NIL;
|
||||
static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
||||
static inline PropertyInfo get_class_info() {
|
||||
return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDNativeConstPtr<T>::get_name());
|
||||
return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDExtensionConstPtr<T>::get_name());
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct GetTypeInfo<GDNativePtr<T>> {
|
||||
struct GetTypeInfo<GDExtensionPtr<T>> {
|
||||
static const Variant::Type VARIANT_TYPE = Variant::NIL;
|
||||
static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
|
||||
static inline PropertyInfo get_class_info() {
|
||||
return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDNativePtr<T>::get_name());
|
||||
return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDExtensionPtr<T>::get_name());
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct PtrToArg<GDNativeConstPtr<T>> {
|
||||
_FORCE_INLINE_ static GDNativeConstPtr<T> convert(const void *p_ptr) {
|
||||
return GDNativeConstPtr<T>(reinterpret_cast<const T *>(p_ptr));
|
||||
struct PtrToArg<GDExtensionConstPtr<T>> {
|
||||
_FORCE_INLINE_ static GDExtensionConstPtr<T> convert(const void *p_ptr) {
|
||||
return GDExtensionConstPtr<T>(reinterpret_cast<const T *>(p_ptr));
|
||||
}
|
||||
typedef const T *EncodeT;
|
||||
_FORCE_INLINE_ static void encode(GDNativeConstPtr<T> p_val, void *p_ptr) {
|
||||
_FORCE_INLINE_ static void encode(GDExtensionConstPtr<T> p_val, void *p_ptr) {
|
||||
*((const T **)p_ptr) = p_val.data;
|
||||
}
|
||||
};
|
||||
template <class T>
|
||||
struct PtrToArg<GDNativePtr<T>> {
|
||||
_FORCE_INLINE_ static GDNativePtr<T> convert(const void *p_ptr) {
|
||||
return GDNativePtr<T>(reinterpret_cast<const T *>(p_ptr));
|
||||
struct PtrToArg<GDExtensionPtr<T>> {
|
||||
_FORCE_INLINE_ static GDExtensionPtr<T> convert(const void *p_ptr) {
|
||||
return GDExtensionPtr<T>(reinterpret_cast<const T *>(p_ptr));
|
||||
}
|
||||
typedef T *EncodeT;
|
||||
_FORCE_INLINE_ static void encode(GDNativePtr<T> p_val, void *p_ptr) {
|
||||
_FORCE_INLINE_ static void encode(GDExtensionPtr<T> p_val, void *p_ptr) {
|
||||
*((T **)p_ptr) = p_val.data;
|
||||
}
|
||||
};
|
||||
|
@ -1517,7 +1517,7 @@ struct VariantTypeAdjust<Object *> {
|
||||
}
|
||||
};
|
||||
|
||||
// GDNative extension helpers.
|
||||
// GDExtension helpers.
|
||||
|
||||
template <class T>
|
||||
struct VariantTypeConstructor {
|
||||
|
@ -1319,6 +1319,9 @@
|
||||
<member name="EngineDebugger" type="EngineDebugger" setter="" getter="">
|
||||
The [EngineDebugger] singleton.
|
||||
</member>
|
||||
<member name="GDExtensionManager" type="GDExtensionManager" setter="" getter="">
|
||||
The [GDExtensionManager] singleton.
|
||||
</member>
|
||||
<member name="Geometry2D" type="Geometry2D" setter="" getter="">
|
||||
The [Geometry2D] singleton.
|
||||
</member>
|
||||
@ -1348,9 +1351,6 @@
|
||||
<member name="Marshalls" type="Marshalls" setter="" getter="">
|
||||
The [Marshalls] singleton.
|
||||
</member>
|
||||
<member name="NativeExtensionManager" type="NativeExtensionManager" setter="" getter="">
|
||||
The [NativeExtensionManager] singleton.
|
||||
</member>
|
||||
<member name="NavigationMeshGenerator" type="NavigationMeshGenerator" setter="" getter="">
|
||||
The [NavigationMeshGenerator] singleton.
|
||||
</member>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<class name="NativeExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
||||
<class name="GDExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
||||
<brief_description>
|
||||
</brief_description>
|
||||
<description>
|
||||
@ -13,13 +13,13 @@
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_minimum_library_initialization_level" qualifiers="const">
|
||||
<return type="int" enum="NativeExtension.InitializationLevel" />
|
||||
<return type="int" enum="GDExtension.InitializationLevel" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
<method name="initialize_library">
|
||||
<return type="void" />
|
||||
<param index="0" name="level" type="int" enum="NativeExtension.InitializationLevel" />
|
||||
<param index="0" name="level" type="int" enum="GDExtension.InitializationLevel" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<class name="NativeExtensionManager" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
||||
<class name="GDExtensionManager" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
|
||||
<brief_description>
|
||||
</brief_description>
|
||||
<description>
|
||||
@ -8,7 +8,7 @@
|
||||
</tutorials>
|
||||
<methods>
|
||||
<method name="get_extension">
|
||||
<return type="NativeExtension" />
|
||||
<return type="GDExtension" />
|
||||
<param index="0" name="path" type="String" />
|
||||
<description>
|
||||
</description>
|
||||
@ -25,19 +25,19 @@
|
||||
</description>
|
||||
</method>
|
||||
<method name="load_extension">
|
||||
<return type="int" enum="NativeExtensionManager.LoadStatus" />
|
||||
<return type="int" enum="GDExtensionManager.LoadStatus" />
|
||||
<param index="0" name="path" type="String" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
<method name="reload_extension">
|
||||
<return type="int" enum="NativeExtensionManager.LoadStatus" />
|
||||
<return type="int" enum="GDExtensionManager.LoadStatus" />
|
||||
<param index="0" name="path" type="String" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
<method name="unload_extension">
|
||||
<return type="int" enum="NativeExtensionManager.LoadStatus" />
|
||||
<return type="int" enum="GDExtensionManager.LoadStatus" />
|
||||
<param index="0" name="path" type="String" />
|
||||
<description>
|
||||
</description>
|
@ -30,7 +30,7 @@
|
||||
|
||||
#include "register_driver_types.h"
|
||||
|
||||
#include "core/extension/native_extension_manager.h"
|
||||
#include "core/extension/gdextension_manager.h"
|
||||
#include "drivers/png/image_loader_png.h"
|
||||
#include "drivers/png/resource_saver_png.h"
|
||||
|
||||
|
@ -31,7 +31,7 @@
|
||||
#include "editor_file_system.h"
|
||||
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/extension/native_extension_manager.h"
|
||||
#include "core/extension/gdextension_manager.h"
|
||||
#include "core/io/file_access.h"
|
||||
#include "core/io/resource_importer.h"
|
||||
#include "core/io/resource_loader.h"
|
||||
@ -2335,7 +2335,7 @@ ResourceUID::ID EditorFileSystem::_resource_saver_get_resource_id_for_path(const
|
||||
static void _scan_extensions_dir(EditorFileSystemDirectory *d, HashSet<String> &extensions) {
|
||||
int fc = d->get_file_count();
|
||||
for (int i = 0; i < fc; i++) {
|
||||
if (d->get_file_type(i) == SNAME("NativeExtension")) {
|
||||
if (d->get_file_type(i) == SNAME("GDExtension")) {
|
||||
extensions.insert(d->get_file_path(i));
|
||||
}
|
||||
}
|
||||
@ -2356,19 +2356,19 @@ bool EditorFileSystem::_scan_extensions() {
|
||||
Vector<String> extensions_removed;
|
||||
|
||||
for (const String &E : extensions) {
|
||||
if (!NativeExtensionManager::get_singleton()->is_extension_loaded(E)) {
|
||||
if (!GDExtensionManager::get_singleton()->is_extension_loaded(E)) {
|
||||
extensions_added.push_back(E);
|
||||
}
|
||||
}
|
||||
|
||||
Vector<String> loaded_extensions = NativeExtensionManager::get_singleton()->get_loaded_extensions();
|
||||
Vector<String> loaded_extensions = GDExtensionManager::get_singleton()->get_loaded_extensions();
|
||||
for (int i = 0; i < loaded_extensions.size(); i++) {
|
||||
if (!extensions.has(loaded_extensions[i])) {
|
||||
extensions_removed.push_back(loaded_extensions[i]);
|
||||
}
|
||||
}
|
||||
|
||||
String extension_list_config_file = NativeExtension::get_extension_list_config_file();
|
||||
String extension_list_config_file = GDExtension::get_extension_list_config_file();
|
||||
if (extensions.size()) {
|
||||
if (extensions_added.size() || extensions_removed.size()) { //extensions were added or removed
|
||||
Ref<FileAccess> f = FileAccess::open(extension_list_config_file, FileAccess::WRITE);
|
||||
@ -2385,18 +2385,18 @@ bool EditorFileSystem::_scan_extensions() {
|
||||
|
||||
bool needs_restart = false;
|
||||
for (int i = 0; i < extensions_added.size(); i++) {
|
||||
NativeExtensionManager::LoadStatus st = NativeExtensionManager::get_singleton()->load_extension(extensions_added[i]);
|
||||
if (st == NativeExtensionManager::LOAD_STATUS_FAILED) {
|
||||
GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->load_extension(extensions_added[i]);
|
||||
if (st == GDExtensionManager::LOAD_STATUS_FAILED) {
|
||||
EditorNode::get_singleton()->add_io_error("Error loading extension: " + extensions_added[i]);
|
||||
} else if (st == NativeExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
|
||||
} else if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
|
||||
needs_restart = true;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < extensions_removed.size(); i++) {
|
||||
NativeExtensionManager::LoadStatus st = NativeExtensionManager::get_singleton()->unload_extension(extensions_removed[i]);
|
||||
if (st == NativeExtensionManager::LOAD_STATUS_FAILED) {
|
||||
GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->unload_extension(extensions_removed[i]);
|
||||
if (st == GDExtensionManager::LOAD_STATUS_FAILED) {
|
||||
EditorNode::get_singleton()->add_io_error("Error removing extension: " + extensions_added[i]);
|
||||
} else if (st == NativeExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
|
||||
} else if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
|
||||
needs_restart = true;
|
||||
}
|
||||
}
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/crypto/crypto_core.h"
|
||||
#include "core/extension/native_extension.h"
|
||||
#include "core/extension/gdextension.h"
|
||||
#include "core/io/file_access_encrypted.h"
|
||||
#include "core/io/file_access_pack.h" // PACK_HEADER_MAGIC, PACK_FORMAT_VERSION
|
||||
#include "core/io/zip_io.h"
|
||||
@ -1267,7 +1267,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
||||
}
|
||||
}
|
||||
|
||||
String extension_list_config_file = NativeExtension::get_extension_list_config_file();
|
||||
String extension_list_config_file = GDExtension::get_extension_list_config_file();
|
||||
if (FileAccess::exists(extension_list_config_file)) {
|
||||
Vector<uint8_t> array = FileAccess::get_file_as_bytes(extension_list_config_file);
|
||||
err = p_func(p_udata, extension_list_config_file, array, idx, total, enc_in_filters, enc_ex_filters, key);
|
||||
|
@ -31,7 +31,7 @@
|
||||
#ifndef EDITOR_EXPORT_PLUGIN_H
|
||||
#define EDITOR_EXPORT_PLUGIN_H
|
||||
|
||||
#include "core/extension/native_extension.h"
|
||||
#include "core/extension/gdextension.h"
|
||||
#include "editor_export_preset.h"
|
||||
#include "editor_export_shared_object.h"
|
||||
#include "scene/main/node.h"
|
||||
|
@ -40,7 +40,7 @@ protected:
|
||||
};
|
||||
|
||||
void GDExtensionExportPlugin::_export_file(const String &p_path, const String &p_type, const HashSet<String> &p_features) {
|
||||
if (p_type != "NativeExtension") {
|
||||
if (p_type != "GDExtension") {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -55,7 +55,7 @@ void GDExtensionExportPlugin::_export_file(const String &p_path, const String &p
|
||||
String entry_symbol = config->get_value("configuration", "entry_symbol");
|
||||
|
||||
PackedStringArray tags;
|
||||
String library_path = NativeExtension::find_extension_library(
|
||||
String library_path = GDExtension::find_extension_library(
|
||||
p_path, config, [p_features](String p_feature) { return p_features.has(p_feature); }, &tags);
|
||||
if (!library_path.is_empty()) {
|
||||
add_shared_object(library_path, tags);
|
||||
|
@ -1398,7 +1398,7 @@ static const char *class_renames[][2] = {
|
||||
// { "Physics2DDirectBodyStateSW", "GodotPhysicsDirectBodyState2D" }, // Class is not visible in ClassDB
|
||||
// { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB
|
||||
// { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB
|
||||
// { "NativeScript","NativeExtension"}, ??
|
||||
// { "NativeScript","GDExtension"}, ??
|
||||
{ "ARVRAnchor", "XRAnchor3D" },
|
||||
{ "ARVRCamera", "XRCamera3D" },
|
||||
{ "ARVRController", "XRController3D" },
|
||||
|
@ -36,8 +36,8 @@
|
||||
#include "core/crypto/crypto.h"
|
||||
#include "core/debugger/engine_debugger.h"
|
||||
#include "core/extension/extension_api_dump.h"
|
||||
#include "core/extension/gdnative_interface_dump.gen.h"
|
||||
#include "core/extension/native_extension_manager.h"
|
||||
#include "core/extension/gdextension_interface_dump.gen.h"
|
||||
#include "core/extension/gdextension_manager.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/input/input_map.h"
|
||||
#include "core/io/dir_access.h"
|
||||
@ -202,7 +202,7 @@ static MovieWriter *movie_writer = nullptr;
|
||||
static bool disable_vsync = false;
|
||||
static bool print_fps = false;
|
||||
#ifdef TOOLS_ENABLED
|
||||
static bool dump_gdnative_interface = false;
|
||||
static bool dump_gdextension_interface = false;
|
||||
static bool dump_extension_api = false;
|
||||
#endif
|
||||
bool profile_gpu = false;
|
||||
@ -423,7 +423,7 @@ void Main::print_help(const char *p_binary) {
|
||||
OS::get_singleton()->print(" --doctool [<path>] Dump the engine API reference to the given <path> (defaults to current dir) in XML format, merging if existing files are found.\n");
|
||||
OS::get_singleton()->print(" --no-docbase Disallow dumping the base types (used with --doctool).\n");
|
||||
OS::get_singleton()->print(" --build-solutions Build the scripting solutions (e.g. for C# projects). Implies --editor and requires a valid project to edit.\n");
|
||||
OS::get_singleton()->print(" --dump-gdextension-interface Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.\n");
|
||||
OS::get_singleton()->print(" --dump-gdextension-interface Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.\n");
|
||||
OS::get_singleton()->print(" --dump-extension-api Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder.\n");
|
||||
OS::get_singleton()->print(" --startup-benchmark Benchmark the startup time and print it to console.\n");
|
||||
OS::get_singleton()->print(" --startup-benchmark-file <path> Benchmark the startup time and save it to a given file in JSON format.\n");
|
||||
@ -473,7 +473,7 @@ Error Main::test_setup() {
|
||||
register_server_types();
|
||||
XRServer::set_xr_mode(XRServer::XRMODE_OFF); // Skip in tests.
|
||||
initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
|
||||
NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
|
||||
translation_server->setup(); //register translations, load them, etc.
|
||||
if (!locale.is_empty()) {
|
||||
@ -488,14 +488,14 @@ Error Main::test_setup() {
|
||||
register_driver_types();
|
||||
|
||||
initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
|
||||
NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
ClassDB::set_current_api(ClassDB::API_EDITOR);
|
||||
register_editor_types();
|
||||
|
||||
initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
|
||||
NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
|
||||
ClassDB::set_current_api(ClassDB::API_CORE);
|
||||
#endif
|
||||
@ -547,12 +547,12 @@ void Main::test_cleanup() {
|
||||
ResourceSaver::remove_custom_savers();
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
|
||||
unregister_editor_types();
|
||||
#endif
|
||||
|
||||
NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
|
||||
unregister_platform_apis();
|
||||
unregister_driver_types();
|
||||
@ -560,7 +560,7 @@ void Main::test_cleanup() {
|
||||
|
||||
finalize_theme_db();
|
||||
|
||||
NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
|
||||
unregister_server_types();
|
||||
|
||||
@ -1063,8 +1063,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
|
||||
// Register as an editor instance to use low-end fallback if relevant.
|
||||
editor = true;
|
||||
cmdline_tool = true;
|
||||
dump_gdnative_interface = true;
|
||||
print_line("Dumping gdnative interface header file");
|
||||
dump_gdextension_interface = true;
|
||||
print_line("Dumping GDExtension interface header file");
|
||||
// Hack. Not needed but otherwise we end up detecting that this should
|
||||
// run the project instead of a cmdline tool.
|
||||
// Needs full refactoring to fix properly.
|
||||
@ -1962,7 +1962,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
|
||||
|
||||
register_server_types();
|
||||
initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
|
||||
NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
|
||||
if (p_main_tid_override) {
|
||||
Thread::main_thread_id = p_main_tid_override;
|
||||
@ -2321,13 +2321,13 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
|
||||
register_driver_types();
|
||||
|
||||
initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
|
||||
NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
ClassDB::set_current_api(ClassDB::API_EDITOR);
|
||||
register_editor_types();
|
||||
initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
|
||||
NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
|
||||
ClassDB::set_current_api(ClassDB::API_CORE);
|
||||
|
||||
@ -2585,15 +2585,15 @@ bool Main::start() {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dump_gdnative_interface) {
|
||||
GDNativeInterfaceDump::generate_gdnative_interface_file("gdnative_interface.h");
|
||||
if (dump_gdextension_interface) {
|
||||
GDExtensionInterfaceDump::generate_gdextension_interface_file("gdextension_interface.h");
|
||||
}
|
||||
|
||||
if (dump_extension_api) {
|
||||
NativeExtensionAPIDump::generate_extension_json_file("extension_api.json");
|
||||
GDExtensionAPIDump::generate_extension_json_file("extension_api.json");
|
||||
}
|
||||
|
||||
if (dump_gdnative_interface || dump_extension_api) {
|
||||
if (dump_gdextension_interface || dump_extension_api) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -3345,7 +3345,7 @@ void Main::cleanup(bool p_force) {
|
||||
}
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
|
||||
uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
|
||||
unregister_editor_types();
|
||||
|
||||
@ -3353,7 +3353,7 @@ void Main::cleanup(bool p_force) {
|
||||
|
||||
ImageLoader::cleanup();
|
||||
|
||||
NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
|
||||
uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
|
||||
|
||||
unregister_platform_apis();
|
||||
@ -3366,7 +3366,7 @@ void Main::cleanup(bool p_force) {
|
||||
finalize_navigation_server();
|
||||
finalize_physics();
|
||||
|
||||
NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
|
||||
uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
|
||||
unregister_server_types();
|
||||
|
||||
|
2
misc/dist/linux/godot.6
vendored
2
misc/dist/linux/godot.6
vendored
@ -157,7 +157,7 @@ Disallow dumping the base types (used with \fB\-\-doctool\fR).
|
||||
Build the scripting solutions (e.g. for C# projects). Implies \-\-editor and requires a valid project to edit.
|
||||
.TP
|
||||
\fB\-\-dump\-gdextension\-interface\fR
|
||||
Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.
|
||||
Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.
|
||||
.TP
|
||||
\fB\-\-dump\-extension\-api\fR
|
||||
Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder.
|
||||
|
2
misc/dist/shell/_godot.zsh-completion
vendored
2
misc/dist/shell/_godot.zsh-completion
vendored
@ -86,7 +86,7 @@ _arguments \
|
||||
'--doctool[dump the engine API reference to the given path in XML format, merging if existing files are found]:path to base Godot build directory (optional):_dirs' \
|
||||
'--no-docbase[disallow dumping the base types (used with --doctool)]' \
|
||||
'--build-solutions[build the scripting solutions (e.g. for C# projects)]' \
|
||||
'--dump-gdextension-interface[generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.]' \
|
||||
'--dump-gdextension-interface[generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.]' \
|
||||
'--dump-extension-api[generate JSON dump of the Godot API for GDExtension bindings named "extension_api.json" in the current folder]' \
|
||||
'--startup-benchmark[benchmark the startup time and print it to console]' \
|
||||
'--startup-benchmark-file[benchmark the startup time and save it to a given file in JSON format]:path to output JSON file' \
|
||||
|
2
misc/dist/shell/godot.fish
vendored
2
misc/dist/shell/godot.fish
vendored
@ -107,7 +107,7 @@ complete -c godot -l validate-conversion-3to4 -d "Shows what elements will be re
|
||||
complete -c godot -l doctool -d "Dump the engine API reference to the given path in XML format, merging if existing files are found" -r
|
||||
complete -c godot -l no-docbase -d "Disallow dumping the base types (used with --doctool)"
|
||||
complete -c godot -l build-solutions -d "Build the scripting solutions (e.g. for C# projects)"
|
||||
complete -c godot -l dump-gdextension-interface -d "Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension"
|
||||
complete -c godot -l dump-gdextension-interface -d "Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension"
|
||||
complete -c godot -l dump-extension-api -d "Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder"
|
||||
complete -c godot -l startup-benchmark -d "Benchmark the startup time and print it to console"
|
||||
complete -c godot -l startup-benchmark-file -d "Benchmark the startup time and save it to a given file in JSON format" -x
|
||||
|
@ -73,7 +73,7 @@ static bool _create_project_solution_if_needed() {
|
||||
|
||||
CSharpLanguage *CSharpLanguage::singleton = nullptr;
|
||||
|
||||
GDNativeInstanceBindingCallbacks CSharpLanguage::_instance_binding_callbacks = {
|
||||
GDExtensionInstanceBindingCallbacks CSharpLanguage::_instance_binding_callbacks = {
|
||||
&_instance_binding_create_callback,
|
||||
&_instance_binding_free_callback,
|
||||
&_instance_binding_reference_callback
|
||||
@ -1293,7 +1293,7 @@ void CSharpLanguage::_instance_binding_free_callback(void *, void *, void *p_bin
|
||||
}
|
||||
}
|
||||
|
||||
GDNativeBool CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDNativeBool p_reference) {
|
||||
GDExtensionBool CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference) {
|
||||
CRASH_COND(!p_binding);
|
||||
|
||||
CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)p_binding)->get();
|
||||
@ -2202,7 +2202,7 @@ void CSharpScript::reload_registered_script(Ref<CSharpScript> p_script) {
|
||||
void CSharpScript::update_script_class_info(Ref<CSharpScript> p_script) {
|
||||
bool tool = false;
|
||||
|
||||
// TODO: Use GDNative godot_dictionary
|
||||
// TODO: Use GDExtension godot_dictionary
|
||||
Array methods_array;
|
||||
methods_array.~Array();
|
||||
Dictionary rpc_functions_dict;
|
||||
|
@ -352,9 +352,9 @@ class CSharpLanguage : public ScriptLanguage {
|
||||
|
||||
static void *_instance_binding_create_callback(void *p_token, void *p_instance);
|
||||
static void _instance_binding_free_callback(void *p_token, void *p_instance, void *p_binding);
|
||||
static GDNativeBool _instance_binding_reference_callback(void *p_token, void *p_binding, GDNativeBool p_reference);
|
||||
static GDExtensionBool _instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference);
|
||||
|
||||
static GDNativeInstanceBindingCallbacks _instance_binding_callbacks;
|
||||
static GDExtensionInstanceBindingCallbacks _instance_binding_callbacks;
|
||||
|
||||
public:
|
||||
static void *get_instance_binding(Object *p_object);
|
||||
|
@ -1,7 +1,7 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GC/@EntryIndexedValue">GC</s:String>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=alcs/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=gdnative/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=gdextension/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=godotsharp/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=icall/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=quat/@EntryIndexedValue">True</s:Boolean>
|
||||
|
@ -31,13 +31,13 @@
|
||||
#ifndef REGISTER_MODULE_TYPES_H
|
||||
#define REGISTER_MODULE_TYPES_H
|
||||
|
||||
#include "core/extension/gdnative_interface.h"
|
||||
#include "core/extension/gdextension_interface.h"
|
||||
|
||||
enum ModuleInitializationLevel {
|
||||
MODULE_INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE,
|
||||
MODULE_INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS,
|
||||
MODULE_INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE,
|
||||
MODULE_INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR
|
||||
MODULE_INITIALIZATION_LEVEL_CORE = GDEXTENSION_INITIALIZATION_CORE,
|
||||
MODULE_INITIALIZATION_LEVEL_SERVERS = GDEXTENSION_INITIALIZATION_SERVERS,
|
||||
MODULE_INITIALIZATION_LEVEL_SCENE = GDEXTENSION_INITIALIZATION_SCENE,
|
||||
MODULE_INITIALIZATION_LEVEL_EDITOR = GDEXTENSION_INITIALIZATION_EDITOR
|
||||
};
|
||||
|
||||
void initialize_modules(ModuleInitializationLevel p_level);
|
||||
|
@ -62,7 +62,7 @@ using namespace godot;
|
||||
|
||||
extern "C" {
|
||||
|
||||
GDNativeBool GDN_EXPORT textserver_advanced_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
|
||||
GDExtensionBool GDN_EXPORT textserver_advanced_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
|
||||
GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
|
||||
|
||||
init_obj.register_initializer(&initialize_text_server_adv_module);
|
||||
|
@ -62,7 +62,7 @@ using namespace godot;
|
||||
|
||||
extern "C" {
|
||||
|
||||
GDNativeBool GDN_EXPORT textserver_fallback_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
|
||||
GDExtensionBool GDN_EXPORT textserver_fallback_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
|
||||
GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
|
||||
|
||||
init_obj.register_initializer(&initialize_text_server_fb_module);
|
||||
|
@ -70,8 +70,8 @@ public:
|
||||
virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override;
|
||||
|
||||
/** GDExtension **/
|
||||
GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>);
|
||||
GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int);
|
||||
GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>);
|
||||
GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int);
|
||||
|
||||
WebRTCDataChannelExtension() {}
|
||||
};
|
||||
|
@ -205,7 +205,7 @@ static const char *LEGACY_BUILD_SPLASH_IMAGE_EXPORT_PATH = "res/drawable-nodpi-v
|
||||
static const char *SPLASH_BG_COLOR_PATH = "res/drawable-nodpi/splash_bg_color.png";
|
||||
static const char *LEGACY_BUILD_SPLASH_BG_COLOR_PATH = "res/drawable-nodpi-v4/splash_bg_color.png";
|
||||
static const char *SPLASH_CONFIG_PATH = "res://android/build/res/drawable/splash_drawable.xml";
|
||||
static const char *GDNATIVE_LIBS_PATH = "res://android/build/libs/gdnativelibs.json";
|
||||
static const char *GDEXTENSION_LIBS_PATH = "res://android/build/libs/gdextensionlibs.json";
|
||||
|
||||
static const int icon_densities_count = 6;
|
||||
static const char *launcher_icon_option = PNAME("launcher_icons/main_192x192");
|
||||
@ -2509,7 +2509,7 @@ void EditorExportPlatformAndroid::_clear_assets_directory() {
|
||||
void EditorExportPlatformAndroid::_remove_copied_libs() {
|
||||
print_verbose("Removing previously installed libraries...");
|
||||
Error error;
|
||||
String libs_json = FileAccess::get_file_as_string(GDNATIVE_LIBS_PATH, &error);
|
||||
String libs_json = FileAccess::get_file_as_string(GDEXTENSION_LIBS_PATH, &error);
|
||||
if (error || libs_json.is_empty()) {
|
||||
print_verbose("No previously installed libraries found");
|
||||
return;
|
||||
@ -2525,7 +2525,7 @@ void EditorExportPlatformAndroid::_remove_copied_libs() {
|
||||
print_verbose("Removing previously installed library " + libs[i]);
|
||||
da->remove(libs[i]);
|
||||
}
|
||||
da->remove(GDNATIVE_LIBS_PATH);
|
||||
da->remove(GDEXTENSION_LIBS_PATH);
|
||||
}
|
||||
|
||||
String EditorExportPlatformAndroid::join_list(const List<String> &p_parts, const String &p_separator) {
|
||||
@ -2661,7 +2661,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
|
||||
return err;
|
||||
}
|
||||
if (user_data.libs.size() > 0) {
|
||||
Ref<FileAccess> fa = FileAccess::open(GDNATIVE_LIBS_PATH, FileAccess::WRITE);
|
||||
Ref<FileAccess> fa = FileAccess::open(GDEXTENSION_LIBS_PATH, FileAccess::WRITE);
|
||||
fa->store_string(JSON::stringify(user_data.libs, "\t"));
|
||||
}
|
||||
} else {
|
||||
|
@ -71,11 +71,11 @@ import javax.microedition.khronos.opengles.GL10;
|
||||
* - 'plugin.init.ClassFullName' is the full name (package + class name) of the plugin class
|
||||
* extending {@link GodotPlugin}.
|
||||
*
|
||||
* A plugin can also define and provide c/c++ gdnative libraries and nativescripts for the target
|
||||
* A plugin can also define and provide c/c++ gdextension libraries and nativescripts for the target
|
||||
* app/game to leverage.
|
||||
* The shared library for the gdnative library will be automatically bundled by the aar build
|
||||
* The shared library for the gdextension library will be automatically bundled by the aar build
|
||||
* system.
|
||||
* Godot '*.gdnlib' and '*.gdns' resource files must however be manually defined in the project
|
||||
* Godot '*.gdextension' resource files must however be manually defined in the project
|
||||
* 'assets' directory. The recommended path for these resources in the 'assets' directory should be:
|
||||
* 'godot/plugin/v1/[PluginName]/'
|
||||
*/
|
||||
@ -112,7 +112,7 @@ public abstract class GodotPlugin {
|
||||
public final void onRegisterPluginWithGodotNative() {
|
||||
registeredSignals.putAll(
|
||||
registerPluginWithGodotNative(this, getPluginName(), getPluginMethods(), getPluginSignals(),
|
||||
getPluginGDNativeLibrariesPaths()));
|
||||
getPluginGDExtensionLibrariesPaths()));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -124,7 +124,7 @@ public abstract class GodotPlugin {
|
||||
GodotPluginInfoProvider pluginInfoProvider) {
|
||||
registerPluginWithGodotNative(pluginObject, pluginInfoProvider.getPluginName(),
|
||||
Collections.emptyList(), pluginInfoProvider.getPluginSignals(),
|
||||
pluginInfoProvider.getPluginGDNativeLibrariesPaths());
|
||||
pluginInfoProvider.getPluginGDExtensionLibrariesPaths());
|
||||
|
||||
// Notify that registration is complete.
|
||||
pluginInfoProvider.onPluginRegistered();
|
||||
@ -132,7 +132,7 @@ public abstract class GodotPlugin {
|
||||
|
||||
private static Map<String, SignalInfo> registerPluginWithGodotNative(Object pluginObject,
|
||||
String pluginName, List<String> pluginMethods, Set<SignalInfo> pluginSignals,
|
||||
Set<String> pluginGDNativeLibrariesPaths) {
|
||||
Set<String> pluginGDExtensionLibrariesPaths) {
|
||||
nativeRegisterSingleton(pluginName, pluginObject);
|
||||
|
||||
Set<Method> filteredMethods = new HashSet<>();
|
||||
@ -176,9 +176,9 @@ public abstract class GodotPlugin {
|
||||
registeredSignals.put(signalName, signalInfo);
|
||||
}
|
||||
|
||||
// Get the list of gdnative libraries to register.
|
||||
if (!pluginGDNativeLibrariesPaths.isEmpty()) {
|
||||
nativeRegisterGDNativeLibraries(pluginGDNativeLibrariesPaths.toArray(new String[0]));
|
||||
// Get the list of gdextension libraries to register.
|
||||
if (!pluginGDExtensionLibrariesPaths.isEmpty()) {
|
||||
nativeRegisterGDExtensionLibraries(pluginGDExtensionLibrariesPaths.toArray(new String[0]));
|
||||
}
|
||||
|
||||
return registeredSignals;
|
||||
@ -304,12 +304,12 @@ public abstract class GodotPlugin {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the paths for the plugin's gdnative libraries.
|
||||
* Returns the paths for the plugin's gdextension libraries.
|
||||
*
|
||||
* The paths must be relative to the 'assets' directory and point to a '*.gdnlib' file.
|
||||
* The paths must be relative to the 'assets' directory and point to a '*.gdextension' file.
|
||||
*/
|
||||
@NonNull
|
||||
protected Set<String> getPluginGDNativeLibrariesPaths() {
|
||||
protected Set<String> getPluginGDExtensionLibrariesPaths() {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
@ -420,10 +420,10 @@ public abstract class GodotPlugin {
|
||||
private static native void nativeRegisterMethod(String p_sname, String p_name, String p_ret, String[] p_params);
|
||||
|
||||
/**
|
||||
* Used to register gdnative libraries bundled by the plugin.
|
||||
* @param gdnlibPaths Paths to the libraries relative to the 'assets' directory.
|
||||
* Used to register gdextension libraries bundled by the plugin.
|
||||
* @param gdextensionPaths Paths to the libraries relative to the 'assets' directory.
|
||||
*/
|
||||
private static native void nativeRegisterGDNativeLibraries(String[] gdnlibPaths);
|
||||
private static native void nativeRegisterGDExtensionLibraries(String[] gdextensionPaths);
|
||||
|
||||
/**
|
||||
* Used to complete registration of the {@link GodotPlugin} instance's methods.
|
||||
|
@ -54,12 +54,12 @@ public interface GodotPluginInfoProvider {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the paths for the plugin's gdnative libraries (if any).
|
||||
* Returns the paths for the plugin's gdextension libraries (if any).
|
||||
*
|
||||
* The paths must be relative to the 'assets' directory and point to a '*.gdnlib' file.
|
||||
* The paths must be relative to the 'assets' directory and point to a '*.gdextension' file.
|
||||
*/
|
||||
@NonNull
|
||||
default Set<String> getPluginGDNativeLibrariesPaths() {
|
||||
default Set<String> getPluginGDExtensionLibrariesPaths() {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
|
@ -128,21 +128,21 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitS
|
||||
singleton->emit_signalp(StringName(signal_name), args, count);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jclass clazz, jobjectArray gdnlib_paths) {
|
||||
int gdnlib_count = env->GetArrayLength(gdnlib_paths);
|
||||
if (gdnlib_count == 0) {
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDExtensionLibraries(JNIEnv *env, jclass clazz, jobjectArray gdextension_paths) {
|
||||
int gdextension_count = env->GetArrayLength(gdextension_paths);
|
||||
if (gdextension_count == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Retrieve the current list of gdnative libraries.
|
||||
// Retrieve the current list of gdextension libraries.
|
||||
Array singletons;
|
||||
if (ProjectSettings::get_singleton()->has_setting("gdnative/singletons")) {
|
||||
singletons = GLOBAL_GET("gdnative/singletons");
|
||||
if (ProjectSettings::get_singleton()->has_setting("gdextension/singletons")) {
|
||||
singletons = GLOBAL_GET("gdextension/singletons");
|
||||
}
|
||||
|
||||
// Insert the libraries provided by the plugin
|
||||
for (int i = 0; i < gdnlib_count; i++) {
|
||||
jstring relative_path = (jstring)env->GetObjectArrayElement(gdnlib_paths, i);
|
||||
for (int i = 0; i < gdextension_count; i++) {
|
||||
jstring relative_path = (jstring)env->GetObjectArrayElement(gdextension_paths, i);
|
||||
|
||||
String path = "res://" + jstring_to_string(relative_path, env);
|
||||
if (!singletons.has(path)) {
|
||||
@ -152,6 +152,6 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegis
|
||||
}
|
||||
|
||||
// Insert the updated list back into project settings.
|
||||
ProjectSettings::get_singleton()->set("gdnative/singletons", singletons);
|
||||
ProjectSettings::get_singleton()->set("gdextension/singletons", singletons);
|
||||
}
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegis
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterMethod(JNIEnv *env, jclass clazz, jstring sname, jstring name, jstring ret, jobjectArray args);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterSignal(JNIEnv *env, jclass clazz, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_param_types);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitSignal(JNIEnv *env, jclass clazz, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_params);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jclass clazz, jobjectArray gdnlib_paths);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDExtensionLibraries(JNIEnv *env, jclass clazz, jobjectArray gdextension_paths);
|
||||
}
|
||||
|
||||
#endif // GODOT_PLUGIN_JNI_H
|
||||
|
@ -1134,7 +1134,7 @@ Error EditorExportPlatformIOS::_copy_asset(const String &p_out_dir, const String
|
||||
"<key>CFBundleShortVersionString</key>\n"
|
||||
"<string>1.0</string>\n"
|
||||
"<key>CFBundleIdentifier</key>\n"
|
||||
"<string>com.gdnative.framework.$name</string>\n"
|
||||
"<string>com.gdextension.framework.$name</string>\n"
|
||||
"<key>CFBundleName</key>\n"
|
||||
"<string>$name</string>\n"
|
||||
"<key>CFBundleExecutable</key>\n"
|
||||
|
@ -133,7 +133,7 @@ void EditorExportPlatformWeb::_fix_html(Vector<uint8_t> &p_html, const Ref<Edito
|
||||
config["canvasResizePolicy"] = p_preset->get("html/canvas_resize_policy");
|
||||
config["experimentalVK"] = p_preset->get("html/experimental_virtual_keyboard");
|
||||
config["focusCanvas"] = p_preset->get("html/focus_canvas_on_start");
|
||||
config["gdnativeLibs"] = libs;
|
||||
config["gdextensionLibs"] = libs;
|
||||
config["executable"] = p_name;
|
||||
config["args"] = args;
|
||||
config["fileSizes"] = p_file_sizes;
|
||||
|
@ -127,7 +127,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
|
||||
* @ignore
|
||||
* @type {Array.<string>}
|
||||
*/
|
||||
gdnativeLibs: [],
|
||||
gdextensionLibs: [],
|
||||
/**
|
||||
* @ignore
|
||||
* @type {Array.<string>}
|
||||
@ -257,7 +257,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
|
||||
this.experimentalVK = parse('experimentalVK', this.experimentalVK);
|
||||
this.focusCanvas = parse('focusCanvas', this.focusCanvas);
|
||||
this.serviceWorker = parse('serviceWorker', this.serviceWorker);
|
||||
this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs);
|
||||
this.gdextensionLibs = parse('gdextensionLibs', this.gdextensionLibs);
|
||||
this.fileSizes = parse('fileSizes', this.fileSizes);
|
||||
this.args = parse('args', this.args);
|
||||
this.onExecute = parse('onExecute', this.onExecute);
|
||||
|
@ -162,9 +162,9 @@ const Engine = (function () {
|
||||
// Godot configuration.
|
||||
me.rtenv['initConfig'](config);
|
||||
|
||||
// Preload GDNative libraries.
|
||||
// Preload GDExtension libraries.
|
||||
const libs = [];
|
||||
me.config.gdnativeLibs.forEach(function (lib) {
|
||||
me.config.gdextensionLibs.forEach(function (lib) {
|
||||
libs.push(me.rtenv['loadDynamicLibrary'](lib, { 'loadAsync': true }));
|
||||
});
|
||||
return Promise.all(libs).then(function () {
|
||||
|
@ -272,7 +272,7 @@ Error OS_Windows::open_dynamic_library(const String p_path, void *&p_library_han
|
||||
String path = p_path.replace("/", "\\");
|
||||
|
||||
if (!FileAccess::exists(path)) {
|
||||
//this code exists so gdnative can load .dll files from within the executable path
|
||||
//this code exists so gdextension can load .dll files from within the executable path
|
||||
path = get_executable_path().get_base_dir().path_join(p_path.get_file());
|
||||
}
|
||||
|
||||
|
@ -112,11 +112,11 @@ protected:
|
||||
public:
|
||||
/* PacketPeer extension */
|
||||
virtual Error get_packet(const uint8_t **r_buffer, int &r_buffer_size) override; ///< buffer is GONE after next get_packet
|
||||
GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>);
|
||||
GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>);
|
||||
GDVIRTUAL0R(PackedByteArray, _get_packet_script); // For GDScript.
|
||||
|
||||
virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override;
|
||||
GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int);
|
||||
GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int);
|
||||
GDVIRTUAL1R(Error, _put_packet_script, PackedByteArray); // For GDScript.
|
||||
|
||||
EXBIND0RC(int, get_available_packet_count);
|
||||
|
@ -31,7 +31,7 @@
|
||||
#include "register_scene_types.h"
|
||||
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/extension/native_extension_manager.h"
|
||||
#include "core/extension/gdextension_manager.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/os/os.h"
|
||||
#include "scene/2d/animated_sprite_2d.h"
|
||||
|
@ -41,7 +41,7 @@ class AudioEffectInstance : public RefCounted {
|
||||
GDCLASS(AudioEffectInstance, RefCounted);
|
||||
|
||||
protected:
|
||||
GDVIRTUAL3(_process, GDNativeConstPtr<AudioFrame>, GDNativePtr<AudioFrame>, int)
|
||||
GDVIRTUAL3(_process, GDExtensionConstPtr<AudioFrame>, GDExtensionPtr<AudioFrame>, int)
|
||||
GDVIRTUAL0RC(bool, _process_silence)
|
||||
static void _bind_methods();
|
||||
|
||||
|
@ -53,7 +53,7 @@ protected:
|
||||
GDVIRTUAL0RC(int, _get_loop_count)
|
||||
GDVIRTUAL0RC(double, _get_playback_position)
|
||||
GDVIRTUAL1(_seek, double)
|
||||
GDVIRTUAL3R(int, _mix, GDNativePtr<AudioFrame>, float, int)
|
||||
GDVIRTUAL3R(int, _mix, GDExtensionPtr<AudioFrame>, float, int)
|
||||
GDVIRTUAL0(_tag_used_streams)
|
||||
public:
|
||||
virtual void start(double p_from_pos = 0.0);
|
||||
@ -91,7 +91,7 @@ protected:
|
||||
virtual int _mix_internal(AudioFrame *p_buffer, int p_frames);
|
||||
virtual float get_stream_sampling_rate();
|
||||
|
||||
GDVIRTUAL2R(int, _mix_resampled, GDNativePtr<AudioFrame>, int)
|
||||
GDVIRTUAL2R(int, _mix_resampled, GDExtensionPtr<AudioFrame>, int)
|
||||
GDVIRTUAL0RC(float, _get_stream_sampling_rate)
|
||||
|
||||
static void _bind_methods();
|
||||
|
@ -126,12 +126,12 @@ protected:
|
||||
static void _bind_methods();
|
||||
bool is_body_excluded_from_query(const RID &p_body) const;
|
||||
|
||||
GDVIRTUAL7R(bool, _intersect_ray, const Vector2 &, const Vector2 &, uint32_t, bool, bool, bool, GDNativePtr<PhysicsServer2DExtensionRayResult>)
|
||||
GDVIRTUAL7R(int, _intersect_point, const Vector2 &, ObjectID, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeResult>, int)
|
||||
GDVIRTUAL9R(int, _intersect_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeResult>, int)
|
||||
GDVIRTUAL9R(bool, _cast_motion, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<real_t>, GDNativePtr<real_t>)
|
||||
GDVIRTUAL10R(bool, _collide_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<Vector2>, int, GDNativePtr<int>)
|
||||
GDVIRTUAL8R(bool, _rest_info, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeRestInfo>)
|
||||
GDVIRTUAL7R(bool, _intersect_ray, const Vector2 &, const Vector2 &, uint32_t, bool, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionRayResult>)
|
||||
GDVIRTUAL7R(int, _intersect_point, const Vector2 &, ObjectID, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int)
|
||||
GDVIRTUAL9R(int, _intersect_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int)
|
||||
GDVIRTUAL9R(bool, _cast_motion, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<real_t>, GDExtensionPtr<real_t>)
|
||||
GDVIRTUAL10R(bool, _collide_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)
|
||||
GDVIRTUAL8R(bool, _rest_info, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeRestInfo>)
|
||||
|
||||
public:
|
||||
virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) override {
|
||||
@ -190,9 +190,9 @@ class PhysicsServer2DExtension : public PhysicsServer2D {
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
GDVIRTUAL9R(bool, _shape_collide, RID, const Transform2D &, const Vector2 &, RID, const Transform2D &, const Vector2 &, GDNativePtr<Vector2>, int, GDNativePtr<int>)
|
||||
GDVIRTUAL9R(bool, _shape_collide, RID, const Transform2D &, const Vector2 &, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)
|
||||
|
||||
GDVIRTUAL8R(bool, _body_collide_shape, RID, int, RID, const Transform2D &, const Vector2 &, GDNativePtr<Vector2>, int, GDNativePtr<int>)
|
||||
GDVIRTUAL8R(bool, _body_collide_shape, RID, int, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)
|
||||
|
||||
public:
|
||||
// The warning is valid, but unavoidable. If the function is not overridden it will error anyway.
|
||||
@ -385,7 +385,7 @@ public:
|
||||
|
||||
EXBIND1R(PhysicsDirectBodyState2D *, body_get_direct_state, RID)
|
||||
|
||||
GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionMotionResult>)
|
||||
GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionMotionResult>)
|
||||
|
||||
thread_local static const HashSet<RID> *exclude_bodies;
|
||||
thread_local static const HashSet<ObjectID> *exclude_objects;
|
||||
|
@ -128,12 +128,12 @@ protected:
|
||||
static void _bind_methods();
|
||||
bool is_body_excluded_from_query(const RID &p_body) const;
|
||||
|
||||
GDVIRTUAL8R(bool, _intersect_ray, const Vector3 &, const Vector3 &, uint32_t, bool, bool, bool, bool, GDNativePtr<PhysicsServer3DExtensionRayResult>)
|
||||
GDVIRTUAL6R(int, _intersect_point, const Vector3 &, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeResult>, int)
|
||||
GDVIRTUAL9R(int, _intersect_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeResult>, int)
|
||||
GDVIRTUAL10R(bool, _cast_motion, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<real_t>, GDNativePtr<real_t>, GDNativePtr<PhysicsServer3DExtensionShapeRestInfo>)
|
||||
GDVIRTUAL10R(bool, _collide_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<Vector3>, int, GDNativePtr<int>)
|
||||
GDVIRTUAL8R(bool, _rest_info, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeRestInfo>)
|
||||
GDVIRTUAL8R(bool, _intersect_ray, const Vector3 &, const Vector3 &, uint32_t, bool, bool, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionRayResult>)
|
||||
GDVIRTUAL6R(int, _intersect_point, const Vector3 &, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeResult>, int)
|
||||
GDVIRTUAL9R(int, _intersect_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeResult>, int)
|
||||
GDVIRTUAL10R(bool, _cast_motion, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<real_t>, GDExtensionPtr<real_t>, GDExtensionPtr<PhysicsServer3DExtensionShapeRestInfo>)
|
||||
GDVIRTUAL10R(bool, _collide_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<Vector3>, int, GDExtensionPtr<int>)
|
||||
GDVIRTUAL8R(bool, _rest_info, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeRestInfo>)
|
||||
GDVIRTUAL2RC(Vector3, _get_closest_point_to_object_volume, RID, const Vector3 &)
|
||||
|
||||
public:
|
||||
@ -382,7 +382,7 @@ public:
|
||||
|
||||
EXBIND2(body_set_ray_pickable, RID, bool)
|
||||
|
||||
GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform3D &, const Vector3 &, real_t, int, bool, GDNativePtr<PhysicsServer3DExtensionMotionResult>)
|
||||
GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform3D &, const Vector3 &, real_t, int, bool, GDExtensionPtr<PhysicsServer3DExtensionMotionResult>)
|
||||
|
||||
thread_local static const HashSet<RID> *exclude_bodies;
|
||||
thread_local static const HashSet<ObjectID> *exclude_objects;
|
||||
|
@ -67,7 +67,7 @@ protected:
|
||||
GDVIRTUAL0RC(Vector<String>, _get_supported_extensions)
|
||||
|
||||
GDVIRTUAL3R(Error, _write_begin, const Size2i &, uint32_t, const String &)
|
||||
GDVIRTUAL2R(Error, _write_frame, const Ref<Image> &, GDNativeConstPtr<int32_t>)
|
||||
GDVIRTUAL2R(Error, _write_frame, const Ref<Image> &, GDExtensionConstPtr<int32_t>)
|
||||
GDVIRTUAL0(_write_end)
|
||||
|
||||
static void _bind_methods();
|
||||
|
@ -210,8 +210,8 @@ public:
|
||||
class PhysicsServer3DRenderingServerHandler : public Object {
|
||||
GDCLASS(PhysicsServer3DRenderingServerHandler, Object)
|
||||
protected:
|
||||
GDVIRTUAL2(_set_vertex, int, GDNativeConstPtr<void>)
|
||||
GDVIRTUAL2(_set_normal, int, GDNativeConstPtr<void>)
|
||||
GDVIRTUAL2(_set_vertex, int, GDExtensionConstPtr<void>)
|
||||
GDVIRTUAL2(_set_normal, int, GDExtensionConstPtr<void>)
|
||||
GDVIRTUAL1(_set_aabb, const AABB &)
|
||||
|
||||
static void _bind_methods();
|
||||
|
@ -1118,13 +1118,13 @@ bool TextServerExtension::shaped_text_is_ready(const RID &p_shaped) const {
|
||||
}
|
||||
|
||||
const Glyph *TextServerExtension::shaped_text_get_glyphs(const RID &p_shaped) const {
|
||||
GDNativeConstPtr<const Glyph> ret;
|
||||
GDExtensionConstPtr<const Glyph> ret;
|
||||
GDVIRTUAL_CALL(_shaped_text_get_glyphs, p_shaped, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
const Glyph *TextServerExtension::shaped_text_sort_logical(const RID &p_shaped) {
|
||||
GDNativeConstPtr<const Glyph> ret;
|
||||
GDExtensionConstPtr<const Glyph> ret;
|
||||
GDVIRTUAL_CALL(_shaped_text_sort_logical, p_shaped, ret);
|
||||
return ret;
|
||||
}
|
||||
@ -1178,7 +1178,7 @@ int64_t TextServerExtension::shaped_text_get_ellipsis_pos(const RID &p_shaped) c
|
||||
}
|
||||
|
||||
const Glyph *TextServerExtension::shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const {
|
||||
GDNativeConstPtr<const Glyph> ret;
|
||||
GDExtensionConstPtr<const Glyph> ret;
|
||||
GDVIRTUAL_CALL(_shaped_text_get_ellipsis_glyphs, p_shaped, ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ public:
|
||||
virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override;
|
||||
virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override;
|
||||
GDVIRTUAL2(_font_set_data, RID, const PackedByteArray &);
|
||||
GDVIRTUAL3(_font_set_data_ptr, RID, GDNativeConstPtr<const uint8_t>, int64_t);
|
||||
GDVIRTUAL3(_font_set_data_ptr, RID, GDExtensionConstPtr<const uint8_t>, int64_t);
|
||||
|
||||
virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override;
|
||||
virtual int64_t font_get_face_index(const RID &p_font_rid) const override;
|
||||
@ -431,8 +431,8 @@ public:
|
||||
virtual const Glyph *shaped_text_get_glyphs(const RID &p_shaped) const override;
|
||||
virtual const Glyph *shaped_text_sort_logical(const RID &p_shaped) override;
|
||||
virtual int64_t shaped_text_get_glyph_count(const RID &p_shaped) const override;
|
||||
GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_glyphs, RID);
|
||||
GDVIRTUAL1R(GDNativeConstPtr<const Glyph>, _shaped_text_sort_logical, RID);
|
||||
GDVIRTUAL1RC(GDExtensionConstPtr<const Glyph>, _shaped_text_get_glyphs, RID);
|
||||
GDVIRTUAL1R(GDExtensionConstPtr<const Glyph>, _shaped_text_sort_logical, RID);
|
||||
GDVIRTUAL1RC(int64_t, _shaped_text_get_glyph_count, RID);
|
||||
|
||||
virtual Vector2i shaped_text_get_range(const RID &p_shaped) const override;
|
||||
@ -451,7 +451,7 @@ public:
|
||||
virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override;
|
||||
GDVIRTUAL1RC(int64_t, _shaped_text_get_trim_pos, RID);
|
||||
GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_pos, RID);
|
||||
GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_ellipsis_glyphs, RID);
|
||||
GDVIRTUAL1RC(GDExtensionConstPtr<const Glyph>, _shaped_text_get_ellipsis_glyphs, RID);
|
||||
GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_glyph_count, RID);
|
||||
|
||||
virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override;
|
||||
@ -480,7 +480,7 @@ public:
|
||||
|
||||
virtual CaretInfo shaped_text_get_carets(const RID &p_shaped, int64_t p_position) const override;
|
||||
virtual Vector<Vector2> shaped_text_get_selection(const RID &p_shaped, int64_t p_start, int64_t p_end) const override;
|
||||
GDVIRTUAL3C(_shaped_text_get_carets, RID, int64_t, GDNativePtr<CaretInfo>);
|
||||
GDVIRTUAL3C(_shaped_text_get_carets, RID, int64_t, GDExtensionPtr<CaretInfo>);
|
||||
GDVIRTUAL3RC(Vector<Vector2>, _shaped_text_get_selection, RID, int64_t, int64_t);
|
||||
|
||||
virtual int64_t shaped_text_hit_test_grapheme(const RID &p_shaped, double p_coords) const override;
|
||||
|
Loading…
Reference in New Issue
Block a user