Merge pull request #70329 from Daylily-Zeleen/daylily-zeleen/register_internal_class

Allow GDExtension to register unexposed classes.
This commit is contained in:
Rémi Verschelde 2023-09-11 15:35:31 +02:00
commit 786dab42fd
No known key found for this signature in database
GPG key ID: C3336907360768E1
6 changed files with 35 additions and 1 deletions

View file

@ -1674,7 +1674,14 @@ void ClassDB::register_extension_class(ObjectGDExtension *p_extension) {
c.inherits = parent->name;
c.class_ptr = parent->class_ptr;
c.inherits_ptr = parent;
c.exposed = true;
c.exposed = p_extension->is_exposed;
if (c.exposed) {
// The parent classes should be exposed if it has an exposed child class.
while (parent && !parent->exposed) {
parent->exposed = true;
parent = classes.getptr(parent->name);
}
}
classes[p_extension->class_name] = c;
}

View file

@ -212,6 +212,21 @@ public:
//nothing
}
template <class T>
static void register_internal_class() {
GLOBAL_LOCK_FUNCTION;
static_assert(TypesAreSame<typename T::self_type, T>::value, "Class not declared properly, please use GDCLASS.");
T::initialize_class();
ClassInfo *t = classes.getptr(T::get_class_static());
ERR_FAIL_COND(!t);
t->creation_func = &creator<T>;
t->exposed = false;
t->is_virtual = false;
t->class_ptr = T::get_class_ptr_static();
t->api = current_api;
T::register_custom_data_to_otdb();
}
static void register_extension_class(ObjectGDExtension *p_extension);
static void unregister_extension_class(const StringName &p_class);
@ -483,6 +498,10 @@ _FORCE_INLINE_ Vector<Error> errarray(P... p_args) {
if (m_class::_class_is_enabled) { \
::ClassDB::register_abstract_class<m_class>(); \
}
#define GDREGISTER_INTERNAL_CLASS(m_class) \
if (m_class::_class_is_enabled) { \
::ClassDB::register_internal_class<m_class>(); \
}
#define GDREGISTER_NATIVE_STRUCT(m_class, m_code) ClassDB::register_native_struct(#m_class, m_code, sizeof(m_class))

View file

@ -315,6 +315,7 @@ struct ObjectGDExtension {
bool editor_class = false;
bool is_virtual = false;
bool is_abstract = false;
bool is_exposed = true;
GDExtensionClassSet set;
GDExtensionClassGet get;
GDExtensionClassGetPropertyList get_property_list;