Skip to content

Commit d83585b

Browse files
authored
Merge pull request #28 from Spartan322/4.4-cherry-pick-add/godot-compat
Replace godot bind versioning with redot bind versioning
2 parents 56185e5 + 007e199 commit d83585b

File tree

4 files changed

+40
-12
lines changed

4 files changed

+40
-12
lines changed

binding_generator.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2099,11 +2099,20 @@ def generate_version_header(api, output_dir):
20992099
header.append(f"#define {header_guard}")
21002100
header.append("")
21012101

2102+
header.append(f"#define REDOT_VERSION_MAJOR {api['redot_header']['version_major']}")
2103+
header.append(f"#define REDOT_VERSION_MINOR {api['redot_header']['version_minor']}")
2104+
header.append(f"#define REDOT_VERSION_PATCH {api['redot_header']['version_patch']}")
2105+
header.append(f"#define REDOT_VERSION_STATUS \"{api['redot_header']['version_status']}\"")
2106+
header.append(f"#define REDOT_VERSION_STATUS_VERSION {api['redot_header']['version_status_version']}")
2107+
header.append(f"#define REDOT_VERSION_BUILD \"{api['redot_header']['version_build']}\"")
2108+
21022109
header.append(f"#define GODOT_VERSION_MAJOR {api['header']['version_major']}")
21032110
header.append(f"#define GODOT_VERSION_MINOR {api['header']['version_minor']}")
21042111
header.append(f"#define GODOT_VERSION_PATCH {api['header']['version_patch']}")
21052112
header.append(f"#define GODOT_VERSION_STATUS \"{api['header']['version_status']}\"")
2106-
header.append(f"#define GODOT_VERSION_STATUS_VERSION \"{api['header']['version_status_version']}\"")
2113+
header.append(
2114+
f"#define GODOT_VERSION_STATUS_VERSION {next(filter(str.isdigit, api['header']['version_status']), 0)}"
2115+
)
21072116
header.append(f"#define GODOT_VERSION_BUILD \"{api['header']['version_build']}\"")
21082117

21092118
header.append("")

gdextension/extension_api.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"header": {
2+
"redot_header": {
33
"version_major": 4,
44
"version_minor": 4,
55
"version_patch": 0,
@@ -8,6 +8,14 @@
88
"version_build": "custom_build",
99
"version_full_name": "Redot Engine v4.4.alpha.custom_build"
1010
},
11+
"header": {
12+
"version_major": 4,
13+
"version_minor": 3,
14+
"version_patch": 1,
15+
"version_status": "dev",
16+
"version_build": "redot.custom_build",
17+
"version_full_name": "Godot Engine v4.3.1.dev.redot.custom_build"
18+
},
1119
"builtin_class_sizes": [
1220
{
1321
"build_configuration": "float_32",

include/godot_cpp/godot.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ extern "C" GDExtensionClassLibraryPtr library;
4444
extern "C" void *token;
4545

4646
extern "C" GDExtensionGodotVersion godot_version;
47+
extern "C" GDExtensionRedotVersion redot_version;
4748

4849
// All of the GDExtension interface functions.
4950
extern "C" GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version;
51+
extern "C" GDExtensionInterfaceGetRedotVersion gdextension_interface_get_redot_version;
5052
extern "C" GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc;
5153
extern "C" GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc;
5254
extern "C" GDExtensionInterfaceMemFree gdextension_interface_mem_free;

src/godot.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ GDExtensionClassLibraryPtr library = nullptr;
5050
void *token = nullptr;
5151

5252
GDExtensionGodotVersion 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.
5556
GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version = nullptr;
57+
GDExtensionInterfaceGetRedotVersion gdextension_interface_get_redot_version = nullptr;
5658
GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr;
5759
GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr;
5860
GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr;
@@ -310,16 +312,23 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
310312
LOAD_PROC_ADDRESS(get_godot_version, GDExtensionInterfaceGetGodotVersion);
311313
internal::gdextension_interface_get_godot_version(&internal::godot_version);
312314

313-
// Check that godot-cpp was compiled using an extension_api.json older or at the
314-
// same version as the Godot that is loading it.
315+
internal::gdextension_interface_get_redot_version = (GDExtensionInterfaceGetRedotVersion)p_get_proc_address("get_redot_version");
316+
if (!internal::gdextension_interface_get_redot_version) {
317+
ERR_PRINT_EARLY("Cannot load a GDExtension built for Redot using Godot or non-Redot derivative.");
318+
return false;
319+
}
320+
internal::gdextension_interface_get_redot_version(&internal::redot_version);
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.
315324
bool compatible;
316-
if (internal::godot_version.major != GODOT_VERSION_MAJOR) {
317-
compatible = internal::godot_version.major > GODOT_VERSION_MAJOR;
318-
} else if (internal::godot_version.minor != GODOT_VERSION_MINOR) {
319-
compatible = internal::godot_version.minor > GODOT_VERSION_MINOR;
325+
if (internal::redot_version.major != REDOT_VERSION_MAJOR) {
326+
compatible = internal::redot_version.major > REDOT_VERSION_MAJOR;
327+
} else if (internal::redot_version.minor != REDOT_VERSION_MINOR) {
328+
compatible = internal::redot_version.minor > REDOT_VERSION_MINOR;
320329
} else {
321330
#if GODOT_VERSION_PATCH > 0
322-
compatible = internal::godot_version.patch >= GODOT_VERSION_PATCH;
331+
compatible = internal::redot_version.patch >= REDOT_VERSION_PATCH;
323332
#else
324333
// Prevent -Wtype-limits warning due to unsigned comparison.
325334
compatible = true;
@@ -329,9 +338,9 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
329338
// We need to use snprintf() here because vformat() uses Variant, and we haven't loaded
330339
// the GDExtension interface far enough to use Variants yet.
331340
char msg[128];
332-
snprintf(msg, 128, "Cannot load a GDExtension built for Godot %d.%d.%d using an older version of Godot (%d.%d.%d).",
333-
GODOT_VERSION_MAJOR, GODOT_VERSION_MINOR, GODOT_VERSION_PATCH,
334-
internal::godot_version.major, internal::godot_version.minor, internal::godot_version.patch);
341+
snprintf(msg, 128, "Cannot load a GDExtension built for Redot %d.%d.%d using an older version of Redot (%d.%d.%d).",
342+
REDOT_VERSION_MAJOR, REDOT_VERSION_MINOR, REDOT_VERSION_PATCH,
343+
internal::redot_version.major, internal::redot_version.minor, internal::redot_version.patch);
335344
ERR_PRINT_EARLY(msg);
336345
return false;
337346
}

0 commit comments

Comments
 (0)