Skip to content

Commit ef5db75

Browse files
committed
Remodel for Godot 4.2 (part 2: header)
1 parent 808ba28 commit ef5db75

File tree

1 file changed

+46
-65
lines changed

1 file changed

+46
-65
lines changed

addons/hello-gdextension/src/hello.gdextension.c

Lines changed: 46 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,97 +2,78 @@
22
#include <stdio.h>
33
#include "hello.gdextension.h"
44

5-
#define HASH_print 2648703342 // Fetch hash from `include/extension_api.json`
6-
7-
// GDExtension function
8-
GDExtensionInterfaceGetProcAddress GetProcAddress;
9-
// GDExtension String / Variant functions
5+
// GDExtension pointers
106
GDExtensionInterfaceStringNewWithLatin1Chars string_new_with_latin1_chars;
11-
GDExtensionInterfaceStringNewWithUtf8Chars string_new_with_utf8_chars;
12-
GDExtensionPtrDestructor destroy_String;
13-
// GDExtension Variant functions
14-
GDExtensionVariantFromTypeConstructorFunc variant_from_String;
7+
GDExtensionPtrDestructor string_destroy;
8+
GDExtensionVariantFromTypeConstructorFunc variant_from_string;
159
GDExtensionInterfaceVariantDestroy variant_destroy;
16-
// GDExtension StringName functions
17-
GDExtensionPtrConstructor stringName_from_String;
18-
GDExtensionPtrDestructor destroy_StringName;
19-
// GDScript functions
20-
GDExtensionPtrUtilityFunction global_print;
21-
22-
GDExtensionStringName CString2StringName(const char* cstring) {
23-
GDExtensionString string;
24-
string_new_with_latin1_chars(&string, cstring);
25-
GDExtensionStringName string_name;
26-
stringName_from_String(&string_name, (GDExtensionConstTypePtr[1]) {&string});
27-
destroy_String(&string);
28-
return string_name;
29-
}
10+
// Godot Library Functions
11+
GDExtensionPtrUtilityFunction global_scope_print;
3012

3113
void gdextension_print(const char* cstring) {
3214
GDExtensionString string;
33-
string_new_with_utf8_chars(&string, cstring);
15+
string_new_with_latin1_chars(string, cstring);
3416
GDExtensionVariant variant;
35-
variant_from_String(&variant, &string);
36-
global_print(NULL, (GDExtensionConstVariantPtr[1]) {&variant}, 1);
37-
variant_destroy(&variant);
38-
destroy_String(&string);
17+
variant_from_string(variant, string);
18+
global_scope_print(NULL, (GDExtensionConstVariantPtr[1]) {variant}, 1);
19+
variant_destroy(variant);
20+
string_destroy(string);
3921
}
4022

41-
void hello_gdextension_initialize(__attribute__((unused)) void *userdata, GDExtensionInitializationLevel p_level) {
42-
if(p_level == GDEXTENSION_INITIALIZATION_SCENE) {
43-
// GDExtension API pointers
44-
stringName_from_String = (
45-
(GDExtensionInterfaceVariantGetPtrConstructor)GetProcAddress("variant_get_ptr_constructor")
46-
)(GDEXTENSION_VARIANT_TYPE_STRING_NAME, 2); // Constructor #2
47-
GDExtensionInterfaceVariantGetPtrDestructor variant_get_ptr_destructor =
48-
(GDExtensionInterfaceVariantGetPtrDestructor)GetProcAddress("variant_get_ptr_destructor");
49-
destroy_StringName = variant_get_ptr_destructor(GDEXTENSION_VARIANT_TYPE_STRING_NAME);
50-
destroy_String = variant_get_ptr_destructor(GDEXTENSION_VARIANT_TYPE_STRING);
51-
variant_from_String = (
52-
(GDExtensionInterfaceGetVariantFromTypeConstructor)GetProcAddress("get_variant_from_type_constructor")
53-
)(GDEXTENSION_VARIANT_TYPE_STRING);
23+
void hello_gdextension_initialize(void* userdata, GDExtensionInitializationLevel level) {
24+
if(level == GDEXTENSION_INITIALIZATION_SCENE) {
25+
GDExtensionInterfaceGetProcAddress get_proc_address = userdata;
5426
// GDExtension pointers
55-
string_new_with_latin1_chars = (GDExtensionInterfaceStringNewWithLatin1Chars)GetProcAddress("string_new_with_latin1_chars");
56-
string_new_with_utf8_chars = (GDExtensionInterfaceStringNewWithUtf8Chars)GetProcAddress("string_new_with_utf8_chars");
57-
variant_destroy = (GDExtensionInterfaceVariantDestroy)GetProcAddress("variant_destroy");
58-
// Fetch GDScript methods
59-
GDExtensionStringName stringName_print = CString2StringName("print");
60-
global_print = (
61-
(GDExtensionInterfaceVariantGetPtrUtilityFunction)GetProcAddress("variant_get_ptr_utility_function")
62-
)(&stringName_print, HASH_print);
63-
destroy_StringName(&stringName_print);
27+
string_new_with_latin1_chars =
28+
(GDExtensionInterfaceStringNewWithLatin1Chars)get_proc_address("string_new_with_latin1_chars");
29+
variant_from_string = (
30+
(GDExtensionInterfaceGetVariantFromTypeConstructor)get_proc_address("get_variant_from_type_constructor")
31+
)(GDEXTENSION_VARIANT_TYPE_STRING);
32+
string_destroy = (
33+
(GDExtensionInterfaceVariantGetPtrDestructor)get_proc_address("variant_get_ptr_destructor")
34+
)(GDEXTENSION_VARIANT_TYPE_STRING);
35+
variant_destroy = (GDExtensionInterfaceVariantDestroy)get_proc_address("variant_destroy");
36+
37+
// Fetch GDScript `@GlobalScope#print`
38+
GDExtensionStringName string_name_print;
39+
(
40+
(GDExtensionInterfaceStringNameNewWithLatin1Chars)get_proc_address("string_name_new_with_latin1_chars")
41+
)(string_name_print, "print", true);
42+
#define HASH_global_scope_print 2648703342 // Fetch hash from `include/extension_api.json`
43+
global_scope_print = (
44+
(GDExtensionInterfaceVariantGetPtrUtilityFunction)get_proc_address("variant_get_ptr_utility_function")
45+
)(string_name_print, HASH_global_scope_print);
46+
6447
// Hello, World!
6548
gdextension_print("Hello, GDExtension!");
6649
}
6750

68-
printf("initialized at level %u\n", p_level);
51+
printf("initialized at level %u\n", level);
6952
}
70-
void hello_gdextension_deinitialize(__attribute__((unused)) void *userdata, GDExtensionInitializationLevel p_level) {
71-
if(p_level == GDEXTENSION_INITIALIZATION_SCENE) {
53+
void hello_gdextension_deinitialize(__attribute__((unused)) void* userdata, GDExtensionInitializationLevel level) {
54+
if(level == GDEXTENSION_INITIALIZATION_SCENE) {
7255
// Unset stale pointers
73-
global_print = NULL;
74-
stringName_from_String = NULL;
75-
destroy_StringName = NULL;
76-
destroy_String = NULL;
56+
global_scope_print = NULL;
57+
variant_from_string = NULL;
7758
string_new_with_latin1_chars = NULL;
78-
string_new_with_utf8_chars = NULL;
7959
variant_destroy = NULL;
60+
string_destroy = NULL;
8061
}
8162

82-
printf("deinitialized at level %u\n", p_level);
63+
printf("deinitialized at level %u\n", level);
8364
}
8465

8566
__attribute__((used)) GDExtensionBool hello_gdextension_main(
86-
GDExtensionInterfaceGetProcAddress p_get_proc_address,
87-
__attribute__((unused)) GDExtensionClassLibraryPtr p_library,
67+
GDExtensionInterfaceGetProcAddress get_proc_address,
68+
__attribute__((unused)) GDExtensionClassLibraryPtr library,
8869
GDExtensionInitialization* r_initialization
8970
) {
9071
// Set up de/initialization functions
9172
r_initialization->minimum_initialization_level = GDEXTENSION_INITIALIZATION_SCENE;
92-
r_initialization->initialize = &hello_gdextension_initialize;
93-
r_initialization->deinitialize = &hello_gdextension_deinitialize;
94-
// Save the GDExtensionInterface
95-
GetProcAddress = p_get_proc_address;
73+
r_initialization->initialize = hello_gdextension_initialize;
74+
r_initialization->deinitialize = hello_gdextension_deinitialize;
75+
// Save the GDExtensionInterface as our userdata of choice
76+
r_initialization->userdata = get_proc_address;
9677
// Success
9778
return true;
9879
}

0 commit comments

Comments
 (0)