@@ -70,10 +70,9 @@ def generate_wrappers(target):
70
70
f .write (txt )
71
71
72
72
73
- def generate_virtual_version (argcount , const = False , returns = False ):
73
+ def generate_virtual_version (argcount , const = False , returns = False , required = False ):
74
74
s = """#define GDVIRTUAL$VER($RET m_name $ARG)\\
75
75
::godot::StringName _gdvirtual_##m_name##_sn = #m_name;\\
76
- template <bool required>\\
77
76
_FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST {\\
78
77
if (::godot::internal::gdextension_interface_object_has_script_method(_owner, &_gdvirtual_##m_name##_sn)) { \\
79
78
GDExtensionCallError ce;\\
@@ -85,10 +84,8 @@ def generate_virtual_version(argcount, const=False, returns=False):
85
84
return true;\\
86
85
}\\
87
86
}\\
88
- if (required) {\\
89
- ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\
90
- $RVOID\\
91
- }\\
87
+ $REQCHECK\\
88
+ $RVOID\\
92
89
return false;\\
93
90
}\\
94
91
_FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const {\\
@@ -106,6 +103,7 @@ def generate_virtual_version(argcount, const=False, returns=False):
106
103
107
104
sproto = str (argcount )
108
105
method_info = ""
106
+ method_flags = "METHOD_FLAG_VIRTUAL"
109
107
if returns :
110
108
sproto += "R"
111
109
s = s .replace ("$RET" , "m_ret," )
@@ -114,16 +112,26 @@ def generate_virtual_version(argcount, const=False, returns=False):
114
112
method_info += "\t \t method_info.return_val_metadata = ::godot::GetTypeInfo<m_ret>::METADATA;"
115
113
else :
116
114
s = s .replace ("$RET " , "" )
117
- s = s .replace ("\t \t \t $RVOID\\ \n " , "" )
115
+ s = s .replace ("\t \t $RVOID\\ \n " , "" )
118
116
119
117
if const :
120
118
sproto += "C"
119
+ method_flags += " | METHOD_FLAG_CONST"
121
120
s = s .replace ("$CONST" , "const" )
122
- s = s .replace ("$METHOD_FLAGS" , "::godot::METHOD_FLAG_VIRTUAL | ::godot::METHOD_FLAG_CONST" )
123
121
else :
124
122
s = s .replace ("$CONST " , "" )
125
- s = s .replace ("$METHOD_FLAGS" , "::godot::METHOD_FLAG_VIRTUAL" )
126
123
124
+ if required :
125
+ sproto += "_REQUIRED"
126
+ method_flags += " | METHOD_FLAG_VIRTUAL_REQUIRED"
127
+ s = s .replace (
128
+ "$REQCHECK" ,
129
+ 'ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");' ,
130
+ )
131
+ else :
132
+ s = s .replace ("\t \t $REQCHECK\\ \n " , "" )
133
+
134
+ s = s .replace ("$METHOD_FLAGS" , method_flags )
127
135
s = s .replace ("$VER" , sproto )
128
136
argtext = ""
129
137
callargtext = ""
@@ -190,6 +198,10 @@ def generate_virtuals(target):
190
198
txt += generate_virtual_version (i , False , True )
191
199
txt += generate_virtual_version (i , True , False )
192
200
txt += generate_virtual_version (i , True , True )
201
+ txt += generate_virtual_version (i , False , False , True )
202
+ txt += generate_virtual_version (i , False , True , True )
203
+ txt += generate_virtual_version (i , True , False , True )
204
+ txt += generate_virtual_version (i , True , True , True )
193
205
194
206
txt += "#endif // GDEXTENSION_GDVIRTUAL_GEN_H\n "
195
207
0 commit comments