You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Merge pull request #106775 from Ivorforce/gdsoftclass-expand
Move compatible functionality from `GDCLASS` to `GDSOFTCLASS`.
This commit is contained in:
@@ -395,23 +395,95 @@ struct ObjectGDExtension {
|
||||
* much alone defines the object model.
|
||||
*/
|
||||
|
||||
// This is a barebones version of GDCLASS,
|
||||
// only intended for simple classes deriving from Object
|
||||
// so that they can support the `Object::cast_to()` method.
|
||||
#define GDSOFTCLASS(m_class, m_inherits) \
|
||||
public: \
|
||||
using self_type = m_class; \
|
||||
using super_type = m_inherits; \
|
||||
static _FORCE_INLINE_ void *get_class_ptr_static() { \
|
||||
static int ptr; \
|
||||
return &ptr; \
|
||||
} \
|
||||
virtual bool is_class_ptr(void *p_ptr) const override { \
|
||||
return (p_ptr == get_class_ptr_static()) || m_inherits::is_class_ptr(p_ptr); \
|
||||
} \
|
||||
\
|
||||
/// `GDSOFTCLASS` provides `Object` functionality, such as being able to use `Object::cast_to()`.
|
||||
/// Use this for `Object` subclasses that are not registered in `ClassDB` (use `GDCLASS` otherwise).
|
||||
#define GDSOFTCLASS(m_class, m_inherits) \
|
||||
public: \
|
||||
using self_type = m_class; \
|
||||
using super_type = m_inherits; \
|
||||
static _FORCE_INLINE_ void *get_class_ptr_static() { \
|
||||
static int ptr; \
|
||||
return &ptr; \
|
||||
} \
|
||||
virtual bool is_class_ptr(void *p_ptr) const override { \
|
||||
return (p_ptr == get_class_ptr_static()) || m_inherits::is_class_ptr(p_ptr); \
|
||||
} \
|
||||
\
|
||||
protected: \
|
||||
_FORCE_INLINE_ bool (Object::*_get_get() const)(const StringName &p_name, Variant &) const { \
|
||||
return (bool (Object::*)(const StringName &, Variant &) const) & m_class::_get; \
|
||||
} \
|
||||
virtual bool _getv(const StringName &p_name, Variant &r_ret) const override { \
|
||||
if (m_class::_get_get() != m_inherits::_get_get()) { \
|
||||
if (_get(p_name, r_ret)) { \
|
||||
return true; \
|
||||
} \
|
||||
} \
|
||||
return m_inherits::_getv(p_name, r_ret); \
|
||||
} \
|
||||
_FORCE_INLINE_ bool (Object::*_get_set() const)(const StringName &p_name, const Variant &p_property) { \
|
||||
return (bool (Object::*)(const StringName &, const Variant &)) & m_class::_set; \
|
||||
} \
|
||||
virtual bool _setv(const StringName &p_name, const Variant &p_property) override { \
|
||||
if (m_inherits::_setv(p_name, p_property)) { \
|
||||
return true; \
|
||||
} \
|
||||
if (m_class::_get_set() != m_inherits::_get_set()) { \
|
||||
return _set(p_name, p_property); \
|
||||
} \
|
||||
return false; \
|
||||
} \
|
||||
_FORCE_INLINE_ void (Object::*_get_validate_property() const)(PropertyInfo & p_property) const { \
|
||||
return (void (Object::*)(PropertyInfo &) const) & m_class::_validate_property; \
|
||||
} \
|
||||
virtual void _validate_propertyv(PropertyInfo &p_property) const override { \
|
||||
m_inherits::_validate_propertyv(p_property); \
|
||||
if (m_class::_get_validate_property() != m_inherits::_get_validate_property()) { \
|
||||
_validate_property(p_property); \
|
||||
} \
|
||||
} \
|
||||
_FORCE_INLINE_ bool (Object::*_get_property_can_revert() const)(const StringName &p_name) const { \
|
||||
return (bool (Object::*)(const StringName &) const) & m_class::_property_can_revert; \
|
||||
} \
|
||||
virtual bool _property_can_revertv(const StringName &p_name) const override { \
|
||||
if (m_class::_get_property_can_revert() != m_inherits::_get_property_can_revert()) { \
|
||||
if (_property_can_revert(p_name)) { \
|
||||
return true; \
|
||||
} \
|
||||
} \
|
||||
return m_inherits::_property_can_revertv(p_name); \
|
||||
} \
|
||||
_FORCE_INLINE_ bool (Object::*_get_property_get_revert() const)(const StringName &p_name, Variant &) const { \
|
||||
return (bool (Object::*)(const StringName &, Variant &) const) & m_class::_property_get_revert; \
|
||||
} \
|
||||
virtual bool _property_get_revertv(const StringName &p_name, Variant &r_ret) const override { \
|
||||
if (m_class::_get_property_get_revert() != m_inherits::_get_property_get_revert()) { \
|
||||
if (_property_get_revert(p_name, r_ret)) { \
|
||||
return true; \
|
||||
} \
|
||||
} \
|
||||
return m_inherits::_property_get_revertv(p_name, r_ret); \
|
||||
} \
|
||||
_FORCE_INLINE_ void (Object::*_get_notification() const)(int) { \
|
||||
return (void (Object::*)(int)) & m_class::_notification; \
|
||||
} \
|
||||
virtual void _notification_forwardv(int p_notification) override { \
|
||||
m_inherits::_notification_forwardv(p_notification); \
|
||||
if (m_class::_get_notification() != m_inherits::_get_notification()) { \
|
||||
_notification(p_notification); \
|
||||
} \
|
||||
} \
|
||||
virtual void _notification_backwardv(int p_notification) override { \
|
||||
if (m_class::_get_notification() != m_inherits::_get_notification()) { \
|
||||
_notification(p_notification); \
|
||||
} \
|
||||
m_inherits::_notification_backwardv(p_notification); \
|
||||
} \
|
||||
\
|
||||
private:
|
||||
|
||||
/// `GDSOFTCLASS` provides `Object` functionality, such as being able to use `Object::cast_to()`.
|
||||
/// Use this for `Object` subclasses that are registered in `ObjectDB` (use `GDSOFTCLASS` otherwise).
|
||||
#define GDCLASS(m_class, m_inherits) \
|
||||
GDSOFTCLASS(m_class, m_inherits) \
|
||||
private: \
|
||||
@@ -466,29 +538,6 @@ protected:
|
||||
virtual void _initialize_classv() override { \
|
||||
initialize_class(); \
|
||||
} \
|
||||
_FORCE_INLINE_ bool (Object::*_get_get() const)(const StringName &p_name, Variant &) const { \
|
||||
return (bool (Object::*)(const StringName &, Variant &) const) & m_class::_get; \
|
||||
} \
|
||||
virtual bool _getv(const StringName &p_name, Variant &r_ret) const override { \
|
||||
if (m_class::_get_get() != m_inherits::_get_get()) { \
|
||||
if (_get(p_name, r_ret)) { \
|
||||
return true; \
|
||||
} \
|
||||
} \
|
||||
return m_inherits::_getv(p_name, r_ret); \
|
||||
} \
|
||||
_FORCE_INLINE_ bool (Object::*_get_set() const)(const StringName &p_name, const Variant &p_property) { \
|
||||
return (bool (Object::*)(const StringName &, const Variant &)) & m_class::_set; \
|
||||
} \
|
||||
virtual bool _setv(const StringName &p_name, const Variant &p_property) override { \
|
||||
if (m_inherits::_setv(p_name, p_property)) { \
|
||||
return true; \
|
||||
} \
|
||||
if (m_class::_get_set() != m_inherits::_get_set()) { \
|
||||
return _set(p_name, p_property); \
|
||||
} \
|
||||
return false; \
|
||||
} \
|
||||
_FORCE_INLINE_ void (Object::*_get_get_property_list() const)(List<PropertyInfo> * p_list) const { \
|
||||
return (void (Object::*)(List<PropertyInfo> *) const) & m_class::_get_property_list; \
|
||||
} \
|
||||
@@ -504,52 +553,6 @@ protected:
|
||||
if (p_reversed) { \
|
||||
m_inherits::_get_property_listv(p_list, p_reversed); \
|
||||
} \
|
||||
} \
|
||||
_FORCE_INLINE_ void (Object::*_get_validate_property() const)(PropertyInfo & p_property) const { \
|
||||
return (void (Object::*)(PropertyInfo &) const) & m_class::_validate_property; \
|
||||
} \
|
||||
virtual void _validate_propertyv(PropertyInfo &p_property) const override { \
|
||||
m_inherits::_validate_propertyv(p_property); \
|
||||
if (m_class::_get_validate_property() != m_inherits::_get_validate_property()) { \
|
||||
_validate_property(p_property); \
|
||||
} \
|
||||
} \
|
||||
_FORCE_INLINE_ bool (Object::*_get_property_can_revert() const)(const StringName &p_name) const { \
|
||||
return (bool (Object::*)(const StringName &) const) & m_class::_property_can_revert; \
|
||||
} \
|
||||
virtual bool _property_can_revertv(const StringName &p_name) const override { \
|
||||
if (m_class::_get_property_can_revert() != m_inherits::_get_property_can_revert()) { \
|
||||
if (_property_can_revert(p_name)) { \
|
||||
return true; \
|
||||
} \
|
||||
} \
|
||||
return m_inherits::_property_can_revertv(p_name); \
|
||||
} \
|
||||
_FORCE_INLINE_ bool (Object::*_get_property_get_revert() const)(const StringName &p_name, Variant &) const { \
|
||||
return (bool (Object::*)(const StringName &, Variant &) const) & m_class::_property_get_revert; \
|
||||
} \
|
||||
virtual bool _property_get_revertv(const StringName &p_name, Variant &r_ret) const override { \
|
||||
if (m_class::_get_property_get_revert() != m_inherits::_get_property_get_revert()) { \
|
||||
if (_property_get_revert(p_name, r_ret)) { \
|
||||
return true; \
|
||||
} \
|
||||
} \
|
||||
return m_inherits::_property_get_revertv(p_name, r_ret); \
|
||||
} \
|
||||
_FORCE_INLINE_ void (Object::*_get_notification() const)(int) { \
|
||||
return (void (Object::*)(int)) & m_class::_notification; \
|
||||
} \
|
||||
virtual void _notification_forwardv(int p_notification) override { \
|
||||
m_inherits::_notification_forwardv(p_notification); \
|
||||
if (m_class::_get_notification() != m_inherits::_get_notification()) { \
|
||||
_notification(p_notification); \
|
||||
} \
|
||||
} \
|
||||
virtual void _notification_backwardv(int p_notification) override { \
|
||||
if (m_class::_get_notification() != m_inherits::_get_notification()) { \
|
||||
_notification(p_notification); \
|
||||
} \
|
||||
m_inherits::_notification_backwardv(p_notification); \
|
||||
} \
|
||||
\
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user