浏览代码

Added property info for ptr and ref + ported the implementation of the `check` method

Дмитрий Сальников 2 年之前
父节点
当前提交
0c6e26dabe
共有 3 个文件被更改,包括 11 次插入5 次删除
  1. 2 2
      include/godot_cpp/classes/ref.hpp
  2. 7 1
      include/godot_cpp/core/binder_common.hpp
  3. 2 2
      include/godot_cpp/core/type_info.hpp

+ 2 - 2
include/godot_cpp/classes/ref.hpp

@@ -276,7 +276,7 @@ struct GetTypeInfo<Ref<T>, typename EnableIf<TypeInherits<RefCounted, T>::value>
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 
 
 	static inline PropertyInfo get_class_info() {
 	static inline PropertyInfo get_class_info() {
-		return make_property_info(Variant::Type::OBJECT, T::get_class_static());
+		return make_property_info(Variant::Type::OBJECT, "", PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static());
 	}
 	}
 };
 };
 
 
@@ -286,7 +286,7 @@ struct GetTypeInfo<const Ref<T> &, typename EnableIf<TypeInherits<RefCounted, T>
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 
 
 	static inline PropertyInfo get_class_info() {
 	static inline PropertyInfo get_class_info() {
-		return make_property_info(Variant::Type::OBJECT, T::get_class_static());
+		return make_property_info(Variant::Type::OBJECT, "", PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static());
 	}
 	}
 };
 };
 
 

+ 7 - 1
include/godot_cpp/core/binder_common.hpp

@@ -122,7 +122,13 @@ struct VariantCaster<const T &> {
 template <typename T>
 template <typename T>
 struct VariantObjectClassChecker {
 struct VariantObjectClassChecker {
 	static _FORCE_INLINE_ bool check(const Variant &p_variant) {
 	static _FORCE_INLINE_ bool check(const Variant &p_variant) {
-		return true;
+		using TStripped = std::remove_pointer_t<T>;
+		if constexpr (std::is_base_of<Object, TStripped>::value) {
+			Object *obj = p_variant;
+			return Object::cast_to<TStripped>(p_variant) || !obj;
+		} else {
+			return true;
+		}
 	}
 	}
 };
 };
 
 

+ 2 - 2
include/godot_cpp/core/type_info.hpp

@@ -201,7 +201,7 @@ struct GetTypeInfo<T *, typename EnableIf<TypeInherits<Object, T>::value>::type>
 	static const GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_OBJECT;
 	static const GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_OBJECT;
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 	static inline PropertyInfo get_class_info() {
 	static inline PropertyInfo get_class_info() {
-		return make_property_info(Variant::Type::OBJECT, T::get_class_static());
+		return make_property_info(Variant::Type::OBJECT, "", PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static());
 	}
 	}
 };
 };
 
 
@@ -210,7 +210,7 @@ struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>:
 	static const GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_OBJECT;
 	static const GDExtensionVariantType VARIANT_TYPE = GDEXTENSION_VARIANT_TYPE_OBJECT;
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 	static const GDExtensionClassMethodArgumentMetadata METADATA = GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE;
 	static inline PropertyInfo get_class_info() {
 	static inline PropertyInfo get_class_info() {
-		return make_property_info(Variant::Type::OBJECT, T::get_class_static());
+		return make_property_info(Variant::Type::OBJECT, "", PROPERTY_HINT_RESOURCE_TYPE, T::get_class_static());
 	}
 	}
 };
 };