Explorar o código

Add `Object::cast_to` for `const Object*`

Marc Gilleron %!s(int64=2) %!d(string=hai) anos
pai
achega
99c004f689
Modificáronse 2 ficheiros con 17 adicións e 0 borrados
  1. 5 0
      binding_generator.py
  2. 12 0
      include/godot_cpp/core/object.hpp

+ 5 - 0
binding_generator.py

@@ -1083,10 +1083,15 @@ def generate_engine_class_header(class_api, used_classes, fully_used_classes, us
     # Special cases.
     if class_name == "Object":
         result.append("")
+
         result.append("\ttemplate<class T>")
         result.append("\tstatic T *cast_to(Object *p_object);")
 
+        result.append("\ttemplate<class T>")
+        result.append("\tstatic const T *cast_to(const Object *p_object);")
+
         result.append("\tvirtual ~Object() = default;")
+
     elif use_template_get_node and class_name == "Node":
         result.append("\ttemplate<class T>")
         result.append(

+ 12 - 0
include/godot_cpp/core/object.hpp

@@ -144,6 +144,18 @@ T *Object::cast_to(Object *p_object) {
 	return reinterpret_cast<T *>(internal::gdn_interface->object_get_instance_binding(casted, internal::token, &T::___binding_callbacks));
 }
 
+template <class T>
+const T *Object::cast_to(const Object *p_object) {
+	if (p_object == nullptr) {
+		return nullptr;
+	}
+	GDNativeObjectPtr casted = internal::gdn_interface->object_cast_to(p_object->_owner, internal::gdn_interface->classdb_get_class_tag(T::get_class_static()));
+	if (casted == nullptr) {
+		return nullptr;
+	}
+	return reinterpret_cast<const T *>(internal::gdn_interface->object_get_instance_binding(casted, internal::token, &T::___binding_callbacks));
+}
+
 } // namespace godot
 
 #endif // ! GODOT_OBJECT_HPP