Skip to content

Commit 7e5fa8e

Browse files
authored
Merge pull request #1410 from dsnopek/4.2-cherrypicks-2
Cherry-picks for the godot-cpp 4.2 branch - 2nd batch
2 parents 51c752c + f8477fb commit 7e5fa8e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+950
-674
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
# Todo
3838
# Test build for Windows, Mac and mingw.
3939

40-
cmake_minimum_required(VERSION 3.12)
40+
cmake_minimum_required(VERSION 3.13)
4141
project(godot-cpp LANGUAGES CXX)
4242

4343
option(GENERATE_TEMPLATE_GET_NODE "Generate a template version of the Node class's get_node." ON)

binding_generator.py

+63-20
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,10 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
413413
if class_name == "PackedVector3Array":
414414
result.append("#include <godot_cpp/variant/vector3.hpp>")
415415

416+
if is_packed_array(class_name):
417+
result.append("#include <godot_cpp/core/error_macros.hpp>")
418+
result.append("#include <initializer_list>")
419+
416420
if class_name == "Array":
417421
result.append("#include <godot_cpp/variant/array_helpers.hpp>")
418422

@@ -454,6 +458,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
454458
result.append("")
455459
result.append("\tstatic struct _MethodBindings {")
456460

461+
result.append("\t\tGDExtensionTypeFromVariantConstructorFunc from_variant_constructor;")
462+
457463
if "constructors" in builtin_api:
458464
for constructor in builtin_api["constructors"]:
459465
result.append(f'\t\tGDExtensionPtrConstructor constructor_{constructor["index"]};')
@@ -494,6 +500,9 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
494500
result.append("\tstatic void init_bindings();")
495501
result.append("\tstatic void _init_bindings_constructors_destructor();")
496502

503+
result.append("")
504+
result.append(f"\t{class_name}(const Variant *p_variant);")
505+
497506
result.append("")
498507
result.append("public:")
499508

@@ -558,7 +567,7 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
558567

559568
vararg = method["is_vararg"]
560569
if vararg:
561-
result.append("\ttemplate<class... Args>")
570+
result.append("\ttemplate<typename... Args>")
562571

563572
method_signature = "\t"
564573
if "is_static" in method and method["is_static"]:
@@ -588,17 +597,17 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
588597

589598
# Special cases.
590599
if class_name == "String":
591-
result.append("\tstatic String utf8(const char *from, int len = -1);")
592-
result.append("\tvoid parse_utf8(const char *from, int len = -1);")
593-
result.append("\tstatic String utf16(const char16_t *from, int len = -1);")
594-
result.append("\tvoid parse_utf16(const char16_t *from, int len = -1);")
600+
result.append("\tstatic String utf8(const char *from, int64_t len = -1);")
601+
result.append("\tvoid parse_utf8(const char *from, int64_t len = -1);")
602+
result.append("\tstatic String utf16(const char16_t *from, int64_t len = -1);")
603+
result.append("\tvoid parse_utf16(const char16_t *from, int64_t len = -1);")
595604
result.append("\tCharString utf8() const;")
596605
result.append("\tCharString ascii() const;")
597606
result.append("\tChar16String utf16() const;")
598607
result.append("\tChar32String utf32() const;")
599608
result.append("\tCharWideString wide_string() const;")
600609
result.append("\tstatic String num_real(double p_num, bool p_trailing = true);")
601-
result.append("\tError resize(int p_size);")
610+
result.append("\tError resize(int64_t p_size);")
602611

603612
if "members" in builtin_api:
604613
for member in builtin_api["members"]:
@@ -651,13 +660,13 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
651660
result.append("\tString &operator+=(const wchar_t *p_str);")
652661
result.append("\tString &operator+=(const char32_t *p_str);")
653662

654-
result.append("\tconst char32_t &operator[](int p_index) const;")
655-
result.append("\tchar32_t &operator[](int p_index);")
663+
result.append("\tconst char32_t &operator[](int64_t p_index) const;")
664+
result.append("\tchar32_t &operator[](int64_t p_index);")
656665
result.append("\tconst char32_t *ptr() const;")
657666
result.append("\tchar32_t *ptrw();")
658667

659668
if class_name == "Array":
660-
result.append("\ttemplate <class... Args>")
669+
result.append("\ttemplate <typename... Args>")
661670
result.append("\tstatic Array make(Args... args) {")
662671
result.append("\t\treturn helpers::append_all(Array(), args...);")
663672
result.append("\t}")
@@ -670,8 +679,8 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
670679
return_type = "int32_t"
671680
elif class_name == "PackedFloat32Array":
672681
return_type = "float"
673-
result.append(f"\tconst {return_type} &operator[](int p_index) const;")
674-
result.append(f"\t{return_type} &operator[](int p_index);")
682+
result.append(f"\tconst {return_type} &operator[](int64_t p_index) const;")
683+
result.append(f"\t{return_type} &operator[](int64_t p_index);")
675684
result.append(f"\tconst {return_type} *ptr() const;")
676685
result.append(f"\t{return_type} *ptrw();")
677686
iterators = """
@@ -740,10 +749,21 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
740749
}
741750
"""
742751
result.append(iterators.replace("$TYPE", return_type))
752+
init_list = """
753+
_FORCE_INLINE_ $CLASS(std::initializer_list<$TYPE> p_init) {
754+
ERR_FAIL_COND(resize(p_init.size()) != 0);
755+
756+
size_t i = 0;
757+
for (const $TYPE &element : p_init) {
758+
set(i++, element);
759+
}
760+
}
761+
"""
762+
result.append(init_list.replace("$TYPE", return_type).replace("$CLASS", class_name))
743763

744764
if class_name == "Array":
745-
result.append("\tconst Variant &operator[](int p_index) const;")
746-
result.append("\tVariant &operator[](int p_index);")
765+
result.append("\tconst Variant &operator[](int64_t p_index) const;")
766+
result.append("\tVariant &operator[](int64_t p_index);")
747767
result.append("\tvoid set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script);")
748768
result.append("\tvoid _ref(const Array &p_from) const;")
749769

@@ -818,6 +838,10 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
818838

819839
result.append(f"void {class_name}::_init_bindings_constructors_destructor() {{")
820840

841+
result.append(
842+
f"\t_method_bindings.from_variant_constructor = internal::gdextension_interface_get_variant_to_type_constructor({enum_type_name});"
843+
)
844+
821845
if "constructors" in builtin_api:
822846
for constructor in builtin_api["constructors"]:
823847
result.append(
@@ -899,6 +923,11 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
899923

900924
copy_constructor_index = -1
901925

926+
result.append(f"{class_name}::{class_name}(const Variant *p_variant) {{")
927+
result.append("\t_method_bindings.from_variant_constructor(&opaque, p_variant->_native_ptr());")
928+
result.append("}")
929+
result.append("")
930+
902931
if "constructors" in builtin_api:
903932
for constructor in builtin_api["constructors"]:
904933
method_signature = f"{class_name}::{class_name}("
@@ -964,8 +993,19 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
964993
result.append(method_signature + "{")
965994

966995
method_call = "\t"
996+
is_ref = False
997+
967998
if "return_type" in method:
968-
method_call += f'return internal::_call_builtin_method_ptr_ret<{correct_type(method["return_type"])}>('
999+
return_type = method["return_type"]
1000+
if is_enum(return_type):
1001+
method_call += f"return ({get_gdextension_type(correct_type(return_type))})internal::_call_builtin_method_ptr_ret<int64_t>("
1002+
elif is_pod_type(return_type) or is_variant(return_type):
1003+
method_call += f"return internal::_call_builtin_method_ptr_ret<{get_gdextension_type(correct_type(return_type))}>("
1004+
elif is_refcounted(return_type):
1005+
method_call += f"return Ref<{return_type}>::_gde_internal_constructor(internal::_call_builtin_method_ptr_ret_obj<{return_type}>("
1006+
is_ref = True
1007+
else:
1008+
method_call += f"return internal::_call_builtin_method_ptr_ret_obj<{return_type}>("
9691009
else:
9701010
method_call += "internal::_call_builtin_method_ptr_no_ret("
9711011
method_call += f'_method_bindings.method_{method["name"]}, '
@@ -986,6 +1026,9 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
9861026
result += encode
9871027
arguments.append(arg_name)
9881028
method_call += ", ".join(arguments)
1029+
1030+
if is_ref:
1031+
method_call += ")" # Close Ref<> constructor.
9891032
method_call += ");"
9901033

9911034
result.append(method_call)
@@ -1384,7 +1427,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
13841427
result.append("protected:")
13851428
# T is the custom class we want to register (from which the call initiates, going up the inheritance chain),
13861429
# B is its base class (can be a custom class too, that's why we pass it).
1387-
result.append("\ttemplate <class T, class B>")
1430+
result.append("\ttemplate <typename T, typename B>")
13881431
result.append("\tstatic void register_virtuals() {")
13891432
if class_name != "Object":
13901433
result.append(f"\t\t{inherits}::register_virtuals<T, B>();")
@@ -1430,16 +1473,16 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
14301473
if class_name == "Object":
14311474
result.append("")
14321475

1433-
result.append("\ttemplate<class T>")
1476+
result.append("\ttemplate<typename T>")
14341477
result.append("\tstatic T *cast_to(Object *p_object);")
14351478

1436-
result.append("\ttemplate<class T>")
1479+
result.append("\ttemplate<typename T>")
14371480
result.append("\tstatic const T *cast_to(const Object *p_object);")
14381481

14391482
result.append("\tvirtual ~Object() = default;")
14401483

14411484
elif use_template_get_node and class_name == "Node":
1442-
result.append("\ttemplate<class T>")
1485+
result.append("\ttemplate<typename T>")
14431486
result.append(
14441487
"\tT *get_node(const NodePath &p_path) const { return Object::cast_to<T>(get_node_internal(p_path)); }"
14451488
)
@@ -1696,7 +1739,7 @@ def generate_global_constants(api, output_dir):
16961739
header.append("")
16971740

16981741
for constant in api["global_constants"]:
1699-
header.append(f'\tconst int {escape_identifier(constant["name"])} = {constant["value"]};')
1742+
header.append(f'\tconst int64_t {escape_identifier(constant["name"])} = {constant["value"]};')
17001743

17011744
header.append("")
17021745

@@ -2073,7 +2116,7 @@ def make_varargs_template(
20732116
if with_public_declare:
20742117
function_signature = "public: "
20752118

2076-
function_signature += "template<class... Args> "
2119+
function_signature += "template<typename... Args> "
20772120

20782121
if static:
20792122
function_signature += "static "

include/godot_cpp/classes/editor_plugin_registration.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ class EditorPlugins {
4747
static void remove_plugin_class(const StringName &p_class_name);
4848
static void deinitialize(GDExtensionInitializationLevel p_level);
4949

50-
template <class T>
50+
template <typename T>
5151
static void add_by_type() {
5252
add_plugin_class(T::get_class_static());
5353
}
54-
template <class T>
54+
template <typename T>
5555
static void remove_by_type() {
5656
remove_plugin_class(T::get_class_static());
5757
}

include/godot_cpp/classes/ref.hpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ namespace godot {
4545

4646
class RefCounted;
4747

48-
template <class T>
48+
template <typename T>
4949
class Ref {
5050
T *reference = nullptr;
5151

@@ -108,7 +108,7 @@ class Ref {
108108
ref(p_from);
109109
}
110110

111-
template <class T_Other>
111+
template <typename T_Other>
112112
void operator=(const Ref<T_Other> &p_from) {
113113
RefCounted *refb = const_cast<RefCounted *>(static_cast<const RefCounted *>(p_from.ptr()));
114114
if (!refb) {
@@ -144,7 +144,7 @@ class Ref {
144144
}
145145
}
146146

147-
template <class T_Other>
147+
template <typename T_Other>
148148
void reference_ptr(T_Other *p_ptr) {
149149
if (reference == p_ptr) {
150150
return;
@@ -161,7 +161,7 @@ class Ref {
161161
ref(p_from);
162162
}
163163

164-
template <class T_Other>
164+
template <typename T_Other>
165165
Ref(const Ref<T_Other> &p_from) {
166166
RefCounted *refb = const_cast<RefCounted *>(static_cast<const RefCounted *>(p_from.ptr()));
167167
if (!refb) {
@@ -226,7 +226,7 @@ class Ref {
226226
}
227227
};
228228

229-
template <class T>
229+
template <typename T>
230230
struct PtrToArg<Ref<T>> {
231231
_FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) {
232232
GDExtensionRefPtr ref = (GDExtensionRefPtr)p_ptr;
@@ -248,7 +248,7 @@ struct PtrToArg<Ref<T>> {
248248
}
249249
};
250250

251-
template <class T>
251+
template <typename T>
252252
struct PtrToArg<const Ref<T> &> {
253253
typedef Ref<T> EncodeT;
254254

@@ -259,7 +259,7 @@ struct PtrToArg<const Ref<T> &> {
259259
}
260260
};
261261

262-
template <class T>
262+
template <typename T>
263263
struct GetTypeInfo<Ref<T>, typename EnableIf<TypeInherits<RefCounted, T>::value>::type> {
264264
static const GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_OBJECT;
265265
static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
@@ -269,7 +269,7 @@ struct GetTypeInfo<Ref<T>, typename EnableIf<TypeInherits<RefCounted, T>::value>
269269
}
270270
};
271271

272-
template <class T>
272+
template <typename T>
273273
struct GetTypeInfo<const Ref<T> &, typename EnableIf<TypeInherits<RefCounted, T>::value>::type> {
274274
static const GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_OBJECT;
275275
static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;

include/godot_cpp/classes/wrapped.hpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ void add_engine_class_registration_callback(EngineClassRegistrationCallback p_ca
117117
void register_engine_class(const StringName &p_name, const GDExtensionInstanceBindingCallbacks *p_callbacks);
118118
void register_engine_classes();
119119

120-
template <class T>
120+
template <typename T>
121121
struct EngineClassRegistration {
122122
EngineClassRegistration() {
123123
add_engine_class_registration_callback(&EngineClassRegistration<T>::callback);
@@ -186,7 +186,7 @@ protected:
186186
return (::godot::String(::godot::Wrapped::*)() const) & m_class::_to_string; \
187187
} \
188188
\
189-
template <class T, class B> \
189+
template <typename T, typename B> \
190190
static void register_virtuals() { \
191191
m_inherits::register_virtuals<T, B>(); \
192192
} \
@@ -218,11 +218,16 @@ public:
218218
\
219219
static void notification_bind(GDExtensionClassInstancePtr p_instance, int32_t p_what, GDExtensionBool p_reversed) { \
220220
if (p_instance && m_class::_get_notification()) { \
221+
if (!p_reversed) { \
222+
m_inherits::notification_bind(p_instance, p_what, p_reversed); \
223+
} \
221224
if (m_class::_get_notification() != m_inherits::_get_notification()) { \
222225
m_class *cls = reinterpret_cast<m_class *>(p_instance); \
223-
return cls->_notification(p_what); \
226+
cls->_notification(p_what); \
227+
} \
228+
if (p_reversed) { \
229+
m_inherits::notification_bind(p_instance, p_what, p_reversed); \
224230
} \
225-
m_inherits::notification_bind(p_instance, p_what, p_reversed); \
226231
} \
227232
} \
228233
\

0 commit comments

Comments
 (0)