Skip to content

Commit

Permalink
Add static methods to ClassDB for the methods bound to the `ClassDB…
Browse files Browse the repository at this point in the history
…` singleton
  • Loading branch information
dsnopek committed Jul 7, 2023
1 parent 80986f8 commit de5e8ef
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 10 deletions.
72 changes: 62 additions & 10 deletions binding_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,9 @@ def get_file_list(api_filepath, output_dir, headers=False, sources=False):
files.append(str(source_filename.as_posix()))

for engine_class in api["classes"]:
# TODO: Properly setup this singleton since it conflicts with ClassDB in the bindings.
# Generate code for the ClassDB singleton under a different name.
if engine_class["name"] == "ClassDB":
continue
engine_class["name"] = "ClassDBSingleton"
header_filename = include_gen_folder / "classes" / (camel_to_snake(engine_class["name"]) + ".hpp")
source_filename = source_gen_folder / "classes" / (camel_to_snake(engine_class["name"]) + ".cpp")
if headers:
Expand Down Expand Up @@ -1036,21 +1036,21 @@ def generate_engine_classes_bindings(api, output_dir, use_template_get_node):

# First create map of classes and singletons.
for class_api in api["classes"]:
# TODO: Properly setup this singleton since it conflicts with ClassDB in the bindings.
# Generate code for the ClassDB singleton under a different name.
if class_api["name"] == "ClassDB":
continue
class_api["name"] = "ClassDBSingleton"
engine_classes[class_api["name"]] = class_api["is_refcounted"]
for native_struct in api["native_structures"]:
engine_classes[native_struct["name"]] = False
native_structures.append(native_struct["name"])

for singleton in api["singletons"]:
# Generate code for the ClassDB singleton under a different name.
if singleton["name"] == "ClassDB":
singleton["name"] = "ClassDBSingleton"
singletons.append(singleton["name"])

for class_api in api["classes"]:
# TODO: Properly setup this singleton since it conflicts with ClassDB in the bindings.
if class_api["name"] == "ClassDB":
continue
# Check used classes for header include.
used_classes = set()
fully_used_classes = set()
Expand Down Expand Up @@ -1242,7 +1242,7 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
if len(fully_used_classes) > 0:
result.append("")

if class_name != "Object":
if class_name != "Object" and class_name != "ClassDBSingleton":
result.append("#include <godot_cpp/core/class_db.hpp>")
result.append("")
result.append("#include <type_traits>")
Expand Down Expand Up @@ -1421,6 +1421,51 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
result.append(f'VARIANT_ENUM_CAST({class_name}::{enum_api["name"]});')
result.append("")

if class_name == "ClassDBSingleton":
result.append("#define CLASSDB_SINGLETON_FORWARD_METHODS \\")
for method in class_api["methods"]:
# ClassDBSingleton shouldn't have any static or vararg methods, but if some appear later, lets skip them.
if vararg:
continue
if "is_static" in method and method["is_static"]:
continue

method_signature = "\tstatic "
if "return_type" in method:
method_signature += f'{correct_type(method["return_type"])} '
elif "return_value" in method:
method_signature += (
correct_type(method["return_value"]["type"], method["return_value"].get("meta", None)) + " "
)
else:
method_signature += "void "

method_signature += f'{method["name"]}('

method_arguments = []
if "arguments" in method:
method_arguments = method["arguments"]

method_signature += make_function_parameters(
method_arguments, include_default=True, for_builtin=True, is_vararg=False
)

method_signature += ") { \\"

result.append(method_signature)

method_body = "\t\t"
if "return_type" in method or "return_value" in method:
method_body += "return "
method_body += f'ClassDBSingleton::get_singleton()->{method["name"]}('
method_body += ", ".join(map(lambda x: escape_identifier(x["name"]), method_arguments))
method_body += "); \\"

result.append(method_body)
result.append("\t} \\")
result.append("\t;")
result.append("")

result.append(f"#endif // ! {header_guard}")

return "\n".join(result)
Expand Down Expand Up @@ -1453,7 +1498,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us

if is_singleton:
result.append(f"{class_name} *{class_name}::get_singleton() {{")
result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();")
if class_name != "ClassDBSingleton":
result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();")
else:
result.append(f'\tstatic const StringName _gde_class_name = StringName("ClassDB");')
result.append(
"\tstatic GDExtensionObjectPtr singleton_obj = internal::gdextension_interface_global_get_singleton(_gde_class_name._native_ptr());"
)
Expand All @@ -1480,7 +1528,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
result.append(method_signature + " {")

# Method body.
result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();")
if class_name != "ClassDBSingleton":
result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();")
else:
result.append(f'\tstatic const StringName _gde_class_name = StringName("ClassDB");')
result.append(f'\tconst StringName _gde_method_name = "{method["name"]}";')
result.append(
f'\tstatic GDExtensionMethodBindPtr _gde_method_bind = internal::gdextension_interface_classdb_get_method_bind(_gde_class_name._native_ptr(), _gde_method_name._native_ptr(), {method["hash"]});'
Expand Down Expand Up @@ -2285,6 +2336,7 @@ def escape_identifier(id):
"operator": "_operator",
"typeof": "type_of",
"typename": "type_name",
"enum": "_enum",
}
if id in cpp_keywords_map:
return cpp_keywords_map[id]
Expand Down
4 changes: 4 additions & 0 deletions include/godot_cpp/core/class_db.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
#include <godot_cpp/core/method_bind.hpp>
#include <godot_cpp/core/object.hpp>

#include <godot_cpp/classes/class_db_singleton.hpp>

#include <list>
#include <set>
#include <string>
Expand Down Expand Up @@ -146,6 +148,8 @@ class ClassDB {

static void initialize(GDExtensionInitializationLevel p_level);
static void deinitialize(GDExtensionInitializationLevel p_level);

CLASSDB_SINGLETON_FORWARD_METHODS;
};

#define BIND_CONSTANT(m_constant) \
Expand Down

0 comments on commit de5e8ef

Please sign in to comment.