2
0
Эх сурвалжийг харах

Merge branch 'master' of https://github.com/okamstudio/godot into fix_android_payments

volzhs 10 жил өмнө
parent
commit
f6668dc9db
72 өөрчлөгдсөн 555 нэмэгдсэн , 305 устгасан
  1. 2 0
      core/bind/core_bind.cpp
  2. 10 1
      core/globals.cpp
  3. 1 0
      core/globals.h
  4. 4 4
      core/image.cpp
  5. 3 1
      core/io/file_access_encrypted.cpp
  6. 1 1
      core/io/http_client.cpp
  7. 1 1
      core/io/ip_address.cpp
  8. 1 1
      core/io/resource_format_binary.cpp
  9. 39 36
      core/io/resource_format_xml.cpp
  10. 2 2
      core/method_bind.cpp
  11. 5 2
      core/object.cpp
  12. 23 6
      core/object.h
  13. 14 8
      core/object_type_db.cpp
  14. 7 7
      core/object_type_db.h
  15. 1 0
      core/print_string.cpp
  16. 1 0
      core/print_string.h
  17. 8 8
      core/script_debugger_local.cpp
  18. 2 2
      core/string_db.cpp
  19. 11 1
      core/string_db.h
  20. 44 6
      core/ustring.cpp
  21. 1 0
      core/ustring.h
  22. 57 0
      core/variant.cpp
  23. 1 0
      core/variant.h
  24. 5 3
      core/vector.h
  25. 1 1
      drivers/speex/audio_stream_speex.cpp
  26. 6 0
      drivers/unix/os_unix.cpp
  27. 8 5
      main/main.cpp
  28. 10 2
      modules/gdscript/gd_script.cpp
  29. 2 0
      modules/gdscript/gd_script.h
  30. 4 4
      modules/gridmap/grid_map.cpp
  31. 4 4
      platform/android/export/export.cpp
  32. 23 0
      platform/iphone/app_delegate.mm
  33. 4 4
      scene/2d/animated_sprite.cpp
  34. 9 8
      scene/2d/area_2d.cpp
  35. 4 4
      scene/2d/canvas_item.cpp
  36. 36 22
      scene/2d/collision_object_2d.cpp
  37. 5 5
      scene/2d/node_2d.cpp
  38. 18 18
      scene/2d/particles_2d.cpp
  39. 19 15
      scene/2d/sprite.cpp
  40. 2 2
      scene/3d/area.cpp
  41. 4 4
      scene/3d/collision_object.cpp
  42. 4 4
      scene/3d/skeleton.cpp
  43. 1 1
      scene/3d/spatial.cpp
  44. 12 9
      scene/animation/animation_player.cpp
  45. 1 1
      scene/audio/sample_player.cpp
  46. 3 3
      scene/gui/base_button.cpp
  47. 4 4
      scene/gui/button.cpp
  48. 4 4
      scene/gui/button_array.cpp
  49. 20 20
      scene/gui/control.cpp
  50. 5 5
      scene/gui/label.cpp
  51. 8 8
      scene/gui/texture_button.cpp
  52. 3 3
      scene/gui/texture_frame.cpp
  53. 3 3
      scene/gui/tree.cpp
  54. 1 1
      scene/main/node.cpp
  55. 17 7
      scene/resources/animation.cpp
  56. 1 1
      scene/resources/animation.h
  57. 4 4
      scene/resources/baked_light.cpp
  58. 5 5
      scene/resources/mesh.cpp
  59. 4 4
      scene/resources/mesh_library.cpp
  60. 6 3
      scene/resources/packed_scene.cpp
  61. 2 2
      scene/resources/sample_library.cpp
  62. 6 6
      scene/resources/theme.cpp
  63. 9 0
      scene/scene_string_names.cpp
  64. 11 1
      scene/scene_string_names.h
  65. 2 2
      servers/physics_2d/space_2d_sw.cpp
  66. 2 2
      tools/collada/collada.cpp
  67. 3 3
      tools/doc/doc_data.cpp
  68. 2 2
      tools/docdump/doc_dump.cpp
  69. 2 2
      tools/editor/create_dialog.cpp
  70. 3 3
      tools/editor/editor_help.cpp
  71. 2 2
      tools/editor/plugins/script_editor_plugin.cpp
  72. 2 2
      tools/editor/property_editor.cpp

+ 2 - 0
core/bind/core_bind.cpp

@@ -1772,6 +1772,7 @@ void _Thread::_start_func(void *ud) {
 	memdelete(tud);
 	Variant::CallError ce;
 	const Variant* arg[1]={&t->userdata};
+
 	t->ret=t->target_instance->call(t->target_method,arg,1,ce);
 	if (ce.error!=Variant::CallError::CALL_OK) {
 
@@ -1796,6 +1797,7 @@ void _Thread::_start_func(void *ud) {
 			default: {}
 		}
 
+
 		ERR_EXPLAIN("Could not call function '"+t->target_method.operator String()+"'' starting thread ID: "+t->get_id()+" Reason: "+reason);
 		ERR_FAIL();
 	}

+ 10 - 1
core/globals.cpp

@@ -1149,6 +1149,12 @@ Error Globals::_save_settings_text(const String& p_file,const Map<String,List<St
 
 	return OK;
 }
+
+Error Globals::_save_custom_bnd(const String &p_file) { // add other params as dictionary and array?
+
+	return save_custom(p_file);
+};
+
 Error Globals::save_custom(const String& p_path,const CustomMap& p_custom,const Set<String>& p_ignore_masks) {
 
 	ERR_FAIL_COND_V(p_path=="",ERR_INVALID_PARAMETER);
@@ -1321,7 +1327,7 @@ Vector<String> Globals::get_optimizer_presets() const {
 
 		if (!E->get().name.begins_with("optimizer_presets/"))
 			continue;
-		names.push_back(E->get().name.get_slice("/",1));
+		names.push_back(E->get().name.get_slicec('/',1));
 	}
 
 	names.sort();
@@ -1361,6 +1367,9 @@ void Globals::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("has_singleton"),&Globals::has_singleton);
 	ObjectTypeDB::bind_method(_MD("get_singleton"),&Globals::get_singleton_object);
 	ObjectTypeDB::bind_method(_MD("load_resource_pack"),&Globals::_load_resource_pack);
+
+	ObjectTypeDB::bind_method(_MD("save_custom"),&Globals::_save_custom_bnd);
+
 }
 
 Globals::Globals() {

+ 1 - 0
core/globals.h

@@ -86,6 +86,7 @@ protected:
 
 	List<Singleton> singletons;
 
+	Error _save_custom_bnd(const String& p_file);
 
 	bool _load_resource_pack(const String& p_pack);
 

+ 4 - 4
core/image.cpp

@@ -1016,10 +1016,10 @@ void Image::create( const char ** p_xpm ) {
 			String line_str=line_ptr;
 			line_str.replace("\t"," ");
 			
-			size_width=line_str.get_slice(" ",0).to_int();
-			size_height=line_str.get_slice(" ",1).to_int();
-			colormap_size=line_str.get_slice(" ",2).to_int();
-			pixelchars=line_str.get_slice(" ",3).to_int();
+			size_width=line_str.get_slicec(' ',0).to_int();
+			size_height=line_str.get_slicec(' ',1).to_int();
+			colormap_size=line_str.get_slicec(' ',2).to_int();
+			pixelchars=line_str.get_slicec(' ',3).to_int();
 			ERR_FAIL_COND(colormap_size > 32766);
 			ERR_FAIL_COND(pixelchars > 5);
 			ERR_FAIL_COND(size_width > 32767);

+ 3 - 1
core/io/file_access_encrypted.cpp

@@ -5,10 +5,12 @@
 #include "print_string.h"
 #define COMP_MAGIC 0x43454447
 
+#include "core/variant.h"
+#include <stdio.h>
 
 Error FileAccessEncrypted::open_and_parse(FileAccess *p_base,const Vector<uint8_t>& p_key,Mode p_mode) {
 
-	print_line("open and parse!");
+	//print_line("open and parse!");
 	ERR_FAIL_COND_V(file!=NULL,ERR_ALREADY_IN_USE);
 	ERR_FAIL_COND_V(p_key.size()!=32,ERR_INVALID_PARAMETER);
 

+ 1 - 1
core/io/http_client.cpp

@@ -325,7 +325,7 @@ Error HTTPClient::poll(){
 
 						if (i==0 && responses[i].begins_with("HTTP")) {
 
-							String num = responses[i].get_slice(" ",1);
+							String num = responses[i].get_slicec(' ',1);
 							response_num=num.to_int();
 						} else {
 

+ 1 - 1
core/io/ip_address.cpp

@@ -47,7 +47,7 @@ IP_Address::IP_Address(const String& p_string) {
 	}
 	for(int i=0;i<4;i++) {
 
-		field[i]=p_string.get_slice(".",i).to_int();
+		field[i]=p_string.get_slicec('.',i).to_int();
 	}
 }
 

+ 1 - 1
core/io/resource_format_binary.cpp

@@ -1819,7 +1819,7 @@ Error ResourceFormatSaverBinaryInstance::save(const String &p_path,const RES& p_
 					Property p;
 					p.name_idx=get_string_index(F->get().name);
 					p.value=E->get()->get(F->get().name);
-					if (F->get().usage&PROPERTY_USAGE_STORE_IF_NONZERO && p.value.is_zero())
+					if ((F->get().usage&PROPERTY_USAGE_STORE_IF_NONZERO && p.value.is_zero())||(F->get().usage&PROPERTY_USAGE_STORE_IF_NONONE && p.value.is_one()) )
 						continue;
 					p.pi=F->get();										
 

+ 39 - 36
core/io/resource_format_xml.cpp

@@ -1207,47 +1207,47 @@ Error ResourceInteractiveLoaderXML::parse_property(Variant& r_v, String &r_name)
 
 
 		r_v=Vector3(
-				data.get_slice(",",0).to_double(),
-				data.get_slice(",",1).to_double(),
-				data.get_slice(",",2).to_double()
+				data.get_slicec(',',0).to_double(),
+				data.get_slicec(',',1).to_double(),
+				data.get_slicec(',',2).to_double()
 			   );
 
 	} else if (type=="vector2") {
 
 
 		r_v=Vector2(
-				data.get_slice(",",0).to_double(),
-				data.get_slice(",",1).to_double()
+				data.get_slicec(',',0).to_double(),
+				data.get_slicec(',',1).to_double()
 			   );
 
 	} else if (type=="plane") {
 
 		r_v=Plane(
-				data.get_slice(",",0).to_double(),
-				data.get_slice(",",1).to_double(),
-				data.get_slice(",",2).to_double(),
-				data.get_slice(",",3).to_double()
+				data.get_slicec(',',0).to_double(),
+				data.get_slicec(',',1).to_double(),
+				data.get_slicec(',',2).to_double(),
+				data.get_slicec(',',3).to_double()
 			 );
 
 	} else if (type=="quaternion") {
 
 		r_v=Quat(
-				data.get_slice(",",0).to_double(),
-				data.get_slice(",",1).to_double(),
-				data.get_slice(",",2).to_double(),
-				data.get_slice(",",3).to_double()
+				data.get_slicec(',',0).to_double(),
+				data.get_slicec(',',1).to_double(),
+				data.get_slicec(',',2).to_double(),
+				data.get_slicec(',',3).to_double()
 			 );
 
 	} else if (type=="rect2") {
 
 		r_v=Rect2(
 			Vector2(
-				data.get_slice(",",0).to_double(),
-				data.get_slice(",",1).to_double()
+				data.get_slicec(',',0).to_double(),
+				data.get_slicec(',',1).to_double()
 			),
 			Vector2(
-				data.get_slice(",",2).to_double(),
-				data.get_slice(",",3).to_double()
+				data.get_slicec(',',2).to_double(),
+				data.get_slicec(',',3).to_double()
 			)
 		);
 
@@ -1256,14 +1256,14 @@ Error ResourceInteractiveLoaderXML::parse_property(Variant& r_v, String &r_name)
 
 		r_v=AABB(
 			Vector3(
-				data.get_slice(",",0).to_double(),
-				data.get_slice(",",1).to_double(),
-				data.get_slice(",",2).to_double()
+				data.get_slicec(',',0).to_double(),
+				data.get_slicec(',',1).to_double(),
+				data.get_slicec(',',2).to_double()
 			),
 			Vector3(
-				data.get_slice(",",3).to_double(),
-				data.get_slice(",",4).to_double(),
-				data.get_slice(",",5).to_double()
+				data.get_slicec(',',3).to_double(),
+				data.get_slicec(',',4).to_double(),
+				data.get_slicec(',',5).to_double()
 			)
 		);
 
@@ -1272,7 +1272,7 @@ Error ResourceInteractiveLoaderXML::parse_property(Variant& r_v, String &r_name)
 		Matrix32 m3;
 		for (int i=0;i<3;i++) {
 			for (int j=0;j<2;j++) {
-				m3.elements[i][j]=data.get_slice(",",i*2+j).to_double();
+				m3.elements[i][j]=data.get_slicec(',',i*2+j).to_double();
 			}
 		}
 		r_v=m3;
@@ -1282,7 +1282,7 @@ Error ResourceInteractiveLoaderXML::parse_property(Variant& r_v, String &r_name)
 		Matrix3 m3;
 		for (int i=0;i<3;i++) {
 			for (int j=0;j<3;j++) {
-				m3.elements[i][j]=data.get_slice(",",i*3+j).to_double();
+				m3.elements[i][j]=data.get_slicec(',',i*3+j).to_double();
 			}
 		}
 		r_v=m3;
@@ -1292,24 +1292,24 @@ Error ResourceInteractiveLoaderXML::parse_property(Variant& r_v, String &r_name)
 		Transform tr;
 		for (int i=0;i<3;i++) {
 			for (int j=0;j<3;j++) {
-				tr.basis.elements[i][j]=data.get_slice(",",i*3+j).to_double();
+				tr.basis.elements[i][j]=data.get_slicec(',',i*3+j).to_double();
 			}
 
 		}
 		tr.origin=Vector3(
-			     data.get_slice(",",9).to_double(),
-			     data.get_slice(",",10).to_double(),
-			     data.get_slice(",",11).to_double()
+			     data.get_slicec(',',9).to_double(),
+			     data.get_slicec(',',10).to_double(),
+			     data.get_slicec(',',11).to_double()
 			   );
 		r_v=tr;
 
 	} else if (type=="color") {
 
 		r_v=Color(
-			   data.get_slice(",",0).to_double(),
-			   data.get_slice(",",1).to_double(),
-			   data.get_slice(",",2).to_double(),
-			   data.get_slice(",",3).to_double()
+			   data.get_slicec(',',0).to_double(),
+			   data.get_slicec(',',1).to_double(),
+			   data.get_slicec(',',2).to_double(),
+			   data.get_slicec(',',3).to_double()
 			 );
 
 	} else if (type=="node_path") {
@@ -1674,8 +1674,8 @@ void ResourceInteractiveLoaderXML::open(FileAccess *p_f) {
 		ERR_FAIL();
 	}
 
-	int major = version.get_slice(".",0).to_int();
-	int minor = version.get_slice(".",1).to_int();
+	int major = version.get_slicec('.',0).to_int();
+	int minor = version.get_slicec('.',1).to_int();
 
 	if (major>VERSION_MAJOR) {
 
@@ -2607,9 +2607,12 @@ Error ResourceFormatSaverXMLInstance::save(const String &p_path,const RES& p_res
 
 				String name = PE->get().name;
 				Variant value = res->get(name);
-				if (PE->get().usage&PROPERTY_USAGE_STORE_IF_NONZERO && value.is_zero())
+
+
+				if ((PE->get().usage&PROPERTY_USAGE_STORE_IF_NONZERO && value.is_zero())||(PE->get().usage&PROPERTY_USAGE_STORE_IF_NONONE && value.is_one()) )
 					continue;
 
+
 				write_property(name,value);
 			}
 

+ 2 - 2
core/method_bind.cpp

@@ -40,8 +40,8 @@ PropertyInfo MethodBind::get_argument_info(int p_argument) const {
 		PropertyInfo pi( get_argument_type(p_argument), name );
 		if ((pi.type==Variant::OBJECT) && name.find(":")!=-1) {
 			pi.hint=PROPERTY_HINT_RESOURCE_TYPE;
-			pi.hint_string=name.get_slice(":",1);
-			pi.name=name.get_slice(":",0);
+			pi.hint_string=name.get_slicec(':',1);
+			pi.name=name.get_slicec(':',0);
 		}
 		return pi;
 

+ 5 - 2
core/object.cpp

@@ -258,12 +258,15 @@ bool Object::_predelete() {
 	
 	_predelete_ok=1;
 	notification(NOTIFICATION_PREDELETE,true);
+	if (_predelete_ok) {
+		_type_ptr=NULL; //must restore so destructors can access type ptr correctly
+	}
 	return _predelete_ok;
 
 }
 
 void Object::_postinitialize() {
-	
+	_type_ptr=_get_type_namev();
 	_initialize_typev();
 	notification(NOTIFICATION_POSTINITIALIZE);
 	
@@ -1707,7 +1710,7 @@ bool Object::is_edited() const {
 
 Object::Object() {
 	
-
+	_type_ptr=NULL;
 	_block_signals=false;
 	_predelete_ok=0;
 	_instance_ID=0;

+ 23 - 6
core/object.h

@@ -82,7 +82,8 @@ enum PropertyUsageFlags {
 	PROPERTY_USAGE_BUNDLE=128, //used for optimized bundles
 	PROPERTY_USAGE_CATEGORY=256,
 	PROPERTY_USAGE_STORE_IF_NONZERO=512, //only store if nonzero
-	PROPERTY_USAGE_NO_INSTANCE_STATE=1024,
+	PROPERTY_USAGE_STORE_IF_NONONE=1024, //only store if false
+	PROPERTY_USAGE_NO_INSTANCE_STATE=2048,
 
 	PROPERTY_USAGE_DEFAULT=PROPERTY_USAGE_STORAGE|PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_NETWORK,
 	PROPERTY_USAGE_DEFAULT_INTL=PROPERTY_USAGE_STORAGE|PROPERTY_USAGE_EDITOR|PROPERTY_USAGE_NETWORK|PROPERTY_USAGE_INTERNATIONALIZED,
@@ -97,6 +98,8 @@ enum PropertyUsageFlags {
 #define ADD_PROPERTYI( m_property, m_setter, m_getter, m_index ) ObjectTypeDB::add_property( get_type_static(), m_property, m_setter, m_getter, m_index )
 #define ADD_PROPERTYNZ( m_property, m_setter, m_getter ) ObjectTypeDB::add_property( get_type_static(), (m_property).added_usage(PROPERTY_USAGE_STORE_IF_NONZERO), m_setter, m_getter )
 #define ADD_PROPERTYINZ( m_property, m_setter, m_getter, m_index ) ObjectTypeDB::add_property( get_type_static(), (m_property).added_usage(PROPERTY_USAGE_STORE_IF_NONZERO), m_setter, m_getter, m_index )
+#define ADD_PROPERTYNO( m_property, m_setter, m_getter ) ObjectTypeDB::add_property( get_type_static(), (m_property).added_usage(PROPERTY_USAGE_STORE_IF_NONONE), m_setter, m_getter )
+#define ADD_PROPERTYINO( m_property, m_setter, m_getter, m_index ) ObjectTypeDB::add_property( get_type_static(), (m_property).added_usage(PROPERTY_USAGE_STORE_IF_NONONE), m_setter, m_getter, m_index )
 
 struct PropertyInfo {
 	
@@ -179,10 +182,10 @@ public:\
 virtual String get_type() const { \
 	return String(#m_type);\
 }\
-virtual StringName get_type_name() const { \
+virtual const StringName* _get_type_namev() const { \
 	if (!_type_name)\
 		_type_name=get_type_static();\
-	return _type_name;\
+	return &_type_name;\
 }\
 static _FORCE_INLINE_ void* get_type_ptr_static() { \
 	static int ptr;\
@@ -388,6 +391,8 @@ friend void postinitialize_handler(Object*);
 	ScriptInstance *script_instance;
 	RefPtr script;
 	Dictionary metadata;
+	mutable StringName _type_name;
+	mutable const StringName* _type_ptr;
 
 	void _add_user_signal(const String& p_name, const Array& p_pargs=Array());
 	bool _has_user_signal(const StringName& p_name) const;
@@ -445,7 +450,11 @@ protected:
 	Variant _call_deferred_bind(const Variant** p_args, int p_argcount, Variant::CallError& r_error);
 
 
-
+	virtual const StringName* _get_type_namev() const {
+		if (!_type_name)
+			_type_name=get_type_static();
+		return &_type_name;
+	}
 
 	DVector<String> _get_meta_list_bind() const;
 	Array _get_property_list_bind() const;
@@ -523,11 +532,19 @@ public:
 
 	virtual String get_type() const { return "Object"; }
 	virtual String get_save_type() const { return get_type(); } //type stored when saving
-	virtual StringName get_type_name() const { return StringName("Object"); }
+
+
+
 	virtual bool is_type(const String& p_type) const { return (p_type=="Object"); }
 	virtual bool is_type_ptr(void *p_ptr) const { return get_type_ptr_static()==p_ptr; }
 
-
+	_FORCE_INLINE_ const StringName& get_type_name() const {
+		if (!_type_ptr) {
+			return *_get_type_namev();
+		} else {
+			return *_type_ptr;
+		}
+	}
 	
 	/* IAPI */
 //	void set(const String& p_name, const Variant& p_value);

+ 14 - 8
core/object_type_db.cpp

@@ -205,7 +205,7 @@ ObjectTypeDB::TypeInfo::~TypeInfo() {
 }
 
 
-bool ObjectTypeDB::is_type(const String &p_type,const String& p_inherits) {
+bool ObjectTypeDB::is_type(const StringName &p_type,const StringName& p_inherits) {
 	
 	OBJTYPE_LOCK;
 	
@@ -220,7 +220,7 @@ bool ObjectTypeDB::is_type(const String &p_type,const String& p_inherits) {
 	
 	return false;
 }
-void ObjectTypeDB::get_type_list( List<String> *p_types) {
+void ObjectTypeDB::get_type_list( List<StringName> *p_types) {
 	
 	OBJTYPE_LOCK;
 	
@@ -235,7 +235,7 @@ void ObjectTypeDB::get_type_list( List<String> *p_types) {
 }
 
 
-void ObjectTypeDB::get_inheriters_from( const String& p_type,List<String> *p_types) {
+void ObjectTypeDB::get_inheriters_from( const StringName& p_type,List<StringName> *p_types) {
 
 	OBJTYPE_LOCK;
 	
@@ -249,7 +249,7 @@ void ObjectTypeDB::get_inheriters_from( const String& p_type,List<String> *p_typ
 
 }
 
-String ObjectTypeDB::type_inherits_from(const String& p_type) {
+StringName ObjectTypeDB::type_inherits_from(const StringName& p_type) {
 	
 	OBJTYPE_LOCK;
 	
@@ -258,7 +258,7 @@ String ObjectTypeDB::type_inherits_from(const String& p_type) {
 	return ti->inherits;
 }
 
-bool ObjectTypeDB::type_exists(const String &p_type) {
+bool ObjectTypeDB::type_exists(const StringName &p_type) {
 	
 	OBJTYPE_LOCK;
 	return types.has(p_type);	
@@ -269,7 +269,7 @@ void ObjectTypeDB::add_compatibility_type(const StringName& p_type,const StringN
 	compat_types[p_type]=p_fallback;
 }
 
-Object *ObjectTypeDB::instance(const String &p_type) {
+Object *ObjectTypeDB::instance(const StringName &p_type) {
 	
 	TypeInfo *ti;
 	{
@@ -287,7 +287,7 @@ Object *ObjectTypeDB::instance(const String &p_type) {
 
 	return ti->creation_func();
 }
-bool ObjectTypeDB::can_instance(const String &p_type) {
+bool ObjectTypeDB::can_instance(const StringName &p_type) {
 	
 	OBJTYPE_LOCK;
 	
@@ -650,7 +650,13 @@ bool ObjectTypeDB::set_property(Object* p_object,const StringName& p_property, c
 				Variant index=psg->index;
 				const Variant* arg[2]={&index,&p_value};
 				Variant::CallError ce;
-				p_object->call(psg->setter,arg,2,ce);
+//				p_object->call(psg->setter,arg,2,ce);
+				if (psg->_setptr) {
+					psg->_setptr->call(p_object,arg,2,ce);
+				} else {
+					p_object->call(psg->setter,arg,2,ce);
+				}
+
 
 			} else {
 				const Variant* arg[1]={&p_value};

+ 7 - 7
core/object_type_db.h

@@ -228,13 +228,13 @@ public:
 		T::register_custom_data_to_otdb();
 	}
 
-	static void get_type_list( List<String> *p_types);
-	static void get_inheriters_from( const String& p_type,List<String> *p_types);
-	static String type_inherits_from(const String& p_type);
-	static bool type_exists(const String &p_type);
-	static bool is_type(const String &p_type,const String& p_inherits);
-	static bool can_instance(const String &p_type);	
-	static Object *instance(const String &p_type);
+	static void get_type_list( List<StringName> *p_types);
+	static void get_inheriters_from( const StringName& p_type,List<StringName> *p_types);
+	static StringName type_inherits_from(const StringName& p_type);
+	static bool type_exists(const StringName &p_type);
+	static bool is_type(const StringName &p_type,const StringName& p_inherits);
+	static bool can_instance(const StringName &p_type);
+	static Object *instance(const StringName &p_type);
 
 #if 0
 	template<class N, class M>

+ 1 - 0
core/print_string.cpp

@@ -32,6 +32,7 @@
 
 static PrintHandlerList *print_handler_list=NULL;
 bool _print_line_enabled=true;
+bool _print_error_enabled = true;
 
 void add_print_handler(PrintHandlerList *p_handler) {
 

+ 1 - 0
core/print_string.h

@@ -52,6 +52,7 @@ void add_print_handler(PrintHandlerList *p_handler);
 void remove_print_handler(PrintHandlerList *p_handler);
 
 extern bool _print_line_enabled;
+extern bool _print_error_enabled;
 extern void print_line(String p_string);
 
 #endif

+ 8 - 8
core/script_debugger_local.cpp

@@ -60,7 +60,7 @@ void ScriptDebuggerLocal::debug(ScriptLanguage *p_script,bool p_can_continue) {
 			if (line.get_slice_count(" ")==1) {
 				print_line("*Frame "+itos(current_frame)+" - "+p_script->debug_get_stack_level_source(current_frame)+":"+itos(p_script->debug_get_stack_level_line(current_frame))+" in function '"+p_script->debug_get_stack_level_function(current_frame)+"'");
 			} else {
-				int frame = line.get_slice(" ",1).to_int();
+				int frame = line.get_slicec(' ',1).to_int();
 				if (frame<0 || frame >=total_frames) {
 					print_line("Error: Invalid frame.");
 				} else {
@@ -108,7 +108,7 @@ void ScriptDebuggerLocal::debug(ScriptLanguage *p_script,bool p_can_continue) {
 				print_line("Usage: print <expre>");
 			} else {
 
-				String expr = line.get_slice(" ",2);
+				String expr = line.get_slicec(' ',2);
 				String res = p_script->debug_parse_stack_level_expression(current_frame,expr);
 				print_line(res);
 			}
@@ -130,9 +130,9 @@ void ScriptDebuggerLocal::debug(ScriptLanguage *p_script,bool p_can_continue) {
 			} else {
 
 
-				String bppos=line.get_slice(" ",1);
-				String source=bppos.get_slice(":",0).strip_edges();
-				int line=bppos.get_slice(":",1).strip_edges().to_int();
+				String bppos=line.get_slicec(' ',1);
+				String source=bppos.get_slicec(':',0).strip_edges();
+				int line=bppos.get_slicec(':',1).strip_edges().to_int();
 
 				source = breakpoint_find_source(source);
 
@@ -147,9 +147,9 @@ void ScriptDebuggerLocal::debug(ScriptLanguage *p_script,bool p_can_continue) {
 				clear_breakpoints();
 			} else {
 
-				String bppos=line.get_slice(" ",1);
-				String source=bppos.get_slice(":",0).strip_edges();
-				int line=bppos.get_slice(":",1).strip_edges().to_int();
+				String bppos=line.get_slicec(' ',1);
+				String source=bppos.get_slicec(':',0).strip_edges();
+				int line=bppos.get_slicec(':',1).strip_edges().to_int();
 
 				source = breakpoint_find_source(source);
 

+ 2 - 2
core/string_db.cpp

@@ -158,7 +158,7 @@ void StringName::operator=(const StringName& p_name) {
 		_data = p_name._data;		
 	}
 }
-
+/* was inlined
 StringName::operator String() const {
 	
 	if (_data)
@@ -166,7 +166,7 @@ StringName::operator String() const {
 	
 	return "";
 }
-
+*/
 StringName::StringName(const StringName& p_name) {
 	
 	ERR_FAIL_COND(!configured);

+ 11 - 1
core/string_db.h

@@ -114,7 +114,17 @@ public:
 	}
 	bool operator!=(const StringName& p_name) const;
 	
-	operator String() const;
+	_FORCE_INLINE_ operator String() const {
+
+		if (_data) {
+			if (_data->cname )
+				return String(_data->cname);
+			else
+				return _data->name;
+		}
+
+		return String();
+	}
 
 	static StringName search(const char *p_name);
 	static StringName search(const CharType *p_name);

+ 44 - 6
core/ustring.cpp

@@ -67,11 +67,14 @@ void String::copy_from(const char *p_cstr) {
 		return;
 	}
 	
+
 	resize(len+1); // include 0
 	
-	for(int i=0;i<len+1;i++) {
-	
-		set(i,p_cstr[i]);
+	CharType *dst = this->ptr();
+
+	for (int i=0;i<len+1;i++) {
+
+		dst[i]=p_cstr[i];
 	}
 
 }
@@ -486,7 +489,7 @@ String String::capitalize() const {
 	String cap;
 	for (int i=0;i<aux.get_slice_count(" ");i++) {
 		
-		String slice=aux.get_slice(" ",i);
+		String slice=aux.get_slicec(' ',i);
 		if (slice.length()>0) {
 		
 			slice[0]=_find_upper(slice[0]);
@@ -577,6 +580,41 @@ String String::get_slice(String p_splitter, int p_slice) const {
 
 }
 
+String String::get_slicec(CharType p_splitter, int p_slice) const {
+
+	if (empty())
+		return String();
+
+	if (p_slice<0)
+		return String();
+
+	const CharType *c=this->ptr();
+	int i=0;
+	int prev=0;
+	int count=0;
+	while(true) {
+
+
+		if (c[i]==0 || c[i]==p_splitter) {
+
+			if (p_slice==count) {
+
+				return substr(prev,i-prev);
+			} else {
+				count++;
+				prev=i+1;
+			}
+
+		}
+
+		i++;
+
+	}
+
+	return String(); //no find!
+
+}
+
 
 Vector<String> String::split_spaces() const {
 
@@ -3333,8 +3371,8 @@ String String::path_to(const String& p_path) const {
 		//nothing
 	} else {
 		//dos style
-		String src_begin=src.get_slice("/",0);
-		String dst_begin=dst.get_slice("/",0);
+		String src_begin=src.get_slicec('/',0);
+		String dst_begin=dst.get_slicec('/',0);
 
 		if (src_begin!=dst_begin)
 			return p_path; //impossible to do this

+ 1 - 0
core/ustring.h

@@ -153,6 +153,7 @@ public:
 
 	int get_slice_count(String p_splitter) const;
 	String get_slice(String p_splitter,int p_slice) const;
+	String get_slicec(CharType splitter,int p_slice) const;
 
 	Vector<String> split(const String &p_splitter,bool p_allow_empty=true) const;
 	Vector<String> split_spaces() const;

+ 57 - 0
core/variant.cpp

@@ -878,6 +878,63 @@ bool Variant::is_zero() const {
 	return false;
 }
 
+
+bool Variant::is_one() const {
+
+	switch( type ) {
+		case NIL: {
+
+			return true;
+		} break;
+
+		// atomic types
+		case BOOL: {
+
+			return _data._bool==true;
+		} break;
+		case INT: {
+
+			return _data._int==1;
+
+		} break;
+		case REAL: {
+
+			return _data._real==1;
+
+		} break;
+		case VECTOR2: {
+
+			return *reinterpret_cast<const Vector2*>(_data._mem)==Vector2(1,1);
+
+		} break;
+		case RECT2: {
+
+			return *reinterpret_cast<const Rect2*>(_data._mem)==Rect2(1,1,1,1);
+
+		} break;
+		case VECTOR3: {
+
+			return *reinterpret_cast<const Vector3*>(_data._mem)==Vector3(1,1,1);
+
+		} break;
+		case PLANE: {
+
+			return *reinterpret_cast<const Plane*>(_data._mem)==Plane(1,1,1,1);
+
+		} break;
+		case COLOR: {
+
+			return *reinterpret_cast<const Color*>(_data._mem)==Color(1,1,1,1);
+
+		} break;
+
+		default: { return !is_zero(); }
+	}
+
+	return false;
+}
+
+
 void Variant::reference(const Variant& p_variant) {
 
 	

+ 1 - 0
core/variant.h

@@ -185,6 +185,7 @@ public:
 	_FORCE_INLINE_ bool is_array() const { return type>=ARRAY; };
 	bool is_shared() const;
 	bool is_zero() const;
+	bool is_one() const;
 
 	operator bool() const;
 	operator signed int() const;

+ 5 - 3
core/vector.h

@@ -340,12 +340,14 @@ template<class T>
 void Vector<T>::remove(int p_index) {
 
 	ERR_FAIL_INDEX(p_index, size());
-	for (int i=p_index; i<size()-1; i++) {
+	T*p=ptr();
+	int len=size();
+	for (int i=p_index; i<len-1; i++) {
 
-		set(i, get(i+1));
+		p[i]=p[i+1];
 	};
 
-	resize(size()-1);
+	resize(len-1);
 };
 
 template<class T>

+ 1 - 1
drivers/speex/audio_stream_speex.cpp

@@ -21,7 +21,7 @@ void AudioStreamSpeex::update() {
 	//printf("update, loops %i, read ofs %i\n", (int)loops, read_ofs);
 	//printf("playing %i, paused %i\n", (int)playing, (int)paused);
 
-	if (!playing || paused || !data.size())
+	if (!active || !playing || paused || !data.size())
 		return;
 
 	/*

+ 6 - 0
drivers/unix/os_unix.cpp

@@ -57,8 +57,14 @@
 #include <errno.h>
 #include <assert.h>
 #include "globals.h"
+
+extern bool _print_error_enabled;
+
 void OS_Unix::print_error(const char* p_function,const char* p_file,int p_line,const char *p_code,const char*p_rationale,ErrorType p_type) {
 
+	if (!_print_error_enabled)
+		return;
+
 	if (p_rationale && p_rationale[0]) {
 
 		print("\E[1;31;40mERROR: %s: \E[1;37;40m%s\n",p_function,p_rationale);

+ 8 - 5
main/main.cpp

@@ -524,8 +524,8 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 		ScriptDebuggerRemote *sdr = memnew( ScriptDebuggerRemote );
 		uint16_t debug_port = GLOBAL_DEF("debug/remote_port",6007);
 		if (debug_host.find(":")!=-1) {
-		    debug_port=debug_host.get_slice(":",1).to_int();
-		    debug_host=debug_host.get_slice(":",0);
+		    debug_port=debug_host.get_slicec(':',1).to_int();
+		    debug_host=debug_host.get_slicec(':',0);
 		}
 		Error derr = sdr->connect_to_host(debug_host,debug_port);
 
@@ -546,8 +546,8 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 		file_access_network_client=memnew(FileAccessNetworkClient);
 		int port;
 		if (remotefs.find(":")!=-1) {
-			port=remotefs.get_slice(":",1).to_int();
-			remotefs=remotefs.get_slice(":",0);
+			port=remotefs.get_slicec(':',1).to_int();
+			remotefs=remotefs.get_slicec(':',0);
 		} else {
 			port=6010;
 		}
@@ -605,6 +605,9 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 	if (bool(Globals::get_singleton()->get("application/disable_stdout"))) {
 		quiet_stdout=true;
 	}
+	if (bool(Globals::get_singleton()->get("application/disable_stderr"))) {
+		_print_error_enabled = false;
+	};
 
 	if (quiet_stdout)
 		_print_line_enabled=false;
@@ -1219,7 +1222,7 @@ bool Main::start() {
 						String s = E->get().name;
 						if (!s.begins_with("autoload/"))
 							continue;
-						String name = s.get_slice("/",1);
+						String name = s.get_slicec('/',1);
 						String path = Globals::get_singleton()->get(s);
 						RES res = ResourceLoader::load(path);
 						ERR_EXPLAIN("Can't autoload: "+path);

+ 10 - 2
modules/gdscript/gd_script.cpp

@@ -1977,9 +1977,17 @@ void GDScript::_bind_methods() {
 
 	ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"new",&GDScript::_new,MethodInfo("new"));	
 
+	ObjectTypeDB::bind_method(_MD("get_as_byte_code"),&GDScript::get_as_byte_code);
+
 }
 
 
+Vector<uint8_t> GDScript::get_as_byte_code() const {
+
+	GDTokenizerBuffer tokenizer;
+	return tokenizer.parse_code_string(source);
+};
+
 
 Error GDScript::load_byte_code(const String& p_path) {
 
@@ -2556,9 +2564,9 @@ void GDScriptLanguage::init() {
 
 	//populate native classes
 
-	List<String> class_list;
+	List<StringName> class_list;
 	ObjectTypeDB::get_type_list(&class_list);
-	for(List<String>::Element *E=class_list.front();E;E=E->next()) {
+	for(List<StringName>::Element *E=class_list.front();E;E=E->next()) {
 
 		StringName n = E->get();
 		String s = String(n);

+ 2 - 0
modules/gdscript/gd_script.h

@@ -349,6 +349,8 @@ public:
 	Error load_source_code(const String& p_path);
 	Error load_byte_code(const String& p_path);
 
+	Vector<uint8_t> get_as_byte_code() const;
+
 	virtual ScriptLanguage *get_language() const;
 
 	GDScript();

+ 4 - 4
modules/gridmap/grid_map.cpp

@@ -130,8 +130,8 @@ bool GridMap::_set(const StringName& p_name, const Variant& p_value) {
 
 
 	} else if (name.begins_with("areas/")) {
-		int which = name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
+		int which = name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
 		if (what=="bounds") {
 			ERR_FAIL_COND_V(area_map.has(which),false);
 			create_area(which,p_value);
@@ -215,8 +215,8 @@ bool GridMap::_get(const StringName& p_name,Variant &r_ret) const {
 
 		r_ret= d;
 	} else if (name.begins_with("areas/")) {
-		int which = name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
+		int which = name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
 		if (what=="bounds")
 			r_ret= area_get_bounds(which);
 		else if (what=="name")

+ 4 - 4
platform/android/export/export.cpp

@@ -317,7 +317,7 @@ bool EditorExportPlatformAndroid::_set(const StringName& p_name, const Variant&
 		apk_expansion_pkey=p_value;
 	else if (n.begins_with("permissions/")) {
 
-		String what = n.get_slice("/",1).to_upper();
+		String what = n.get_slicec('/',1).to_upper();
 		bool state = p_value;
 		if (state)
 			perms.insert(what);
@@ -325,7 +325,7 @@ bool EditorExportPlatformAndroid::_set(const StringName& p_name, const Variant&
 			perms.erase(what);
 	} else if (n.begins_with("user_permissions/")) {
 
-		int which = n.get_slice("/",1).to_int();
+		int which = n.get_slicec('/',1).to_int();
 		ERR_FAIL_INDEX_V(which,MAX_USER_PERMISSIONS,false);
 		user_perms[which]=p_value;
 
@@ -390,11 +390,11 @@ bool EditorExportPlatformAndroid::_get(const StringName& p_name,Variant &r_ret)
 		r_ret=apk_expansion_pkey;
 	else if (n.begins_with("permissions/")) {
 
-		String what = n.get_slice("/",1).to_upper();
+		String what = n.get_slicec('/',1).to_upper();
 		r_ret = perms.has(what);
 	} else if (n.begins_with("user_permissions/")) {
 
-		int which = n.get_slice("/",1).to_int();
+		int which = n.get_slicec('/',1).to_int();
 		ERR_FAIL_INDEX_V(which,MAX_USER_PERMISSIONS,false);
 		r_ret=user_perms[which];
 	} else

+ 23 - 0
platform/iphone/app_delegate.mm

@@ -138,6 +138,29 @@ static int frame_count = 0;
 		Main::setup2();
 		++frame_count;
 
+		// this might be necessary before here
+		for (NSString* key in [[NSBundle mainBundle] infoDictionary]) {
+			NSObject* value = [xyz objectForKey:key];
+			String ukey = String::utf8([key UTF8String]);
+
+			// we need a NSObject to Variant conversor
+
+			if ([value isKindOfClass:[NSString class]]) {
+				NSString* str = (NSString*)value;
+				String uval = String::utf8([str UTF8String]);
+
+				Globals::get_singleton()->set("Info.plist/"+ukey, uval);
+
+			} else if ([value isKindOfClass:[NSNumber class]]) {
+
+				NSNumber* n = (NSNumber*)value;
+				double dval = [n doubleValue];
+
+				Globals::get_singleton()->set("Info.plist/"+ukey, dval);
+			};
+			// do stuff
+		}
+
 	} break;
 /*
 	case 3: {

+ 4 - 4
scene/2d/animated_sprite.cpp

@@ -330,11 +330,11 @@ void AnimatedSprite::_bind_methods() {
 
 	ADD_PROPERTYNZ( PropertyInfo( Variant::OBJECT, "frames",PROPERTY_HINT_RESOURCE_TYPE,"SpriteFrames"), _SCS("set_sprite_frames"),_SCS("get_sprite_frames"));
 	ADD_PROPERTYNZ( PropertyInfo( Variant::INT, "frame",PROPERTY_HINT_SPRITE_FRAME), _SCS("set_frame"),_SCS("get_frame"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "centered"), _SCS("set_centered"),_SCS("is_centered"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::BOOL, "centered"), _SCS("set_centered"),_SCS("is_centered"));
 	ADD_PROPERTYNZ( PropertyInfo( Variant::VECTOR2, "offset"), _SCS("set_offset"),_SCS("get_offset"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "flip_h"), _SCS("set_flip_h"),_SCS("is_flipped_h"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "flip_v"), _SCS("set_flip_v"),_SCS("is_flipped_v"));
-	ADD_PROPERTY( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "flip_h"), _SCS("set_flip_h"),_SCS("is_flipped_h"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "flip_v"), _SCS("set_flip_v"),_SCS("is_flipped_v"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate"));
 
 }
 

+ 9 - 8
scene/2d/area_2d.cpp

@@ -428,8 +428,9 @@ void Area2D::set_enable_monitoring(bool p_enable) {
 
 	if (monitoring) {
 
-		Physics2DServer::get_singleton()->area_set_monitor_callback(get_rid(),this,"_body_inout");
-		Physics2DServer::get_singleton()->area_set_area_monitor_callback(get_rid(),this,"_area_inout");
+		Physics2DServer::get_singleton()->area_set_monitor_callback(get_rid(),this,SceneStringNames::get_singleton()->_body_inout);
+		Physics2DServer::get_singleton()->area_set_area_monitor_callback(get_rid(),this,SceneStringNames::get_singleton()->_area_inout);
+
 	} else {
 		Physics2DServer::get_singleton()->area_set_monitor_callback(get_rid(),NULL,StringName());
 		Physics2DServer::get_singleton()->area_set_area_monitor_callback(get_rid(),NULL,StringName());
@@ -652,17 +653,17 @@ void Area2D::_bind_methods() {
 
 
 	ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"space_override",PROPERTY_HINT_ENUM,"Disabled,Combine,Replace"),_SCS("set_space_override_mode"),_SCS("get_space_override_mode"));
-	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"gravity_point"),_SCS("set_gravity_is_point"),_SCS("is_gravity_a_point"));
-	ADD_PROPERTY( PropertyInfo(Variant::REAL,"gravity_distance_scale", PROPERTY_HINT_RANGE,"0,1024,0.001"),_SCS("set_gravity_distance_scale"),_SCS("get_gravity_distance_scale"));
+	ADD_PROPERTYNZ( PropertyInfo(Variant::BOOL,"gravity_point"),_SCS("set_gravity_is_point"),_SCS("is_gravity_a_point"));
+	ADD_PROPERTYNZ( PropertyInfo(Variant::REAL,"gravity_distance_scale", PROPERTY_HINT_RANGE,"0,1024,0.001"),_SCS("set_gravity_distance_scale"),_SCS("get_gravity_distance_scale"));
 	ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"gravity_vec"),_SCS("set_gravity_vector"),_SCS("get_gravity_vector"));
 	ADD_PROPERTY( PropertyInfo(Variant::REAL,"gravity",PROPERTY_HINT_RANGE,"-1024,1024,0.01"),_SCS("set_gravity"),_SCS("get_gravity"));
 	ADD_PROPERTY( PropertyInfo(Variant::REAL,"linear_damp",PROPERTY_HINT_RANGE,"0,1024,0.001"),_SCS("set_linear_damp"),_SCS("get_linear_damp"));
 	ADD_PROPERTY( PropertyInfo(Variant::REAL,"angular_damp",PROPERTY_HINT_RANGE,"0,1024,0.001"),_SCS("set_angular_damp"),_SCS("get_angular_damp"));
 	ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"priority",PROPERTY_HINT_RANGE,"0,128,1"),_SCS("set_priority"),_SCS("get_priority"));
-	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"monitoring"),_SCS("set_enable_monitoring"),_SCS("is_monitoring_enabled"));
-	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"monitorable"),_SCS("set_monitorable"),_SCS("is_monitorable"));
-	ADD_PROPERTY( PropertyInfo(Variant::INT,"collision/layers",PROPERTY_HINT_ALL_FLAGS),_SCS("set_layer_mask"),_SCS("get_layer_mask"));
-	ADD_PROPERTY( PropertyInfo(Variant::INT,"collision/mask",PROPERTY_HINT_ALL_FLAGS),_SCS("set_collision_mask"),_SCS("get_collision_mask"));
+	ADD_PROPERTYNO( PropertyInfo(Variant::BOOL,"monitoring"),_SCS("set_enable_monitoring"),_SCS("is_monitoring_enabled"));
+	ADD_PROPERTYNO( PropertyInfo(Variant::BOOL,"monitorable"),_SCS("set_monitorable"),_SCS("is_monitorable"));
+	ADD_PROPERTYNO( PropertyInfo(Variant::INT,"collision/layers",PROPERTY_HINT_ALL_FLAGS),_SCS("set_layer_mask"),_SCS("get_layer_mask"));
+	ADD_PROPERTYNO( PropertyInfo(Variant::INT,"collision/mask",PROPERTY_HINT_ALL_FLAGS),_SCS("set_collision_mask"),_SCS("get_collision_mask"));
 
 }
 

+ 4 - 4
scene/2d/canvas_item.cpp

@@ -1103,14 +1103,14 @@ void CanvasItem::_bind_methods() {
 
 	BIND_VMETHOD(MethodInfo("_draw"));
 
-	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"visibility/visible"), _SCS("_set_visible_"),_SCS("_is_visible_") );
-	ADD_PROPERTY( PropertyInfo(Variant::REAL,"visibility/opacity",PROPERTY_HINT_RANGE, "0,1,0.01"), _SCS("set_opacity"),_SCS("get_opacity") );
-	ADD_PROPERTY( PropertyInfo(Variant::REAL,"visibility/self_opacity",PROPERTY_HINT_RANGE, "0,1,0.01"), _SCS("set_self_opacity"),_SCS("get_self_opacity") );
+	ADD_PROPERTYNO( PropertyInfo(Variant::BOOL,"visibility/visible"), _SCS("_set_visible_"),_SCS("_is_visible_") );
+	ADD_PROPERTYNO( PropertyInfo(Variant::REAL,"visibility/opacity",PROPERTY_HINT_RANGE, "0,1,0.01"), _SCS("set_opacity"),_SCS("get_opacity") );
+	ADD_PROPERTYNO( PropertyInfo(Variant::REAL,"visibility/self_opacity",PROPERTY_HINT_RANGE, "0,1,0.01"), _SCS("set_self_opacity"),_SCS("get_self_opacity") );
 	ADD_PROPERTYNZ( PropertyInfo(Variant::BOOL,"visibility/behind_parent"), _SCS("set_draw_behind_parent"),_SCS("is_draw_behind_parent_enabled") );
 	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"visibility/on_top",PROPERTY_HINT_NONE,"",0), _SCS("_set_on_top"),_SCS("_is_on_top") ); //compatibility
 
 	ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"visibility/blend_mode",PROPERTY_HINT_ENUM, "Mix,Add,Sub,Mul,PMAlpha"), _SCS("set_blend_mode"),_SCS("get_blend_mode") );
-	ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"visibility/light_mask",PROPERTY_HINT_ALL_FLAGS), _SCS("set_light_mask"),_SCS("get_light_mask") );
+	ADD_PROPERTYNO( PropertyInfo(Variant::INT,"visibility/light_mask",PROPERTY_HINT_ALL_FLAGS), _SCS("set_light_mask"),_SCS("get_light_mask") );
 	ADD_PROPERTYNZ( PropertyInfo(Variant::OBJECT,"material/material",PROPERTY_HINT_RESOURCE_TYPE, "CanvasItemMaterial"), _SCS("set_material"),_SCS("get_material") );
 	ADD_PROPERTYNZ( PropertyInfo(Variant::BOOL,"material/use_parent"), _SCS("set_use_parent_material"),_SCS("get_use_parent_material") );
 	//exporting these two things doesn't really make much sense i think

+ 36 - 22
scene/2d/collision_object_2d.cpp

@@ -115,19 +115,16 @@ void CollisionObject2D::_update_shapes() {
 bool CollisionObject2D::_set(const StringName& p_name, const Variant& p_value) {
 	String name=p_name;
 
-	if (name=="shape_count") {
+	if (name.begins_with("shapes/")) {
 
-		shapes.resize(p_value);
-		_update_shapes();
-		_change_notify();
-
-	} else if (name.begins_with("shapes/")) {
-
-		int idx=name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
-		if (what=="shape")
-			set_shape(idx,RefPtr(p_value));
-		else if (what=="transform")
+		int idx=name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
+		if (what=="shape") {
+			if (idx>=shapes.size())
+				add_shape(RefPtr(p_value));
+			else
+				set_shape(idx,RefPtr(p_value));
+		} else if (what=="transform")
 			set_shape_transform(idx,p_value);
 		else if (what=="trigger")
 			set_shape_as_trigger(idx,p_value);
@@ -143,12 +140,10 @@ bool CollisionObject2D::_get(const StringName& p_name,Variant &r_ret) const {
 
 	String name=p_name;
 
-	if (name=="shape_count") {
-		r_ret= shapes.size();
-	} else if (name.begins_with("shapes/")) {
+	if (name.begins_with("shapes/")) {
 
-		int idx=name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
+		int idx=name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
 		if (what=="shape")
 			r_ret= get_shape(idx);
 		else if (what=="transform")
@@ -163,7 +158,7 @@ bool CollisionObject2D::_get(const StringName& p_name,Variant &r_ret) const {
 
 void CollisionObject2D::_get_property_list( List<PropertyInfo> *p_list) const {
 
-	p_list->push_back( PropertyInfo(Variant::INT,"shape_count",PROPERTY_HINT_RANGE,"0,256,1",PROPERTY_USAGE_NOEDITOR|PROPERTY_USAGE_NO_INSTANCE_STATE) );
+	//p_list->push_back( PropertyInfo(Variant::INT,"shape_count",PROPERTY_HINT_RANGE,"0,256,1",PROPERTY_USAGE_NOEDITOR|PROPERTY_USAGE_NO_INSTANCE_STATE) );
 
 	for(int i=0;i<shapes.size();i++) {
 		String path="shapes/"+itos(i)+"/";
@@ -254,12 +249,19 @@ void CollisionObject2D::_bind_methods() {
 
 void CollisionObject2D::add_shape(const Ref<Shape2D>& p_shape, const Matrix32& p_transform) {
 
+	ERR_FAIL_COND(p_shape.is_null());
+
 	ShapeData sdata;
 	sdata.shape=p_shape;
 	sdata.xform=p_transform;
 	sdata.trigger=false;
-	shapes.push_back(sdata);
-	_update_shapes();
+
+	if (area)
+		Physics2DServer::get_singleton()->area_add_shape(get_rid(),p_shape->get_rid(),p_transform);
+	else
+		Physics2DServer::get_singleton()->body_add_shape(get_rid(),p_shape->get_rid(),p_transform);
+
+	shapes.push_back(sdata);	
 
 }
 int CollisionObject2D::get_shape_count() const {
@@ -270,8 +272,15 @@ int CollisionObject2D::get_shape_count() const {
 void CollisionObject2D::set_shape(int p_shape_idx, const Ref<Shape2D>& p_shape) {
 
 	ERR_FAIL_INDEX(p_shape_idx,shapes.size());
+	ERR_FAIL_COND(p_shape.is_null());
+
 	shapes[p_shape_idx].shape=p_shape;
-	_update_shapes();
+	if (area)
+		Physics2DServer::get_singleton()->area_set_shape(get_rid(),p_shape_idx,p_shape->get_rid());
+	else
+		Physics2DServer::get_singleton()->body_set_shape(get_rid(),p_shape_idx,p_shape->get_rid());
+
+//	_update_shapes();
 }
 
 void CollisionObject2D::set_shape_transform(int p_shape_idx, const Matrix32& p_transform) {
@@ -279,7 +288,12 @@ void CollisionObject2D::set_shape_transform(int p_shape_idx, const Matrix32& p_t
 	ERR_FAIL_INDEX(p_shape_idx,shapes.size());
 	shapes[p_shape_idx].xform=p_transform;
 
-	_update_shapes();
+	if (area)
+		Physics2DServer::get_singleton()->area_set_shape_transform(get_rid(),p_shape_idx,p_transform);
+	else
+		Physics2DServer::get_singleton()->body_set_shape_transform(get_rid(),p_shape_idx,p_transform);
+
+//	_update_shapes();
 }
 
 Ref<Shape2D> CollisionObject2D::get_shape(int p_shape_idx) const {

+ 5 - 5
scene/2d/node_2d.cpp

@@ -398,11 +398,11 @@ void Node2D::_bind_methods() {
 
 	ObjectTypeDB::bind_method(_MD("get_relative_transform"),&Node2D::get_relative_transform);
 
-	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"transform/pos"),_SCS("set_pos"),_SCS("get_pos"));
-	ADD_PROPERTY(PropertyInfo(Variant::REAL,"transform/rot",PROPERTY_HINT_RANGE,"-1440,1440,0.1"),_SCS("_set_rotd"),_SCS("_get_rotd"));
-	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"transform/scale"),_SCS("set_scale"),_SCS("get_scale"));
-	ADD_PROPERTY(PropertyInfo(Variant::INT,"z/z",PROPERTY_HINT_RANGE,itos(VS::CANVAS_ITEM_Z_MIN)+","+itos(VS::CANVAS_ITEM_Z_MAX)+",1"),_SCS("set_z"),_SCS("get_z"));
-	ADD_PROPERTY(PropertyInfo(Variant::BOOL,"z/relative"),_SCS("set_z_as_relative"),_SCS("is_z_relative"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2,"transform/pos"),_SCS("set_pos"),_SCS("get_pos"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::REAL,"transform/rot",PROPERTY_HINT_RANGE,"-1440,1440,0.1"),_SCS("_set_rotd"),_SCS("_get_rotd"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::VECTOR2,"transform/scale"),_SCS("set_scale"),_SCS("get_scale"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::INT,"z/z",PROPERTY_HINT_RANGE,itos(VS::CANVAS_ITEM_Z_MIN)+","+itos(VS::CANVAS_ITEM_Z_MAX)+",1"),_SCS("set_z"),_SCS("get_z"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::BOOL,"z/relative"),_SCS("set_z_as_relative"),_SCS("is_z_relative"));
 
 
 }

+ 18 - 18
scene/2d/particles_2d.cpp

@@ -1072,19 +1072,19 @@ void Particles2D::_bind_methods() {
 
 	ADD_PROPERTY(PropertyInfo(Variant::INT,"config/amount",PROPERTY_HINT_EXP_RANGE,"1,1024"),_SCS("set_amount"),_SCS("get_amount") );
 	ADD_PROPERTY(PropertyInfo(Variant::REAL,"config/lifetime",PROPERTY_HINT_EXP_RANGE,"0.1,3600,0.1"),_SCS("set_lifetime"),_SCS("get_lifetime") );
-	ADD_PROPERTY(PropertyInfo(Variant::REAL,"config/time_scale",PROPERTY_HINT_EXP_RANGE,"0.01,128,0.01"),_SCS("set_time_scale"),_SCS("get_time_scale") );
-	ADD_PROPERTY(PropertyInfo(Variant::REAL,"config/preprocess",PROPERTY_HINT_EXP_RANGE,"0.1,3600,0.1"),_SCS("set_pre_process_time"),_SCS("get_pre_process_time") );
-	ADD_PROPERTY(PropertyInfo(Variant::REAL,"config/emit_timeout",PROPERTY_HINT_RANGE,"0,3600,0.1"),_SCS("set_emit_timeout"),_SCS("get_emit_timeout") );
-	ADD_PROPERTY(PropertyInfo(Variant::BOOL,"config/emitting"),_SCS("set_emitting"),_SCS("is_emitting") );
-	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"config/offset"),_SCS("set_emissor_offset"),_SCS("get_emissor_offset"));
-	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"config/half_extents"),_SCS("set_emission_half_extents"),_SCS("get_emission_half_extents"));
-	ADD_PROPERTY(PropertyInfo(Variant::BOOL,"config/local_space"),_SCS("set_use_local_space"),_SCS("is_using_local_space"));
-	ADD_PROPERTY(PropertyInfo(Variant::REAL,"config/explosiveness",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_explosiveness"),_SCS("get_explosiveness"));
-	ADD_PROPERTY(PropertyInfo(Variant::BOOL,"config/flip_h"),_SCS("set_flip_h"),_SCS("is_flipped_h"));
-	ADD_PROPERTY(PropertyInfo(Variant::BOOL,"config/flip_v"),_SCS("set_flip_v"),_SCS("is_flipped_v"));
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"config/texture",PROPERTY_HINT_RESOURCE_TYPE,"Texture"),_SCS("set_texture"),_SCS("get_texture"));
-	ADD_PROPERTY(PropertyInfo(Variant::INT,"config/h_frames",PROPERTY_HINT_RANGE,"1,512,1"),_SCS("set_h_frames"),_SCS("get_h_frames"));
-	ADD_PROPERTY(PropertyInfo(Variant::INT,"config/v_frames",PROPERTY_HINT_RANGE,"1,512,1"),_SCS("set_v_frames"),_SCS("get_v_frames"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::REAL,"config/time_scale",PROPERTY_HINT_EXP_RANGE,"0.01,128,0.01"),_SCS("set_time_scale"),_SCS("get_time_scale") );
+	ADD_PROPERTYNZ(PropertyInfo(Variant::REAL,"config/preprocess",PROPERTY_HINT_EXP_RANGE,"0.1,3600,0.1"),_SCS("set_pre_process_time"),_SCS("get_pre_process_time") );
+	ADD_PROPERTYNZ(PropertyInfo(Variant::REAL,"config/emit_timeout",PROPERTY_HINT_RANGE,"0,3600,0.1"),_SCS("set_emit_timeout"),_SCS("get_emit_timeout") );
+	ADD_PROPERTYNO(PropertyInfo(Variant::BOOL,"config/emitting"),_SCS("set_emitting"),_SCS("is_emitting") );
+	ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2,"config/offset"),_SCS("set_emissor_offset"),_SCS("get_emissor_offset"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2,"config/half_extents"),_SCS("set_emission_half_extents"),_SCS("get_emission_half_extents"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::BOOL,"config/local_space"),_SCS("set_use_local_space"),_SCS("is_using_local_space"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::REAL,"config/explosiveness",PROPERTY_HINT_RANGE,"0,1,0.01"),_SCS("set_explosiveness"),_SCS("get_explosiveness"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL,"config/flip_h"),_SCS("set_flip_h"),_SCS("is_flipped_h"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL,"config/flip_v"),_SCS("set_flip_v"),_SCS("is_flipped_v"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"config/texture",PROPERTY_HINT_RESOURCE_TYPE,"Texture"),_SCS("set_texture"),_SCS("get_texture"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::INT,"config/h_frames",PROPERTY_HINT_RANGE,"1,512,1"),_SCS("set_h_frames"),_SCS("get_h_frames"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::INT,"config/v_frames",PROPERTY_HINT_RANGE,"1,512,1"),_SCS("set_v_frames"),_SCS("get_v_frames"));
 
 
 	for(int i=0;i<PARAM_MAX;i++) {
@@ -1092,10 +1092,10 @@ void Particles2D::_bind_methods() {
 	}
 
 	for(int i=0;i<PARAM_MAX;i++) {
-		ADD_PROPERTYI(PropertyInfo(Variant::REAL,_particlesframe_property_rnames[i],PROPERTY_HINT_RANGE,"-1,1,0.01"),_SCS("set_randomness"),_SCS("get_randomness"),i);
+		ADD_PROPERTYINZ(PropertyInfo(Variant::REAL,_particlesframe_property_rnames[i],PROPERTY_HINT_RANGE,"-1,1,0.01"),_SCS("set_randomness"),_SCS("get_randomness"),i);
 	}
 
-	ADD_PROPERTY( PropertyInfo( Variant::INT, "color_phases/count",PROPERTY_HINT_RANGE,"0,4,1", 0), _SCS("set_color_phases"), _SCS("get_color_phases"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::INT, "color_phases/count",PROPERTY_HINT_RANGE,"0,4,1", 0), _SCS("set_color_phases"), _SCS("get_color_phases"));
 
 	//Backward compatibility. They will be converted to color ramp
 	for(int i=0;i<MAX_COLOR_PHASES;i++) {
@@ -1104,10 +1104,10 @@ void Particles2D::_bind_methods() {
 		ADD_PROPERTYI( PropertyInfo( Variant::COLOR, phase+"color", PROPERTY_HINT_NONE, "", 0),_SCS("set_color_phase_color"),_SCS("get_color_phase_color"),i );
 	}
 
-	ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color/color"),_SCS("set_color"),_SCS("get_color"));
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"color/color_ramp",PROPERTY_HINT_RESOURCE_TYPE,"ColorRamp"),_SCS("set_color_ramp"),_SCS("get_color_ramp"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::COLOR, "color/color"),_SCS("set_color"),_SCS("get_color"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"color/color_ramp",PROPERTY_HINT_RESOURCE_TYPE,"ColorRamp"),_SCS("set_color_ramp"),_SCS("get_color_ramp"));
 
-	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2_ARRAY,"emission_points",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("set_emission_points"),_SCS("get_emission_points"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2_ARRAY,"emission_points",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("set_emission_points"),_SCS("get_emission_points"));
 
 	BIND_CONSTANT( PARAM_DIRECTION );
 	BIND_CONSTANT( PARAM_SPREAD );

+ 19 - 15
scene/2d/sprite.cpp

@@ -103,14 +103,18 @@ void Sprite::set_texture(const Ref<Texture>& p_texture) {
 
 	if (p_texture==texture)
 		return;
+#ifdef DEBUG_ENABLED
 	if (texture.is_valid()) {
 		texture->disconnect(CoreStringNames::get_singleton()->changed,this,SceneStringNames::get_singleton()->update);
 	}
+#endif
 	texture=p_texture;
+#ifdef DEBUG_ENABLED
 	if (texture.is_valid()) {
 		texture->set_flags(texture->get_flags()); //remove repeat from texture, it looks bad in sprites
 		texture->connect(CoreStringNames::get_singleton()->changed,this,SceneStringNames::get_singleton()->update);
 	}
+#endif
 	update();
 	item_rect_changed();
 }
@@ -313,17 +317,17 @@ void Sprite::_bind_methods() {
 
 	ADD_SIGNAL(MethodInfo("frame_changed"));
 
-	ADD_PROPERTY( PropertyInfo( Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_texture"),_SCS("get_texture"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "centered"), _SCS("set_centered"),_SCS("is_centered"));
-	ADD_PROPERTY( PropertyInfo( Variant::VECTOR2, "offset"), _SCS("set_offset"),_SCS("get_offset"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "flip_h"), _SCS("set_flip_h"),_SCS("is_flipped_h"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "flip_v"), _SCS("set_flip_v"),_SCS("is_flipped_v"));
-	ADD_PROPERTY( PropertyInfo( Variant::INT, "vframes"), _SCS("set_vframes"),_SCS("get_vframes"));
-	ADD_PROPERTY( PropertyInfo( Variant::INT, "hframes"), _SCS("set_hframes"),_SCS("get_hframes"));
-	ADD_PROPERTY( PropertyInfo( Variant::INT, "frame",PROPERTY_HINT_SPRITE_FRAME), _SCS("set_frame"),_SCS("get_frame"));
-	ADD_PROPERTY( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "region"), _SCS("set_region"),_SCS("is_region"));
-	ADD_PROPERTY( PropertyInfo( Variant::RECT2, "region_rect"), _SCS("set_region_rect"),_SCS("get_region_rect"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_texture"),_SCS("get_texture"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::BOOL, "centered"), _SCS("set_centered"),_SCS("is_centered"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::VECTOR2, "offset"), _SCS("set_offset"),_SCS("get_offset"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "flip_h"), _SCS("set_flip_h"),_SCS("is_flipped_h"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "flip_v"), _SCS("set_flip_v"),_SCS("is_flipped_v"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::INT, "vframes"), _SCS("set_vframes"),_SCS("get_vframes"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::INT, "hframes"), _SCS("set_hframes"),_SCS("get_hframes"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::INT, "frame",PROPERTY_HINT_SPRITE_FRAME), _SCS("set_frame"),_SCS("get_frame"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "region"), _SCS("set_region"),_SCS("is_region"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::RECT2, "region_rect"), _SCS("set_region_rect"),_SCS("get_region_rect"));
 
 }
 
@@ -530,10 +534,10 @@ void ViewportSprite::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("set_modulate","modulate"),&ViewportSprite::set_modulate);
 	ObjectTypeDB::bind_method(_MD("get_modulate"),&ViewportSprite::get_modulate);
 
-	ADD_PROPERTY( PropertyInfo( Variant::NODE_PATH, "viewport"), _SCS("set_viewport_path"),_SCS("get_viewport_path"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "centered"), _SCS("set_centered"),_SCS("is_centered"));
-	ADD_PROPERTY( PropertyInfo( Variant::VECTOR2, "offset"), _SCS("set_offset"),_SCS("get_offset"));
-	ADD_PROPERTY( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::NODE_PATH, "viewport"), _SCS("set_viewport_path"),_SCS("get_viewport_path"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::BOOL, "centered"), _SCS("set_centered"),_SCS("is_centered"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::VECTOR2, "offset"), _SCS("set_offset"),_SCS("get_offset"));
+	ADD_PROPERTYNO( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate"));
 
 }
 

+ 2 - 2
scene/3d/area.cpp

@@ -299,8 +299,8 @@ void Area::set_enable_monitoring(bool p_enable) {
 
 	if (monitoring) {
 
-		PhysicsServer::get_singleton()->area_set_monitor_callback(get_rid(),this,"_body_inout");
-		PhysicsServer::get_singleton()->area_set_area_monitor_callback(get_rid(),this,"_area_inout");
+		PhysicsServer::get_singleton()->area_set_monitor_callback(get_rid(),this,SceneStringNames::get_singleton()->_body_inout);
+		PhysicsServer::get_singleton()->area_set_area_monitor_callback(get_rid(),this,SceneStringNames::get_singleton()->_area_inout);
 	} else {
 		PhysicsServer::get_singleton()->area_set_monitor_callback(get_rid(),NULL,StringName());
 		PhysicsServer::get_singleton()->area_set_area_monitor_callback(get_rid(),NULL,StringName());

+ 4 - 4
scene/3d/collision_object.cpp

@@ -122,8 +122,8 @@ bool CollisionObject::_set(const StringName& p_name, const Variant& p_value) {
 
 	} else if (name.begins_with("shapes/")) {
 
-		int idx=name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
+		int idx=name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
 		if (what=="shape")
 			set_shape(idx,RefPtr(p_value));
 		else if (what=="transform")
@@ -148,8 +148,8 @@ bool CollisionObject::_get(const StringName& p_name,Variant &r_ret) const {
 		r_ret= shapes.size();
 	} else if (name.begins_with("shapes/")) {
 
-		int idx=name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
+		int idx=name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
 		if (what=="shape")
 			r_ret= get_shape(idx);
 		else if (what=="transform")

+ 4 - 4
scene/3d/skeleton.cpp

@@ -41,8 +41,8 @@ bool Skeleton::_set(const StringName& p_path, const Variant& p_value) {
 	if (!path.begins_with("bones/"))
 		return false;
 		
-	int which=path.get_slice("/",1).to_int();
-	String what=path.get_slice("/",2);
+	int which=path.get_slicec('/',1).to_int();
+	String what=path.get_slicec('/',2);
 
 
 	if (which==bones.size() && what=="name") {
@@ -88,8 +88,8 @@ bool Skeleton::_get(const StringName& p_name,Variant &r_ret) const {
 	if (!path.begins_with("bones/"))
 		return false;
 		
-	int which=path.get_slice("/",1).to_int();
-	String what=path.get_slice("/",2);
+	int which=path.get_slicec('/',1).to_int();
+	String what=path.get_slicec('/',2);
 		
 	ERR_FAIL_INDEX_V( which, bones.size(), false );
 	

+ 1 - 1
scene/3d/spatial.cpp

@@ -758,7 +758,7 @@ void Spatial::_bind_methods() {
 	ADD_PROPERTY( PropertyInfo(Variant::VECTOR3,"transform/rotation",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_EDITOR), _SCS("_set_rotation_deg"), _SCS("_get_rotation_deg") );
 	ADD_PROPERTY( PropertyInfo(Variant::VECTOR3,"transform/rotation_rad",PROPERTY_HINT_NONE,"",0), _SCS("set_rotation"), _SCS("get_rotation") );
 	ADD_PROPERTY( PropertyInfo(Variant::VECTOR3,"transform/scale",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_EDITOR), _SCS("set_scale"), _SCS("get_scale") );
-	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"visibility/visible"), _SCS("_set_visible_"), _SCS("_is_visible_") );
+	ADD_PROPERTYNO( PropertyInfo(Variant::BOOL,"visibility/visible"), _SCS("_set_visible_"), _SCS("_is_visible_") );
 	//ADD_PROPERTY( PropertyInfo(Variant::TRANSFORM,"transform/local"), _SCS("set_transform"), _SCS("get_transform") );
 
 	ADD_SIGNAL( MethodInfo("visibility_changed" ) );

+ 12 - 9
scene/animation/animation_player.cpp

@@ -35,10 +35,10 @@ bool AnimationPlayer::_set(const StringName& p_name, const Variant& p_value) {
 
 	String name=p_name;
 
-	if (name=="playback/speed" || name=="speed") { //bw compatibility
+	if (p_name==SceneStringNames::get_singleton()->playback_speed || p_name==SceneStringNames::get_singleton()->speed) { //bw compatibility
 		set_speed(p_value);
 
-	} else if (name=="playback/active") {
+	} else if (p_name==SceneStringNames::get_singleton()->playback_active) {
 		set_active(p_value);
 	} else if (name.begins_with("playback/play")) {
 
@@ -52,16 +52,16 @@ bool AnimationPlayer::_set(const StringName& p_name, const Variant& p_value) {
 	} else if (name.begins_with("anims/")) {
 	
 
-		String which=name.get_slice("/",1);
+		String which=name.get_slicec('/',1);
 		
 		add_animation(which,p_value);
 	} else if (name.begins_with("next/")) {
 
 
-		String which=name.get_slice("/",1);
+		String which=name.get_slicec('/',1);
 		animation_set_next(which,p_value);
 
-	} else if (name=="blend_times") {
+	} else if (p_name==SceneStringNames::get_singleton()->blend_times) {
 	
 		Array array=p_value;
 		int len = array.size();
@@ -77,7 +77,7 @@ bool AnimationPlayer::_set(const StringName& p_name, const Variant& p_value) {
 			set_blend_time(from,to,time);
 		}
 
-	} else if (name=="autoplay") {
+	} else if (p_name==SceneStringNames::get_singleton()->autoplay) {
 		autoplay=p_value;
 	
 	} else
@@ -106,12 +106,12 @@ bool AnimationPlayer::_get(const StringName& p_name,Variant &r_ret) const {
 
 	} else if (name.begins_with("anims/")) {
 	
-		String which=name.get_slice("/",1);
+		String which=name.get_slicec('/',1);
 		
 		r_ret= get_animation(which).get_ref_ptr();
 	} else if (name.begins_with("next/")) {
 
-		String which=name.get_slice("/",1);
+		String which=name.get_slicec('/',1);
 
 		r_ret= animation_get_next(which);
 
@@ -661,8 +661,11 @@ void AnimationPlayer::_animation_process(float p_delta) {
 
 Error AnimationPlayer::add_animation(const StringName& p_name, const Ref<Animation>& p_animation) {
 
+#ifdef DEBUG_ENABLED
 	ERR_EXPLAIN("Invalid animation name: "+String(p_name));
 	ERR_FAIL_COND_V( String(p_name).find("/")!=-1 || String(p_name).find(":")!=-1 || String(p_name).find(",")!=-1 || String(p_name).find("[")!=-1, ERR_INVALID_PARAMETER );
+#endif
+
 	ERR_FAIL_COND_V( p_animation.is_null() , ERR_INVALID_PARAMETER );
 	
 	//print_line("Add anim: "+String(p_name)+" name: "+p_animation->get_name());
@@ -1271,7 +1274,7 @@ AnimationPlayer::AnimationPlayer() {
 	animation_process_mode=ANIMATION_PROCESS_IDLE;
 	processing=false;
         default_blend_time=0;
-	root=NodePath("..");
+	root=SceneStringNames::get_singleton()->path_pp;
 	playing = false;
 	active=true;
 }

+ 1 - 1
scene/audio/sample_player.cpp

@@ -102,7 +102,7 @@ bool SamplePlayer::_get(const StringName& p_name,Variant &r_ret) const {
 		r_ret= get_sample_library();
 	} else if (name.begins_with("default/")) {
 
-			String what=name.get_slice("/",1);
+			String what=name.get_slicec('/',1);
 
 			if (what=="volume_db")
 				r_ret= get_default_volume_db();

+ 3 - 3
scene/gui/base_button.cpp

@@ -390,10 +390,10 @@ void BaseButton::_bind_methods() {
 	ADD_SIGNAL( MethodInfo("pressed" ) );
 	ADD_SIGNAL( MethodInfo("released" ) );
 	ADD_SIGNAL( MethodInfo("toggled", PropertyInfo( Variant::BOOL,"pressed") ) );
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "disabled"), _SCS("set_disabled"), _SCS("is_disabled"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "disabled"), _SCS("set_disabled"), _SCS("is_disabled"));
 	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "toggle_mode"), _SCS("set_toggle_mode"), _SCS("is_toggle_mode"));
-    ADD_PROPERTY( PropertyInfo( Variant::BOOL, "is_pressed"), _SCS("set_pressed"), _SCS("is_pressed"));
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "click_on_press"), _SCS("set_click_on_press"), _SCS("get_click_on_press"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "is_pressed"), _SCS("set_pressed"), _SCS("is_pressed"));
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "click_on_press"), _SCS("set_click_on_press"), _SCS("get_click_on_press"));
 
 
 	BIND_CONSTANT( DRAW_NORMAL );

+ 4 - 4
scene/gui/button.cpp

@@ -225,11 +225,11 @@ void Button::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("get_text_align"),&Button::get_text_align);
 	ObjectTypeDB::bind_method(_MD("is_flat"),&Button::is_flat);
 
-	ADD_PROPERTY( PropertyInfo( Variant::STRING, "text", PROPERTY_HINT_NONE,"",PROPERTY_USAGE_DEFAULT_INTL ), _SCS("set_text"),_SCS("get_text") );
-	ADD_PROPERTY( PropertyInfo( Variant::OBJECT, "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture" ), _SCS("set_button_icon"),_SCS("get_button_icon") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::STRING, "text", PROPERTY_HINT_NONE,"",PROPERTY_USAGE_DEFAULT_INTL ), _SCS("set_text"),_SCS("get_text") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::OBJECT, "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture" ), _SCS("set_button_icon"),_SCS("get_button_icon") );
 	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "flat" ), _SCS("set_flat"),_SCS("is_flat") );
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "clip_text" ), _SCS("set_clip_text"),_SCS("get_clip_text") );
-	ADD_PROPERTY( PropertyInfo( Variant::INT, "align",PROPERTY_HINT_ENUM,"Left,Center,Right" ), _SCS("set_text_align"),_SCS("get_text_align") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "clip_text" ), _SCS("set_clip_text"),_SCS("get_clip_text") );
+	ADD_PROPERTYNO( PropertyInfo( Variant::INT, "align",PROPERTY_HINT_ENUM,"Left,Center,Right" ), _SCS("set_text_align"),_SCS("get_text_align") );
 
 }
 

+ 4 - 4
scene/gui/button_array.cpp

@@ -34,7 +34,7 @@ bool ButtonArray::_set(const StringName& p_name, const Variant& p_value) {
 	String n=String(p_name);
 	if (n.begins_with("button/")) {
 
-		String what = n.get_slice("/",1);
+		String what = n.get_slicec('/',1);
 		if (what=="count") {
 			int new_size=p_value;
 			if (new_size>0 && buttons.size()==0) {
@@ -57,7 +57,7 @@ bool ButtonArray::_set(const StringName& p_name, const Variant& p_value) {
 		} else {
 			int idx=what.to_int();
 			ERR_FAIL_INDEX_V(idx,buttons.size(),false);
-			String f = n.get_slice("/",2);
+			String f = n.get_slicec('/',2);
 			if (f=="text")
 				buttons[idx].text=p_value;
 			else if (f=="icon")
@@ -80,7 +80,7 @@ bool ButtonArray::_get(const StringName& p_name,Variant &r_ret) const {
 	String n=String(p_name);
 	if (n.begins_with("button/")) {
 
-		String what = n.get_slice("/",1);
+		String what = n.get_slicec('/',1);
 		if (what=="count") {
 			r_ret=buttons.size();
 		} else if (what=="align") {
@@ -92,7 +92,7 @@ bool ButtonArray::_get(const StringName& p_name,Variant &r_ret) const {
 		} else {
 			int idx=what.to_int();
 			ERR_FAIL_INDEX_V(idx,buttons.size(),false);
-			String f = n.get_slice("/",2);
+			String f = n.get_slicec('/',2);
 			if (f=="text")
 				r_ret=buttons[idx].text;
 			else if (f=="icon")

+ 20 - 20
scene/gui/control.cpp

@@ -136,27 +136,27 @@ bool Control::_set(const StringName& p_name, const Variant& p_value) {
 	if (p_value.get_type()==Variant::NIL) {
 
 		if (name.begins_with("custom_icons/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			data.icon_override.erase(dname);
 			notification(NOTIFICATION_THEME_CHANGED);
 			update();
 		} else if (name.begins_with("custom_styles/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			data.style_override.erase(dname);
 			notification(NOTIFICATION_THEME_CHANGED);
 			update();
 		} else if (name.begins_with("custom_fonts/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			data.font_override.erase(dname);
 			notification(NOTIFICATION_THEME_CHANGED);
 			update();
 		} else if (name.begins_with("custom_colors/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			data.color_override.erase(dname);
 			notification(NOTIFICATION_THEME_CHANGED);
 			update();
 		} else if (name.begins_with("custom_constants/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			data.constant_override.erase(dname);
 			notification(NOTIFICATION_THEME_CHANGED);
 			update();
@@ -165,23 +165,23 @@ bool Control::_set(const StringName& p_name, const Variant& p_value) {
 
 	} else {
 		if (name.begins_with("custom_icons/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			notification(NOTIFICATION_THEME_CHANGED);
 			add_icon_override(dname,p_value);
 		} else if (name.begins_with("custom_styles/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			add_style_override(dname,p_value);
 			notification(NOTIFICATION_THEME_CHANGED);
 		} else if (name.begins_with("custom_fonts/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			add_font_override(dname,p_value);
 			notification(NOTIFICATION_THEME_CHANGED);
 		} else if (name.begins_with("custom_colors/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			add_color_override(dname,p_value);
 			notification(NOTIFICATION_THEME_CHANGED);
 		} else if (name.begins_with("custom_constants/")) {
-			String dname = name.get_slice("/",1);
+			String dname = name.get_slicec('/',1);
 			add_constant_override(dname,p_value);
 			notification(NOTIFICATION_THEME_CHANGED);
 		} else
@@ -217,22 +217,22 @@ bool Control::_get(const StringName& p_name,Variant &r_ret) const {
 		return false;
 
 	if (sname.begins_with("custom_icons/")) {
-		String name = sname.get_slice("/",1);
+		String name = sname.get_slicec('/',1);
 
 		r_ret= data.icon_override.has(name)?Variant(data.icon_override[name]):Variant();
 	} else if (sname.begins_with("custom_styles/")) {
-		String name = sname.get_slice("/",1);
+		String name = sname.get_slicec('/',1);
 
 		r_ret= data.style_override.has(name)?Variant(data.style_override[name]):Variant();
 	} else if (sname.begins_with("custom_fonts/")) {
-		String name = sname.get_slice("/",1);
+		String name = sname.get_slicec('/',1);
 
 		r_ret= data.font_override.has(name)?Variant(data.font_override[name]):Variant();
 	} else if (sname.begins_with("custom_colors/")) {
-		String name = sname.get_slice("/",1);
+		String name = sname.get_slicec('/',1);
 		r_ret= data.color_override.has(name)?Variant(data.color_override[name]):Variant();
 	} else if (sname.begins_with("custom_constants/")) {
-		String name = sname.get_slice("/",1);
+		String name = sname.get_slicec('/',1);
 
 		r_ret= data.constant_override.has(name)?Variant(data.constant_override[name]):Variant();
 	} else
@@ -2832,16 +2832,16 @@ void Control::_bind_methods() {
 	ADD_PROPERTYNZ( PropertyInfo(Variant::VECTOR2,"rect/size", PROPERTY_HINT_NONE, "",PROPERTY_USAGE_EDITOR), _SCS("set_size"),_SCS("get_size") );
 	ADD_PROPERTYNZ( PropertyInfo(Variant::VECTOR2,"rect/min_size"), _SCS("set_custom_minimum_size"),_SCS("get_custom_minimum_size") );
 	ADD_PROPERTYNZ( PropertyInfo(Variant::STRING,"hint/tooltip", PROPERTY_HINT_MULTILINE_TEXT), _SCS("set_tooltip"),_SCS("_get_tooltip") );
-	ADD_PROPERTYI( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/left" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_LEFT );
-	ADD_PROPERTYI( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/top" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_TOP );
-	ADD_PROPERTYI( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/right" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_RIGHT );
-	ADD_PROPERTYI( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/bottom" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_BOTTOM );
+	ADD_PROPERTYINZ( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/left" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_LEFT );
+	ADD_PROPERTYINZ( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/top" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_TOP );
+	ADD_PROPERTYINZ( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/right" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_RIGHT );
+	ADD_PROPERTYINZ( PropertyInfo(Variant::NODE_PATH,"focus_neighbour/bottom" ), _SCS("set_focus_neighbour"),_SCS("get_focus_neighbour"),MARGIN_BOTTOM );
 	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"focus/ignore_mouse"), _SCS("set_ignore_mouse"),_SCS("is_ignoring_mouse") );
 	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"focus/stop_mouse"), _SCS("set_stop_mouse"),_SCS("is_stopping_mouse") );
 
 	ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"size_flags/horizontal", PROPERTY_HINT_FLAGS, "Expand,Fill"), _SCS("set_h_size_flags"),_SCS("get_h_size_flags") );
 	ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"size_flags/vertical", PROPERTY_HINT_FLAGS, "Expand,Fill"), _SCS("set_v_size_flags"),_SCS("get_v_size_flags") );
-	ADD_PROPERTY( PropertyInfo(Variant::INT,"size_flags/stretch_ratio", PROPERTY_HINT_RANGE, "1,128,0.01"), _SCS("set_stretch_ratio"),_SCS("get_stretch_ratio") );
+	ADD_PROPERTYNO( PropertyInfo(Variant::INT,"size_flags/stretch_ratio", PROPERTY_HINT_RANGE, "1,128,0.01"), _SCS("set_stretch_ratio"),_SCS("get_stretch_ratio") );
 	ADD_PROPERTYNZ( PropertyInfo(Variant::OBJECT,"theme/theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), _SCS("set_theme"),_SCS("get_theme") );
 
 	BIND_CONSTANT( ANCHOR_BEGIN );

+ 5 - 5
scene/gui/label.cpp

@@ -613,11 +613,11 @@ void Label::_bind_methods() {
 	BIND_CONSTANT( VALIGN_BOTTOM );
 	BIND_CONSTANT( VALIGN_FILL );
 
-	ADD_PROPERTY( PropertyInfo( Variant::STRING, "text",PROPERTY_HINT_MULTILINE_TEXT,"",PROPERTY_USAGE_DEFAULT_INTL), _SCS("set_text"),_SCS("get_text") );
-	ADD_PROPERTY( PropertyInfo( Variant::INT, "align", PROPERTY_HINT_ENUM,"Left,Center,Right,Fill" ),_SCS("set_align"),_SCS("get_align") );
-	ADD_PROPERTY( PropertyInfo( Variant::INT, "valign", PROPERTY_HINT_ENUM,"Top,Center,Bottom,Fill" ),_SCS("set_valign"),_SCS("get_valign") );
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "autowrap"),_SCS("set_autowrap"),_SCS("has_autowrap") );
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "uppercase"),_SCS("set_uppercase"),_SCS("is_uppercase") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::STRING, "text",PROPERTY_HINT_MULTILINE_TEXT,"",PROPERTY_USAGE_DEFAULT_INTL), _SCS("set_text"),_SCS("get_text") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::INT, "align", PROPERTY_HINT_ENUM,"Left,Center,Right,Fill" ),_SCS("set_align"),_SCS("get_align") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::INT, "valign", PROPERTY_HINT_ENUM,"Top,Center,Bottom,Fill" ),_SCS("set_valign"),_SCS("get_valign") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "autowrap"),_SCS("set_autowrap"),_SCS("has_autowrap") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "uppercase"),_SCS("set_uppercase"),_SCS("is_uppercase") );
 	ADD_PROPERTY( PropertyInfo( Variant::REAL, "percent_visible", PROPERTY_HINT_RANGE,"0,1,0.001"),_SCS("set_percent_visible"),_SCS("get_percent_visible") );
 
 }

+ 8 - 8
scene/gui/texture_button.cpp

@@ -157,14 +157,14 @@ void TextureButton::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("get_scale"),&TextureButton::get_scale);
 	ObjectTypeDB::bind_method(_MD("get_modulate"),&TextureButton::get_modulate);
 
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"textures/normal",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_normal_texture"), _SCS("get_normal_texture"));
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"textures/pressed",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_pressed_texture"), _SCS("get_pressed_texture"));
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"textures/hover",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_hover_texture"), _SCS("get_hover_texture"));
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"textures/disabled",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_disabled_texture"), _SCS("get_disabled_texture"));
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"textures/focused",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_focused_texture"), _SCS("get_focused_texture"));
-	ADD_PROPERTY(PropertyInfo(Variant::OBJECT,"textures/click_mask",PROPERTY_HINT_RESOURCE_TYPE,"BitMap"), _SCS("set_click_mask"), _SCS("get_click_mask")) ;
-	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"params/scale",PROPERTY_HINT_RANGE,"0.01,1024,0.01"), _SCS("set_scale"), _SCS("get_scale"));
-	ADD_PROPERTY(PropertyInfo(Variant::COLOR,"params/modulate"), _SCS("set_modulate"), _SCS("get_modulate"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"textures/normal",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_normal_texture"), _SCS("get_normal_texture"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"textures/pressed",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_pressed_texture"), _SCS("get_pressed_texture"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"textures/hover",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_hover_texture"), _SCS("get_hover_texture"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"textures/disabled",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_disabled_texture"), _SCS("get_disabled_texture"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"textures/focused",PROPERTY_HINT_RESOURCE_TYPE,"Texture"), _SCS("set_focused_texture"), _SCS("get_focused_texture"));
+	ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT,"textures/click_mask",PROPERTY_HINT_RESOURCE_TYPE,"BitMap"), _SCS("set_click_mask"), _SCS("get_click_mask")) ;
+	ADD_PROPERTYNO(PropertyInfo(Variant::VECTOR2,"params/scale",PROPERTY_HINT_RANGE,"0.01,1024,0.01"), _SCS("set_scale"), _SCS("get_scale"));
+	ADD_PROPERTYNO(PropertyInfo(Variant::COLOR,"params/modulate"), _SCS("set_modulate"), _SCS("get_modulate"));
 
 }
 

+ 3 - 3
scene/gui/texture_frame.cpp

@@ -77,9 +77,9 @@ void TextureFrame::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("set_expand","enable"), & TextureFrame::set_expand );
 	ObjectTypeDB::bind_method(_MD("has_expand"), & TextureFrame::has_expand );
 
-	ADD_PROPERTY( PropertyInfo( Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), _SCS("set_texture"),_SCS("get_texture") );
-	ADD_PROPERTY( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate") );
-	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "expand" ), _SCS("set_expand"),_SCS("has_expand") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), _SCS("set_texture"),_SCS("get_texture") );
+	ADD_PROPERTYNO( PropertyInfo( Variant::COLOR, "modulate"), _SCS("set_modulate"),_SCS("get_modulate") );
+	ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "expand" ), _SCS("set_expand"),_SCS("has_expand") );
 
 }
 

+ 3 - 3
scene/gui/tree.cpp

@@ -1106,7 +1106,7 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
 						int option = (int)p_item->cells[i].val;
 
 						String s = p_item->cells[i].text;
-						s=s.get_slice(",",option);
+						s=s.get_slicec(',',option);
 
 						Ref<Texture> downarrow = cache.select_arrow;
 
@@ -1527,7 +1527,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos,int x_ofs,int y_ofs,bool p_
 					popup_menu->clear();
 					for (int i=0;i<c.text.get_slice_count(",");i++) {
 
-						String s = c.text.get_slice(",",i);
+						String s = c.text.get_slicec(',',i);
 						popup_menu->add_item(s,i);
 
 					}
@@ -2234,7 +2234,7 @@ bool Tree::edit_selected() {
 		popup_menu->clear();
 		for (int i=0;i<c.text.get_slice_count(",");i++) {
 
-			String s = c.text.get_slice(",",i);
+			String s = c.text.get_slicec(',',i);
 			popup_menu->add_item(s,i);
 
 		}

+ 1 - 1
scene/main/node.cpp

@@ -1891,7 +1891,7 @@ void Node::_bind_methods() {
 #ifdef TOOLS_ENABLED
 	ObjectTypeDB::bind_method(_MD("_set_import_path","import_path"),&Node::set_import_path);
 	ObjectTypeDB::bind_method(_MD("_get_import_path"),&Node::get_import_path);
-	ADD_PROPERTY( PropertyInfo(Variant::NODE_PATH,"_import_path",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("_set_import_path"),_SCS("_get_import_path"));
+	ADD_PROPERTYNZ( PropertyInfo(Variant::NODE_PATH,"_import_path",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("_set_import_path"),_SCS("_get_import_path"));
 
 #endif
 

+ 17 - 7
scene/resources/animation.cpp

@@ -42,8 +42,8 @@ bool Animation::_set(const StringName& p_name, const Variant& p_value) {
 		set_step(p_value);
 	else if (name.begins_with("tracks/")) {
 	
-		int track=name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
+		int track=name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
 
 		if (tracks.size()==track && what=="type") {
 		
@@ -257,8 +257,8 @@ bool Animation::_get(const StringName& p_name,Variant &r_ret) const {
 		r_ret= step;
 	else if (name.begins_with("tracks/")) {
 
-		int track=name.get_slice("/",1).to_int();
-		String what=name.get_slice("/",2);
+		int track=name.get_slicec('/',1).to_int();
+		String what=name.get_slicec('/',2);
 		ERR_FAIL_INDEX_V( track, tracks.size(), false );
 		if (what=="type") {
 		
@@ -1718,7 +1718,7 @@ void Animation::clear() {
 
 
 
-bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0,const TKey<TransformKey> &t1, const TKey<TransformKey> &t2, float p_alowed_linear_err,float p_alowed_angular_err,float p_max_optimizable_angle) {
+bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0,const TKey<TransformKey> &t1, const TKey<TransformKey> &t2, float p_alowed_linear_err,float p_alowed_angular_err,float p_max_optimizable_angle,const Vector3& p_norm) {
 
 
 	real_t c = (t1.time-t0.time)/(t2.time-t0.time);
@@ -1754,6 +1754,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0,const
 				return false; //beyond allowed error for colinearity
 			}
 
+			if (p_norm!=Vector3() && Math::acos(pd.normalized().dot(p_norm))>p_alowed_angular_err)
+				return false;
+
 			t[0] = (d1-d0)/(d2-d0);
 		}
 	}
@@ -1905,16 +1908,21 @@ void Animation::_transform_track_optimize(int p_idx,float p_alowed_linear_err,fl
 	bool prev_erased=false;
 	TKey<TransformKey> first_erased;
 
+	Vector3 norm;
+
 	for(int i=1;i<tt->transforms.size()-1;i++) {
 
 		TKey<TransformKey> &t0 = tt->transforms[i-1];
 		TKey<TransformKey> &t1 = tt->transforms[i];
 		TKey<TransformKey> &t2 = tt->transforms[i+1];
 
-		bool erase = _transform_track_optimize_key(t0,t1,t2,p_alowed_linear_err,p_alowed_angular_err,p_max_optimizable_angle);
+		bool erase = _transform_track_optimize_key(t0,t1,t2,p_alowed_linear_err,p_alowed_angular_err,p_max_optimizable_angle,norm);
+		if (erase && !prev_erased) {
+			norm=(t2.value.loc-t1.value.loc).normalized();
+		}
 
 
-		if (prev_erased && !_transform_track_optimize_key(t0,first_erased,t2,p_alowed_linear_err,p_alowed_angular_err,p_max_optimizable_angle)) {
+		if (prev_erased && !_transform_track_optimize_key(t0,first_erased,t2,p_alowed_linear_err,p_alowed_angular_err,p_max_optimizable_angle,norm)) {
 			 //avoid error to go beyond first erased key
 			erase=false;
 		}
@@ -1932,9 +1940,11 @@ void Animation::_transform_track_optimize(int p_idx,float p_alowed_linear_err,fl
 
 		} else {
 			prev_erased=false;
+			norm=Vector3();
 		}
 
 
+
 		//	print_line(itos(i)+" could be eliminated: "+rtos(tr));
 		//}
 	}

+ 1 - 1
scene/resources/animation.h

@@ -204,7 +204,7 @@ private:
 		return idxr;
 	}
 
-	bool _transform_track_optimize_key(const TKey<TransformKey> &t0,const TKey<TransformKey> &t1, const TKey<TransformKey> &t2, float p_alowed_linear_err,float p_alowed_angular_err,float p_max_optimizable_angle);
+	bool _transform_track_optimize_key(const TKey<TransformKey> &t0,const TKey<TransformKey> &t1, const TKey<TransformKey> &t2, float p_alowed_linear_err,float p_alowed_angular_err,float p_max_optimizable_angle,const Vector3& p_norm);
 	void _transform_track_optimize(int p_idx, float p_allowed_err=0.05, float p_alowed_angular_err=0.01,float p_max_optimizable_angle=Math_PI*0.125);
 
 protected:	

+ 4 - 4
scene/resources/baked_light.cpp

@@ -311,11 +311,11 @@ bool BakedLight::_set(const StringName& p_name, const Variant& p_value) {
 	String n = p_name;
 	if (!n.begins_with("lightmap"))
 		return false;
-	int idx = n.get_slice("/",1).to_int();
+	int idx = n.get_slicec('/',1).to_int();
 	ERR_FAIL_COND_V(idx<0,false);
 	ERR_FAIL_COND_V(idx>lightmaps.size(),false);
 
-	String what = n.get_slice("/",2);
+	String what = n.get_slicec('/',2);
 	Ref<Texture> tex;
 	Size2 gens;
 
@@ -343,11 +343,11 @@ bool BakedLight::_get(const StringName& p_name,Variant &r_ret) const{
 	String n = p_name;
 	if (!n.begins_with("lightmap"))
 		return false;
-	int idx = n.get_slice("/",1).to_int();
+	int idx = n.get_slicec('/',1).to_int();
 	ERR_FAIL_COND_V(idx<0,false);
 	ERR_FAIL_COND_V(idx>lightmaps.size(),false);
 
-	String what = n.get_slice("/",2);
+	String what = n.get_slicec('/',2);
 
 	if (what=="texture") {
 		if (idx==lightmaps.size())

+ 5 - 5
scene/resources/mesh.cpp

@@ -99,7 +99,7 @@ bool Mesh::_set(const StringName& p_name, const Variant& p_value) {
 		if (sl==-1)
 			return false;
 		int idx=sname.substr(8,sl-8).to_int()-1;
-		String what = sname.get_slice("/",1);
+		String what = sname.get_slicec('/',1);
 		if (what=="material")
 			surface_set_material(idx,p_value);
 		else if (what=="name")
@@ -117,8 +117,8 @@ bool Mesh::_set(const StringName& p_name, const Variant& p_value) {
 		return false;
 
 
-	int idx=sname.get_slice("/",1).to_int();
-	String what=sname.get_slice("/",2);
+	int idx=sname.get_slicec('/',1).to_int();
+	String what=sname.get_slicec('/',2);
 
 	if (idx==surfaces.size()) {
 
@@ -180,7 +180,7 @@ bool Mesh::_get(const StringName& p_name,Variant &r_ret) const {
 		if (sl==-1)
 			return false;
 		int idx=sname.substr(8,sl-8).to_int()-1;
-		String what = sname.get_slice("/",1);
+		String what = sname.get_slicec('/',1);
 		if (what=="material")
 			r_ret=surface_get_material(idx);
 		else if (what=="name")
@@ -195,7 +195,7 @@ bool Mesh::_get(const StringName& p_name,Variant &r_ret) const {
 		return false;
 
 
-	int idx=sname.get_slice("/",1).to_int();
+	int idx=sname.get_slicec('/',1).to_int();
 	ERR_FAIL_INDEX_V(idx,surfaces.size(),false);
 
 	Dictionary d;

+ 4 - 4
scene/resources/mesh_library.cpp

@@ -35,8 +35,8 @@ bool MeshLibrary::_set(const StringName& p_name, const Variant& p_value) {
 	String name=p_name;
 	if (name.begins_with("item/")) {
 
-		int idx = name.get_slice("/",1).to_int();
-		String what = name.get_slice("/",2);
+		int idx = name.get_slicec('/',1).to_int();
+		String what = name.get_slicec('/',2);
 		if (!item_map.has(idx))
 			create_item(idx);
 
@@ -60,9 +60,9 @@ bool MeshLibrary::_set(const StringName& p_name, const Variant& p_value) {
 bool MeshLibrary::_get(const StringName& p_name,Variant &r_ret) const {
 
 	String name=p_name;
-	int idx = name.get_slice("/",1).to_int();
+	int idx = name.get_slicec('/',1).to_int();
 	ERR_FAIL_COND_V(!item_map.has(idx),false);
-	String what = name.get_slice("/",2);
+	String what = name.get_slicec('/',2);
 
 	if(what=="name")
 		r_ret= get_item_name(idx);

+ 6 - 3
scene/resources/packed_scene.cpp

@@ -53,7 +53,7 @@ Node *PackedScene::instance(bool p_gen_edit_state) const {
 	if (prop_count)
 		props=&variants[0];
 
-	Vector<Variant> properties;
+	//Vector<Variant> properties;
 
 	const NodeData *nd = &nodes[0];
 
@@ -257,10 +257,13 @@ Error PackedScene::_parse_node(Node *p_owner,Node *p_node,int p_parent_idx, Map<
 		String name = E->get().name;
 		Variant value = p_node->get( E->get().name );
 
-		if (E->get().usage & PROPERTY_USAGE_STORE_IF_NONZERO && value.is_zero()) {
+		if (nd.instance<0 && ((E->get().usage & PROPERTY_USAGE_STORE_IF_NONZERO) && value.is_zero()) || ((E->get().usage & PROPERTY_USAGE_STORE_IF_NONONE) && value.is_one())) {
 			continue;
 		}
 
+		print_line("PASSED!");
+		print_line("at: "+String(p_node->get_name())+"::"+name+": -  nz: "+itos(E->get().usage&PROPERTY_USAGE_STORE_IF_NONZERO)+" no: "+itos(E->get().usage&PROPERTY_USAGE_STORE_IF_NONONE));
+		print_line("value: "+String(value)+" is zero: "+itos(value.is_zero())+" is one" +itos(value.is_one()));
 
 		if (nd.instance>=0) {
 			//only save changed properties in instance
@@ -278,7 +281,7 @@ Error PackedScene::_parse_node(Node *p_owner,Node *p_node,int p_parent_idx, Map<
 				continue;
 			}
 
-			if (instance_state[name]==value) {
+			if (instance_state.has(name) && instance_state[name]==value) {
 				continue;
 			}
 

+ 2 - 2
scene/resources/sample_library.cpp

@@ -34,7 +34,7 @@ bool SampleLibrary::_set(const StringName& p_name, const Variant& p_value) {
 
 	if (String(p_name).begins_with("samples/")) {
 
-		String name=String(p_name).get_slice("/",1);
+		String name=String(p_name).get_slicec('/',1);
 		if (p_value.get_type()==Variant::NIL)
 			sample_map.erase(name);
 		else {
@@ -66,7 +66,7 @@ bool SampleLibrary::_get(const StringName& p_name,Variant &r_ret) const {
 
 	if (String(p_name).begins_with("samples/")) {
 
-		String name=String(p_name).get_slice("/",1);
+		String name=String(p_name).get_slicec('/',1);
 		if(sample_map.has(name)) {
 			Dictionary d;
 			d["sample"]=sample_map[name].sample;

+ 6 - 6
scene/resources/theme.cpp

@@ -40,9 +40,9 @@ bool Theme::_set(const StringName& p_name, const Variant& p_value) {
 
 	if (sname.find("/")!=-1) {
 
-		String type=sname.get_slice("/",1);
-		String node_type=sname.get_slice("/",0);
-		String name=sname.get_slice("/",2);
+		String type=sname.get_slicec('/',1);
+		String node_type=sname.get_slicec('/',0);
+		String name=sname.get_slicec('/',2);
 
 		if (type=="icons") {
 
@@ -75,9 +75,9 @@ bool Theme::_get(const StringName& p_name,Variant &r_ret) const {
 
 	if (sname.find("/")!=-1) {
 
-		String type=sname.get_slice("/",1);
-		String node_type=sname.get_slice("/",0);
-		String name=sname.get_slice("/",2);
+		String type=sname.get_slicec('/',1);
+		String node_type=sname.get_slicec('/',0);
+		String name=sname.get_slicec('/',2);
 
 		if (type=="icons") {
 

+ 9 - 0
scene/scene_string_names.cpp

@@ -68,6 +68,8 @@ SceneStringNames::SceneStringNames() {
 	area_enter_shape = StaticCString::create("area_enter_shape");
 	area_exit_shape = StaticCString::create("area_exit_shape");
 
+	_body_inout = StaticCString::create("_body_inout");
+	_area_inout = StaticCString::create("_area_inout");
 
 	idle=StaticCString::create("idle");
 	iteration=StaticCString::create("iteration");
@@ -161,4 +163,11 @@ SceneStringNames::SceneStringNames() {
 
 	frame_changed=StaticCString::create("frame_changed");
 
+	playback_speed=StaticCString::create("playback/speed");
+	playback_active=StaticCString::create("playback/active");
+	autoplay=StaticCString::create("autoplay");
+	blend_times=StaticCString::create("blend_times");
+	speed=StaticCString::create("speed");
+
+	path_pp=NodePath("..");
 }

+ 11 - 1
scene/scene_string_names.h

@@ -30,7 +30,7 @@
 #define SCENE_STRING_NAMES_H
 
 #include "string_db.h"
-
+#include "path_db.h"
 class SceneStringNames {
 
 friend void register_scene_types();
@@ -87,6 +87,8 @@ public:
 	StringName area_enter_shape;
 	StringName area_exit_shape;
 
+	StringName _body_inout;
+	StringName _area_inout;
 
 
 	StringName _get_gizmo_geometry;
@@ -170,6 +172,14 @@ public:
 
 	StringName frame_changed;
 
+	StringName playback_speed;
+	StringName playback_active;
+	StringName autoplay;
+	StringName blend_times;
+	StringName speed;
+
+	NodePath path_pp;
+
 
 };
 

+ 2 - 2
servers/physics_2d/space_2d_sw.cpp

@@ -657,8 +657,8 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body,const Vector2&p_motion,float p
 						const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
 
 						Vector2 cdir = body->get_one_way_collision_direction();
-						if (cdir!=Vector2() && p_motion.dot(cdir)<0)
-							continue;
+						//if (cdir!=Vector2() && p_motion.dot(cdir)<0)
+						//	continue;
 
 						cbk.valid_dir=cdir;
 						cbk.valid_depth=body->get_one_way_collision_max_depth();

+ 2 - 2
tools/collada/collada.cpp

@@ -2054,8 +2054,8 @@ void Collada::_parse_animation(XMLParser& parser) {
 			}
 
 			if (target.find("/")!=-1) { //transform component
-				track.target=target.get_slice("/",0);
-				track.param=target.get_slice("/",1);
+				track.target=target.get_slicec('/',0);
+				track.param=target.get_slicec('/',1);
 				if (track.param.find(".")!=-1)
 					track.component=track.param.get_slice(".",1).to_upper();
 				track.param=track.param.get_slice(".",0);

+ 3 - 3
tools/doc/doc_data.cpp

@@ -137,9 +137,9 @@ void DocData::merge_from(const DocData& p_data) {
 void DocData::generate(bool p_basic_types) {
 
 
-	List<String> classes;
+	List<StringName> classes;
 	ObjectTypeDB::get_type_list(&classes);
-	classes.sort();
+	classes.sort_custom<StringName::AlphCompare>();
 
 	while(classes.size()) {
 
@@ -547,7 +547,7 @@ void DocData::generate(bool p_basic_types) {
 			Globals::Singleton &s=E->get();
 			pd.name=s.name;
 			pd.type=s.ptr->get_type();
-			while (ObjectTypeDB::type_inherits_from(pd.type)!="Object")
+			while (String(ObjectTypeDB::type_inherits_from(pd.type))!="Object")
 				pd.type=ObjectTypeDB::type_inherits_from(pd.type);
 			if (pd.type.begins_with("_"))
 				pd.type=pd.type.substr(1,pd.type.length());

+ 2 - 2
tools/docdump/doc_dump.cpp

@@ -76,10 +76,10 @@ static String _escape_string(const String& p_str) {
 void DocDump::dump(const String& p_file) {
 
 
-	List<String> class_list;
+	List<StringName> class_list;
 	ObjectTypeDB::get_type_list(&class_list);
 
-	class_list.sort();
+	class_list.sort_custom<StringName::AlphCompare>();
 
 
 	FileAccess *f = FileAccess::open(p_file,FileAccess::WRITE);

+ 2 - 2
tools/editor/create_dialog.cpp

@@ -128,7 +128,7 @@ void CreateDialog::_update_search() {
 	_parse_fs(EditorFileSystem::get_singleton()->get_filesystem());
 */
 
-	List<String> type_list;
+	List<StringName> type_list;
 	ObjectTypeDB::get_type_list(&type_list);
 
 	HashMap<String,TreeItem*> types;
@@ -137,7 +137,7 @@ void CreateDialog::_update_search() {
 
 	root->set_text(0,base_type);
 
-	List<String>::Element *I=type_list.front();
+	List<StringName>::Element *I=type_list.front();
 	TreeItem *to_select=NULL;
 
 	for(;I;I=I->next()) {

+ 3 - 3
tools/editor/editor_help.cpp

@@ -79,7 +79,7 @@ void EditorHelpSearch::_update_search() {
 	_parse_fs(EditorFileSystem::get_singleton()->get_filesystem());
 */
 
-	List<String> type_list;
+	List<StringName> type_list;
 	ObjectTypeDB::get_type_list(&type_list);
 
 	DocData *doc=EditorHelp::get_doc_data();
@@ -1241,13 +1241,13 @@ void EditorHelp::_update_doc() {
 
 	class_list->clear();
 
-	List<String> type_list;
+	List<StringName> type_list;
 
 	tree_item_map.clear();
 
 	TreeItem *root = class_list->create_item();
 	class_list->set_hide_root(true);
-	List<String>::Element *I=type_list.front();
+	List<StringName>::Element *I=type_list.front();
 
 	for(Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
 

+ 2 - 2
tools/editor/plugins/script_editor_plugin.cpp

@@ -321,10 +321,10 @@ void ScriptTextEditor::_load_theme_settings() {
 	//colorize engine types
 	Color type_color= EDITOR_DEF("text_editor/engine_type_color",Color(0.0,0.2,0.4));
 
-    List<String> types;
+	List<StringName> types;
 	ObjectTypeDB::get_type_list(&types);
 
-	for(List<String>::Element *E=types.front();E;E=E->next()) {
+	for(List<StringName>::Element *E=types.front();E;E=E->next()) {
 
 		get_text_edit()->add_keyword_color(E->get(),type_color);
 	}

+ 2 - 2
tools/editor/property_editor.cpp

@@ -614,9 +614,9 @@ bool CustomPropertyEditor::edit(Object* p_owner,const String& p_name,Variant::Ty
 
 					Set<String> valid_inheritors;
 					valid_inheritors.insert(base);
-					List<String> inheritors;
+					List<StringName> inheritors;
 					ObjectTypeDB::get_inheriters_from(base.strip_edges(),&inheritors);
-					List<String>::Element *E=inheritors.front();
+					List<StringName>::Element *E=inheritors.front();
 					while(E) {
 						valid_inheritors.insert(E->get());
 						E=E->next();