Skip to content

Commit f402a21

Browse files
committed
Update for GDExtension interface changes in Godot 4.5
1 parent 61f52cb commit f402a21

File tree

6 files changed

+41
-18
lines changed

6 files changed

+41
-18
lines changed

binding_generator.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,6 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
911911
result.append("\tconst Variant &operator[](int64_t p_index) const;")
912912
result.append("\tVariant &operator[](int64_t p_index);")
913913
result.append("\tvoid set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script);")
914-
result.append("\tvoid _ref(const Array &p_from) const;")
915914
result.append("""
916915
struct Iterator {
917916
_FORCE_INLINE_ Variant &operator*() const;

gdextension/gdextension_interface.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,8 +815,11 @@ typedef void (*GDExtensionMainLoopShutdownCallback)();
815815
typedef void (*GDExtensionMainLoopFrameCallback)();
816816

817817
typedef struct {
818+
// Will be called after Godot is started and is fully initialized.
818819
GDExtensionMainLoopStartupCallback startup_func;
820+
// Will be called before Godot is shutdown when it is still fully initialized.
819821
GDExtensionMainLoopShutdownCallback shutdown_func;
822+
// Will be called for each process frame. This will run after all `_process()` methods on Node, and before `ScriptServer::frame()`.
820823
GDExtensionMainLoopFrameCallback frame_func;
821824
} GDExtensionMainLoopCallbacks;
822825

include/godot_cpp/godot.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ extern "C" GDExtensionInterfaceGetProcAddress gdextension_interface_get_proc_add
4040
extern "C" GDExtensionClassLibraryPtr library;
4141
extern "C" void *token;
4242

43-
extern "C" GDExtensionGodotVersion godot_version;
43+
extern "C" GDExtensionGodotVersion2 godot_version;
4444

4545
// All of the GDExtension interface functions.
46-
extern "C" GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version;
46+
extern "C" GDExtensionInterfaceGetGodotVersion2 gdextension_interface_get_godot_version2;
4747
extern "C" GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc;
4848
extern "C" GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc;
4949
extern "C" GDExtensionInterfaceMemFree gdextension_interface_mem_free;
@@ -155,7 +155,6 @@ extern "C" GDExtensionInterfacePackedVector4ArrayOperatorIndex gdextension_inter
155155
extern "C" GDExtensionInterfacePackedVector4ArrayOperatorIndexConst gdextension_interface_packed_vector4_array_operator_index_const;
156156
extern "C" GDExtensionInterfaceArrayOperatorIndex gdextension_interface_array_operator_index;
157157
extern "C" GDExtensionInterfaceArrayOperatorIndexConst gdextension_interface_array_operator_index_const;
158-
extern "C" GDExtensionInterfaceArrayRef gdextension_interface_array_ref;
159158
extern "C" GDExtensionInterfaceArraySetTyped gdextension_interface_array_set_typed;
160159
extern "C" GDExtensionInterfaceDictionaryOperatorIndex gdextension_interface_dictionary_operator_index;
161160
extern "C" GDExtensionInterfaceDictionaryOperatorIndexConst gdextension_interface_dictionary_operator_index_const;
@@ -204,6 +203,7 @@ extern "C" GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8Chars gdextension_inter
204203
extern "C" GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen gdextension_interface_editor_help_load_xml_from_utf8_chars_and_len;
205204
extern "C" GDExtensionInterfaceImagePtrw gdextension_interface_image_ptrw;
206205
extern "C" GDExtensionInterfaceImagePtr gdextension_interface_image_ptr;
206+
extern "C" GDExtensionInterfaceRegisterMainLoopCallbacks gdextension_interface_register_main_loop_callbacks;
207207

208208
class DocDataRegistration {
209209
public:
@@ -228,6 +228,11 @@ class GDExtensionBinding {
228228
GDExtensionInitializationLevel minimum_initialization_level = GDEXTENSION_INITIALIZATION_CORE;
229229
Callback init_callback = nullptr;
230230
Callback terminate_callback = nullptr;
231+
GDExtensionMainLoopCallbacks main_loop_callbacks = {};
232+
233+
inline bool has_main_loop_callbacks() const {
234+
return main_loop_callbacks.frame_func || main_loop_callbacks.startup_func || main_loop_callbacks.shutdown_func;
235+
}
231236
};
232237

233238
class InitDataList {
@@ -262,6 +267,10 @@ class GDExtensionBinding {
262267
void register_terminator(Callback p_init) const;
263268
void set_minimum_library_initialization_level(ModuleInitializationLevel p_level) const;
264269

270+
void register_startup_callback(GDExtensionMainLoopStartupCallback p_callback) const;
271+
void register_frame_callback(GDExtensionMainLoopFrameCallback p_callback) const;
272+
void register_shutdown_callback(GDExtensionMainLoopShutdownCallback p_callback) const;
273+
265274
GDExtensionBool init() const;
266275
};
267276
};

include/godot_cpp/variant/typed_array.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ class TypedArray : public Array {
4040
public:
4141
_FORCE_INLINE_ void operator=(const Array &p_array) {
4242
ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type.");
43-
_ref(p_array);
43+
Array::operator=(p_array);
4444
}
4545
_FORCE_INLINE_ TypedArray(const Variant &p_variant) :
4646
TypedArray(Array(p_variant)) {
4747
}
4848
_FORCE_INLINE_ TypedArray(const Array &p_array) {
4949
set_typed(Variant::OBJECT, T::get_class_static(), Variant());
5050
if (is_same_typed(p_array)) {
51-
_ref(p_array);
51+
Array::operator=(p_array);
5252
} else {
5353
assign(p_array);
5454
}
@@ -68,7 +68,7 @@ class TypedArray : public Array {
6868
public: \
6969
_FORCE_INLINE_ void operator=(const Array &p_array) { \
7070
ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \
71-
_ref(p_array); \
71+
Array::operator=(p_array); \
7272
} \
7373
_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) : \
7474
Array(Array(p_init), m_variant_type, StringName(), Variant()) { \
@@ -79,7 +79,7 @@ class TypedArray : public Array {
7979
_FORCE_INLINE_ TypedArray(const Array &p_array) { \
8080
set_typed(m_variant_type, StringName(), Variant()); \
8181
if (is_same_typed(p_array)) { \
82-
_ref(p_array); \
82+
Array::operator=(p_array); \
8383
} else { \
8484
assign(p_array); \
8585
} \

src/godot.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ GDExtensionInterfaceGetProcAddress gdextension_interface_get_proc_address = null
4747
GDExtensionClassLibraryPtr library = nullptr;
4848
void *token = nullptr;
4949

50-
GDExtensionGodotVersion godot_version = { 0, 0, 0, nullptr };
50+
GDExtensionGodotVersion2 godot_version = {};
5151

5252
// All of the GDExtension interface functions.
53-
GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version = nullptr;
53+
GDExtensionInterfaceGetGodotVersion2 gdextension_interface_get_godot_version2 = nullptr;
5454
GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr;
5555
GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr;
5656
GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr;
@@ -162,7 +162,6 @@ GDExtensionInterfacePackedVector4ArrayOperatorIndex gdextension_interface_packed
162162
GDExtensionInterfacePackedVector4ArrayOperatorIndexConst gdextension_interface_packed_vector4_array_operator_index_const = nullptr;
163163
GDExtensionInterfaceArrayOperatorIndex gdextension_interface_array_operator_index = nullptr;
164164
GDExtensionInterfaceArrayOperatorIndexConst gdextension_interface_array_operator_index_const = nullptr;
165-
GDExtensionInterfaceArrayRef gdextension_interface_array_ref = nullptr;
166165
GDExtensionInterfaceArraySetTyped gdextension_interface_array_set_typed = nullptr;
167166
GDExtensionInterfaceDictionaryOperatorIndex gdextension_interface_dictionary_operator_index = nullptr;
168167
GDExtensionInterfaceDictionaryOperatorIndexConst gdextension_interface_dictionary_operator_index_const = nullptr;
@@ -211,6 +210,7 @@ GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8Chars gdextension_interface_editor
211210
GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen gdextension_interface_editor_help_load_xml_from_utf8_chars_and_len = nullptr;
212211
GDExtensionInterfaceImagePtrw gdextension_interface_image_ptrw = nullptr;
213212
GDExtensionInterfaceImagePtr gdextension_interface_image_ptr = nullptr;
213+
GDExtensionInterfaceRegisterMainLoopCallbacks gdextension_interface_register_main_loop_callbacks = nullptr;
214214

215215
struct DocData {
216216
const char *hash = nullptr;
@@ -308,8 +308,8 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
308308
internal::library = p_library;
309309
internal::token = p_library;
310310

311-
LOAD_PROC_ADDRESS(get_godot_version, GDExtensionInterfaceGetGodotVersion);
312-
internal::gdextension_interface_get_godot_version(&internal::godot_version);
311+
LOAD_PROC_ADDRESS(get_godot_version2, GDExtensionInterfaceGetGodotVersion2);
312+
internal::gdextension_interface_get_godot_version2(&internal::godot_version);
313313

314314
// Check that godot-cpp was compiled using an extension_api.json older or at the
315315
// same version as the Godot that is loading it.
@@ -447,7 +447,6 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
447447
LOAD_PROC_ADDRESS(packed_vector4_array_operator_index_const, GDExtensionInterfacePackedVector4ArrayOperatorIndexConst);
448448
LOAD_PROC_ADDRESS(array_operator_index, GDExtensionInterfaceArrayOperatorIndex);
449449
LOAD_PROC_ADDRESS(array_operator_index_const, GDExtensionInterfaceArrayOperatorIndexConst);
450-
LOAD_PROC_ADDRESS(array_ref, GDExtensionInterfaceArrayRef);
451450
LOAD_PROC_ADDRESS(array_set_typed, GDExtensionInterfaceArraySetTyped);
452451
LOAD_PROC_ADDRESS(dictionary_operator_index, GDExtensionInterfaceDictionaryOperatorIndex);
453452
LOAD_PROC_ADDRESS(dictionary_operator_index_const, GDExtensionInterfaceDictionaryOperatorIndexConst);
@@ -496,6 +495,7 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
496495
LOAD_PROC_ADDRESS(editor_help_load_xml_from_utf8_chars_and_len, GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen);
497496
LOAD_PROC_ADDRESS(image_ptrw, GDExtensionInterfaceImagePtrw);
498497
LOAD_PROC_ADDRESS(image_ptr, GDExtensionInterfaceImagePtr);
498+
LOAD_PROC_ADDRESS(register_main_loop_callbacks, GDExtensionInterfaceRegisterMainLoopCallbacks);
499499

500500
r_initialization->initialize = initialize_level;
501501
r_initialization->deinitialize = deinitialize_level;
@@ -526,6 +526,10 @@ void GDExtensionBinding::initialize_level(void *p_userdata, GDExtensionInitializ
526526
}
527527
level_initialized[p_level]++;
528528

529+
if ((ModuleInitializationLevel)p_level == MODULE_INITIALIZATION_LEVEL_CORE && init_data && init_data->has_main_loop_callbacks()) {
530+
internal::gdextension_interface_register_main_loop_callbacks(internal::library, &init_data->main_loop_callbacks);
531+
}
532+
529533
if ((ModuleInitializationLevel)p_level == MODULE_INITIALIZATION_LEVEL_EDITOR) {
530534
internal::gdextension_interface_editor_register_get_classes_used_callback(internal::library, &ClassDB::_editor_get_classes_used_callback);
531535

@@ -596,6 +600,18 @@ void GDExtensionBinding::InitObject::set_minimum_library_initialization_level(Mo
596600
init_data->minimum_initialization_level = static_cast<GDExtensionInitializationLevel>(p_level);
597601
}
598602

603+
void GDExtensionBinding::InitObject::register_startup_callback(GDExtensionMainLoopStartupCallback p_callback) const {
604+
init_data->main_loop_callbacks.startup_func = p_callback;
605+
}
606+
607+
void GDExtensionBinding::InitObject::register_frame_callback(GDExtensionMainLoopFrameCallback p_callback) const {
608+
init_data->main_loop_callbacks.frame_func = p_callback;
609+
}
610+
611+
void GDExtensionBinding::InitObject::register_shutdown_callback(GDExtensionMainLoopShutdownCallback p_callback) const {
612+
init_data->main_loop_callbacks.shutdown_func = p_callback;
613+
}
614+
599615
GDExtensionBool GDExtensionBinding::InitObject::init() const {
600616
return GDExtensionBinding::init(get_proc_address, library, init_data, initialization);
601617
}

src/variant/packed_arrays.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,6 @@ void Array::set_typed(uint32_t p_type, const StringName &p_class_name, const Var
232232
internal::gdextension_interface_array_set_typed((GDExtensionTypePtr *)this, (GDExtensionVariantType)p_type, (GDExtensionConstStringNamePtr)&p_class_name, (GDExtensionConstVariantPtr)&p_script);
233233
}
234234

235-
void Array::_ref(const Array &p_from) const {
236-
internal::gdextension_interface_array_ref((GDExtensionTypePtr *)this, (GDExtensionConstTypePtr *)&p_from);
237-
}
238-
239235
const Variant *Array::ptr() const {
240236
return (const Variant *)internal::gdextension_interface_array_operator_index_const((GDExtensionTypePtr *)this, 0);
241237
}

0 commit comments

Comments
 (0)