Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gdextension declarative property #68479

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/linux_builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@ jobs:
if: ${{ matrix.godot-cpp-test }}
uses: actions/checkout@v3
with:
repository: godotengine/godot-cpp
repository: touilleMan/godot-cpp
ref: gdextension-declarative-property
submodules: 'recursive'
path: 'godot-cpp'

Expand Down
10 changes: 6 additions & 4 deletions core/extension/gdnative_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,10 +238,10 @@ typedef struct {
GDNativeBool is_abstract;
GDNativeExtensionClassSet set_func;
GDNativeExtensionClassGet get_func;
GDNativeExtensionClassGetPropertyList get_property_list_func;
GDNativeExtensionClassFreePropertyList free_property_list_func;
GDNativeExtensionClassPropertyCanRevert property_can_revert_func;
GDNativeExtensionClassPropertyGetRevert property_get_revert_func;
uint32_t property_count;
GDNativePropertyInfo *properties_info; // array of `property_count` size
// array of `property_count` size, properties that can't be reverted are set to NULL
GDNativeVariantPtr *properties_revert_value;
GDNativeExtensionClassNotification notification_func;
GDNativeExtensionClassToString to_string_func;
GDNativeExtensionClassReference reference_func;
Expand Down Expand Up @@ -309,6 +309,7 @@ typedef GDNativeBool (*GDNativeExtensionScriptInstanceSet)(GDNativeExtensionScri
typedef GDNativeBool (*GDNativeExtensionScriptInstanceGet)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret);
typedef const GDNativePropertyInfo *(*GDNativeExtensionScriptInstanceGetPropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
typedef void (*GDNativeExtensionScriptInstanceFreePropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativePropertyInfo *p_list);
typedef GDNativeVariantType (*GDNativeExtensionScriptInstanceGetPropertyType)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name, GDNativeBool *r_is_valid);

typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyCanRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name);
typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyGetRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret);
Expand Down Expand Up @@ -354,6 +355,7 @@ typedef struct {

GDNativeExtensionScriptInstanceGetMethodList get_method_list_func;
GDNativeExtensionScriptInstanceFreeMethodList free_method_list_func;
GDNativeExtensionScriptInstanceGetPropertyType get_property_type_func;

GDNativeExtensionScriptInstanceHasMethod has_method_func;

Expand Down
15 changes: 11 additions & 4 deletions core/extension/native_extension.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,17 @@ void NativeExtension::_register_extension_class(const GDNativeExtensionClassLibr
extension->native_extension.is_abstract = p_extension_funcs->is_abstract;
extension->native_extension.set = p_extension_funcs->set_func;
extension->native_extension.get = p_extension_funcs->get_func;
extension->native_extension.get_property_list = p_extension_funcs->get_property_list_func;
extension->native_extension.free_property_list = p_extension_funcs->free_property_list_func;
extension->native_extension.property_can_revert = p_extension_funcs->property_can_revert_func;
extension->native_extension.property_get_revert = p_extension_funcs->property_get_revert_func;

for (uint32_t i = 0; i < p_extension_funcs->property_count; i++) {
GDNativePropertyInfo *prop = reinterpret_cast<GDNativePropertyInfo *>(&p_extension_funcs->properties_info[i]);
extension->native_extension.properties.push_back(PropertyInfo(*prop));
Variant *revert_value = reinterpret_cast<Variant *>(p_extension_funcs->properties_revert_value[i]);
if (revert_value != NULL) {
StringName *prop_name = reinterpret_cast<StringName *>(prop->name);
extension->native_extension.properties_revert_value[*prop_name] = revert_value->duplicate(true);
}
}

extension->native_extension.notification = p_extension_funcs->notification_func;
extension->native_extension.to_string = p_extension_funcs->to_string_func;
extension->native_extension.reference = p_extension_funcs->reference_func;
Expand Down
38 changes: 9 additions & 29 deletions core/object/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -485,14 +485,9 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons
}
}

if (_extension && _extension->get_property_list) {
uint32_t pcount;
const GDNativePropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount);
for (uint32_t i = 0; i < pcount; i++) {
p_list->push_back(PropertyInfo(pinfo[i]));
}
if (_extension->free_property_list) {
_extension->free_property_list(_extension_instance, pinfo);
if (_extension) {
for (int i = 0; i < _extension->properties.size(); i++) {
p_list->push_back(_extension->properties[i]);
}
}

Expand Down Expand Up @@ -527,19 +522,11 @@ bool Object::property_can_revert(const StringName &p_name) const {
}
}

// C style pointer casts should never trigger a compiler warning because the risk is assumed by the user, so GCC should keep quiet about it.
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wignored-qualifiers"
#endif
if (_extension && _extension->property_can_revert) {
if (_extension->property_can_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name)) {
if (_extension) {
if (_extension->properties_revert_value.has(p_name)) {
return true;
}
}
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif

return _property_can_revertv(p_name);
}
Expand All @@ -553,19 +540,12 @@ Variant Object::property_get_revert(const StringName &p_name) const {
}
}

// C style pointer casts should never trigger a compiler warning because the risk is assumed by the user, so GCC should keep quiet about it.
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wignored-qualifiers"
#endif
if (_extension && _extension->property_get_revert) {
if (_extension->property_get_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name, (GDNativeVariantPtr)&ret)) {
return ret;
if (_extension) {
Variant *revert_value = _extension->properties_revert_value.getptr(p_name);
if (revert_value != nullptr) {
return revert_value->duplicate(true);
}
}
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif

if (_property_get_revertv(p_name, ret)) {
return ret;
Expand Down
6 changes: 2 additions & 4 deletions core/object/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,10 +313,8 @@ struct ObjectNativeExtension {
bool is_abstract = false;
GDNativeExtensionClassSet set;
GDNativeExtensionClassGet get;
GDNativeExtensionClassGetPropertyList get_property_list;
GDNativeExtensionClassFreePropertyList free_property_list;
GDNativeExtensionClassPropertyCanRevert property_can_revert;
GDNativeExtensionClassPropertyGetRevert property_get_revert;
List<PropertyInfo> properties;
HashMap<StringName, Variant> properties_revert_value;
GDNativeExtensionClassNotification notification;
GDNativeExtensionClassToString to_string;
GDNativeExtensionClassReference reference;
Expand Down
20 changes: 7 additions & 13 deletions core/object/script_language_extension.h
Original file line number Diff line number Diff line change
Expand Up @@ -681,21 +681,15 @@ class ScriptInstanceExtension : public ScriptInstance {
}
}
virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = nullptr) const override {
Variant::Type type = Variant::Type::NIL;
if (native_info->get_property_list_func) {
uint32_t pcount;
const GDNativePropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount);
for (uint32_t i = 0; i < pcount; i++) {
if (p_name == *reinterpret_cast<StringName *>(pinfo->name)) {
type = Variant::Type(pinfo->type);
break;
}
}
if (native_info->free_property_list_func) {
native_info->free_property_list_func(instance, pinfo);
if (native_info->get_property_type_func) {
GDNativeBool is_valid = 0;
GDNativeVariantType type = native_info->get_property_type_func(instance, (const GDNativeStringNamePtr)&p_name, &is_valid);
if (r_is_valid) {
*r_is_valid = is_valid != 0;
}
return Variant::Type(type);
}
return type;
return Variant::NIL;
}

virtual bool property_can_revert(const StringName &p_name) const override {
Expand Down