summaryrefslogtreecommitdiffstats
path: root/include/godot_cpp
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2021-09-28 15:49:08 +0200
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2021-09-28 15:49:08 +0200
commitb90d0ac555035c4db9ebc2a3516acff72e5cfb43 (patch)
treea315ec62e4331be00bf7b8ae1c1e3adc7cd9c9cc /include/godot_cpp
parent5826fd52592c5ed9051c7ef5dbfbd9295fb23607 (diff)
downloadredot-cpp-b90d0ac555035c4db9ebc2a3516acff72e5cfb43.tar.gz
Add Ref<T> binding support.
Added PtrToArg and GetTypeInfo adapted from Godot.
Diffstat (limited to 'include/godot_cpp')
-rw-r--r--include/godot_cpp/classes/ref.hpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/include/godot_cpp/classes/ref.hpp b/include/godot_cpp/classes/ref.hpp
index b5fec34..71c8d88 100644
--- a/include/godot_cpp/classes/ref.hpp
+++ b/include/godot_cpp/classes/ref.hpp
@@ -35,6 +35,7 @@
#include <godot_cpp/classes/object.hpp>
#include <godot_cpp/classes/ref_counted.hpp>
+#include <godot_cpp/core/binder_common.hpp>
#include <godot_cpp/core/memory.hpp>
#include <godot_cpp/variant/variant.hpp>
@@ -236,6 +237,48 @@ public:
}
};
+template <class T>
+struct PtrToArg<Ref<T>> {
+ _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) {
+ return Ref<T>(godot::internal::interface->object_get_instance_binding((void *)p_ptr, godot::internal::token, &T::___binding_callbacks));
+ }
+
+ typedef Ref<T> EncodeT;
+
+ _FORCE_INLINE_ static void encode(Ref<T> p_val, const void *p_ptr) {
+ *(void **)p_ptr = p_val->_owner;
+ }
+};
+
+template <class T>
+struct PtrToArg<const Ref<T> &> {
+ typedef Ref<T> EncodeT;
+
+ _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) {
+ return Ref<T>(godot::internal::interface->object_get_instance_binding((void *)p_ptr, godot::internal::token, &T::___binding_callbacks));
+ }
+};
+
+template <class T>
+struct GetTypeInfo<Ref<T>, typename EnableIf<TypeInherits<RefCounted, T>::value>::type> {
+ static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT;
+ static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE;
+
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static());
+ }
+};
+
+template <class T>
+struct GetTypeInfo<const Ref<T> &, typename EnableIf<TypeInherits<RefCounted, T>::value>::type> {
+ static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT;
+ static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE;
+
+ static inline PropertyInfo get_class_info() {
+ return PropertyInfo(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static());
+ }
+};
+
} // namespace godot
#endif // ! GODOT_CPP_REF_HPP