@@ -50,9 +50,11 @@ GDExtensionClassLibraryPtr library = nullptr;
5050void *token = nullptr ;
5151
5252GDExtensionGodotVersion godot_version = { 0 , 0 , 0 , nullptr };
53+ GDExtensionRedotVersion redot_version = { 0 , 0 , 0 , 0 , nullptr , 0 , nullptr , nullptr , 0 , nullptr };
5354
5455// All of the GDExtension interface functions.
5556GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version = nullptr ;
57+ GDExtensionInterfaceGetRedotVersion gdextension_interface_get_redot_version = nullptr ;
5658GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr ;
5759GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr ;
5860GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr ;
@@ -307,28 +309,61 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
307309 LOAD_PROC_ADDRESS (get_godot_version, GDExtensionInterfaceGetGodotVersion);
308310 internal::gdextension_interface_get_godot_version (&internal::godot_version);
309311
310- // Check that godot-cpp was compiled using an extension_api.json older or at the
311- // same version as the Godot that is loading it.
312+ internal::gdextension_interface_get_redot_version = (GDExtensionInterfaceGetRedotVersion)p_get_proc_address (" get_redot_version" );
313+ if (internal::gdextension_interface_get_redot_version) {
314+ internal::gdextension_interface_get_redot_version (&internal::redot_version);
315+ } else {
316+ internal::redot_version.major = internal::godot_version.major ;
317+ internal::redot_version.minor = internal::godot_version.minor ;
318+ internal::redot_version.patch = internal::godot_version.patch ;
319+ internal::redot_version.string = internal::godot_version.string ;
320+ }
321+
322+ // Check that redot-cpp was compiled using an extension_api.json older or at the
323+ // same version as the Redot that is loading it.
312324 bool compatible;
313- if (internal::godot_version.major != GODOT_VERSION_MAJOR) {
314- compatible = internal::godot_version.major > GODOT_VERSION_MAJOR;
315- } else if (internal::godot_version.minor != GODOT_VERSION_MINOR) {
316- compatible = internal::godot_version.minor > GODOT_VERSION_MINOR;
325+ if (internal::gdextension_interface_get_redot_version) {
326+ if (internal::redot_version.major != REDOT_VERSION_MAJOR) {
327+ compatible = internal::redot_version.major > REDOT_VERSION_MAJOR;
328+ } else if (internal::redot_version.minor != REDOT_VERSION_MINOR) {
329+ compatible = internal::redot_version.minor > REDOT_VERSION_MINOR;
330+ } else {
331+ #if GODOT_VERSION_PATCH > 0
332+ compatible = internal::redot_version.patch >= REDOT_VERSION_PATCH;
333+ #else
334+ // Prevent -Wtype-limits warning due to unsigned comparison.
335+ compatible = true ;
336+ #endif
337+ }
317338 } else {
339+ // Check that godot-cpp was compiled using an extension_api.json older or at the
340+ // same version as the Redot that is loading it.
341+ if (internal::godot_version.major != GODOT_VERSION_MAJOR) {
342+ compatible = internal::godot_version.major > GODOT_VERSION_MAJOR;
343+ } else if (internal::godot_version.minor != GODOT_VERSION_MINOR) {
344+ compatible = internal::godot_version.minor > GODOT_VERSION_MINOR;
345+ } else {
318346#if GODOT_VERSION_PATCH > 0
319- compatible = internal::godot_version.patch >= GODOT_VERSION_PATCH;
347+ compatible = internal::godot_version.patch >= GODOT_VERSION_PATCH;
320348#else
321- // Prevent -Wtype-limits warning due to unsigned comparison.
322- compatible = true ;
349+ // Prevent -Wtype-limits warning due to unsigned comparison.
350+ compatible = true ;
323351#endif
352+ }
324353 }
325354 if (!compatible) {
326355 // We need to use snprintf() here because vformat() uses Variant, and we haven't loaded
327356 // the GDExtension interface far enough to use Variants yet.
328357 char msg[128 ];
329- snprintf (msg, 128 , " Cannot load a GDExtension built for Godot %d.%d.%d using an older version of Godot (%d.%d.%d)." ,
330- GODOT_VERSION_MAJOR, GODOT_VERSION_MINOR, GODOT_VERSION_PATCH,
331- internal::godot_version.major , internal::godot_version.minor , internal::godot_version.patch );
358+ if (internal::gdextension_interface_get_redot_version) {
359+ snprintf (msg, 128 , " Cannot load a GDExtension built for Redot %d.%d.%d using an older version of Redot (%d.%d.%d)." ,
360+ REDOT_VERSION_MAJOR, REDOT_VERSION_MINOR, REDOT_VERSION_PATCH,
361+ internal::redot_version.major , internal::redot_version.minor , internal::redot_version.patch );
362+ } else {
363+ snprintf (msg, 128 , " Cannot load a GDExtension built for Redot %d.%d.%d using an older version of Godot (%d.%d.%d)." ,
364+ GODOT_VERSION_MAJOR, GODOT_VERSION_MINOR, GODOT_VERSION_PATCH,
365+ internal::godot_version.major , internal::godot_version.minor , internal::godot_version.patch );
366+ }
332367 ERR_PRINT_EARLY (msg);
333368 return false ;
334369 }
0 commit comments