Browse Source

some NodePath fixes and better handling of Object type arguments

Karroffel 8 years ago
parent
commit
5e3b01f0f1

+ 22 - 1
binding_generator/src/main.rs

@@ -33,6 +33,7 @@ struct GodotMethod {
 	is_noscript: bool,
 	is_noscript: bool,
 	is_const: bool,
 	is_const: bool,
 	is_virtual: bool,
 	is_virtual: bool,
+	has_varargs: bool,
 	is_from_script: bool,
 	is_from_script: bool,
 	arguments: Vec<GodotArgument>
 	arguments: Vec<GodotArgument>
 }
 }
@@ -295,6 +296,13 @@ fn generate_class_header(used_classes: &HashSet<&String>, class: &GodotClass) ->
 			}
 			}
 		}
 		}
 
 
+		if method.has_varargs {
+			if method.arguments.len() > 0 {
+				contents += ", ";
+			}
+			contents = contents + "const Array& __var_args = Array()";
+		}
+
 		contents = contents + ")" + if method.is_const && !class.singleton { " const" } else { "" } + ";\n";
 		contents = contents + ")" + if method.is_const && !class.singleton { " const" } else { "" } + ";\n";
 		// contents = contents + ")" + if method.is_const { " const" } else { "" } + ";\n";
 		// contents = contents + ")" + if method.is_const { " const" } else { "" } + ";\n";
 	}
 	}
@@ -416,6 +424,13 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 			}
 			}
 		}
 		}
 
 
+		if method.has_varargs {
+			if method.arguments.len() > 0 {
+				contents += ", ";
+			}
+			contents = contents + "const Array& __var_args";
+		}
+
 		contents = contents + ")" + if method.is_const && !class.singleton { " const" } else { "" } + "\n{\n";
 		contents = contents + ")" + if method.is_const && !class.singleton { " const" } else { "" } + "\n{\n";
 
 
 
 
@@ -425,7 +440,7 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 			contents = contents + "\t}\n\n";
 			contents = contents + "\t}\n\n";
 		}
 		}
 
 
-		if method.is_virtual {
+		if method.is_virtual || method.has_varargs {
 
 
 			contents = contents + "\tArray __args;\n";
 			contents = contents + "\tArray __args;\n";
 
 
@@ -434,6 +449,12 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 				contents = contents + "\t__args.append(" + escape_cpp(&arg.name) + ");\n";
 				contents = contents + "\t__args.append(" + escape_cpp(&arg.name) + ");\n";
 			}
 			}
 
 
+			if method.has_varargs {
+				contents = contents + "\tfor (int i = 0; i < __var_args.size(); i++) {\n";
+				contents = contents + "\t\t__args.append(__var_args[i]);\n";
+				contents = contents + "\t}\n";
+			}
+
 			contents = contents + "\t";
 			contents = contents + "\t";
 
 
 			if method.return_type != "void" {
 			if method.return_type != "void" {

+ 29 - 10
include/godot_cpp/Godot.hpp

@@ -38,6 +38,25 @@ namespace godot {
 
 
 
 
 
 
+template<class T>
+struct _ArgCast {
+	static T _arg_cast(Variant a)
+	{
+		return (T) a;
+	}
+};
+
+template<class T>
+struct _ArgCast<T*> {
+	static T *_arg_cast(Variant a)
+	{
+		return (T *) ((Object *) a);
+	}
+};
+
+
+
+
 template<class T>
 template<class T>
 T *as(Object *obj)
 T *as(Object *obj)
 {
 {
@@ -188,7 +207,7 @@ struct _WrappedMethod1 {
 		Variant *var = (Variant *) &v;
 		Variant *var = (Variant *) &v;
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		*var = (obj->*(method->f))(*arg[0]);
+		*var = (obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -207,7 +226,7 @@ struct _WrappedMethod1<T, void, A0> {
 
 
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		(obj->*(method->f))(*arg[0]);
+		(obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]));
 
 
 		return v;
 		return v;
  	}
  	}
@@ -253,7 +272,7 @@ struct _WrappedMethod2 {
 		Variant *var = (Variant *) &v;
 		Variant *var = (Variant *) &v;
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		*var = (obj->*(method->f))(*arg[0], *arg[1]);
+		*var = (obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -272,7 +291,7 @@ struct _WrappedMethod2<T, void, A0, A1> {
 
 
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		(obj->*(method->f))(*arg[0], *arg[1]);
+		(obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -318,7 +337,7 @@ struct _WrappedMethod3 {
 		Variant *var = (Variant *) &v;
 		Variant *var = (Variant *) &v;
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		*var = (obj->*(method->f))(*arg[0], *arg[1], *arg[2]);
+		*var = (obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]), _ArgCast<A2>::_arg_cast(*arg[2]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -337,7 +356,7 @@ struct _WrappedMethod3<T, void, A0, A1, A2> {
 
 
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		(obj->*(method->f))(*arg[0], *arg[1], *arg[2]);
+		(obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]), _ArgCast<A2>::_arg_cast(*arg[2]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -382,7 +401,7 @@ struct _WrappedMethod4 {
 		Variant *var = (Variant *) &v;
 		Variant *var = (Variant *) &v;
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		*var = (obj->*(method->f))(*arg[0], *arg[1], *arg[2], *arg[3]);
+		*var = (obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]), _ArgCast<A2>::_arg_cast(*arg[2]), _ArgCast<A3>::_arg_cast(*arg[3]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -401,7 +420,7 @@ struct _WrappedMethod4<T, void, A0, A1, A2, A3> {
 
 
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		(obj->*(method->f))(*arg[0], *arg[1], *arg[2], *arg[3]);
+		(obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]), _ArgCast<A2>::_arg_cast(*arg[2]), _ArgCast<A3>::_arg_cast(*arg[3]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -445,7 +464,7 @@ struct _WrappedMethod5 {
 		Variant *var = (Variant *) &v;
 		Variant *var = (Variant *) &v;
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		*var = (obj->*(method->f))(*arg[0], *arg[1], *arg[2], *arg[3], *arg[4]);
+		*var = (obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]), _ArgCast<A2>::_arg_cast(*arg[2]), _ArgCast<A3>::_arg_cast(*arg[3]), _ArgCast<A4>::_arg_cast(*arg[4]));
 
 
 		return v;
 		return v;
 	}
 	}
@@ -464,7 +483,7 @@ struct _WrappedMethod5<T, void, A0, A1, A2, A3, A4> {
 
 
 		Variant **arg = (Variant **) args;
 		Variant **arg = (Variant **) args;
 
 
-		(obj->*(method->f))(*arg[0], *arg[1], *arg[2], *arg[3], *arg[4]);
+		(obj->*(method->f))(_ArgCast<A0>::_arg_cast(*arg[0]), _ArgCast<A1>::_arg_cast(*arg[1]), _ArgCast<A2>::_arg_cast(*arg[2]), _ArgCast<A3>::_arg_cast(*arg[3]), _ArgCast<A4>::_arg_cast(*arg[4]));
 
 
 		return v;
 		return v;
 	}
 	}

+ 19 - 0
include/godot_cpp/core/NodePath.cpp

@@ -9,7 +9,15 @@ namespace godot {
 
 
 NodePath::NodePath()
 NodePath::NodePath()
 {
 {
+	String from = "";
+	godot_node_path_new(&_node_path, (godot_string *) &from);
+}
 
 
+NodePath::NodePath(const NodePath &other)
+{
+	String from = other;
+	godot_node_path_new(&_node_path, (godot_string *) &from);
+	godot_node_path_copy(&_node_path, &other._node_path);
 }
 }
 
 
 NodePath::NodePath(const String &from)
 NodePath::NodePath(const String &from)
@@ -17,6 +25,12 @@ NodePath::NodePath(const String &from)
 	godot_node_path_new(&_node_path, (godot_string *) &from);
 	godot_node_path_new(&_node_path, (godot_string *) &from);
 }
 }
 
 
+NodePath::NodePath(const char *contents)
+{
+	String from = contents;
+	godot_node_path_new(&_node_path, (godot_string *) &from);
+}
+
 String NodePath::get_name(const int idx) const
 String NodePath::get_name(const int idx) const
 {
 {
 	godot_string str = godot_node_path_get_name(&_node_path, idx);
 	godot_string str = godot_node_path_get_name(&_node_path, idx);
@@ -63,6 +77,11 @@ NodePath::operator String() const
 	return *(String *) &str;
 	return *(String *) &str;
 }
 }
 
 
+void NodePath::operator =(const NodePath& other)
+{
+	godot_node_path_copy(&_node_path, &other._node_path);
+}
+
 NodePath::~NodePath()
 NodePath::~NodePath()
 {
 {
 	godot_node_path_destroy(&_node_path);
 	godot_node_path_destroy(&_node_path);

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

@@ -24,7 +24,11 @@ class GD_CPP_CORE_API NodePath
 public:
 public:
 	NodePath();
 	NodePath();
 
 
-	NodePath(const String &from);
+	NodePath(const NodePath &other);
+
+	NodePath(const String& from);
+
+	NodePath(const char *contents);
 
 
 	String get_name(const int idx) const;
 	String get_name(const int idx) const;
 
 
@@ -42,6 +46,8 @@ public:
 
 
 	operator String() const;
 	operator String() const;
 
 
+	void operator =(const NodePath& other);
+
 	~NodePath();
 	~NodePath();
 };
 };
 
 

+ 7 - 0
include/godot_cpp/core/String.cpp

@@ -1,5 +1,7 @@
 #include "String.hpp"
 #include "String.hpp"
 
 
+#include "NodePath.hpp"
+
 namespace godot {
 namespace godot {
 
 
 
 
@@ -119,6 +121,11 @@ bool String::operator >=(const String &s)
 	return !(*this < s);
 	return !(*this < s);
 }
 }
 
 
+String::operator NodePath() const
+{
+	return NodePath(*this);
+}
+
 const wchar_t *String::c_string() const
 const wchar_t *String::c_string() const
 {
 {
 	return godot_string_c_str(&_godot_string);
 	return godot_string_c_str(&_godot_string);

+ 4 - 0
include/godot_cpp/core/String.hpp

@@ -15,6 +15,8 @@
 
 
 namespace godot {
 namespace godot {
 
 
+class NodePath;
+
 class GD_CPP_CORE_API String
 class GD_CPP_CORE_API String
 {
 {
 	godot_string _godot_string;
 	godot_string _godot_string;
@@ -61,6 +63,8 @@ public:
 
 
 	bool operator >=(const String &s);
 	bool operator >=(const String &s);
 
 
+	operator NodePath() const;
+
 	const wchar_t *c_string() const;
 	const wchar_t *c_string() const;
 
 
 };
 };

+ 4 - 0
include/godot_cpp/core/Variant.cpp

@@ -385,6 +385,10 @@ Variant::operator PoolColorArray() const
 	godot_pool_color_array s = godot_variant_as_pool_color_array(&_godot_variant);
 	godot_pool_color_array s = godot_variant_as_pool_color_array(&_godot_variant);
 	return *(PoolColorArray *) &s;
 	return *(PoolColorArray *) &s;
 }
 }
+Variant::operator Object*() const {
+	godot_object *o = godot_variant_as_object(&_godot_variant);
+	return (Object *) o;
+}
 
 
 Variant::Type Variant::get_type() const
 Variant::Type Variant::get_type() const
 {
 {

+ 1 - 1
include/godot_cpp/core/Variant.hpp

@@ -205,7 +205,7 @@ public:
 	operator NodePath() const;
 	operator NodePath() const;
 	operator RID() const;
 	operator RID() const;
 	operator InputEvent() const;
 	operator InputEvent() const;
-	operator Object() const;
+	operator Object*() const;
 
 
 	operator Dictionary() const;
 	operator Dictionary() const;
 	operator Array() const;
 	operator Array() const;