Browse Source

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

Juan Linietsky 10 years ago
parent
commit
963845eea9

+ 3 - 0
.gitignore

@@ -23,6 +23,9 @@ tools/editor/editor_icons.cpp
 make.bat
 log.txt
 
+# Javascript specific
+*.bc
+
 # Android specific
 platform/android/java/local.properties
 platform/android/java/project.properties

+ 7 - 0
SConstruct

@@ -111,6 +111,7 @@ opts.Add('jpg','JPG Image loader support (yes/no)','yes')
 opts.Add('webp','WEBP Image loader support (yes/no)','yes')
 opts.Add('dds','DDS Texture loader support (yes/no)','yes')
 opts.Add('pvr','PVR (PowerVR) Texture loader support (yes/no)','yes')
+opts.Add('etc1','etc1 Texture compression support (yes/no)','yes')
 opts.Add('builtin_zlib','Use built-in zlib (yes/no)','yes')
 opts.Add('openssl','Use OpenSSL (yes/no/builtin)','no')
 opts.Add('musepack','Musepack Audio (yes/no)','yes')
@@ -121,6 +122,7 @@ opts.Add("LINKFLAGS", "Custom flags for the linker");
 opts.Add('disable_3d', 'Disable 3D nodes for smaller executable (yes/no)', "no")
 opts.Add('disable_advanced_gui', 'Disable advance 3D gui nodes and behaviors (yes/no)', "no")
 opts.Add('colored', 'Enable colored output for the compilation (yes/no)', 'no')
+opts.Add('extra_suffix', 'Custom extra suffix added to the base filename of all generated binary files.', '')
 
 # add platform specific options
 
@@ -176,6 +178,9 @@ if selected_platform in platform_list:
 		env = env_base.Clone()
 
 	env.extra_suffix=""
+	
+	if env["extra_suffix"] != '' :
+		env.extra_suffix += '.'+env["extra_suffix"]
 
 	CCFLAGS = env.get('CCFLAGS', '')
 	env['CCFLAGS'] = ''
@@ -307,6 +312,8 @@ if selected_platform in platform_list:
 	if (env['colored']=='yes'):
 		methods.colored(sys,env)
 		
+	if (env['etc1']=='yes'):
+		env.Append(CPPFLAGS=['-DETC1_ENABLED'])
 
 	Export('env')
 

+ 5 - 5
core/bind/core_bind.cpp

@@ -709,13 +709,13 @@ void _OS::_bind_methods() {
 
 	ObjectTypeDB::bind_method(_MD("get_screen_count"),&_OS::get_screen_count);
 	ObjectTypeDB::bind_method(_MD("get_current_screen"),&_OS::get_current_screen);
-	ObjectTypeDB::bind_method(_MD("set_current_screen"),&_OS::set_current_screen);
-	ObjectTypeDB::bind_method(_MD("get_screen_position"),&_OS::get_screen_position,DEFVAL(0));
-	ObjectTypeDB::bind_method(_MD("get_screen_size"),&_OS::get_screen_size,DEFVAL(0));
+	ObjectTypeDB::bind_method(_MD("set_current_screen","screen"),&_OS::set_current_screen);
+	ObjectTypeDB::bind_method(_MD("get_screen_position","screen"),&_OS::get_screen_position,DEFVAL(0));
+	ObjectTypeDB::bind_method(_MD("get_screen_size","screen"),&_OS::get_screen_size,DEFVAL(0));
 	ObjectTypeDB::bind_method(_MD("get_window_position"),&_OS::get_window_position);
-	ObjectTypeDB::bind_method(_MD("set_window_position"),&_OS::set_window_position);
+	ObjectTypeDB::bind_method(_MD("set_window_position","position"),&_OS::set_window_position);
 	ObjectTypeDB::bind_method(_MD("get_window_size"),&_OS::get_window_size);
-	ObjectTypeDB::bind_method(_MD("set_window_size"),&_OS::set_window_size);
+	ObjectTypeDB::bind_method(_MD("set_window_size","size"),&_OS::set_window_size);
 	ObjectTypeDB::bind_method(_MD("set_window_fullscreen","enabled"),&_OS::set_window_fullscreen);
 	ObjectTypeDB::bind_method(_MD("is_window_fullscreen"),&_OS::is_window_fullscreen);
 	ObjectTypeDB::bind_method(_MD("set_window_resizable","enabled"),&_OS::set_window_resizable);

+ 7 - 0
core/object.cpp

@@ -1503,6 +1503,8 @@ void Object::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("XL_MESSAGE","message"),&Object::XL_MESSAGE);
 	ObjectTypeDB::bind_method(_MD("tr","message"),&Object::tr);
 
+	ObjectTypeDB::bind_method(_MD("is_queued_for_deletion"),&Object::is_queued_for_deletion);
+
 	ADD_SIGNAL( MethodInfo("script_changed"));
 
 	BIND_VMETHOD( MethodInfo("_notification",PropertyInfo(Variant::INT,"what")) );
@@ -1566,6 +1568,10 @@ void Object::get_translatable_strings(List<String> *p_strings) const {
 
 }
 
+bool Object::is_queued_for_deletion() const {
+	return _is_queued_for_deletion;
+}
+
 #ifdef TOOLS_ENABLED
 void Object::set_edited(bool p_edited) {
 
@@ -1587,6 +1593,7 @@ Object::Object() {
 	_instance_ID=0;
 	_instance_ID = ObjectDB::add_instance(this);
 	_can_translate=true;
+	_is_queued_for_deletion=false;
 	script_instance=NULL;
 #ifdef TOOLS_ENABLED
 

+ 3 - 1
core/object.h

@@ -397,7 +397,6 @@ friend void postinitialize_handler(Object*);
 
 protected:	
 
-
 	virtual bool _use_builtin_script() const { return false; }
 	virtual void _initialize_typev() { initialize_type(); }
 	virtual bool _setv(const StringName& p_name,const Variant &p_property) { return false; };
@@ -589,6 +588,9 @@ public:
 	StringName XL_MESSAGE(const StringName& p_message) const; //translate message (internationalization)
 	StringName tr(const StringName& p_message) const; //translate message (alternative)
 
+	bool _is_queued_for_deletion; // set to true by SceneTree::queue_delete()
+	bool is_queued_for_deletion() const; 
+
 	_FORCE_INLINE_ void set_message_translation(bool p_enable) { _can_translate=p_enable; }
 	_FORCE_INLINE_ bool can_translate_messages() const { return _can_translate; }
 	Object();	

+ 21 - 0
core/ustring.cpp

@@ -498,6 +498,27 @@ String String::capitalize() const {
 	
 	return cap;
 }
+
+String String::camelcase_to_underscore() const {
+	const CharType * cstr = c_str();
+	String newString;
+	const char A = 'A', Z = 'Z';
+	int startIndex = 0;
+
+	for ( int i = 1; i < this->size()-1; i++ ) {
+		bool isCapital = cstr[i] >= A && cstr[i] <= Z;
+
+		if ( isCapital ) {
+			newString += "_" + this->substr(startIndex, i-startIndex);
+			startIndex = i;
+		}
+	}
+
+	newString += "_" + this->substr(startIndex, this->size()-startIndex);
+
+	return newString;
+}
+
 int String::get_slice_count(String p_splitter) const{
 
 	if (empty())

+ 1 - 0
core/ustring.h

@@ -149,6 +149,7 @@ public:
 	static double to_double(const CharType* p_str, const CharType **r_end=NULL);
 	static int64_t to_int(const CharType* p_str,int p_len=-1);
 	String capitalize() const;
+	String camelcase_to_underscore() const;
 
 	int get_slice_count(String p_splitter) const;
 	String get_slice(String p_splitter,int p_slice) const;

+ 10 - 1
core/vector.h

@@ -149,7 +149,16 @@ public:
 		sort_custom<_DefaultComparator<T> >();
 	}
 
-
+	void ordered_insert(const T& p_val) {
+			int i;
+			for (i=0; i<size(); i++) {
+
+				if (p_val < operator[](i)) {
+					break;
+				};
+			};
+			insert(i, p_val);
+	}
 
 	void operator=(const Vector& p_from);
 	Vector(const Vector& p_from);

+ 2 - 1
drivers/etc1/SCsub

@@ -6,7 +6,8 @@ etc_sources = [
 	"etc1/rg_etc1.cpp"
 ]
 
-env.drivers_sources+=etc_sources
+if (env["etc1"] != "no"):
+    env.drivers_sources+=etc_sources
 
 #env.add_source_files(env.drivers_sources, etc_sources)
 

+ 4 - 1
drivers/etc1/rg_etc1.cpp

@@ -24,6 +24,9 @@
 namespace rg_etc1
 {
 
+   inline long labs(long val) {
+        return val < 0 ? -val : val;
+   }
 
    inline int intabs(int val) {
 
@@ -1913,7 +1916,7 @@ done:
                   for (uint packed_c = 0; packed_c < limit; packed_c++)
                   {
                      int v = etc1_decode_value(diff, inten, selector, packed_c);
-             uint err = intabs(v - color);
+                     uint err = labs(v - static_cast<int>(color));
 		     //printf("err: %d - %u = %u\n",v,color,err);
                      if (err < best_error)
                      {

+ 98 - 14
drivers/gles2/rasterizer_gles2.cpp

@@ -91,6 +91,10 @@
 
 static RasterizerGLES2* _singleton = NULL;
 
+#ifdef GLES_NO_CLIENT_ARRAYS
+static float GlobalVertexBuffer[MAX_POLYGON_VERTICES * 8] = {0};
+#endif
+
 static const GLenum prim_type[]={GL_POINTS,GL_LINES,GL_TRIANGLES,GL_TRIANGLE_FAN};
 
 _FORCE_INLINE_ static void _set_color_attrib(const Color& p_color) {
@@ -8341,20 +8345,22 @@ void RasterizerGLES2::canvas_draw_primitive(const Vector<Point2>& p_points, cons
 
 void RasterizerGLES2::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) {
 
-	bool do_colors=false;
+    bool do_colors=false;
+    Color m;
+    if (p_singlecolor) {
+        m = *p_colors;
+        m.a*=canvas_opacity;
+        _set_color_attrib(m);
+    } else if (!p_colors) {
+        m = Color(1, 1, 1, canvas_opacity);
+        _set_color_attrib(m);
+    } else
+        do_colors=true;
 
-	if (p_singlecolor) {
-		Color m = *p_colors;
-		m.a*=canvas_opacity;
-		_set_color_attrib(m);
-	} else if (!p_colors) {
-		_set_color_attrib( Color(1,1,1,canvas_opacity));
-	} else
-		do_colors=true;
-
-	Texture *texture = _bind_canvas_texture(p_texture);
+    Texture *texture = _bind_canvas_texture(p_texture);
 
-	glEnableVertexAttribArray(VS::ARRAY_VERTEX);
+#ifndef GLES_NO_CLIENT_ARRAYS
+    glEnableVertexAttribArray(VS::ARRAY_VERTEX);
 	glVertexAttribPointer( VS::ARRAY_VERTEX, 2 ,GL_FLOAT, false, sizeof(Vector2), p_vertices );
 	if (do_colors) {
 
@@ -8384,11 +8390,78 @@ void RasterizerGLES2::canvas_draw_polygon(int p_vertex_count, const int* p_indic
 		};
 		glDrawElements(GL_TRIANGLES, p_vertex_count, GL_UNSIGNED_SHORT, _draw_poly_indices );
 #endif
-		//glDrawElements(GL_TRIANGLES, p_vertex_count, GL_UNSIGNED_INT, p_indices );
 	} else {
 		glDrawArrays(GL_TRIANGLES,0,p_vertex_count);
 	}
 
+
+#else //WebGL specific impl.
+	glBindBuffer(GL_ARRAY_BUFFER, gui_quad_buffer);    
+    float *b = GlobalVertexBuffer;
+    int ofs = 0;
+    if(p_vertex_count > MAX_POLYGON_VERTICES){
+        print_line("Too many vertices to render");
+        return;
+    }
+    glEnableVertexAttribArray(VS::ARRAY_VERTEX);
+    glVertexAttribPointer( VS::ARRAY_VERTEX, 2 ,GL_FLOAT, false, sizeof(float)*2, ((float*)0)+ofs );
+    for(int i=0;i<p_vertex_count;i++) {
+        b[ofs++]=p_vertices[i].x;
+        b[ofs++]=p_vertices[i].y;
+    }
+
+    if (p_colors && do_colors) {
+
+        glEnableVertexAttribArray(VS::ARRAY_COLOR);
+        glVertexAttribPointer( VS::ARRAY_COLOR, 4 ,GL_FLOAT, false, sizeof(float)*4, ((float*)0)+ofs );
+        for(int i=0;i<p_vertex_count;i++) {
+            b[ofs++]=p_colors[i].r;
+            b[ofs++]=p_colors[i].g;
+            b[ofs++]=p_colors[i].b;
+            b[ofs++]=p_colors[i].a;
+        }
+
+    } else {
+        glDisableVertexAttribArray(VS::ARRAY_COLOR);
+    }
+
+
+    if (p_uvs) {
+
+        glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
+        glVertexAttribPointer( VS::ARRAY_TEX_UV, 2 ,GL_FLOAT, false, sizeof(float)*2, ((float*)0)+ofs );
+        for(int i=0;i<p_vertex_count;i++) {
+            b[ofs++]=p_uvs[i].x;
+            b[ofs++]=p_uvs[i].y;
+        }
+
+    } else {
+        glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
+    }
+
+    glBufferSubData(GL_ARRAY_BUFFER,0,ofs*4,&b[0]);
+
+    //bind the indices buffer.
+        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer);
+
+		static const int _max_draw_poly_indices = 16*1024; // change this size if needed!!!
+		ERR_FAIL_COND(p_vertex_count > _max_draw_poly_indices);
+		static uint16_t _draw_poly_indices[_max_draw_poly_indices];
+		for (int i=0; i<p_vertex_count; i++) {
+			_draw_poly_indices[i] = p_indices[i];
+             //OS::get_singleton()->print("ind: %d ", p_indices[i]);
+		};
+
+        //copy the data to GPU.
+        glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, p_vertex_count * sizeof(uint16_t), &_draw_poly_indices[0]);
+
+        //draw the triangles.
+        glDrawElements(GL_TRIANGLES, p_vertex_count, GL_UNSIGNED_SHORT, 0);
+
+    glBindBuffer(GL_ARRAY_BUFFER, 0);
+    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+#endif
+
 	_rinfo.ci_draw_commands++;
 
 };
@@ -10673,10 +10746,21 @@ void RasterizerGLES2::init() {
 
 	glGenBuffers(1,&gui_quad_buffer);
 	glBindBuffer(GL_ARRAY_BUFFER,gui_quad_buffer);
-	glBufferData(GL_ARRAY_BUFFER,128,NULL,GL_DYNAMIC_DRAW);
+#ifdef GLES_NO_CLIENT_ARRAYS //WebGL specific implementation.
+    glBufferData(GL_ARRAY_BUFFER, 8 * MAX_POLYGON_VERTICES,NULL,GL_DYNAMIC_DRAW);
+#else
+    glBufferData(GL_ARRAY_BUFFER,128,NULL,GL_DYNAMIC_DRAW);
+#endif
 	glBindBuffer(GL_ARRAY_BUFFER,0); //unbind
 
 
+#ifdef GLES_NO_CLIENT_ARRAYS    //webgl indices buffer
+    glGenBuffers(1, &indices_buffer);
+    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer);
+    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 16*1024, NULL, GL_DYNAMIC_DRAW);
+    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);// unbind
+#endif
+
 	using_canvas_bg=false;
 	_update_framebuffer();
 	DEBUG_TEST_ERROR("Initializing");

+ 3 - 0
drivers/gles2/rasterizer_gles2.h

@@ -31,6 +31,8 @@
 
 #include "servers/visual/rasterizer.h"
 
+#define MAX_POLYGON_VERTICES 4096 //used for WebGL canvas_draw_polygon call.
+
 #ifdef GLES2_ENABLED
 
 #include "image.h"
@@ -828,6 +830,7 @@ class RasterizerGLES2 : public Rasterizer {
 	GLuint base_framebuffer;
 
 	GLuint gui_quad_buffer;
+	GLuint indices_buffer;
 
 
 

+ 3 - 0
drivers/register_driver_types.cpp

@@ -222,7 +222,10 @@ void register_driver_types() {
 #endif
 #endif
 
+#ifdef ETC1_ENABLED
 	_register_etc1_compress_func();
+#endif
+
 	initialize_chibi();
 }
 

+ 35 - 1
modules/gdscript/gd_functions.cpp

@@ -71,6 +71,7 @@ const char *GDFunctions::get_func_name(Function p_func) {
 		"randi",
 		"randf",
 		"rand_range",
+		"seed",
 		"rand_seed",
 		"deg2rad",
 		"rad2deg",
@@ -97,6 +98,7 @@ const char *GDFunctions::get_func_name(Function p_func) {
 		"dict2inst",
 		"hash",
 		"print_stack",
+		"get_inst",
 	};
 
 	return _names[p_func];
@@ -328,6 +330,13 @@ void GDFunctions::call(Function p_func,const Variant **p_args,int p_arg_count,Va
 			VALIDATE_ARG_NUM(1);
 			r_ret=Math::random(*p_args[0],*p_args[1]);
 		} break;
+		case MATH_SEED: {
+			VALIDATE_ARG_COUNT(1);
+			VALIDATE_ARG_NUM(0);
+			uint32_t seed=*p_args[0];
+			Math::seed(seed);
+			r_ret=Variant();
+		} break;
 		case MATH_RANDSEED: {
 			VALIDATE_ARG_COUNT(1);
 			VALIDATE_ARG_NUM(0);
@@ -575,7 +584,7 @@ void GDFunctions::call(Function p_func,const Variant **p_args,int p_arg_count,Va
 			}
 
 			//str+="\n";
-			OS::get_singleton()->print("%s\n",str.utf8().get_data());
+			OS::get_singleton()->print("%s",str.utf8().get_data());
 			r_ret=Variant();
 
 		} break;
@@ -895,6 +904,20 @@ void GDFunctions::call(Function p_func,const Variant **p_args,int p_arg_count,Va
 			};
 		} break;
 
+		case GET_INST: {
+
+			VALIDATE_ARG_COUNT(1);
+			if (p_args[0]->get_type()!=Variant::INT && p_args[0]->get_type()!=Variant::REAL) {
+				r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
+				r_error.argument=0;
+				r_ret=Variant();
+				break;
+			}
+
+			uint32_t id=*p_args[0];
+			r_ret=ObjectDB::get_instance(id);
+
+		} break;
 		case FUNC_MAX: {
 
 			ERR_FAIL_V();
@@ -1130,6 +1153,11 @@ MethodInfo GDFunctions::get_info(Function p_func) {
 			mi.return_val.type=Variant::REAL;
 			return mi;
 		} break;
+		case MATH_SEED: {
+			MethodInfo mi("seed",PropertyInfo(Variant::REAL,"seed"));
+			mi.return_val.type=Variant::NIL;
+			return mi;
+		} break;
 		case MATH_RANDSEED: {
 			MethodInfo mi("rand_seed",PropertyInfo(Variant::REAL,"seed"));
 			mi.return_val.type=Variant::ARRAY;
@@ -1288,6 +1316,12 @@ MethodInfo GDFunctions::get_info(Function p_func) {
 			return mi;
 		} break;
 
+		case GET_INST: {
+			MethodInfo mi("get_info",PropertyInfo(Variant::INT,"instance_id"));
+			mi.return_val.type=Variant::OBJECT;
+			return mi;
+		} break;
+
 		case FUNC_MAX: {
 
 			ERR_FAIL_V(MethodInfo());

+ 2 - 0
modules/gdscript/gd_functions.h

@@ -67,6 +67,7 @@ public:
 		MATH_RAND,
 		MATH_RANDF,
 		MATH_RANDOM,
+		MATH_SEED,
 		MATH_RANDSEED,
 		MATH_DEG2RAD,
 		MATH_RAD2DEG,
@@ -93,6 +94,7 @@ public:
 		DICT2INST,
 		HASH,
 		PRINT_STACK,
+		GET_INST,
 		FUNC_MAX
 
 	};

+ 1 - 1
modules/gdscript/gd_script.cpp

@@ -1689,7 +1689,7 @@ bool GDScript::_update_exports() {
 			}
 
 
-			if (c->extends_used && String(c->extends_file)!="") {
+			if (c->extends_used && String(c->extends_file)!="" && String(c->extends_file) != get_path()) {
 
 				String path = c->extends_file;
 				if (path.is_rel_path()) {

+ 18 - 3
platform/android/java/src/com/android/godot/Godot.java

@@ -571,9 +571,24 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
 	}
 
 	@Override public void onSensorChanged(SensorEvent event) {
-		float x = event.values[0];
-		float y = event.values[1];
-		float z = event.values[2];
+		Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
+		int displayRotation = display.getRotation();
+		
+		float[] adjustedValues = new float[3];
+		final int axisSwap[][] = {
+		{  1,  -1,  0,  1  },     // ROTATION_0 
+		{-1,  -1,  1,  0  },     // ROTATION_90 
+		{-1,    1,  0,  1  },     // ROTATION_180 
+		{  1,    1,  1,  0  }  }; // ROTATION_270 
+
+		final int[] as = axisSwap[displayRotation]; 
+		adjustedValues[0]  =  (float)as[0] * event.values[ as[2] ]; 
+		adjustedValues[1]  =  (float)as[1] * event.values[ as[3] ]; 
+		adjustedValues[2]  =  event.values[2];
+		
+		float x = adjustedValues[0];
+		float y = adjustedValues[1];
+		float z = adjustedValues[2];
 		GodotLib.accelerometer(x,y,z);
 	}
 

+ 21 - 16
platform/javascript/detect.py

@@ -10,9 +10,9 @@ def get_name():
 
 def can_build():
 
-        import os
-        if (not os.environ.has_key("EMSCRIPTEN_ROOT")):
-        	return False
+	import os
+	if (not os.environ.has_key("EMSCRIPTEN_ROOT")):
+		return False
 	return True
 
 def get_opts():
@@ -36,6 +36,7 @@ def get_flags():
 		('squish', 'no'),
 		('speex', 'no'),
 		('old_scenes', 'no'),
+		('etc1', 'no'),
 #		('default_gui_theme', 'no'),
 
 		#('builtin_zlib', 'no'),
@@ -44,33 +45,36 @@ def get_flags():
 
 
 def configure(env):
-
-
 	env.Append(CPPPATH=['#platform/javascript'])
-	
+
 	em_path=os.environ["EMSCRIPTEN_ROOT"]
-	
+
 	env['ENV']['PATH'] = em_path+":"+env['ENV']['PATH']
 
 	env['CC'] = em_path+'/emcc'
 	env['CXX'] = em_path+'/emcc'
-	env['AR'] = em_path+"/emar"
-	env['RANLIB'] = em_path+"/emranlib"
+	#env['AR'] = em_path+"/emar"
+	env['AR'] = em_path+"/emcc"
+	env['ARFLAGS'] = "-o"
+
+#	env['RANLIB'] = em_path+"/emranlib"
+	env['RANLIB'] = em_path + "/emcc"
+	env['OBJSUFFIX'] = '.bc'
+	env['LIBSUFFIX'] = '.bc'
+	env['CCCOM'] = "$CC -o $TARGET $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES"
+	env['CXXCOM'] = "$CC -o $TARGET $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES"
 
 #	env.Append(LIBS=['c','m','stdc++','log','GLESv1_CM','GLESv2'])
 
 #	env["LINKFLAGS"]= string.split(" -g --sysroot="+ld_sysroot+" -Wl,--no-undefined -Wl,-z,noexecstack ")
 
 	if (env["target"]=="release"):
-
 		env.Append(CCFLAGS=['-O2'])
-
 	elif (env["target"]=="release_debug"):
-
 		env.Append(CCFLAGS=['-O2','-DDEBUG_ENABLED'])
-
 	elif (env["target"]=="debug"):
 		env.Append(CCFLAGS=['-D_DEBUG', '-Wall', '-O2', '-DDEBUG_ENABLED'])
+		#env.Append(CCFLAGS=['-D_DEBUG', '-Wall', '-g4', '-DDEBUG_ENABLED'])
 		env.Append(CPPFLAGS=['-DDEBUG_MEMORY_ALLOC'])
 
 	env.Append(CPPFLAGS=["-fno-exceptions",'-DNO_SAFE_CAST','-fno-rtti'])
@@ -84,10 +88,11 @@ def configure(env):
 		lzma_binpath = em_path+"/third_party/lzma.js/lzma-native"
 		lzma_decoder = em_path+"/third_party/lzma.js/lzma-decoder.js"
 		lzma_dec = "LZMA.decompress"
-
 		env.Append(LINKFLAGS=['--compression',lzma_binpath+","+lzma_decoder+","+lzma_dec])
 
 	env.Append(LINKFLAGS=['-s','ASM_JS=1'])
 	env.Append(LINKFLAGS=['-O2'])
-
-
+	#env.Append(LINKFLAGS=['-g4'])
+	
+	#print "CCCOM is:", env.subst('$CCCOM')
+	#print "P: ", env['p'], " Platofrm: ", env['platform']

+ 8 - 1
platform/windows/os_windows.cpp

@@ -423,6 +423,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM	wParam,	LPARAM	lParam) {
 		case WM_RBUTTONUP:
 		case WM_MOUSEWHEEL:
 		case WM_LBUTTONDBLCLK:
+		case WM_RBUTTONDBLCLK:
 		/*case WM_XBUTTONDOWN:
 		case WM_XBUTTONUP: */{
 
@@ -476,6 +477,12 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM	wParam,	LPARAM	lParam) {
 					mb.button_index=1;
 					mb.doubleclick = true;
 				} break;
+				case WM_RBUTTONDBLCLK: {
+
+					mb.pressed=true;
+					mb.button_index=2;
+					mb.doubleclick = true;
+				} break;
 				case WM_MOUSEWHEEL: {
 
 					mb.pressed=true;
@@ -2045,7 +2052,7 @@ String OS_Windows::get_executable_path() const {
 	wchar_t bufname[4096];
 	GetModuleFileNameW(NULL,bufname,4096);
 	String s= bufname;
-	print_line("EXEC PATHPó: "+s);
+	print_line("EXEC PATHP¨®: "+s);
 	return s;
 }
 

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

@@ -669,7 +669,7 @@ void SpotLight::_bind_methods() {
 	ADD_PROPERTYI( PropertyInfo( Variant::REAL, "params/attenuation", PROPERTY_HINT_EXP_EASING, "attenuation"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_ATTENUATION );
 
 	ADD_PROPERTYI( PropertyInfo( Variant::REAL, "params/spot_angle", PROPERTY_HINT_RANGE, "0.01,89.9,0.01"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SPOT_ANGLE );
-	ADD_PROPERTYI( PropertyInfo( Variant::REAL, "params/spot_attenuation", PROPERTY_HINT_EXP_EASING, "attenuation"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SPOT_ATTENUATION );
+	ADD_PROPERTYI( PropertyInfo( Variant::REAL, "params/spot_attenuation", PROPERTY_HINT_EXP_EASING, "spot_attenuation"), _SCS("set_parameter"), _SCS("get_parameter"), PARAM_SPOT_ATTENUATION );
 
 }
 

+ 1 - 1
scene/3d/light.h

@@ -49,7 +49,7 @@ public:
 		PARAM_ENERGY=VisualServer::LIGHT_PARAM_ENERGY,
 		PARAM_ATTENUATION=VisualServer::LIGHT_PARAM_ATTENUATION,
 		PARAM_SPOT_ANGLE=VisualServer::LIGHT_PARAM_SPOT_ANGLE,
-		PARAM_SPOT_ATTENUATION=VisualServer::LIGHT_PARAM_ATTENUATION,
+		PARAM_SPOT_ATTENUATION=VisualServer::LIGHT_PARAM_SPOT_ATTENUATION,
 		PARAM_SHADOW_DARKENING=VisualServer::LIGHT_PARAM_SHADOW_DARKENING,
 		PARAM_SHADOW_Z_OFFSET=VisualServer::LIGHT_PARAM_SHADOW_Z_OFFSET,
 		PARAM_SHADOW_Z_SLOPE_SCALE=VisualServer::LIGHT_PARAM_SHADOW_Z_SLOPE_SCALE,

+ 1 - 0
scene/main/scene_main_loop.cpp

@@ -850,6 +850,7 @@ void SceneTree::queue_delete(Object *p_object) {
 
 	_THREAD_SAFE_METHOD_
 	ERR_FAIL_NULL(p_object);
+	p_object->_is_queued_for_deletion = true;
 	delete_queue.push_back(p_object->get_instance_ID());
 }
 

+ 1 - 1
scene/main/viewport.cpp

@@ -406,7 +406,7 @@ void Viewport::_notification(int p_what) {
 						int rc = ss2d->intersect_point(point,res,64,Set<RID>(),0xFFFFFFFF,0xFFFFFFFF);
 						for(int i=0;i<rc;i++) {
 
-							if (res[i].collider) {
+							if (res[i].collider_id && res[i].collider) {
 								CollisionObject2D *co=res[i].collider->cast_to<CollisionObject2D>();
 								if (co) {
 

+ 19 - 13
servers/physics/body_sw.cpp

@@ -358,10 +358,10 @@ void BodySW::_compute_area_gravity(const AreaSW *p_area) {
 
 	if (p_area->is_gravity_point()) {
 
-		gravity = (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity();
+		gravity += (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity();
 
 	} else {
-		gravity = p_area->get_gravity_vector() * p_area->get_gravity();
+		gravity += p_area->get_gravity_vector() * p_area->get_gravity();
 	}
 }
 
@@ -371,23 +371,29 @@ void BodySW::integrate_forces(real_t p_step) {
 	if (mode==PhysicsServer::BODY_MODE_STATIC)
 		return;
 
-	AreaSW *current_area = get_space()->get_default_area();
-	ERR_FAIL_COND(!current_area);
+	AreaSW *def_area = get_space()->get_default_area();
+	ERR_FAIL_COND(!def_area);
 
-	int prio = current_area->get_priority();
 	int ac = areas.size();
+	bool replace = false;
+	gravity=Vector3(0,0,0);
 	if (ac) {
+		areas.sort();
 		const AreaCMP *aa = &areas[0];
-		for(int i=0;i<ac;i++) {
-			if (aa[i].area->get_priority() > prio) {
-				current_area=aa[i].area;
-				prio=current_area->get_priority();
+		density = aa[ac-1].area->get_density();
+		for(int i=ac-1;i>=0;i--) {
+			_compute_area_gravity(aa[i].area);
+			if (aa[i].area->get_space_override_mode() == PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE) {
+				replace = true;
+				break;
 			}
 		}
+	} else {
+		density=def_area->get_density();
+	}
+	if( !replace ) {
+		_compute_area_gravity(def_area);
 	}
-
-	_compute_area_gravity(current_area);
-	density=current_area->get_density();
 
 	Vector3 motion;
 	bool do_motion=false;
@@ -455,7 +461,7 @@ void BodySW::integrate_forces(real_t p_step) {
 	}
 
 
-	current_area=NULL; // clear the area, so it is set in the next frame
+	def_area=NULL; // clear the area, so it is set in the next frame
 	contact_count=0;
 
 }

+ 4 - 5
servers/physics/body_sw.h

@@ -84,13 +84,13 @@ class BodySW : public CollisionObjectSW {
 	struct AreaCMP {
 
 		AreaSW *area;
-		_FORCE_INLINE_ bool operator<(const AreaCMP& p_cmp) const { return area->get_self() < p_cmp.area->get_self() ; }
+		_FORCE_INLINE_ bool operator==(const AreaCMP& p_cmp) const { return area->get_self() == p_cmp.area->get_self();}
+		_FORCE_INLINE_ bool operator<(const AreaCMP a) const { return area->get_priority() < a.area->get_priority();}
 		_FORCE_INLINE_ AreaCMP() {}
 		_FORCE_INLINE_ AreaCMP(AreaSW *p_area) { area=p_area;}
 	};
 
-
-	VSet<AreaCMP> areas;
+	Vector<AreaCMP> areas;
 
 	struct Contact {
 
@@ -134,8 +134,7 @@ public:
 
 	void set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata=Variant());
 
-
-	_FORCE_INLINE_ void add_area(AreaSW *p_area) { areas.insert(AreaCMP(p_area)); }
+	_FORCE_INLINE_ void add_area(AreaSW *p_area) { areas.ordered_insert(AreaCMP(p_area)); }
 	_FORCE_INLINE_ void remove_area(AreaSW *p_area) { areas.erase(AreaCMP(p_area)); }
 
 	_FORCE_INLINE_ void set_max_contacts_reported(int p_size) { contacts.resize(p_size); contact_count=0; if (mode==PhysicsServer::BODY_MODE_KINEMATIC && p_size) set_active(true);}

+ 3 - 1
tools/editor/editor_help.cpp

@@ -1390,7 +1390,9 @@ EditorHelp::EditorHelp(EditorNode *p_editor) {
 
 	{
 		PanelContainer *pc = memnew( PanelContainer );
-		pc->add_style_override("panel",get_stylebox("normal","TextEdit"));
+		Ref<StyleBoxFlat> style( memnew( StyleBoxFlat ) );
+		style->set_bg_color( EditorSettings::get_singleton()->get("text_editor/background_color") );	
+		pc->add_style_override("panel", style); //get_stylebox("normal","TextEdit"));
 		h_split->add_child(pc);
 		class_desc = memnew( RichTextLabel );
 		pc->add_child(class_desc);

BIN
tools/editor/icons/icon_default_project_icon.png


+ 4 - 1
tools/editor/plugins/mesh_editor_plugin.cpp

@@ -33,7 +33,7 @@ void MeshInstanceEditor::_menu_option(int p_option) {
 	Ref<Mesh> mesh = node->get_mesh();
 	if (mesh.is_null()) {
 		err_dialog->set_text("Mesh is empty!");
-		err_dialog->popup_centered(Size2(100,50));
+		err_dialog->popup_centered(Size2(100,80));
 		return;
 	}
 
@@ -240,6 +240,9 @@ MeshInstanceEditor::MeshInstanceEditor() {
 	add_child(outline_dialog);
 	outline_dialog->connect("confirmed",this,"_create_outline_mesh");
 
+	err_dialog = memnew( AcceptDialog );
+	add_child(err_dialog);
+
 }
 
 

+ 1 - 0
tools/editor/plugins/sample_library_editor_plugin.cpp

@@ -235,6 +235,7 @@ void SampleLibraryEditor::_update_library() {
 
 	List<StringName> names;
 	sample_library->get_sample_list(&names);
+	names.sort_custom<StringName::AlphCompare>();
 
 	for(List<StringName>::Element *E=names.front();E;E=E->next()) {
 

+ 1 - 0
tools/editor/plugins/sample_player_editor_plugin.cpp

@@ -94,6 +94,7 @@ void SamplePlayerEditor::_update_sample_library() {
 
 	List<StringName> samplenames;
 	sl->get_sample_list(&samplenames);
+	samplenames.sort_custom<StringName::AlphCompare>();
 	for(List<StringName>::Element *E=samplenames.front();E;E=E->next()) {
 		samples->add_item(E->get());
 	}

+ 1 - 1
tools/editor/plugins/shader_graph_editor_plugin.cpp

@@ -376,7 +376,7 @@ void GraphCurveMapEdit::_input_event(const InputEvent& p_event) {
 		update();
 	}
 
-	if (p_event.type==InputEvent::MOUSE_MOTION && grabbing) {
+	if (p_event.type==InputEvent::MOUSE_MOTION && grabbing  && grabbed != -1) {
 
 		Point2 p = Vector2(p_event.mouse_button.x,p_event.mouse_button.y)/get_size();
 		p.y=1.0-p.y;

+ 1 - 1
tools/editor/property_editor.cpp

@@ -2258,7 +2258,7 @@ void PropertyEditor::update_tree() {
 		}
 
 		if (capitalize_paths)
-			item->set_text( 0, name.capitalize() );
+			item->set_text( 0, name.camelcase_to_underscore().capitalize() );
 		else
 			item->set_text( 0, name );