Browse Source

reworked object system a little bit

Karroffel 8 years ago
parent
commit
575bb7f339
5 changed files with 70 additions and 43 deletions
  1. 1 0
      .gitignore
  2. 44 15
      binding_generator/src/main.rs
  3. 12 5
      include/SConstruct
  4. 12 22
      include/godot_cpp/Godot.hpp
  5. 1 1
      include/godot_cpp/core/Color.hpp

+ 1 - 0
.gitignore

@@ -3,3 +3,4 @@ include/godot_cpp/impl/
 include/godot.h
 include/godot
 *.os
+*.so

+ 44 - 15
binding_generator/src/main.rs

@@ -71,6 +71,9 @@ fn main() {
 	let mut icalls: HashSet<(String, Vec<String>)> = HashSet::new();
 
 	for class in json {
+		if class.api_type == "tools" {
+			continue
+		}
 		let used_classes = get_used_classes(&class);
 
 		let mut header = File::create((base_dir.to_string() + strip_name(&class.name) + ".hpp").as_str()).unwrap();
@@ -158,7 +161,7 @@ fn generate_class_header(used_classes: &HashSet<&String>, class: &GodotClass) ->
 	contents = contents + " {\n";
 
 	if class.base_class == "" {
-		contents = contents + "protected:\n\tgodot_object *__core_object = 0;\n\n";
+		contents = contents + "public:\n\tgodot_object *__core_object = 0;\n\n";
 	}
 
 	if class.singleton {
@@ -180,12 +183,22 @@ fn generate_class_header(used_classes: &HashSet<&String>, class: &GodotClass) ->
 		contents = contents + "\t" + strip_name(&class.name) + "(godot_object *ptr);\n\n";
 	}
 
+	// object constructor
+	if !class.singleton {
+		contents = contents + "\t" + strip_name(&class.name) + "(const Object& ptr);\n\n";
+	}
+
+	// object cast
+	{
+		contents = contents + "\toperator godot_object*();\n\n";
+	}
+
 	if class.base_class != "" {
 		contents = contents + "\tvoid _init();\n\n";
 	}
 
 	if class.instanciable {
-		contents = contents + "\tstatic " + strip_name(&class.name) + "& __new();\n";
+		contents = contents + "\tstatic " + strip_name(&class.name) + " __new();\n";
 		contents = contents + "\tvoid __destroy();\n\n";
 	}
 
@@ -196,10 +209,10 @@ fn generate_class_header(used_classes: &HashSet<&String>, class: &GodotClass) ->
 	contents += "\n\n";
 
 	for method in &class.methods {
-		contents = contents + "\t" + (if class.singleton { "static " } else if method.is_virtual { "virtual " } else { "" }) + strip_name(&method.return_type) + (if !is_core_type(&method.return_type) && !is_primitive(&method.return_type) { " &" } else { " " }) + escape_cpp(&method.name) + "(";
+		contents = contents + "\t" + (if class.singleton { "static " } else if method.is_virtual { "virtual " } else { "" }) + strip_name(&method.return_type) + (if !is_core_type(&method.return_type) && !is_primitive(&method.return_type) { " " } else { " " }) + escape_cpp(&method.name) + "(";
 
 		for (i, argument) in (&method.arguments).iter().enumerate() {
-			if !is_primitive(&argument._type) {
+			if !is_primitive(&argument._type) && !is_core_type(&argument._type) {
 				contents = contents + "const " + argument._type.as_str() + "&";
 			} else {
 				contents = contents + "const " + argument._type.as_str() + "";
@@ -241,6 +254,8 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 
 	contents = contents + "\n#include \"core/CoreTypes.hpp\"\n";
 
+	contents = contents + "\n#include \"Godot.hpp\"\n\n";
+
 	if class.instanciable {
 		contents = contents + "#include \"ClassDB.hpp\"\n";
 	}
@@ -294,6 +309,20 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 		contents = contents + "}\n\n\n";
 	}
 
+	// Object constructor
+	if !class.singleton {
+		contents = contents + "" + strip_name(&class.name) + "::" + strip_name(&class.name) + "(const Object& ptr)\n{\n";
+		contents = contents + "\t__core_object = ptr.__core_object;\n";
+		contents = contents + "}\n\n\n";
+	}
+
+	// Object constructor
+	{
+		contents = contents + "" + strip_name(&class.name) + "::operator godot_object*()\n{\n";
+		contents = contents + "\treturn __core_object;\n";
+		contents = contents + "}\n\n\n";
+	}
+
 	if class.base_class != "" {
 		contents = contents + "void " + strip_name(&class.name) + "::" + "_init()\n{\n";
 		contents = contents + "\t\n";
@@ -304,10 +333,10 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 	contents += "\n\n";
 
 	for method in &class.methods {
-		contents = contents + strip_name(&method.return_type) + (if !is_core_type(&method.return_type) && !is_primitive(&method.return_type) { " &" } else { " " }) + strip_name(&class.name) + "::" + escape_cpp(&method.name) + "(";
+		contents = contents + strip_name(&method.return_type) + (if !is_core_type(&method.return_type) && !is_primitive(&method.return_type) { " " } else { " " }) + strip_name(&class.name) + "::" + escape_cpp(&method.name) + "(";
 
 		for (i, argument) in (&method.arguments).iter().enumerate() {
-			if !is_primitive(&argument._type) {
+			if !is_primitive(&argument._type) && !is_core_type(&argument._type) {
 				contents = contents + "const " + argument._type.as_str() + "&";
 			} else {
 				contents = contents + "const " + argument._type.as_str() + "";
@@ -337,7 +366,7 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 		if method.return_type != "void" {
 			contents = contents + "return ";
 			if !is_primitive(&method.return_type) && !is_core_type(&method.return_type) {
-				contents = contents + "reinterpret_cast<" + strip_name(&method.return_type) + "&>(";
+				contents = contents + strip_name(&method.return_type) + "(";
 			}
 		}
 
@@ -379,9 +408,9 @@ fn generate_class_implementation(icalls: &mut HashSet<(String, Vec<String>)>, us
 
 	if class.instanciable {
 
-		contents = contents + strip_name(&class.name) + "& " + strip_name(&class.name) + "::__new() {\n";
+		contents = contents + strip_name(&class.name) + " " + strip_name(&class.name) + "::__new() {\n";
 		contents = contents + "\tObject ptr = ClassDB::instance(\"" + class.name.as_str() + "\");\n";
-		contents = contents + "\treturn reinterpret_cast<" + strip_name(&class.name) + "&>(ptr);\n";
+		contents = contents + "\treturn ptr;\n";
 		contents = contents + "}\n\n";
 
 		contents = contents + "void " + strip_name(&class.name) + "::__destroy() {\n";
@@ -443,7 +472,7 @@ fn generate_icall_header(icalls: &HashSet<(String, Vec<String>)>) -> String {
 		if is_primitive(t) || is_core_type(t) {
 			t.as_str()
 		} else {
-			"Object& "
+			"godot_object* "
 		}
 	}
 
@@ -464,7 +493,7 @@ fn generate_icall_header(icalls: &HashSet<(String, Vec<String>)>) -> String {
 		contents = contents + return_type(ret) + " " + get_icall_name_ref((ret, args)).as_str() + "(godot_method_bind *mb, godot_object *inst";
 		for arg in args {
 			contents = contents + ", ";
-			if !is_primitive(&arg) {
+			if !is_primitive(&arg) && is_core_type(&arg) {
 				contents = contents + "const " + arg.as_str() + "&";
 			} else {
 				contents = contents + "const " + arg.as_str() + "";
@@ -484,7 +513,7 @@ fn generate_icall_implementation(icalls: &HashSet<(String, Vec<String>)>) -> Str
 		if is_primitive(t) || is_core_type(t) {
 			t.as_str()
 		} else {
-			"Object& "
+			"godot_object* "
 		}
 	}
 
@@ -504,7 +533,7 @@ fn generate_icall_implementation(icalls: &HashSet<(String, Vec<String>)>) -> Str
 		let mut i = 0;
 		for arg in args {
 			contents = contents + ", ";
-			if !is_primitive(&arg) {
+			if !is_primitive(&arg) && is_core_type(&arg) {
 				contents = contents + "const " + arg.as_str() + "&";
 			} else {
 				contents = contents + "const " + arg.as_str() + "";
@@ -530,7 +559,7 @@ fn generate_icall_implementation(icalls: &HashSet<(String, Vec<String>)>) -> Str
 			} else if is_core_type(arg) {
 				contents = contents + "(void *) &arg" + j.to_string().as_str();
 			} else {
-				contents = contents + "(void *) &arg" + j.to_string().as_str();
+				contents = contents + "(void *) *(godot_object**) &arg" + j.to_string().as_str();
 			}
 			contents = contents + ",\n";
 			j = j + 1;
@@ -541,7 +570,7 @@ fn generate_icall_implementation(icalls: &HashSet<(String, Vec<String>)>) -> Str
 		contents = contents + "\tgodot_method_bind_ptrcall(mb, inst, args, " + if ret == "void" { "NULL" } else { "&ret" } + ");\n";
 
 		if !is_primitive(ret) && !is_core_type(ret) {
-			contents = contents + "\treturn reinterpret_cast<Object&>(ret);\n";
+			contents = contents + "\treturn ret;\n";
 		} else if ret != "void" {
 			contents = contents + "\treturn ret;\n";
 		}

+ 12 - 5
include/SConstruct

@@ -2,7 +2,9 @@
 import os
 
 env = Environment()
-env["CXX"] = "clang++"
+
+if ARGUMENTS.get("use_llvm", "yes") == "yes":
+    env["CXX"] = "clang++"
 
 target = ARGUMENTS.get("target", "core")
 
@@ -35,13 +37,18 @@ if (target == "core"):
     library = env.SharedLibrary(target='godot_cpp_core', source=sources)
     Default(library)
 
-elif target == "binding":
-    env.Append(CCFLAGS = ['-Wno-writable-strings'])
+elif target == "bindings":
+    if env["CXX"] == "clang++":
+        env.Append(CCFLAGS = ['-Wno-writable-strings'])
+    else:
+        env.Append(CCFLAGS = ['-Wno-write-strings', '-Wno-return-local-addr'])
+        
     env.Append(CCFLAGS = ['-g','-O3', '-std=c++14'])
     env.Append(CPPPATH=['.', './godot', './godot_cpp'])
 
-    env.Append(RPATH=['.'])
-    env.Append(LINKFLAGS=['-Rgodot_cpp_core'])
+    env.Append(LINKFLAGS = ['-Wl,-R,\'$$ORIGIN/\''])
+    env.Append(LIBS=['godot_cpp_core'])
+    env.Append(LIBPATH=["."])
 
 
     sources = [os.path.join("godot_cpp/impl/", f) for f in os.listdir("godot_cpp/impl/") if f.endswith('.cpp')]

+ 12 - 22
include/godot_cpp/Godot.hpp

@@ -20,16 +20,6 @@ namespace godot {
 
 
 
-template<class A, class B>
-A object_cast(B b)
-{
-	A *a = (A*) &b;
-	return *a;
-}
-
-
-
-
 
 // instance and destroy funcs
 
@@ -66,7 +56,7 @@ void register_class()
 
 template<class T, class R, class A0, class A1, class A2, class A3, class A4, R (T::*p)(A0, A1, A2, A3, A4)>
 struct WrappedMethod5 {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -80,7 +70,7 @@ struct WrappedMethod5 {
 
 template<class T, class A0, class A1, class A2, class A3, class A4, void (T::*p)(A0, A1, A2, A3, A4)>
 struct WrappedMethod5<T, void, A0, A1, A2, A3, A4, p> {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -93,7 +83,7 @@ struct WrappedMethod5<T, void, A0, A1, A2, A3, A4, p> {
 
 template<class T, class R, class A0, class A1, class A2, class A3, R (T::*p)(A0, A1, A2, A3)>
 struct WrappedMethod4 {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -107,7 +97,7 @@ struct WrappedMethod4 {
 
 template<class T, class A0, class A1, class A2, class A3, void (T::*p)(A0, A1, A2, A3)>
 struct WrappedMethod4<T, void, A0, A1, A2, A3, p> {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -121,7 +111,7 @@ struct WrappedMethod4<T, void, A0, A1, A2, A3, p> {
 
 template<class T, class R, class A0, class A1, class A2, R (T::*p)(A0, A1, A2)>
 struct WrappedMethod3 {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -135,7 +125,7 @@ struct WrappedMethod3 {
 
 template<class T, class A0, class A1, class A2, void (T::*p)(A0, A1, A2)>
 struct WrappedMethod3<T, void, A0, A1, A2, p> {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -148,7 +138,7 @@ struct WrappedMethod3<T, void, A0, A1, A2, p> {
 
 template<class T, class R, class A0, class A1, R (T::*p)(A0, A1)>
 struct WrappedMethod2 {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -162,7 +152,7 @@ struct WrappedMethod2 {
 
 template<class T, class A0, class A1, void (T::*p)(A0, A1)>
 struct WrappedMethod2<T, void, A0, A1, p> {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -175,7 +165,7 @@ struct WrappedMethod2<T, void, A0, A1, p> {
 
 template<class T, class R, class I, R (T::*p)(I)>
 struct WrappedMethod1 {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -189,7 +179,7 @@ struct WrappedMethod1 {
 
 template <class T, class I, void (T::*p)(I)>
 struct WrappedMethod1<T, void, I, p> {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -204,7 +194,7 @@ struct WrappedMethod1<T, void, I, p> {
 
 template<class T, class R, R (T::*p)()>
 struct WrappedMethod0 {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);
@@ -217,7 +207,7 @@ struct WrappedMethod0 {
 
 template<class T, void (T::*p)()>
 struct WrappedMethod0<T, void, p> {
-	static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
+	static godot_variant wrapped_method(godot_object *_, void *data, void *, int num_args, godot_variant **args)
 	{
 		godot_variant _variant;
 		godot_variant_new_nil(&_variant);

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

@@ -14,7 +14,7 @@ struct Color {
 
 
 private:
-	static float _parse_col(const String& p_str, int p_ofs);
+	// static float _parse_col(const String& p_str, int p_ofs);
 public:
 
 	union {