Browse Source

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

Conflicts:
	drivers/gles2/shader_compiler_gles2.cpp
Saracen 9 years ago
parent
commit
dd00452997
100 changed files with 1236 additions and 554 deletions
  1. 26 25
      SConstruct
  2. 0 2
      bin/tests/SCsub
  3. 0 2
      core/SCsub
  4. 0 2
      core/bind/SCsub
  5. 0 2
      core/io/SCsub
  6. 6 6
      core/io/json.cpp
  7. 0 2
      core/math/SCsub
  8. 1 1
      core/math/quat.h
  9. 0 2
      core/os/SCsub
  10. 9 2
      core/os/os.cpp
  11. 2 0
      core/variant_call.cpp
  12. 16 2
      core/variant_op.cpp
  13. 1 0
      demos/2d/area_input/engine.cfg
  14. BIN
      demos/2d/area_input/icon.png
  15. 1 0
      demos/2d/dynamic_collision_shapes/engine.cfg
  16. BIN
      demos/2d/dynamic_collision_shapes/icon.png
  17. 1 1
      demos/2d/fog_of_war/engine.cfg
  18. 1 0
      demos/2d/hdr/engine.cfg
  19. BIN
      demos/2d/hdr/icon.png
  20. 1 0
      demos/2d/isometric_light/engine.cfg
  21. BIN
      demos/2d/isometric_light/icon.png
  22. 1 0
      demos/2d/light_mask/engine.cfg
  23. BIN
      demos/2d/light_mask/icon.png
  24. 1 0
      demos/2d/lights_shadows/engine.cfg
  25. BIN
      demos/2d/lights_shadows/icon.png
  26. 1 0
      demos/2d/navpoly/engine.cfg
  27. BIN
      demos/2d/navpoly/icon.png
  28. 1 0
      demos/2d/normalmaps/engine.cfg
  29. BIN
      demos/2d/normalmaps/icon.png
  30. 1 1
      demos/2d/polygon_path_finder_demo/engine.cfg
  31. 1 0
      demos/2d/screen_space_shaders/engine.cfg
  32. BIN
      demos/2d/screen_space_shaders/icon.png
  33. 1 0
      demos/2d/sdf_font/engine.cfg
  34. BIN
      demos/2d/sdf_font/icon.png
  35. 1 0
      demos/2d/splash/engine.cfg
  36. BIN
      demos/2d/splash/icon.png
  37. 1 0
      demos/2d/sprite_shaders/engine.cfg
  38. BIN
      demos/2d/sprite_shaders/icon.png
  39. BIN
      demos/3d/navmesh/icon.png
  40. 1 0
      demos/3d/sat_test/engine.cfg
  41. BIN
      demos/3d/sat_test/icon.png
  42. 0 1
      demos/gui/input_mapping/engine.cfg
  43. 1 0
      demos/gui/rich_text_bbcode/engine.cfg
  44. BIN
      demos/gui/rich_text_bbcode/icon.png
  45. 1 0
      demos/misc/instancing/engine.cfg
  46. BIN
      demos/misc/instancing/icon.png
  47. 10 8
      demos/misc/regex/regex.gd
  48. BIN
      demos/misc/regex/regex.scn
  49. 1 1
      demos/misc/tween/engine.cfg
  50. 1 1
      demos/misc/window_management/engine.cfg
  51. 13 8
      drivers/SCsub
  52. 0 2
      drivers/alsa/SCsub
  53. 1 1
      drivers/builtin_zlib/SCsub
  54. 0 2
      drivers/chibi/SCsub
  55. 0 1
      drivers/dds/SCsub
  56. 0 1
      drivers/etc1/SCsub
  57. 0 1
      drivers/gl_context/SCsub
  58. 66 50
      drivers/gles2/rasterizer_gles2.cpp
  59. 3 3
      drivers/gles2/rasterizer_gles2.h
  60. 123 115
      drivers/gles2/shader_compiler_gles2.cpp
  61. 4 1
      drivers/gles2/shader_compiler_gles2.h
  62. 0 2
      drivers/gles2/shaders/SCsub
  63. 0 1
      drivers/jpg/SCsub
  64. 0 1
      drivers/mpc/SCsub
  65. 0 1
      drivers/nedmalloc/SCsub
  66. 26 31
      drivers/nrex/README.md
  67. 0 2
      drivers/nrex/SCsub
  68. 618 140
      drivers/nrex/nrex.cpp
  69. 7 3
      drivers/nrex/nrex.hpp
  70. 6 4
      drivers/nrex/regex.cpp
  71. 1 1
      drivers/nrex/regex.h
  72. 0 1
      drivers/ogg/SCsub
  73. 0 2
      drivers/openssl/SCsub
  74. 8 0
      drivers/opus/opus_config.h
  75. 0 1
      drivers/png/SCsub
  76. 0 1
      drivers/squish/SCsub
  77. 0 3
      drivers/theora/SCsub
  78. 30 16
      drivers/theora/decode.c
  79. 17 9
      drivers/theora/video_stream_theora.cpp
  80. 0 2
      drivers/unix/SCsub
  81. 19 9
      drivers/unix/os_unix.cpp
  82. 0 2
      drivers/vorbis/SCsub
  83. 1 1
      drivers/vorbis/audio_stream_ogg_vorbis.h
  84. 0 1
      drivers/webp/SCsub
  85. 0 2
      drivers/windows/SCsub
  86. 0 2
      main/SCsub
  87. 23 16
      main/main.cpp
  88. 0 2
      modules/SCsub
  89. 0 2
      modules/gdscript/SCsub
  90. 7 1
      modules/gdscript/gd_parser.cpp
  91. 0 1
      modules/gdscript/gd_parser.h
  92. 0 3
      modules/gridmap/SCsub
  93. 2 2
      platform/android/SCsub
  94. 4 0
      platform/android/export/export.cpp
  95. 16 0
      platform/android/java/res/values-fa/strings.xml
  96. 43 17
      platform/android/java/src/com/android/godot/GodotPaymentV3.java
  97. 101 22
      platform/android/java/src/com/android/godot/payments/PaymentsManager.java
  98. 6 2
      platform/android/java/src/com/android/godot/payments/PurchaseTask.java
  99. 0 1
      platform/bb10/SCsub
  100. 2 1
      platform/bb10/os_bb10.cpp

+ 26 - 25
SConstruct

@@ -59,7 +59,7 @@ platform_arg = ARGUMENTS.get("platform", False)
 if (os.name=="posix"):
 if (os.name=="posix"):
 	pass
 	pass
 elif (os.name=="nt"):
 elif (os.name=="nt"):
-    if (os.getenv("VSINSTALLDIR")==None or platform_arg=="android"):
+	if (os.getenv("VSINSTALLDIR")==None or platform_arg=="android"):
 		custom_tools=['mingw']
 		custom_tools=['mingw']
 
 
 env_base=Environment(tools=custom_tools,ENV = {'PATH' : os.environ['PATH']});
 env_base=Environment(tools=custom_tools,ENV = {'PATH' : os.environ['PATH']});
@@ -185,7 +185,7 @@ if selected_platform in platform_list:
 	if env['vsproj']=="yes":
 	if env['vsproj']=="yes":
 		env.vs_incs = []
 		env.vs_incs = []
 		env.vs_srcs = []
 		env.vs_srcs = []
-		
+
 		def AddToVSProject( sources ):
 		def AddToVSProject( sources ):
 			for x in sources:
 			for x in sources:
 				if type(x) == type(""):
 				if type(x) == type(""):
@@ -197,12 +197,12 @@ if selected_platform in platform_list:
 					basename = pieces[0]
 					basename = pieces[0]
 					basename = basename.replace('\\\\','/')
 					basename = basename.replace('\\\\','/')
 					env.vs_srcs = env.vs_srcs + [basename + ".cpp"]
 					env.vs_srcs = env.vs_srcs + [basename + ".cpp"]
-					env.vs_incs = env.vs_incs + [basename + ".h"]					
-					#print basename	
-		env.AddToVSProject = AddToVSProject				
-		
+					env.vs_incs = env.vs_incs + [basename + ".h"]
+					#print basename
+		env.AddToVSProject = AddToVSProject
+
 	env.extra_suffix=""
 	env.extra_suffix=""
-	
+
 	if env["extra_suffix"] != '' :
 	if env["extra_suffix"] != '' :
 		env.extra_suffix += '.'+env["extra_suffix"]
 		env.extra_suffix += '.'+env["extra_suffix"]
 
 
@@ -229,7 +229,7 @@ if selected_platform in platform_list:
 	#must happen after the flags, so when flags are used by configure, stuff happens (ie, ssl on x11)
 	#must happen after the flags, so when flags are used by configure, stuff happens (ie, ssl on x11)
 	detect.configure(env)
 	detect.configure(env)
 
 
-        #env['platform_libsuffix'] = env['LIBSUFFIX']
+	#env['platform_libsuffix'] = env['LIBSUFFIX']
 
 
 	suffix="."+selected_platform
 	suffix="."+selected_platform
 
 
@@ -284,10 +284,11 @@ if selected_platform in platform_list:
 
 
 	if (env['musepack']=='yes'):
 	if (env['musepack']=='yes'):
 		env.Append(CPPFLAGS=['-DMUSEPACK_ENABLED']);
 		env.Append(CPPFLAGS=['-DMUSEPACK_ENABLED']);
-        if (env['openssl']!='no'):
-            env.Append(CPPFLAGS=['-DOPENSSL_ENABLED']);
-            if (env['openssl']=="builtin"):
-                env.Append(CPPPATH=['#drivers/builtin_openssl2'])
+
+	if (env['openssl']!='no'):
+		env.Append(CPPFLAGS=['-DOPENSSL_ENABLED']);
+		if (env['openssl']=="builtin"):
+			env.Append(CPPPATH=['#drivers/builtin_openssl2'])
 
 
 	if (env["builtin_zlib"]=='yes'):
 	if (env["builtin_zlib"]=='yes'):
 		env.Append(CPPPATH=['#drivers/builtin_zlib/zlib'])
 		env.Append(CPPPATH=['#drivers/builtin_zlib/zlib'])
@@ -337,7 +338,7 @@ if selected_platform in platform_list:
 
 
 	if (env['colored']=='yes'):
 	if (env['colored']=='yes'):
 		methods.colored(sys,env)
 		methods.colored(sys,env)
-		
+
 	if (env['etc1']=='yes'):
 	if (env['etc1']=='yes'):
 		env.Append(CPPFLAGS=['-DETC1_ENABLED'])
 		env.Append(CPPFLAGS=['-DETC1_ENABLED'])
 
 
@@ -356,22 +357,22 @@ if selected_platform in platform_list:
 	SConscript("main/SCsub")
 	SConscript("main/SCsub")
 
 
 	SConscript("platform/"+selected_platform+"/SCsub"); # build selected platform
 	SConscript("platform/"+selected_platform+"/SCsub"); # build selected platform
-	
-	# Microsoft Visual Studio Project Generation			
-	if (env['vsproj'])=="yes":		
-	
+
+	# Microsoft Visual Studio Project Generation
+	if (env['vsproj'])=="yes":
+
 		AddToVSProject(env.core_sources)
 		AddToVSProject(env.core_sources)
 		AddToVSProject(env.main_sources)
 		AddToVSProject(env.main_sources)
-		AddToVSProject(env.modules_sources)	
+		AddToVSProject(env.modules_sources)
 		AddToVSProject(env.scene_sources)
 		AddToVSProject(env.scene_sources)
 		AddToVSProject(env.servers_sources)
 		AddToVSProject(env.servers_sources)
 		AddToVSProject(env.tool_sources)
 		AddToVSProject(env.tool_sources)
-		
+
 		#env['MSVS_VERSION']='9.0'
 		#env['MSVS_VERSION']='9.0'
 		env['MSVSBUILDCOM'] = "scons platform=" + selected_platform + " target=" + env["target"] + " bits=" + env["bits"] + " tools=yes"
 		env['MSVSBUILDCOM'] = "scons platform=" + selected_platform + " target=" + env["target"] + " bits=" + env["bits"] + " tools=yes"
 		env['MSVSREBUILDCOM'] = "scons platform=" + selected_platform + " target=" + env["target"] + " bits=" + env["bits"] + " tools=yes vsproj=true"
 		env['MSVSREBUILDCOM'] = "scons platform=" + selected_platform + " target=" + env["target"] + " bits=" + env["bits"] + " tools=yes vsproj=true"
 		env['MSVSCLEANCOM'] = "scons --clean platform=" + selected_platform + " target=" + env["target"] + " bits=" + env["bits"] + " tools=yes"
 		env['MSVSCLEANCOM'] = "scons --clean platform=" + selected_platform + " target=" + env["target"] + " bits=" + env["bits"] + " tools=yes"
-			
+
 		debug_variants = ['Debug|Win32']+['Debug|x64']
 		debug_variants = ['Debug|Win32']+['Debug|x64']
 		release_variants = ['Release|Win32']+['Release|x64']
 		release_variants = ['Release|Win32']+['Release|x64']
 		release_debug_variants = ['Release_Debug|Win32']+['Release_Debug|x64']
 		release_debug_variants = ['Release_Debug|Win32']+['Release_Debug|x64']
@@ -382,11 +383,11 @@ if selected_platform in platform_list:
 		targets = debug_targets + release_targets + release_debug_targets
 		targets = debug_targets + release_targets + release_debug_targets
 		msvproj = env.MSVSProject(target = ['#godot' + env['MSVSPROJECTSUFFIX'] ],
 		msvproj = env.MSVSProject(target = ['#godot' + env['MSVSPROJECTSUFFIX'] ],
 								incs = env.vs_incs,
 								incs = env.vs_incs,
-								srcs = env.vs_srcs, 
-								runfile = targets, 
-								buildtarget = targets, 
-								auto_build_solution=1, 
-								variant = variants) 		
+								srcs = env.vs_srcs,
+								runfile = targets,
+								buildtarget = targets,
+								auto_build_solution=1,
+								variant = variants)
 
 
 else:
 else:
 
 

+ 0 - 2
bin/tests/SCsub

@@ -10,5 +10,3 @@ Export('env')
 lib = env.Library("tests",env.tests_sources)
 lib = env.Library("tests",env.tests_sources)
 
 
 env.Prepend(LIBS=[lib])
 env.Prepend(LIBS=[lib])
-
-

+ 0 - 2
core/SCsub

@@ -63,5 +63,3 @@ SConscript('bind/SCsub');
 lib = env.Library("core",env.core_sources)
 lib = env.Library("core",env.core_sources)
 
 
 env.Prepend(LIBS=[lib])
 env.Prepend(LIBS=[lib])
-
-

+ 0 - 2
core/bind/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.core_sources,"*.cpp")
 env.add_source_files(env.core_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 0 - 2
core/io/SCsub

@@ -5,5 +5,3 @@ env.add_source_files(env.core_sources,"*.c")
 #env.core_sources.append("io/fastlz.c")
 #env.core_sources.append("io/fastlz.c")
 
 
 Export('env')
 Export('env')
-
-

+ 6 - 6
core/io/json.cpp

@@ -177,9 +177,6 @@ Error JSON::_get_token(const CharType *p_str, int &idx, int p_len, Token& r_toke
 							case 'n': res=10; break;
 							case 'n': res=10; break;
 							case 'f': res=12; break;
 							case 'f': res=12; break;
 							case 'r': res=13; break;
 							case 'r': res=13; break;
-							case '\"': res='\"'; break;
-							case '\\': res='\\'; break;
-							case '/': res='/'; break; //wtf
 							case 'u': {
 							case 'u': {
 								//hexnumbarh - oct is deprecated
 								//hexnumbarh - oct is deprecated
 
 
@@ -218,10 +215,13 @@ Error JSON::_get_token(const CharType *p_str, int &idx, int p_len, Token& r_toke
 
 
 
 
 							} break;
 							} break;
+							//case '\"': res='\"'; break;
+							//case '\\': res='\\'; break;
+							//case '/': res='/'; break;
 							default: {
 							default: {
-
-								r_err_str="Invalid escape sequence";
-								return ERR_PARSE_ERROR;
+								res = next;
+								//r_err_str="Invalid escape sequence";
+								//return ERR_PARSE_ERROR;
 							} break;
 							} break;
 						}
 						}
 
 

+ 0 - 2
core/math/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.core_sources,"*.cpp")
 env.add_source_files(env.core_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 1 - 1
core/math/quat.h

@@ -73,7 +73,7 @@ public:
 			-x * v.x - y * v.y - z * v.z);
 			-x * v.x - y * v.y - z * v.z);
 	}
 	}
 
 
-	_FORCE_INLINE_ Vector3 xform(const Vector3& v) {
+	_FORCE_INLINE_ Vector3 xform(const Vector3& v) const {
 
 
 		Quat q = *this * v;
 		Quat q = *this * v;
 		q *= this->inverse();
 		q *= this->inverse();

+ 0 - 2
core/os/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.core_sources,"*.cpp")
 env.add_source_files(env.core_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 9 - 2
core/os/os.cpp

@@ -61,9 +61,16 @@ void OS::debug_break() {
 
 
 void OS::print_error(const char* p_function,const char* p_file,int p_line,const char *p_code,const char*p_rationale,ErrorType p_type) {
 void OS::print_error(const char* p_function,const char* p_file,int p_line,const char *p_code,const char*p_rationale,ErrorType p_type) {
 
 
+	const char* err_type;
+	switch(p_type) {
+		case ERR_ERROR: err_type="**ERROR**"; break;
+		case ERR_WARNING: err_type="**WARNING**"; break;
+		case ERR_SCRIPT: err_type="**SCRIPT ERROR**"; break;
+	}
+
 	if (p_rationale && *p_rationale)
 	if (p_rationale && *p_rationale)
-		print("**ERROR**: %s\n ",p_rationale);
-	print("**ERROR**: At: %s:%i:%s() - %s\n",p_file,p_line,p_function,p_code);
+		print("%s: %s\n ",err_type,p_rationale);
+	print("%s: At: %s:%i:%s() - %s\n",err_type,p_file,p_line,p_function,p_code);
 }
 }
 
 
 void OS::print(const char* p_format, ...) {
 void OS::print(const char* p_format, ...) {

+ 2 - 0
core/variant_call.cpp

@@ -409,6 +409,7 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var
 	VCALL_LOCALMEM0R(Quat,normalized);
 	VCALL_LOCALMEM0R(Quat,normalized);
 	VCALL_LOCALMEM0R(Quat,inverse);
 	VCALL_LOCALMEM0R(Quat,inverse);
 	VCALL_LOCALMEM1R(Quat,dot);
 	VCALL_LOCALMEM1R(Quat,dot);
+	VCALL_LOCALMEM1R(Quat,xform);
 	VCALL_LOCALMEM2R(Quat,slerp);
 	VCALL_LOCALMEM2R(Quat,slerp);
 	VCALL_LOCALMEM2R(Quat,slerpni);
 	VCALL_LOCALMEM2R(Quat,slerpni);
 	VCALL_LOCALMEM4R(Quat,cubic_slerp);
 	VCALL_LOCALMEM4R(Quat,cubic_slerp);
@@ -1361,6 +1362,7 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl
 	ADDFUNC0(QUAT,QUAT,Quat,normalized,varray());
 	ADDFUNC0(QUAT,QUAT,Quat,normalized,varray());
 	ADDFUNC0(QUAT,QUAT,Quat,inverse,varray());
 	ADDFUNC0(QUAT,QUAT,Quat,inverse,varray());
 	ADDFUNC1(QUAT,REAL,Quat,dot,QUAT,"b",varray());
 	ADDFUNC1(QUAT,REAL,Quat,dot,QUAT,"b",varray());
+	ADDFUNC1(QUAT,VECTOR3,Quat,xform,VECTOR3,"v",varray());
 	ADDFUNC2(QUAT,QUAT,Quat,slerp,QUAT,"b",REAL,"t",varray());
 	ADDFUNC2(QUAT,QUAT,Quat,slerp,QUAT,"b",REAL,"t",varray());
 	ADDFUNC2(QUAT,QUAT,Quat,slerpni,QUAT,"b",REAL,"t",varray());
 	ADDFUNC2(QUAT,QUAT,Quat,slerpni,QUAT,"b",REAL,"t",varray());
 	ADDFUNC4(QUAT,QUAT,Quat,cubic_slerp,QUAT,"b",QUAT,"pre_a",QUAT,"post_b",REAL,"t",varray());
 	ADDFUNC4(QUAT,QUAT,Quat,cubic_slerp,QUAT,"b",QUAT,"pre_a",QUAT,"post_b",REAL,"t",varray());

+ 16 - 2
core/variant_op.cpp

@@ -586,7 +586,21 @@ void Variant::evaluate(const Operator& p_op, const Variant& p_a, const Variant&
 				} break;
 				} break;
 				DEFAULT_OP_LOCALMEM_NUM(*,VECTOR3,Vector3);
 				DEFAULT_OP_LOCALMEM_NUM(*,VECTOR3,Vector3);
 				DEFAULT_OP_FAIL(PLANE);
 				DEFAULT_OP_FAIL(PLANE);
-				DEFAULT_OP_FAIL(QUAT);
+				case QUAT: {
+
+					switch(p_b.type) {
+						case VECTOR3: {
+
+							_RETURN( reinterpret_cast<const Quat*>(p_a._data._mem)->xform( *(const Vector3*)p_b._data._mem) );
+						} break;
+						case QUAT: {
+
+							_RETURN( *reinterpret_cast<const Quat*>(p_a._data._mem) * *reinterpret_cast<const Quat*>(p_b._data._mem) );
+						} break;
+					};
+					r_valid=false;
+					return;
+				} break;
 				DEFAULT_OP_FAIL(_AABB);
 				DEFAULT_OP_FAIL(_AABB);
 				case MATRIX3: {
 				case MATRIX3: {
 
 
@@ -2573,7 +2587,7 @@ bool Variant::in(const Variant& p_index, bool *r_valid) const {
 				String idx=p_index;
 				String idx=p_index;
 				const String *str=reinterpret_cast<const String*>(_data._mem);
 				const String *str=reinterpret_cast<const String*>(_data._mem);
 
 
-				return str->find("idx")!=-1;
+				return str->find(idx)!=-1;
 			}
 			}
 
 
 		} break;
 		} break;

+ 1 - 0
demos/2d/area_input/engine.cfg

@@ -2,3 +2,4 @@
 
 
 name="Area 2D Input Events"
 name="Area 2D Input Events"
 main_scene="res://input.scn"
 main_scene="res://input.scn"
+icon="res://icon.png"

BIN
demos/2d/area_input/icon.png


+ 1 - 0
demos/2d/dynamic_collision_shapes/engine.cfg

@@ -2,3 +2,4 @@
 
 
 name="Run-Time CollisionShape"
 name="Run-Time CollisionShape"
 main_scene="res://dynamic_colobjs.scn"
 main_scene="res://dynamic_colobjs.scn"
+icon="res://icon.png"

BIN
demos/2d/dynamic_collision_shapes/icon.png


+ 1 - 1
demos/2d/fog_of_war/engine.cfg

@@ -2,7 +2,7 @@
 
 
 name="Fog of War"
 name="Fog of War"
 main_scene="res://fog.scn"
 main_scene="res://fog.scn"
-icon="icon.png"
+icon="res://icon.png"
 
 
 [input]
 [input]
 
 

+ 1 - 0
demos/2d/hdr/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="HDR for 2D"
 name="HDR for 2D"
 main_scene="res://beach_cave.scn"
 main_scene="res://beach_cave.scn"
+icon="res://icon.png"
 
 
 [display]
 [display]
 
 

BIN
demos/2d/hdr/icon.png


+ 1 - 0
demos/2d/isometric_light/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="Isometric 2D + Lighting"
 name="Isometric 2D + Lighting"
 main_scene="res://map.scn"
 main_scene="res://map.scn"
+icon="res://icon.png"
 
 
 [input]
 [input]
 
 

BIN
demos/2d/isometric_light/icon.png


+ 1 - 0
demos/2d/light_mask/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="Using Lights As Mask"
 name="Using Lights As Mask"
 main_scene="res://lightmask.scn"
 main_scene="res://lightmask.scn"
+icon="res://icon.png"
 
 
 [rasterizer]
 [rasterizer]
 
 

BIN
demos/2d/light_mask/icon.png


+ 1 - 0
demos/2d/lights_shadows/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="2D Lighting"
 name="2D Lighting"
 main_scene="res://light_shadows.scn"
 main_scene="res://light_shadows.scn"
+icon="res://icon.png"
 
 
 [display]
 [display]
 
 

BIN
demos/2d/lights_shadows/icon.png


+ 1 - 0
demos/2d/navpoly/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="Navigation Polygon (2D)"
 name="Navigation Polygon (2D)"
 main_scene="res://navigation.scn"
 main_scene="res://navigation.scn"
+icon="res://icon.png"
 
 
 [display]
 [display]
 
 

BIN
demos/2d/navpoly/icon.png


+ 1 - 0
demos/2d/normalmaps/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="2D Normal Mapping"
 name="2D Normal Mapping"
 main_scene="res://normalmap.scn"
 main_scene="res://normalmap.scn"
+icon="res://icon.png"
 
 
 [display]
 [display]
 
 

BIN
demos/2d/normalmaps/icon.png


+ 1 - 1
demos/2d/polygon_path_finder_demo/engine.cfg

@@ -2,4 +2,4 @@
 
 
 name="polygon_path_finder_demo"
 name="polygon_path_finder_demo"
 main_scene="res://new_scene_poly_with_holes.scn"
 main_scene="res://new_scene_poly_with_holes.scn"
-icon="icon.png"
+icon="res://icon.png"

+ 1 - 0
demos/2d/screen_space_shaders/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="Screen-Space Shaders"
 name="Screen-Space Shaders"
 main_scene="res://screen_shaders.scn"
 main_scene="res://screen_shaders.scn"
+icon="res://icon.png"
 
 
 [display]
 [display]
 
 

BIN
demos/2d/screen_space_shaders/icon.png


+ 1 - 0
demos/2d/sdf_font/engine.cfg

@@ -2,3 +2,4 @@
 
 
 name="Signed Distance Field Font"
 name="Signed Distance Field Font"
 main_scene="res://sdf.scn"
 main_scene="res://sdf.scn"
+icon="res://icon.png"

BIN
demos/2d/sdf_font/icon.png


+ 1 - 0
demos/2d/splash/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="Splash Screen"
 name="Splash Screen"
 main_scene="res://splash.xml"
 main_scene="res://splash.xml"
+icon="res://icon.png"
 
 
 [display]
 [display]
 
 

BIN
demos/2d/splash/icon.png


+ 1 - 0
demos/2d/sprite_shaders/engine.cfg

@@ -2,3 +2,4 @@
 
 
 name="2D Shaders for Sprites"
 name="2D Shaders for Sprites"
 main_scene="res://sprite_shaders.scn"
 main_scene="res://sprite_shaders.scn"
+icon="res://icon.png"

BIN
demos/2d/sprite_shaders/icon.png


BIN
demos/3d/navmesh/icon.png


+ 1 - 0
demos/3d/sat_test/engine.cfg

@@ -2,3 +2,4 @@
 
 
 name="SAT Collision Test"
 name="SAT Collision Test"
 main_scene="res://sat_test.xml"
 main_scene="res://sat_test.xml"
+icon="res://icon.png"

BIN
demos/3d/sat_test/icon.png


+ 0 - 1
demos/gui/input_mapping/engine.cfg

@@ -2,7 +2,6 @@
 
 
 name="Input Mapping GUI"
 name="Input Mapping GUI"
 main_scene="res://controls.scn"
 main_scene="res://controls.scn"
-icon="icon.png"
 
 
 [display]
 [display]
 
 

+ 1 - 0
demos/gui/rich_text_bbcode/engine.cfg

@@ -2,3 +2,4 @@
 
 
 name="Rich Text Label (BBCode)"
 name="Rich Text Label (BBCode)"
 main_scene="res://rich_text_bbcode.scn"
 main_scene="res://rich_text_bbcode.scn"
+icon="res://icon.png"

BIN
demos/gui/rich_text_bbcode/icon.png


+ 1 - 0
demos/misc/instancing/engine.cfg

@@ -2,6 +2,7 @@
 
 
 name="Scene Instancing Demo"
 name="Scene Instancing Demo"
 main_scene="res://container.scn"
 main_scene="res://container.scn"
+icon="res://icon.png"
 
 
 [physics_2d]
 [physics_2d]
 
 

BIN
demos/misc/instancing/icon.png


+ 10 - 8
demos/misc/regex/regex.gd

@@ -2,21 +2,23 @@ extends VBoxContainer
 
 
 var regex = RegEx.new()
 var regex = RegEx.new()
 
 
-func update_expression():
-	regex.compile(get_node("Expression").get_text())
+func update_expression(text):
+	regex.compile(text)
 	update_text()
 	update_text()
 
 
 func update_text():
 func update_text():
 	var text = get_node("Text").get_text()
 	var text = get_node("Text").get_text()
-	regex.find(text)
 	var list = get_node("List")
 	var list = get_node("List")
 	for child in list.get_children():
 	for child in list.get_children():
 		child.queue_free()
 		child.queue_free()
-	for res in regex.get_captures():
-		var label = Label.new()
-		label.set_text(res)
-		list.add_child(label)
+	if regex.is_valid():
+		regex.find(text)
+		for res in regex.get_captures():
+			var label = Label.new()
+			label.set_text(res)
+			list.add_child(label)
 
 
 func _ready():
 func _ready():
 	get_node("Text").set_text("They asked me \"What's going on \\\"in the manor\\\"?\"")
 	get_node("Text").set_text("They asked me \"What's going on \\\"in the manor\\\"?\"")
-	update_expression()
+	update_expression(get_node("Expression").get_text())
+

BIN
demos/misc/regex/regex.scn


+ 1 - 1
demos/misc/tween/engine.cfg

@@ -2,7 +2,7 @@
 
 
 name="Tween Demo"
 name="Tween Demo"
 main_scene="res://main.xml"
 main_scene="res://main.xml"
-icon="icon.png"
+icon="res://icon.png"
 target_fps=60
 target_fps=60
 
 
 [display]
 [display]

+ 1 - 1
demos/misc/window_management/engine.cfg

@@ -2,7 +2,7 @@
 
 
 name="Window Management"
 name="Window Management"
 main_scene="res://window_management.scn"
 main_scene="res://window_management.scn"
-icon="icon.png"
+icon="res://icon.png"
 
 
 [display]
 [display]
 
 

+ 13 - 8
drivers/SCsub

@@ -69,21 +69,27 @@ for f in env.drivers_sources:
 		fname = env.File(f).path
 		fname = env.File(f).path
 	else:
 	else:
 		fname = env.File(f)[0].path
 		fname = env.File(f)[0].path
-	#base = string.join(fname.split("/")[:-1], "/")
 	fname = fname.replace("\\", "/")
 	fname = fname.replace("\\", "/")
 	base = string.join(fname.split("/")[:2], "/")
 	base = string.join(fname.split("/")[:2], "/")
 	if base != cur_base and len(list) > max_src:
 	if base != cur_base and len(list) > max_src:
-		lib = env.Library("drivers"+str(num), list)
-		lib_list.append(lib)
-		list = []
+		if num > 0:
+			lib = env.Library("drivers"+str(num), list)
+			lib_list.append(lib)
+			list = []
 		num = num+1
 		num = num+1
 	cur_base = base
 	cur_base = base
 	list.append(f)
 	list.append(f)
 
 
-if len(list) > 0:
-	lib = env.Library("drivers"+str(num), list)
-	lib_list.append(lib)
+lib = env.Library("drivers"+str(num), list)
+lib_list.append(lib)
 
 
+if len(lib_list) > 0:
+	import os, sys
+	if os.name=='posix' and sys.platform=='msys':
+		env.Replace(ARFLAGS=['rcsT'])
+
+		lib = env.Library("drivers_collated", lib_list)
+		lib_list = [lib]
 
 
 drivers_base=[]
 drivers_base=[]
 env.add_source_files(drivers_base,"*.cpp")
 env.add_source_files(drivers_base,"*.cpp")
@@ -93,4 +99,3 @@ env.Prepend(LIBS=lib_list)
 
 
 #lib = env.Library("drivers",env.drivers_sources)
 #lib = env.Library("drivers",env.drivers_sources)
 #env.Prepend(LIBS=[lib])
 #env.Prepend(LIBS=[lib])
-

+ 0 - 2
drivers/alsa/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 1 - 1
drivers/builtin_zlib/SCsub

@@ -1,7 +1,7 @@
 Import('env')
 Import('env')
 
 
 zlib_sources = [
 zlib_sources = [
-	
+
 	"builtin_zlib/zlib/adler32.c",
 	"builtin_zlib/zlib/adler32.c",
 	"builtin_zlib/zlib/compress.c",
 	"builtin_zlib/zlib/compress.c",
 	"builtin_zlib/zlib/crc32.c",
 	"builtin_zlib/zlib/crc32.c",

+ 0 - 2
drivers/chibi/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 0 - 1
drivers/dds/SCsub

@@ -8,4 +8,3 @@ dds_sources = [
 env.drivers_sources+=dds_sources
 env.drivers_sources+=dds_sources
 
 
 #env.add_source_files(env.drivers_sources, dds_sources)
 #env.add_source_files(env.drivers_sources, dds_sources)
-

+ 0 - 1
drivers/etc1/SCsub

@@ -12,4 +12,3 @@ if (env["etc1"] != "no"):
 #env.add_source_files(env.drivers_sources, etc_sources)
 #env.add_source_files(env.drivers_sources, etc_sources)
 
 
 Export('env')
 Export('env')
-

+ 0 - 1
drivers/gl_context/SCsub

@@ -3,4 +3,3 @@ Export('env');
 
 
 env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.c")
 env.add_source_files(env.drivers_sources,"*.c")
-

+ 66 - 50
drivers/gles2/rasterizer_gles2.cpp

@@ -4075,6 +4075,8 @@ void RasterizerGLES2::render_target_set_size(RID p_render_target,int p_width,int
 		glDeleteTextures(1,&rt->color);
 		glDeleteTextures(1,&rt->color);
 
 
 		rt->fbo=0;
 		rt->fbo=0;
+		rt->depth=0;
+		rt->color=0;
 		rt->width=0;
 		rt->width=0;
 		rt->height=0;
 		rt->height=0;
 		rt->texture_ptr->tex_id=0;
 		rt->texture_ptr->tex_id=0;
@@ -4094,12 +4096,14 @@ void RasterizerGLES2::render_target_set_size(RID p_render_target,int p_width,int
 	glBindFramebuffer(GL_FRAMEBUFFER, rt->fbo);
 	glBindFramebuffer(GL_FRAMEBUFFER, rt->fbo);
 
 
 	//depth
 	//depth
-	glGenRenderbuffers(1, &rt->depth);
-	glBindRenderbuffer(GL_RENDERBUFFER, rt->depth );
+	if (!low_memory_2d) {
+		glGenRenderbuffers(1, &rt->depth);
+		glBindRenderbuffer(GL_RENDERBUFFER, rt->depth );
 
 
-	glRenderbufferStorage(GL_RENDERBUFFER, use_depth24?_DEPTH_COMPONENT24_OES:GL_DEPTH_COMPONENT16, rt->width,rt->height);
+		glRenderbufferStorage(GL_RENDERBUFFER, use_depth24?_DEPTH_COMPONENT24_OES:GL_DEPTH_COMPONENT16, rt->width,rt->height);
 
 
-	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth);
+		glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth);
+	}
 
 
 	//color
 	//color
 	glGenTextures(1, &rt->color);
 	glGenTextures(1, &rt->color);
@@ -4644,6 +4648,9 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const {
 			enablers.push_back("#define USE_TIME\n");
 			enablers.push_back("#define USE_TIME\n");
 			uses_time=true;
 			uses_time=true;
 		}
 		}
+		if (vertex_flags.vertex_code_writes_position) {
+			enablers.push_back("#define VERTEX_SHADER_WRITE_POSITION\n");
+		}
 
 
 		material_shader.set_custom_shader_code(p_shader->custom_code_id,vertex_code, vertex_globals,fragment_code, light_code, fragment_globals,uniform_names,enablers);
 		material_shader.set_custom_shader_code(p_shader->custom_code_id,vertex_code, vertex_globals,fragment_code, light_code, fragment_globals,uniform_names,enablers);
 	} else if (p_shader->mode==VS::SHADER_CANVAS_ITEM) {
 	} else if (p_shader->mode==VS::SHADER_CANVAS_ITEM) {
@@ -6529,80 +6536,84 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans
 			material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false);
 			material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false);
 			material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,false);
 			material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,false);
 
 
-			if (e->instance->sampled_light.is_valid()) {
+			if (material->flags[VS::MATERIAL_FLAG_UNSHADED] == false && current_debug != VS::SCENARIO_DEBUG_SHADELESS) {
 
 
-				SampledLight *sl = sampled_light_owner.get(e->instance->sampled_light);
-				if (sl) {
+				if (e->instance->sampled_light.is_valid()) {
 
 
-					baked_light=NULL; //can't mix
-					material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,true);
-					glActiveTexture(GL_TEXTURE0+max_texture_units-3);
-					glBindTexture(GL_TEXTURE_2D,sl->texture); //bind the texture
-					sampled_light_dp_multiplier=sl->multiplier;
-					bind_dp_sampler=true;
+					SampledLight *sl = sampled_light_owner.get(e->instance->sampled_light);
+					if (sl) {
+
+						baked_light = NULL; //can't mix
+						material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER, true);
+						glActiveTexture(GL_TEXTURE0 + max_texture_units - 3);
+						glBindTexture(GL_TEXTURE_2D, sl->texture); //bind the texture
+						sampled_light_dp_multiplier = sl->multiplier;
+						bind_dp_sampler = true;
+					}
 				}
 				}
-			}
 
 
 
 
-			if (!additive && baked_light) {
+				if (!additive && baked_light) {
 
 
-				if (baked_light->mode==VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) {
-					material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,true);
-					bind_baked_light_octree=true;
-					if (prev_baked_light!=baked_light) {
-						Texture *tex=texture_owner.get(baked_light->octree_texture);
-						if (tex) {
+					if (baked_light->mode == VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) {
+						material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE, true);
+						bind_baked_light_octree = true;
+						if (prev_baked_light != baked_light) {
+							Texture *tex = texture_owner.get(baked_light->octree_texture);
+							if (tex) {
 
 
-							glActiveTexture(GL_TEXTURE0+max_texture_units-3);
-							glBindTexture(tex->target,tex->tex_id); //bind the texture
-						}
-						if (baked_light->light_texture.is_valid()) {
-							Texture *texl=texture_owner.get(baked_light->light_texture);
-							if (texl) {
-								glActiveTexture(GL_TEXTURE0+max_texture_units-4);
-								glBindTexture(texl->target,texl->tex_id); //bind the light texture
+								glActiveTexture(GL_TEXTURE0 + max_texture_units - 3);
+								glBindTexture(tex->target, tex->tex_id); //bind the texture
+							}
+							if (baked_light->light_texture.is_valid()) {
+								Texture *texl = texture_owner.get(baked_light->light_texture);
+								if (texl) {
+									glActiveTexture(GL_TEXTURE0 + max_texture_units - 4);
+									glBindTexture(texl->target, texl->tex_id); //bind the light texture
+								}
 							}
 							}
-						}
 
 
+						}
 					}
 					}
-				} else if (baked_light->mode==VS::BAKED_LIGHT_LIGHTMAPS) {
+					else if (baked_light->mode == VS::BAKED_LIGHT_LIGHTMAPS) {
 
 
 
 
-					int lightmap_idx = e->instance->baked_lightmap_id;
+						int lightmap_idx = e->instance->baked_lightmap_id;
 
 
-					material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false);
-					bind_baked_lightmap=false;
+						material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP, false);
+						bind_baked_lightmap = false;
 
 
 
 
-					if (baked_light->lightmaps.has(lightmap_idx)) {
+						if (baked_light->lightmaps.has(lightmap_idx)) {
 
 
 
 
-						RID texid = baked_light->lightmaps[lightmap_idx];
+							RID texid = baked_light->lightmaps[lightmap_idx];
 
 
-						if (prev_baked_light!=baked_light || texid!=prev_baked_light_texture) {
+							if (prev_baked_light != baked_light || texid != prev_baked_light_texture) {
 
 
 
 
-							Texture *tex = texture_owner.get(texid);
-							if (tex) {
+								Texture *tex = texture_owner.get(texid);
+								if (tex) {
+
+									glActiveTexture(GL_TEXTURE0 + max_texture_units - 3);
+									glBindTexture(tex->target, tex->tex_id); //bind the texture
+								}
 
 
-								glActiveTexture(GL_TEXTURE0+max_texture_units-3);
-								glBindTexture(tex->target,tex->tex_id); //bind the texture
+								prev_baked_light_texture = texid;
 							}
 							}
 
 
-							prev_baked_light_texture=texid;
-						}
+							if (texid.is_valid()) {
+								material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP, true);
+								bind_baked_lightmap = true;
+							}
 
 
-						if (texid.is_valid()) {
-							material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,true);
-							bind_baked_lightmap=true;
 						}
 						}
-
 					}
 					}
 				}
 				}
-			}
 
 
-			if (int(prev_baked_light!=NULL) ^ int(baked_light!=NULL)) {
-				rebind=true;
+				if (int(prev_baked_light != NULL) ^ int(baked_light != NULL)) {
+					rebind = true;
+				}
 			}
 			}
 		}
 		}
 
 
@@ -10296,7 +10307,11 @@ void RasterizerGLES2::_update_framebuffer() {
 		framebuffer.fbo=0;
 		framebuffer.fbo=0;
 	}
 	}
 
 
+#ifdef TOOLS_ENABLED
 	framebuffer.active=use_fbo;
 	framebuffer.active=use_fbo;
+#else
+	framebuffer.active=use_fbo && !low_memory_2d;
+#endif
 	framebuffer.width=dwidth;
 	framebuffer.width=dwidth;
 	framebuffer.height=dheight;
 	framebuffer.height=dheight;
 	framebuffer.scale=scale;
 	framebuffer.scale=scale;
@@ -11206,6 +11221,7 @@ RasterizerGLES2::RasterizerGLES2(bool p_compress_arrays,bool p_keep_ram_copy,boo
 	use_fp16_fb=bool(GLOBAL_DEF("rasterizer/fp16_framebuffer",true));
 	use_fp16_fb=bool(GLOBAL_DEF("rasterizer/fp16_framebuffer",true));
 	use_shadow_mapping=true;
 	use_shadow_mapping=true;
 	use_fast_texture_filter=!bool(GLOBAL_DEF("rasterizer/trilinear_mipmap_filter",true));
 	use_fast_texture_filter=!bool(GLOBAL_DEF("rasterizer/trilinear_mipmap_filter",true));
+	low_memory_2d=bool(GLOBAL_DEF("rasterizer/low_memory_2d_mode",false));
 	skel_default.resize(1024*4);
 	skel_default.resize(1024*4);
 	for(int i=0;i<1024/3;i++) {
 	for(int i=0;i<1024/3;i++) {
 
 

+ 3 - 3
drivers/gles2/rasterizer_gles2.h

@@ -105,13 +105,13 @@ class RasterizerGLES2 : public Rasterizer {
 	float anisotropic_level;
 	float anisotropic_level;
 
 
 	bool use_half_float;
 	bool use_half_float;
-
+	bool low_memory_2d;
 
 
 	Vector<float> skel_default;
 	Vector<float> skel_default;
 
 
 	Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,GLenum& r_gl_internal_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed);
 	Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,GLenum& r_gl_internal_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed);
 
 
-	class RenderTarget;
+	struct RenderTarget;
 
 
 	struct Texture {
 	struct Texture {
 
 
@@ -305,7 +305,7 @@ class RasterizerGLES2 : public Rasterizer {
 		virtual ~GeometryOwner() {}
 		virtual ~GeometryOwner() {}
 	};
 	};
 
 
-	class Mesh;
+	struct Mesh;
 
 
 	struct Surface : public Geometry {
 	struct Surface : public Geometry {
 
 

+ 123 - 115
drivers/gles2/shader_compiler_gles2.cpp

@@ -154,6 +154,9 @@ String ShaderCompilerGLES2::dump_node_code(SL::Node *p_node,int p_level,bool p_a
 				if (vnode->name==vname_vertex && p_assign_left) {
 				if (vnode->name==vname_vertex && p_assign_left) {
 					vertex_code_writes_vertex=true;
 					vertex_code_writes_vertex=true;
 				}
 				}
+				if (vnode->name == vname_position && p_assign_left) {
+					vertex_code_writes_position = true;
+				}
 				if (vnode->name==vname_color_interp) {
 				if (vnode->name==vname_color_interp) {
 					flags->use_color_interp=true;
 					flags->use_color_interp=true;
 				}
 				}
@@ -663,6 +666,7 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT
 	uses_texpixel_size=false;
 	uses_texpixel_size=false;
 	uses_worldvec=false;
 	uses_worldvec=false;
 	vertex_code_writes_vertex=false;
 	vertex_code_writes_vertex=false;
+	vertex_code_writes_position = false;
 	uses_shadow_color=false;
 	uses_shadow_color=false;
 	uniforms=r_uniforms;
 	uniforms=r_uniforms;
 	flags=&r_flags;
 	flags=&r_flags;
@@ -694,6 +698,7 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT
 	r_flags.uses_texscreen=uses_texscreen;
 	r_flags.uses_texscreen=uses_texscreen;
 	r_flags.uses_texpos=uses_texpos;
 	r_flags.uses_texpos=uses_texpos;
 	r_flags.vertex_code_writes_vertex=vertex_code_writes_vertex;
 	r_flags.vertex_code_writes_vertex=vertex_code_writes_vertex;
+	r_flags.vertex_code_writes_position=vertex_code_writes_position;
 	r_flags.uses_discard=uses_discard;
 	r_flags.uses_discard=uses_discard;
 	r_flags.uses_screen_uv=uses_screen_uv;
 	r_flags.uses_screen_uv=uses_screen_uv;
 	r_flags.uses_light=uses_light;
 	r_flags.uses_light=uses_light;
@@ -782,127 +787,129 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
 	replace_table["texscreen"]= "texscreen";
 	replace_table["texscreen"]= "texscreen";
 	replace_table["texpos"]= "texpos";
 	replace_table["texpos"]= "texpos";
 
 
-	mode_replace_table[0]["SRC_VERTEX"]="vertex_in.xyz";
-	mode_replace_table[0]["SRC_NORMAL"]="normal_in";
-	mode_replace_table[0]["SRC_TANGENT"]="tangent_in";
-	mode_replace_table[0]["SRC_BINORMALF"]="binormalf";
-
-	mode_replace_table[0]["VERTEX"]="vertex_interp";
-	mode_replace_table[0]["NORMAL"]="normal_interp";
-	mode_replace_table[0]["TANGENT"]="tangent_interp";
-	mode_replace_table[0]["BINORMAL"]="binormal_interp";
-	mode_replace_table[0]["UV"]="uv_interp.xy";
-	mode_replace_table[0]["UV2"]="uv_interp.zw";
-	mode_replace_table[0]["COLOR"]="color_interp";
+
+
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["SRC_VERTEX"] = "vertex_in.xyz";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["SRC_NORMAL"] = "normal_in";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["SRC_TANGENT"]="tangent_in";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["SRC_BINORMALF"]="binormalf";
+	
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["POSITION"] = "gl_Position";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["VERTEX"]="vertex_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["NORMAL"]="normal_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["TANGENT"]="tangent_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["BINORMAL"]="binormal_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["UV"]="uv_interp.xy";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["UV2"]="uv_interp.zw";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["COLOR"]="color_interp";
 	//@TODO convert to glsl stuff
 	//@TODO convert to glsl stuff
-	mode_replace_table[0]["SPEC_EXP"]="vertex_specular_exp";
-	mode_replace_table[0]["WORLD_MATRIX"]="world_transform";
-	mode_replace_table[0]["INV_CAMERA_MATRIX"]="camera_inverse_transform";
-	mode_replace_table[0]["PROJECTION_MATRIX"]="projection_transform";
-	mode_replace_table[0]["MODELVIEW_MATRIX"]="modelview";
-	mode_replace_table[0]["POINT_SIZE"]="gl_PointSize";
-	mode_replace_table[0]["VAR1"]="var1_interp";
-	mode_replace_table[0]["VAR2"]="var2_interp";
-
-//	mode_replace_table[0]["SCREEN_POS"]="SCREEN_POS";
-//	mode_replace_table[0]["SCREEN_SIZE"]="SCREEN_SIZE";
-	mode_replace_table[0]["INSTANCE_ID"]="instance_id";
-	mode_replace_table[0]["TIME"]="time";
-
-	mode_replace_table[1]["VERTEX"]="vertex";
-	//mode_replace_table[1]["POSITION"]="IN_POSITION";
-	mode_replace_table[1]["NORMAL"]="normal";
-	mode_replace_table[1]["TANGENT"]="tangent";
-	mode_replace_table[1]["POSITION"]="gl_Position";
-	mode_replace_table[1]["BINORMAL"]="binormal";
-	mode_replace_table[1]["NORMALMAP"]="normalmap";
-	mode_replace_table[1]["NORMALMAP_DEPTH"]="normaldepth";
-	mode_replace_table[1]["VAR1"]="var1_interp";
-	mode_replace_table[1]["VAR2"]="var2_interp";
-	mode_replace_table[1]["UV"]="uv";
-	mode_replace_table[1]["UV2"]="uv2";
-	mode_replace_table[1]["SCREEN_UV"]="screen_uv";
-	mode_replace_table[1]["VAR1"]="var1_interp";
-	mode_replace_table[1]["VAR2"]="var2_interp";
-	mode_replace_table[1]["COLOR"]="color";
-	mode_replace_table[1]["DIFFUSE"]="diffuse.rgb";
-	mode_replace_table[1]["DIFFUSE_ALPHA"]="diffuse";
-	mode_replace_table[1]["SPECULAR"]="specular";
-	mode_replace_table[1]["EMISSION"]="emission";
-	mode_replace_table[1]["SHADE_PARAM"]="shade_param";
-	mode_replace_table[1]["SPEC_EXP"]="specular_exp";
-	mode_replace_table[1]["GLOW"]="glow";
-	mode_replace_table[1]["DISCARD"]="discard_";
-	mode_replace_table[1]["POINT_COORD"]="gl_PointCoord";
-	mode_replace_table[1]["INV_CAMERA_MATRIX"]="camera_inverse_transform";
-
-	//mode_replace_table[1]["SCREEN_POS"]="SCREEN_POS";
-	//mode_replace_table[1]["SCREEN_TEXEL_SIZE"]="SCREEN_TEXEL_SIZE";
-	mode_replace_table[1]["TIME"]="time";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["SPEC_EXP"]="vertex_specular_exp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["WORLD_MATRIX"]="world_transform";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["INV_CAMERA_MATRIX"]="camera_inverse_transform";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["PROJECTION_MATRIX"]="projection_transform";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["MODELVIEW_MATRIX"]="modelview";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["POINT_SIZE"]="gl_PointSize";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["VAR1"]="var1_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["VAR2"]="var2_interp";
+
+//	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["SCREEN_POS"]="SCREEN_POS";
+//	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["SCREEN_SIZE"]="SCREEN_SIZE";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["INSTANCE_ID"]="instance_id";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_VERTEX]["TIME"]="time";
+
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["VERTEX"]="vertex";
+	//mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["POSITION"]="IN_POSITION";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["NORMAL"]="normal";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["TANGENT"]="tangent";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["POSITION"]="gl_Position";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["BINORMAL"]="binormal";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["NORMALMAP"]="normalmap";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["NORMALMAP_DEPTH"]="normaldepth";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["VAR1"]="var1_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["VAR2"]="var2_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["UV"]="uv";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["UV2"]="uv2";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["SCREEN_UV"]="screen_uv";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["VAR1"]="var1_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["VAR2"]="var2_interp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["COLOR"]="color";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["DIFFUSE"]="diffuse.rgb";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["DIFFUSE_ALPHA"]="diffuse";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["SPECULAR"]="specular";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["EMISSION"]="emission";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["SHADE_PARAM"]="shade_param";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["SPEC_EXP"]="specular_exp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["GLOW"]="glow";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["DISCARD"]="discard_";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["POINT_COORD"]="gl_PointCoord";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["INV_CAMERA_MATRIX"]="camera_inverse_transform";
+
+	//mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["SCREEN_POS"]="SCREEN_POS";
+	//mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["SCREEN_TEXEL_SIZE"]="SCREEN_TEXEL_SIZE";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_FRAGMENT]["TIME"]="time";
 
 
 	//////////////
 	//////////////
 
 
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["NORMAL"]="normal";
+	//mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["POSITION"]="IN_POSITION";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["LIGHT_DIR"]="light_dir";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["LIGHT_DIFFUSE"]="light_diffuse";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["LIGHT_SPECULAR"]="light_specular";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["EYE_VEC"]="eye_vec";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["DIFFUSE"]="mdiffuse";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["SPECULAR"]="specular";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["SPECULAR_EXP"]="specular_exp";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["SHADE_PARAM"]="shade_param";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["LIGHT"]="light";
+	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["POINT_COORD"]="gl_PointCoord";
 	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["TIME"]="time";
 	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["TIME"]="time";
-	mode_replace_table[2]["NORMAL"]="normal";
-	//mode_replace_table[2]["POSITION"]="IN_POSITION";
-	mode_replace_table[2]["LIGHT_DIR"]="light_dir";
-	mode_replace_table[2]["LIGHT_DIFFUSE"]="light_diffuse";
-	mode_replace_table[2]["LIGHT_SPECULAR"]="light_specular";
-	mode_replace_table[2]["EYE_VEC"]="eye_vec";
-	mode_replace_table[2]["DIFFUSE"]="mdiffuse";
-	mode_replace_table[2]["SPECULAR"]="specular";
-	mode_replace_table[2]["SPECULAR_EXP"]="specular_exp";
-	mode_replace_table[2]["SHADE_PARAM"]="shade_param";
-	mode_replace_table[2]["LIGHT"]="light";
 	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["SHADOW"]="shadow_color";
 	mode_replace_table[ShaderLanguage::SHADER_MATERIAL_LIGHT]["SHADOW"]="shadow_color";
-	mode_replace_table[2]["POINT_COORD"]="gl_PointCoord";
-	mode_replace_table[2]["TIME"]="time";
-
-	mode_replace_table[3]["SRC_VERTEX"]="src_vtx";
-	mode_replace_table[3]["VERTEX"]="outvec.xy";
-	mode_replace_table[3]["WORLD_VERTEX"]="outvec.xy";
-	mode_replace_table[3]["UV"]="uv_interp";
-	mode_replace_table[3]["COLOR"]="color_interp";
-	mode_replace_table[3]["VAR1"]="var1_interp";
-	mode_replace_table[3]["VAR2"]="var2_interp";
-	mode_replace_table[3]["POINT_SIZE"]="gl_PointSize";
-	mode_replace_table[3]["WORLD_MATRIX"]="modelview_matrix";
-	mode_replace_table[3]["PROJECTION_MATRIX"]="projection_matrix";
-	mode_replace_table[3]["EXTRA_MATRIX"]="extra_matrix";
-	mode_replace_table[3]["TIME"]="time";
-
-	mode_replace_table[4]["POSITION"]="gl_Position";
-	mode_replace_table[4]["NORMAL"]="normal";
-	mode_replace_table[4]["NORMALMAP"]="normal_map";
-	mode_replace_table[4]["NORMALMAP_DEPTH"]="normal_depth";
-	mode_replace_table[4]["UV"]="uv_interp";
-	mode_replace_table[4]["SRC_COLOR"]="color_interp";
-	mode_replace_table[4]["COLOR"]="color";
-	mode_replace_table[4]["TEXTURE"]="texture";
-	mode_replace_table[4]["TEXTURE_PIXEL_SIZE"]="texpixel_size";
-	mode_replace_table[4]["VAR1"]="var1_interp";
-	mode_replace_table[4]["VAR2"]="var2_interp";
-	mode_replace_table[4]["SCREEN_UV"]="screen_uv";
-	mode_replace_table[4]["POINT_COORD"]="gl_PointCoord";
-	mode_replace_table[4]["TIME"]="time";
-
-	mode_replace_table[5]["POSITION"]="gl_Position";
-	mode_replace_table[5]["NORMAL"]="normal";
-	mode_replace_table[5]["UV"]="uv_interp";
-	mode_replace_table[5]["COLOR"]="color";
-	mode_replace_table[5]["TEXTURE"]="texture";
-	mode_replace_table[5]["TEXTURE_PIXEL_SIZE"]="texpixel_size";
-	mode_replace_table[5]["VAR1"]="var1_interp";
-	mode_replace_table[5]["VAR2"]="var2_interp";
-	mode_replace_table[5]["LIGHT_VEC"]="light_vec";
-	mode_replace_table[5]["LIGHT_HEIGHT"]="light_height";
-	mode_replace_table[5]["LIGHT_COLOR"]="light";
-	mode_replace_table[5]["LIGHT_UV"]="light_uv";
-	mode_replace_table[5]["LIGHT"]="light_out";
-	mode_replace_table[5]["SHADOW"]="shadow_color";
-	mode_replace_table[5]["SCREEN_UV"]="screen_uv";
-	mode_replace_table[5]["POINT_COORD"]="gl_PointCoord";
-	mode_replace_table[5]["TIME"]="time";
+
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["SRC_VERTEX"]="src_vtx";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["VERTEX"]="outvec.xy";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["WORLD_VERTEX"]="outvec.xy";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["UV"]="uv_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["COLOR"]="color_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["VAR1"]="var1_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["VAR2"]="var2_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["POINT_SIZE"]="gl_PointSize";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["WORLD_MATRIX"]="modelview_matrix";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["PROJECTION_MATRIX"]="projection_matrix";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["EXTRA_MATRIX"]="extra_matrix";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_VERTEX]["TIME"]="time";
+
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["POSITION"]="gl_Position";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["NORMAL"]="normal";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["NORMALMAP"]="normal_map";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["NORMALMAP_DEPTH"]="normal_depth";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["UV"]="uv_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["SRC_COLOR"]="color_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["COLOR"]="color";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["TEXTURE"]="texture";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["TEXTURE_PIXEL_SIZE"]="texpixel_size";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["VAR1"]="var1_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["VAR2"]="var2_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["SCREEN_UV"]="screen_uv";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["POINT_COORD"]="gl_PointCoord";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_FRAGMENT]["TIME"]="time";
+
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["POSITION"]="gl_Position";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["NORMAL"]="normal";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["UV"]="uv_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["COLOR"]="color";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["TEXTURE"]="texture";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["TEXTURE_PIXEL_SIZE"]="texpixel_size";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["VAR1"]="var1_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["VAR2"]="var2_interp";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["LIGHT_VEC"]="light_vec";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["LIGHT_HEIGHT"]="light_height";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["LIGHT_COLOR"]="light";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["LIGHT_UV"]="light_uv";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["LIGHT"]="light_out";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["SHADOW"]="shadow_color";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["SCREEN_UV"]="screen_uv";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["POINT_COORD"]="gl_PointCoord";
+	mode_replace_table[ShaderLanguage::SHADER_CANVAS_ITEM_LIGHT]["TIME"]="time";
 
 
 
 
 
 
@@ -923,6 +930,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
 	vname_var1_interp="VAR1";
 	vname_var1_interp="VAR1";
 	vname_var2_interp="VAR2";
 	vname_var2_interp="VAR2";
 	vname_vertex="VERTEX";
 	vname_vertex="VERTEX";
+	vname_position = "POSITION";
 	vname_light="LIGHT";
 	vname_light="LIGHT";
 	vname_time="TIME";
 	vname_time="TIME";
 	vname_normalmap="NORMALMAP";
 	vname_normalmap="NORMALMAP";

+ 4 - 1
drivers/gles2/shader_compiler_gles2.h

@@ -34,7 +34,7 @@ class ShaderCompilerGLES2 {
 
 
 	class Uniform;
 	class Uniform;
 public:
 public:
-	class Flags;
+	struct Flags;
 private:
 private:
 
 
 	ShaderLanguage::ProgramNode *program_node;
 	ShaderLanguage::ProgramNode *program_node;
@@ -55,6 +55,7 @@ private:
 	bool uses_texpixel_size;
 	bool uses_texpixel_size;
 	bool uses_worldvec;
 	bool uses_worldvec;
 	bool vertex_code_writes_vertex;
 	bool vertex_code_writes_vertex;
+	bool vertex_code_writes_position;
 	bool uses_shadow_color;
 	bool uses_shadow_color;
 
 
 	bool sinh_used;
 	bool sinh_used;
@@ -76,6 +77,7 @@ private:
 	StringName vname_var1_interp;
 	StringName vname_var1_interp;
 	StringName vname_var2_interp;
 	StringName vname_var2_interp;
 	StringName vname_vertex;
 	StringName vname_vertex;
+	StringName vname_position;
 	StringName vname_light;
 	StringName vname_light;
 	StringName vname_time;
 	StringName vname_time;
 	StringName vname_normalmap;
 	StringName vname_normalmap;
@@ -107,6 +109,7 @@ public:
 		bool uses_texpos;
 		bool uses_texpos;
 		bool uses_normalmap;
 		bool uses_normalmap;
 		bool vertex_code_writes_vertex;
 		bool vertex_code_writes_vertex;
+		bool vertex_code_writes_position;
 		bool uses_discard;
 		bool uses_discard;
 		bool uses_screen_uv;
 		bool uses_screen_uv;
 		bool use_color_interp;
 		bool use_color_interp;

+ 0 - 2
drivers/gles2/shaders/SCsub

@@ -6,5 +6,3 @@ if env['BUILDERS'].has_key('GLSL120GLES'):
 	env.GLSL120GLES('canvas_shadow.glsl');
 	env.GLSL120GLES('canvas_shadow.glsl');
 	env.GLSL120GLES('blur.glsl');
 	env.GLSL120GLES('blur.glsl');
 	env.GLSL120GLES('copy.glsl');
 	env.GLSL120GLES('copy.glsl');
-
-

+ 0 - 1
drivers/jpg/SCsub

@@ -10,4 +10,3 @@ jpg_sources = [
 env.drivers_sources+=jpg_sources
 env.drivers_sources+=jpg_sources
 
 
 #env.add_source_files(env.drivers_sources, jpg_sources)
 #env.add_source_files(env.drivers_sources, jpg_sources)
-

+ 0 - 1
drivers/mpc/SCsub

@@ -19,4 +19,3 @@ env.add_source_files(env.drivers_sources,"*.cpp")
 #env.add_source_files(env.drivers_sources, mpc_sources)
 #env.add_source_files(env.drivers_sources, mpc_sources)
 
 
 Export('env')
 Export('env')
-

+ 0 - 1
drivers/nedmalloc/SCsub

@@ -3,4 +3,3 @@ Export('env');
 
 
 env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.cpp")
 #env.add_source_files(env.drivers_sources,"*.c")
 #env.add_source_files(env.drivers_sources,"*.c")
-

+ 26 - 31
drivers/nrex/README.md

@@ -18,47 +18,42 @@ More details about its use is documented in `nrex.hpp`
 
 
 Currently supported features:
 Currently supported features:
  * Capturing `()` and non-capturing `(?:)` groups
  * Capturing `()` and non-capturing `(?:)` groups
- * Any character `.`
+ * Any character `.` (includes newlines)
  * Shorthand caracter classes `\w\W\s\S\d\D`
  * Shorthand caracter classes `\w\W\s\S\d\D`
- * User-defined character classes such as `[A-Za-z]`
+ * POSIX character classes such as `[[:alnum:]]`
+ * Bracket expressions such as `[A-Za-z]`
  * Simple quantifiers `?`, `*` and `+`
  * Simple quantifiers `?`, `*` and `+`
  * Range quantifiers `{0,1}`
  * Range quantifiers `{0,1}`
  * Lazy (non-greedy) quantifiers `*?`
  * Lazy (non-greedy) quantifiers `*?`
  * Begining `^` and end `$` anchors
  * Begining `^` and end `$` anchors
+ * Word boundaries `\b`
  * Alternation `|`
  * Alternation `|`
- * Backreferences `\1` to `\99`
-
-To do list:
+ * ASCII `\xFF` code points
  * Unicode `\uFFFF` code points
  * Unicode `\uFFFF` code points
+ * Positive `(?=)` and negative `(?!)` lookahead
+ * Positive `(?<=)` and negative `(?<!)` lookbehind (fixed length and no alternations)
+ * Backreferences `\1` to `\9` (with option to expand to `\99`)
 
 
 ## License
 ## License
 
 
 Copyright (c) 2015, Zher Huei Lee
 Copyright (c) 2015, Zher Huei Lee
 All rights reserved.
 All rights reserved.
 
 
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- 1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the copyright holder nor the names of its
-    contributors may be used to endorse or promote products derived from
-    this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+    claim that you wrote the original software. If you use this software
+    in a product, an acknowledgment in the product documentation would
+    be appreciated but is not required.
+    
+ 2. Altered source versions must be plainly marked as such, and must not
+    be misrepresented as being the original software.
+    
+ 3. This notice may not be removed or altered from any source
+    distribution.

+ 0 - 2
drivers/nrex/SCsub

@@ -1,4 +1,3 @@
-
 Import('env')
 Import('env')
 
 
 sources = [
 sources = [
@@ -6,4 +5,3 @@ sources = [
 	'regex.cpp',
 	'regex.cpp',
 ]
 ]
 env.add_source_files(env.drivers_sources, sources)
 env.add_source_files(env.drivers_sources, sources)
-

File diff suppressed because it is too large
+ 618 - 140
drivers/nrex/nrex.cpp


+ 7 - 3
drivers/nrex/nrex.hpp

@@ -79,7 +79,8 @@ class nrex
          * This is used to provide the array size of the captures needed for
          * This is used to provide the array size of the captures needed for
          * nrex::match() to work. The size is actually the number of capture
          * nrex::match() to work. The size is actually the number of capture
          * groups + one for the matching of the entire pattern. The result is
          * groups + one for the matching of the entire pattern. The result is
-         * always capped at 100.
+         * always capped at 10 or 100, depending on the extend option given in
+         * nrex::compile() (default 10).
          *
          *
          * \return The number of captures
          * \return The number of captures
          */
          */
@@ -95,10 +96,13 @@ class nrex
          * runtime error nrex_compile_error if it encounters a problem when
          * runtime error nrex_compile_error if it encounters a problem when
          * parsing the pattern.
          * parsing the pattern.
          *
          *
-         * \param The regex pattern
+         * \param pattern   The regex pattern
+         * \param extended  If true, raises the limit on number of capture
+         *                  groups and back-references to 99. Otherwise limited
+         *                  to 9. Defaults to false.
          * \return True if the pattern was succesfully compiled
          * \return True if the pattern was succesfully compiled
          */
          */
-        bool compile(const nrex_char* pattern);
+        bool compile(const nrex_char* pattern, bool extended = false);
 
 
         /*!
         /*!
          * \brief Uses the pattern to search through the provided string
          * \brief Uses the pattern to search through the provided string

+ 6 - 4
drivers/nrex/regex.cpp

@@ -15,7 +15,7 @@
 
 
 void RegEx::_bind_methods() {
 void RegEx::_bind_methods() {
 
 
-	ObjectTypeDB::bind_method(_MD("compile","pattern"),&RegEx::compile);
+	ObjectTypeDB::bind_method(_MD("compile","pattern", "expanded"),&RegEx::compile, DEFVAL(true));
 	ObjectTypeDB::bind_method(_MD("find","text","start","end"),&RegEx::find, DEFVAL(0), DEFVAL(-1));
 	ObjectTypeDB::bind_method(_MD("find","text","start","end"),&RegEx::find, DEFVAL(0), DEFVAL(-1));
 	ObjectTypeDB::bind_method(_MD("clear"),&RegEx::clear);
 	ObjectTypeDB::bind_method(_MD("clear"),&RegEx::clear);
 	ObjectTypeDB::bind_method(_MD("is_valid"),&RegEx::is_valid);
 	ObjectTypeDB::bind_method(_MD("is_valid"),&RegEx::is_valid);
@@ -54,7 +54,9 @@ bool RegEx::is_valid() const {
 };
 };
 
 
 int RegEx::get_capture_count() const {
 int RegEx::get_capture_count() const {
-	
+
+	ERR_FAIL_COND_V( !exp.valid(), 0 );
+
 	return exp.capture_size();
 	return exp.capture_size();
 }
 }
 
 
@@ -66,11 +68,11 @@ String RegEx::get_capture(int capture) const {
 
 
 }
 }
 
 
-Error RegEx::compile(const String& p_pattern) {
+Error RegEx::compile(const String& p_pattern, bool expanded) {
 
 
 	clear();
 	clear();
 
 
-	exp.compile(p_pattern.c_str());
+	exp.compile(p_pattern.c_str(), expanded);
 
 
 	ERR_FAIL_COND_V( !exp.valid(), FAILED );
 	ERR_FAIL_COND_V( !exp.valid(), FAILED );
 
 

+ 1 - 1
drivers/nrex/regex.h

@@ -36,7 +36,7 @@ public:
 	bool is_valid() const;
 	bool is_valid() const;
 	int get_capture_count() const;
 	int get_capture_count() const;
 	String get_capture(int capture) const;
 	String get_capture(int capture) const;
-	Error compile(const String& p_pattern);
+	Error compile(const String& p_pattern, bool expanded = false);
 	int find(const String& p_text, int p_start = 0, int p_end = -1) const;
 	int find(const String& p_text, int p_start = 0, int p_end = -1) const;
 
 
 	RegEx();
 	RegEx();

+ 0 - 1
drivers/ogg/SCsub

@@ -8,4 +8,3 @@ ogg_sources = [
 
 
 if env['theora'] != "yes" or env['use_theoraplayer_binary'] != "yes":
 if env['theora'] != "yes" or env['use_theoraplayer_binary'] != "yes":
 	env.drivers_sources+=ogg_sources
 	env.drivers_sources+=ogg_sources
-

+ 0 - 2
drivers/openssl/SCsub

@@ -4,5 +4,3 @@ env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.c")
 env.add_source_files(env.drivers_sources,"*.c")
 
 
 Export('env')
 Export('env')
-
-

+ 8 - 0
drivers/opus/opus_config.h

@@ -7,12 +7,16 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 /* Define to 1 if you have the <inttypes.h> header file. */
 #define HAVE_INTTYPES_H 1
 #define HAVE_INTTYPES_H 1
 
 
+#if (!defined( _MSC_VER ) || ( _MSC_VER >= 1800 ))
+
 /* Define to 1 if you have the `lrint' function. */
 /* Define to 1 if you have the `lrint' function. */
 #define HAVE_LRINT 1
 #define HAVE_LRINT 1
 
 
 /* Define to 1 if you have the `lrintf' function. */
 /* Define to 1 if you have the `lrintf' function. */
 #define HAVE_LRINTF 1
 #define HAVE_LRINTF 1
 
 
+#endif
+
 /* Define to 1 if you have the <memory.h> header file. */
 /* Define to 1 if you have the <memory.h> header file. */
 #define HAVE_MEMORY_H 1
 #define HAVE_MEMORY_H 1
 
 
@@ -109,7 +113,11 @@
 /* Define to the equivalent of the C99 'restrict' keyword, or to
 /* Define to the equivalent of the C99 'restrict' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
    nothing if this is not supported.  Do not define if restrict is
    supported directly.  */
    supported directly.  */
+#if (!defined( _MSC_VER ) || ( _MSC_VER >= 1800 ))
 #define restrict __restrict
 #define restrict __restrict
+#else
+#undef restrict
+#endif
 /* Work around a bug in Sun C++: it does not support _Restrict or
 /* Work around a bug in Sun C++: it does not support _Restrict or
    __restrict__, even though the corresponding Sun C compiler ends up with
    __restrict__, even though the corresponding Sun C compiler ends up with
    "#define restrict _Restrict" or "#define restrict __restrict__" in the
    "#define restrict _Restrict" or "#define restrict __restrict__" in the

+ 0 - 1
drivers/png/SCsub

@@ -38,4 +38,3 @@ env.drivers_sources+=png_sources
 #env.add_source_files(env.drivers_sources, png_sources)
 #env.add_source_files(env.drivers_sources, png_sources)
 
 
 Export('env')
 Export('env')
-

+ 0 - 1
drivers/squish/SCsub

@@ -21,4 +21,3 @@ if (env["tools"]=="yes"):
 #env.add_source_files(env.drivers_sources, squish_sources)
 #env.add_source_files(env.drivers_sources, squish_sources)
 
 
 Export('env')
 Export('env')
-

+ 0 - 3
drivers/theora/SCsub

@@ -1,4 +1,3 @@
-
 Import('env')
 Import('env')
 
 
 sources = [
 sources = [
@@ -34,5 +33,3 @@ sources = [
 
 
 if env['use_theoraplayer_binary'] != "yes":
 if env['use_theoraplayer_binary'] != "yes":
 	env.drivers_sources += sources
 	env.drivers_sources += sources
-
-

+ 30 - 16
drivers/theora/decode.c

@@ -1611,28 +1611,35 @@ static void oc_filter_hedge(unsigned char *_dst,int _dst_ystride,
   int                  sum1;
   int                  sum1;
   int                  bx;
   int                  bx;
   int                  by;
   int                  by;
+  int		       _rlimit1;
+  int		       _rlimit2;
   rdst=_dst;
   rdst=_dst;
   rsrc=_src;
   rsrc=_src;
-  for(bx=0;bx<8;bx++){
+  for(bx=0;bx<8;++bx){
     cdst=rdst;
     cdst=rdst;
     csrc=rsrc;
     csrc=rsrc;
-    for(by=0;by<10;by++){
+    _rlimit1 = _rlimit2 = _flimit;
+    for(by=0;by<10;++by){
       r[by]=*csrc;
       r[by]=*csrc;
       csrc+=_src_ystride;
       csrc+=_src_ystride;
     }
     }
     sum0=sum1=0;
     sum0=sum1=0;
-    for(by=0;by<4;by++){
-      sum0+=abs(r[by+1]-r[by]);
-      sum1+=abs(r[by+5]-r[by+6]);
+    for(by=0;by<4;++by){
+      int sumed = abs(r[by+1]-r[by]);
+      sum0+=sumed;
+      _rlimit1-=sumed;
+      sumed = abs(r[by+5]-r[by+6]);
+      sum1+=sumed;
+      _rlimit2-=sumed;
     }
     }
     *_variance0+=OC_MINI(255,sum0);
     *_variance0+=OC_MINI(255,sum0);
     *_variance1+=OC_MINI(255,sum1);
     *_variance1+=OC_MINI(255,sum1);
-    if(sum0<_flimit&&sum1<_flimit&&r[5]-r[4]<_qstep&&r[4]-r[5]<_qstep){
+    if(_rlimit1&&_rlimit2&&!(r[5]-r[4]-_qstep)&&!(r[4]-r[5]-_qstep)){
       *cdst=(unsigned char)(r[0]*3+r[1]*2+r[2]+r[3]+r[4]+4>>3);
       *cdst=(unsigned char)(r[0]*3+r[1]*2+r[2]+r[3]+r[4]+4>>3);
       cdst+=_dst_ystride;
       cdst+=_dst_ystride;
       *cdst=(unsigned char)(r[0]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
       *cdst=(unsigned char)(r[0]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
       cdst+=_dst_ystride;
       cdst+=_dst_ystride;
-      for(by=0;by<4;by++){
+      for(by=0;by<4;++by){
         *cdst=(unsigned char)(r[by]+r[by+1]+r[by+2]+r[by+3]*2+
         *cdst=(unsigned char)(r[by]+r[by+1]+r[by+2]+r[by+3]*2+
          r[by+4]+r[by+5]+r[by+6]+4>>3);
          r[by+4]+r[by+5]+r[by+6]+4>>3);
         cdst+=_dst_ystride;
         cdst+=_dst_ystride;
@@ -1642,13 +1649,13 @@ static void oc_filter_hedge(unsigned char *_dst,int _dst_ystride,
       *cdst=(unsigned char)(r[5]+r[6]+r[7]+r[8]*2+r[9]*3+4>>3);
       *cdst=(unsigned char)(r[5]+r[6]+r[7]+r[8]*2+r[9]*3+4>>3);
     }
     }
     else{
     else{
-      for(by=1;by<=8;by++){
+      for(by=1;by<=8;++by){
         *cdst=(unsigned char)r[by];
         *cdst=(unsigned char)r[by];
         cdst+=_dst_ystride;
         cdst+=_dst_ystride;
       }
       }
     }
     }
-    rdst++;
-    rsrc++;
+    ++rdst;
+    ++rsrc;
   }
   }
 }
 }
 
 
@@ -1663,19 +1670,26 @@ static void oc_filter_vedge(unsigned char *_dst,int _dst_ystride,
   int                  sum1;
   int                  sum1;
   int                  bx;
   int                  bx;
   int                  by;
   int                  by;
+  int		       _rlimit1;
+  int		       _rlimit2;
   cdst=_dst;
   cdst=_dst;
-  for(by=0;by<8;by++){
+  for(by=0;by<8;++by){
     rsrc=cdst-1;
     rsrc=cdst-1;
     rdst=cdst;
     rdst=cdst;
-    for(bx=0;bx<10;bx++)r[bx]=*rsrc++;
+    for(bx=0;bx<10;++bx)r[bx]=*rsrc++;
     sum0=sum1=0;
     sum0=sum1=0;
-    for(bx=0;bx<4;bx++){
-      sum0+=abs(r[bx+1]-r[bx]);
-      sum1+=abs(r[bx+5]-r[bx+6]);
+    _rlimit1 = _rlimit2 = _flimit;
+    for(bx=0;bx<4;++bx){
+      int sumed = abs(r[bx+1]-r[bx]);
+      sum0+=sumed;
+      _rlimit1-=sumed;
+      sumed = abs(r[bx+5]-r[bx+6]);
+      sum1+=sumed;
+      _rlimit2-=sumed;
     }
     }
     _variances[0]+=OC_MINI(255,sum0);
     _variances[0]+=OC_MINI(255,sum0);
     _variances[1]+=OC_MINI(255,sum1);
     _variances[1]+=OC_MINI(255,sum1);
-    if(sum0<_flimit&&sum1<_flimit&&r[5]-r[4]<_qstep&&r[4]-r[5]<_qstep){
+    if(_rlimit1&&_rlimit2&&!(r[5]-r[4]-_qstep)&&!(r[4]-r[5]-_qstep)){
       *rdst++=(unsigned char)(r[0]*3+r[1]*2+r[2]+r[3]+r[4]+4>>3);
       *rdst++=(unsigned char)(r[0]*3+r[1]*2+r[2]+r[3]+r[4]+4>>3);
       *rdst++=(unsigned char)(r[0]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
       *rdst++=(unsigned char)(r[0]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
       for(bx=0;bx<4;bx++){
       for(bx=0;bx<4;bx++){

+ 17 - 9
drivers/theora/video_stream_theora.cpp

@@ -243,7 +243,9 @@ void VideoStreamPlaybackTheora::set_file(const String& p_file) {
 	/* Only interested in Vorbis/Theora streams */
 	/* Only interested in Vorbis/Theora streams */
 	int stateflag = 0;
 	int stateflag = 0;
 
 
-    int audio_track_skip=audio_track;
+	int audio_track_skip=audio_track;
+
+
 	while(!stateflag){
 	while(!stateflag){
 		int ret=buffer_data();
 		int ret=buffer_data();
 		if(ret==0)break;
 		if(ret==0)break;
@@ -269,15 +271,21 @@ void VideoStreamPlaybackTheora::set_file(const String& p_file) {
 				copymem(&to,&test,sizeof(test));
 				copymem(&to,&test,sizeof(test));
 				theora_p=1;
 				theora_p=1;
 			}else if(!vorbis_p && vorbis_synthesis_headerin(&vi,&vc,&op)>=0){
 			}else if(!vorbis_p && vorbis_synthesis_headerin(&vi,&vc,&op)>=0){
+
+
 				/* it is vorbis */
 				/* it is vorbis */
-		if (audio_track_skip) {
-		    vorbis_info_clear(&vi);
-		    vorbis_comment_clear(&vc);
-		    audio_track_skip--;
-		} else {
-		    copymem(&vo,&test,sizeof(test));
-		    vorbis_p=1;
-		}
+				if (audio_track_skip) {
+					vorbis_info_clear(&vi);
+					vorbis_comment_clear(&vc);
+					ogg_stream_clear(&test);
+					vorbis_info_init(&vi);
+					vorbis_comment_init(&vc);
+
+					audio_track_skip--;
+				} else {
+                                        copymem(&vo,&test,sizeof(test));
+					vorbis_p=1;
+				}
 			}else{
 			}else{
 				/* whatever it is, we don't care about it */
 				/* whatever it is, we don't care about it */
 				ogg_stream_clear(&test);
 				ogg_stream_clear(&test);

+ 0 - 2
drivers/unix/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 19 - 9
drivers/unix/os_unix.cpp

@@ -65,15 +65,25 @@ void OS_Unix::print_error(const char* p_function,const char* p_file,int p_line,c
 	if (!_print_error_enabled)
 	if (!_print_error_enabled)
 		return;
 		return;
 
 
-	if (p_rationale && p_rationale[0]) {
-
-		print("\E[1;31;40mERROR: %s: \E[1;37;40m%s\n",p_function,p_rationale);
-		print("\E[0;31;40m   At: %s:%i.\E[0;0;37m\n",p_file,p_line);
-
-	} else {
-		print("\E[1;31;40mERROR: %s: \E[1;37;40m%s\n",p_function,p_code);
-		print("\E[0;31;40m   At: %s:%i.\E[0;0;37m\n",p_file,p_line);
-
+	const char* err_details;
+	if (p_rationale && p_rationale[0])
+		err_details=p_rationale;
+	else
+		err_details=p_code;
+
+	switch(p_type) {
+		case ERR_ERROR:
+			print("\E[1;31mERROR: %s: \E[0m\E[1m%s\n",p_function,err_details);
+			print("\E[0;31m   At: %s:%i.\E[0m\n",p_file,p_line);
+			break;
+		case ERR_WARNING:
+			print("\E[1;33mWARNING: %s: \E[0m\E[1m%s\n",p_function,err_details);
+			print("\E[0;33m     At: %s:%i.\E[0m\n",p_file,p_line);
+			break;
+		case ERR_SCRIPT:
+			print("\E[1;35mSCRIPT ERROR: %s: \E[0m\E[1m%s\n",p_function,err_details);
+			print("\E[0;35m          At: %s:%i.\E[0m\n",p_file,p_line);
+			break;
 	}
 	}
 }
 }
 
 

+ 0 - 2
drivers/vorbis/SCsub

@@ -1,4 +1,3 @@
-
 Import('env')
 Import('env')
 
 
 sources = [
 sources = [
@@ -37,4 +36,3 @@ env.drivers_sources += sources
 
 
 if env['theora'] != "yes" or env['use_theoraplayer_binary'] != "yes":
 if env['theora'] != "yes" or env['use_theoraplayer_binary'] != "yes":
 	env.drivers_sources += sources_lib
 	env.drivers_sources += sources_lib
-

+ 1 - 1
drivers/vorbis/audio_stream_ogg_vorbis.h

@@ -85,7 +85,7 @@ public:
 	virtual void stop();
 	virtual void stop();
 	virtual bool is_playing() const;
 	virtual bool is_playing() const;
 
 
-	virtual void set_loop_restart_time(float p_time) { loop_restart_time=0; }
+	virtual void set_loop_restart_time(float p_time) { loop_restart_time=p_time; }
 
 
 	virtual void set_paused(bool p_paused);
 	virtual void set_paused(bool p_paused);
 	virtual bool is_paused(bool p_paused) const;
 	virtual bool is_paused(bool p_paused) const;

+ 0 - 1
drivers/webp/SCsub

@@ -61,4 +61,3 @@ env.drivers_sources+=webp_sources
 #env.add_source_files(env.drivers_sources, webp_sources)
 #env.add_source_files(env.drivers_sources, webp_sources)
 
 
 Export('env')
 Export('env')
-

+ 0 - 2
drivers/windows/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.drivers_sources,"*.cpp")
 env.add_source_files(env.drivers_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 0 - 2
main/SCsub

@@ -8,5 +8,3 @@ Export('env')
 lib = env.Library("main",env.main_sources)
 lib = env.Library("main",env.main_sources)
 
 
 env.Prepend(LIBS=[lib])
 env.Prepend(LIBS=[lib])
-
-

+ 23 - 16
main/main.cpp

@@ -796,7 +796,6 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 	main_args.clear();
 	main_args.clear();
 	
 	
 	print_help(execpath);
 	print_help(execpath);
-	
 
 
 	if (performance)
 	if (performance)
 		memdelete(performance);
 		memdelete(performance);
@@ -812,6 +811,8 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 		memdelete(packed_data);
 		memdelete(packed_data);
 	if (file_access_network_client)
 	if (file_access_network_client)
 		memdelete(file_access_network_client);
 		memdelete(file_access_network_client);
+	if(path_remap)
+		memdelete(path_remap);
 
 
 // Note 1: *zip_packed_data live into *packed_data
 // Note 1: *zip_packed_data live into *packed_data
 // Note 2: PackedData::~PackedData destroy this.
 // Note 2: PackedData::~PackedData destroy this.
@@ -820,7 +821,7 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 //		memdelete( zip_packed_data );
 //		memdelete( zip_packed_data );
 //#endif
 //#endif
 
 
-
+	unregister_core_driver_types();
 	unregister_core_types();
 	unregister_core_types();
 	
 	
 	OS::get_singleton()->_cmdline.clear();
 	OS::get_singleton()->_cmdline.clear();
@@ -1007,8 +1008,21 @@ bool Main::start() {
 	bool export_debug=false;
 	bool export_debug=false;
 	List<String> args = OS::get_singleton()->get_cmdline_args();
 	List<String> args = OS::get_singleton()->get_cmdline_args();
 	for (int i=0;i<args.size();i++) {
 	for (int i=0;i<args.size();i++) {
+		//parameters that do not have an argument to the right
+		if (args[i]=="-nodocbase") {
+			doc_base=false;
+		} else if (args[i]=="-noquit") {
+			noquit=true;
+		} else if (args[i]=="-convert_old") {
+			convert_old=true;
+		} else if (args[i]=="-editor" || args[i]=="-e") {
+			editor=true;
+		} else if (args[i].length() && args[i][0] != '-' && game_path == "") {
+			game_path=args[i];
+		}
 		//parameters that have an argument to the right
 		//parameters that have an argument to the right
-		if (i < (args.size()-1)) {
+		else if (i < (args.size()-1)) {
+			bool parsed_pair=true;
 			if (args[i]=="-doctool") {
 			if (args[i]=="-doctool") {
 				doc_tool=args[i+1];
 				doc_tool=args[i+1];
 			} else if (args[i]=="-script" || args[i]=="-s") {
 			} else if (args[i]=="-script" || args[i]=="-s") {
@@ -1037,20 +1051,13 @@ bool Main::start() {
 			} else if (args[i]=="-dumpstrings") {
 			} else if (args[i]=="-dumpstrings") {
 				editor=true; //needs editor
 				editor=true; //needs editor
 				dumpstrings=args[i+1];
 				dumpstrings=args[i+1];
+			} else {
+				// The parameter does not match anything known, don't skip the next argument
+				parsed_pair=false;
+			}
+			if (parsed_pair) {
+				i++;
 			}
 			}
-			i++;
-		}
-		//parameters that do not have an argument to the right
-		if (args[i]=="-nodocbase") {
-			doc_base=false;
-		} else if (args[i]=="-noquit") {
-			noquit=true;
-		} else if (args[i]=="-convert_old") {
-			convert_old=true;
-		} else if (args[i]=="-editor" || args[i]=="-e") {
-			editor=true;
-		} else if (args[i].length() && args[i][0] != '-' && game_path == "") {
-			game_path=args[i];
 		}
 		}
 	}
 	}
 
 

+ 0 - 2
modules/SCsub

@@ -19,5 +19,3 @@ for x in env.module_list:
 lib = env_modules.Library("modules",env.modules_sources)
 lib = env_modules.Library("modules",env.modules_sources)
 
 
 env.Prepend(LIBS=[lib])
 env.Prepend(LIBS=[lib])
-
-

+ 0 - 2
modules/gdscript/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.modules_sources,"*.cpp")
 env.add_source_files(env.modules_sources,"*.cpp")
 
 
 Export('env')
 Export('env')
-
-

+ 7 - 1
modules/gdscript/gd_parser.cpp

@@ -1940,9 +1940,15 @@ void GDParser::_parse_extends(ClassNode *p_class) {
 
 
 	p_class->extends_used=true;
 	p_class->extends_used=true;
 
 
-	//see if inheritance happens from a file
 	tokenizer->advance();
 	tokenizer->advance();
 
 
+	if (tokenizer->get_token()==GDTokenizer::TK_BUILT_IN_TYPE && tokenizer->get_token_type()==Variant::OBJECT) {
+		p_class->extends_class.push_back(Variant::get_type_name(Variant::OBJECT));
+		tokenizer->advance();
+		return;
+	}
+
+	// see if inheritance happens from a file
 	if (tokenizer->get_token()==GDTokenizer::TK_CONSTANT) {
 	if (tokenizer->get_token()==GDTokenizer::TK_CONSTANT) {
 
 
 		Variant constant = tokenizer->get_token_constant();
 		Variant constant = tokenizer->get_token_constant();

+ 0 - 1
modules/gdscript/gd_parser.h

@@ -276,7 +276,6 @@ public:
 	};
 	};
 
 
 	struct NewLineNode : public Node {
 	struct NewLineNode : public Node {
-		int line;
 		NewLineNode() { type=TYPE_NEWLINE; }
 		NewLineNode() { type=TYPE_NEWLINE; }
 	};
 	};
 
 

+ 0 - 3
modules/gridmap/SCsub

@@ -1,6 +1,3 @@
 Import('env')
 Import('env')
 
 
 env.add_source_files(env.modules_sources,"*.cpp")
 env.add_source_files(env.modules_sources,"*.cpp")
-
-
-

+ 2 - 2
platform/android/SCsub

@@ -62,10 +62,10 @@ pp_baseout.write( manifest )
 
 
 
 
 for x in env.android_source_files:
 for x in env.android_source_files:
-	shutil.copy(x,abspath+"/java/src/com/android/godot")	
+	shutil.copy(x,abspath+"/java/src/com/android/godot")
 
 
 for x in env.android_module_libraries:
 for x in env.android_module_libraries:
-	shutil.copy(x,abspath+"/java/libs")	
+	shutil.copy(x,abspath+"/java/libs")
 
 
 
 
 env_android.SharedLibrary("#bin/libgodot",[android_objects],SHLIBSUFFIX=env["SHLIBSUFFIX"])
 env_android.SharedLibrary("#bin/libgodot",[android_objects],SHLIBSUFFIX=env["SHLIBSUFFIX"])

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

@@ -1123,6 +1123,10 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d
 		if (file=="lib/armeabi/libgodot_android.so" && !export_arm) {
 		if (file=="lib/armeabi/libgodot_android.so" && !export_arm) {
 			skip=true;
 			skip=true;
 		}
 		}
+		
+		if (file.begins_with("META-INF") && _signed) {
+			skip=true;
+		}
 
 
 		print_line("ADDING: "+file);
 		print_line("ADDING: "+file);
 
 

+ 16 - 0
platform/android/java/res/values-fa/strings.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="godot_project_name_string">godot-project-name-fa</string>
+    <string name="testuf8">سلام</string>
+    <string name="text_paused_cellular">آیا می خواهید بر روی اتصال داده همراه دانلود را شروع کنید؟ بر اساس نوع سطح داده شما این ممکن است برای شما هزینه مالی داشته باشد.</string>
+    <string name="text_paused_cellular_2">اگر نمی خواهید بر روی اتصال داده همراه دانلود را شروع کنید ، دانلود به صورت خودکار در زمان دسترسی به وای-فای شروع می شود.</string>
+    <string name="text_button_resume_cellular">ادامه دانلود</string>
+    <string name="text_button_wifi_settings">تنظیمات وای-فای</string>
+    <string name="text_verifying_download">درحال تایید دانلود</string>
+    <string name="text_validation_complete">تایید فایل XAPK تکمیل شد.  برای خروج تایید کنید.</string>
+    <string name="text_validation_failed">اعتبارسنجی فایل XAPK ناموق.</string>
+    <string name="text_button_pause">توقف دانلود</string>
+    <string name="text_button_resume">ادامه دانلود</string>
+    <string name="text_button_cancel">انصراف</string>
+    <string name="text_button_cancel_verify">انصراف از تایید شدن</string>
+</resources>

+ 43 - 17
platform/android/java/src/com/android/godot/GodotPaymentV3.java

@@ -27,7 +27,7 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 				activity.getPaymentsManager().requestPurchase(sku, transactionId);				
 				activity.getPaymentsManager().requestPurchase(sku, transactionId);				
 			}
 			}
 		});
 		});
-	};
+	}
 	
 	
 /*	public string requestPurchasedTicket(){
 /*	public string requestPurchasedTicket(){
 	    activity.getPaymentsManager()
 	    activity.getPaymentsManager()
@@ -42,7 +42,7 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 	
 	
 	public GodotPaymentV3(Activity p_activity) {
 	public GodotPaymentV3(Activity p_activity) {
 
 
-		registerClass("GodotPayments", new String[] {"purchase", "setPurchaseCallbackId", "setPurchaseValidationUrlPrefix", "setTransactionId", "getSignature", "consumeUnconsumedPurchases"});
+		registerClass("GodotPayments", new String[] {"purchase", "setPurchaseCallbackId", "setPurchaseValidationUrlPrefix", "setTransactionId", "getSignature", "consumeUnconsumedPurchases", "requestPurchased", "setAutoConsume", "consume"});
 		activity=(Godot) p_activity;
 		activity=(Godot) p_activity;
 	}
 	}
 
 
@@ -54,7 +54,6 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 				activity.getPaymentsManager().consumeUnconsumedPurchases();				
 				activity.getPaymentsManager().consumeUnconsumedPurchases();				
 			}
 			}
 		});
 		});
-		
 	}
 	}
 
 
 	private String signature;
 	private String signature;
@@ -63,25 +62,26 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 	}
 	}
 	
 	
 	
 	
-	public void callbackSuccess(String ticket, String signature){
-//        Log.d(this.getClass().getName(), "PRE-Send callback to purchase success");
-        GodotLib.callobject(purchaseCallbackId, "purchase_success", new Object[]{ticket, signature});
-//    	Log.d(this.getClass().getName(), "POST-Send callback to purchase success");
+	public void callbackSuccess(String ticket, String signature, String sku){
+//		Log.d(this.getClass().getName(), "PRE-Send callback to purchase success");
+		GodotLib.callobject(purchaseCallbackId, "purchase_success", new Object[]{ticket, signature, sku});
+//		Log.d(this.getClass().getName(), "POST-Send callback to purchase success");
 }
 }
 
 
 	public void callbackSuccessProductMassConsumed(String ticket, String signature, String sku){
 	public void callbackSuccessProductMassConsumed(String ticket, String signature, String sku){
-//        Log.d(this.getClass().getName(), "PRE-Send callback to consume success");
-        GodotLib.calldeferred(purchaseCallbackId, "consume_success", new Object[]{ticket, signature, sku});
-//    	Log.d(this.getClass().getName(), "POST-Send callback to consume success");
+//		Log.d(this.getClass().getName(), "PRE-Send callback to consume success");
+		Log.d(this.getClass().getName(), "callbackSuccessProductMassConsumed > "+ticket+","+signature+","+sku);
+        	GodotLib.calldeferred(purchaseCallbackId, "consume_success", new Object[]{ticket, signature, sku});
+//		Log.d(this.getClass().getName(), "POST-Send callback to consume success");
 	}
 	}
 
 
 	public void callbackSuccessNoUnconsumedPurchases(){
 	public void callbackSuccessNoUnconsumedPurchases(){
-        GodotLib.calldeferred(purchaseCallbackId, "no_validation_required", new Object[]{});
+		GodotLib.calldeferred(purchaseCallbackId, "no_validation_required", new Object[]{});
 	}
 	}
 	
 	
 	public void callbackFail(){
 	public void callbackFail(){
-                GodotLib.calldeferred(purchaseCallbackId, "purchase_fail", new Object[]{});
-//                GodotLib.callobject(purchaseCallbackId, "purchase_fail", new Object[]{});
+		GodotLib.calldeferred(purchaseCallbackId, "purchase_fail", new Object[]{});
+//		GodotLib.callobject(purchaseCallbackId, "purchase_fail", new Object[]{});
 	}
 	}
 	
 	
 	public void callbackCancel(){
 	public void callbackCancel(){
@@ -89,6 +89,10 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 //		GodotLib.callobject(purchaseCallbackId, "purchase_cancel", new Object[]{});
 //		GodotLib.callobject(purchaseCallbackId, "purchase_cancel", new Object[]{});
 	}
 	}
 	
 	
+	public void callbackAlreadyOwned(String sku){
+		GodotLib.calldeferred(purchaseCallbackId, "purchase_owned", new Object[]{sku});
+	}
+	
 	public int getPurchaseCallbackId() {
 	public int getPurchaseCallbackId() {
 		return purchaseCallbackId;
 		return purchaseCallbackId;
 	}
 	}
@@ -97,8 +101,6 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 		this.purchaseCallbackId = purchaseCallbackId;
 		this.purchaseCallbackId = purchaseCallbackId;
 	}
 	}
 
 
-
-
 	public String getPurchaseValidationUrlPrefix(){
 	public String getPurchaseValidationUrlPrefix(){
 		return this.purchaseValidationUrlPrefix ;
 		return this.purchaseValidationUrlPrefix ;
 	}
 	}
@@ -107,12 +109,10 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 		this.purchaseValidationUrlPrefix = url;
 		this.purchaseValidationUrlPrefix = url;
 	}
 	}
 
 
-
 	public String getAccessToken() {
 	public String getAccessToken() {
 		return accessToken;
 		return accessToken;
 	}
 	}
 
 
-
 	public void setAccessToken(String accessToken) {
 	public void setAccessToken(String accessToken) {
 		this.accessToken = accessToken;
 		this.accessToken = accessToken;
 	}
 	}
@@ -125,4 +125,30 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 		return this.transactionId;
 		return this.transactionId;
 	}
 	}
 	
 	
+	// request purchased items are not consumed
+	public void requestPurchased(){
+		activity.getPaymentsManager().setBaseSingleton(this);
+		activity.runOnUiThread(new Runnable() {
+			@Override
+			public void run() {
+				activity.getPaymentsManager().requestPurchased();				
+			}
+		});
+	}
+	
+	// callback for requestPurchased()
+	public void callbackPurchased(String receipt, String signature, String sku){
+		GodotLib.calldeferred(purchaseCallbackId, "has_purchased", new Object[]{receipt, signature, sku});
+	}
+	
+	// consume item automatically after purchase. default is true.
+	public void setAutoConsume(boolean autoConsume){
+		activity.getPaymentsManager().setAutoConsume(autoConsume);
+	}
+	
+	// consume a specific item
+	public void consume(String sku){
+		activity.getPaymentsManager().consume(sku);
+	}
 }
 }
+

+ 101 - 22
platform/android/java/src/com/android/godot/payments/PaymentsManager.java

@@ -25,10 +25,8 @@ import com.android.vending.billing.IInAppBillingService;
 public class PaymentsManager {
 public class PaymentsManager {
 
 
 	public static final int BILLING_RESPONSE_RESULT_OK = 0;
 	public static final int BILLING_RESPONSE_RESULT_OK = 0;
-
-	
 	public static final int REQUEST_CODE_FOR_PURCHASE = 0x1001;
 	public static final int REQUEST_CODE_FOR_PURCHASE = 0x1001;
-	
+	private static boolean auto_consume = true;
 	
 	
 	private Activity activity;
 	private Activity activity;
 	IInAppBillingService mService;
 	IInAppBillingService mService;
@@ -69,13 +67,12 @@ public class PaymentsManager {
 	    }
 	    }
 
 
 	    @Override
 	    @Override
-	    public void onServiceConnected(ComponentName name, 
-	    		IBinder service) {
-		mService = IInAppBillingService.Stub.asInterface(service);
+	    public void onServiceConnected(ComponentName name, IBinder service) {
+			mService = IInAppBillingService.Stub.asInterface(service);
 	    }
 	    }
 	};
 	};
 	
 	
-	public void requestPurchase(String sku, String transactionId){
+	public void requestPurchase(final String sku, String transactionId){
 		new PurchaseTask(mService, Godot.getInstance()) {
 		new PurchaseTask(mService, Godot.getInstance()) {
 			
 			
 			@Override
 			@Override
@@ -88,6 +85,12 @@ public class PaymentsManager {
 			protected void canceled() {
 			protected void canceled() {
 				godotPaymentV3.callbackCancel();
 				godotPaymentV3.callbackCancel();
 			}
 			}
+			
+			@Override
+			protected void alreadyOwned() {
+				godotPaymentV3.callbackAlreadyOwned(sku);
+			}
+			
 		}.purchase(sku, transactionId);
 		}.purchase(sku, transactionId);
 
 
 	}
 	}
@@ -114,26 +117,82 @@ public class PaymentsManager {
 		}.consumeItAll();
 		}.consumeItAll();
 	}
 	}
 	
 	
+	public void requestPurchased(){
+		try{
+			PaymentsCache pc = new PaymentsCache(Godot.getInstance());
+
+//			Log.d("godot", "requestPurchased for " + activity.getPackageName());
+			Bundle bundle = mService.getPurchases(3, activity.getPackageName(), "inapp",null);
+
+/*			
+			for (String key : bundle.keySet()) {
+			    Object value = bundle.get(key);
+			    Log.d("godot", String.format("%s %s (%s)", key, value.toString(), value.getClass().getName()));
+			}
+*/			
+			
+			if (bundle.getInt("RESPONSE_CODE") == 0){
+
+				final ArrayList<String> myPurchases = bundle.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
+				final ArrayList<String> mySignatures = bundle.getStringArrayList("INAPP_DATA_SIGNATURE_LIST");
+				
+
+				if (myPurchases == null || myPurchases.size() == 0){
+//					Log.d("godot", "No purchases!");
+					godotPaymentV3.callbackPurchased("", "", "");
+					return;
+				}
+		
+//				Log.d("godot", "# products are purchased:" + myPurchases.size());
+				for (int i=0;i<myPurchases.size();i++)
+				{
+					
+					try{
+						String receipt = myPurchases.get(i);
+						JSONObject inappPurchaseData = new JSONObject(receipt);
+						String sku = inappPurchaseData.getString("productId");
+						String token = inappPurchaseData.getString("purchaseToken");
+						String signature = mySignatures.get(i);
+//						Log.d("godot", "purchased item:" + token + "\n" + receipt);
+
+						pc.setConsumableValue("ticket_signautre", sku, signature);
+						pc.setConsumableValue("ticket", sku, receipt);
+						pc.setConsumableFlag("block", sku, true);
+						pc.setConsumableValue("token", sku, token);
+
+						godotPaymentV3.callbackPurchased(receipt, signature, sku);
+					} catch (JSONException e) {
+					}
+				}
+
+			}
+		}catch(Exception e){
+			Log.d("godot", "Error requesting purchased products:" + e.getClass().getName() + ":" + e.getMessage());
+		}
+	}
+	
 	public void processPurchaseResponse(int resultCode, Intent data) {
 	public void processPurchaseResponse(int resultCode, Intent data) {
 		new HandlePurchaseTask(activity){
 		new HandlePurchaseTask(activity){
 
 
 			@Override
 			@Override
 			protected void success(final String sku, final String signature, final String ticket) {
 			protected void success(final String sku, final String signature, final String ticket) {
-				godotPaymentV3.callbackSuccess(ticket, signature);
-				new ConsumeTask(mService, activity) {
+				godotPaymentV3.callbackSuccess(ticket, signature, sku);
+
+				if (auto_consume){
+					new ConsumeTask(mService, activity) {
 					
 					
-					@Override
-					protected void success(String ticket) {
-//						godotPaymentV3.callbackSuccess("");
-					}
+						@Override
+						protected void success(String ticket) {
+//							godotPaymentV3.callbackSuccess("");
+						}
 					
 					
-					@Override
-					protected void error(String message) {
-						godotPaymentV3.callbackFail();
+						@Override
+						protected void error(String message) {
+							godotPaymentV3.callbackFail();
 						
 						
-					}
-				}.consume(sku);
-
+						}
+					}.consume(sku);
+				}
 				
 				
 //				godotPaymentV3.callbackSuccess(new PaymentsCache(activity).getConsumableValue("ticket", sku),signature);
 //				godotPaymentV3.callbackSuccess(new PaymentsCache(activity).getConsumableValue("ticket", sku),signature);
 //			    godotPaymentV3.callbackSuccess(ticket);
 //			    godotPaymentV3.callbackSuccess(ticket);
@@ -151,7 +210,7 @@ public class PaymentsManager {
 				godotPaymentV3.callbackCancel();
 				godotPaymentV3.callbackCancel();
 				
 				
 			}
 			}
-			}.handlePurchaseRequest(resultCode, data);
+		}.handlePurchaseRequest(resultCode, data);
 	}
 	}
 	
 	
 	public void validatePurchase(String purchaseToken, final String sku){
 	public void validatePurchase(String purchaseToken, final String sku){
@@ -165,7 +224,7 @@ public class PaymentsManager {
 					
 					
 					@Override
 					@Override
 					protected void success(String ticket) {
 					protected void success(String ticket) {
-						godotPaymentV3.callbackSuccess(ticket, null);
+						godotPaymentV3.callbackSuccess(ticket, null, sku);
 						
 						
 					}
 					}
 					
 					
@@ -192,11 +251,31 @@ public class PaymentsManager {
 		}.validatePurchase(sku);
 		}.validatePurchase(sku);
 	}
 	}
 	
 	
+	public void setAutoConsume(boolean autoConsume){
+		auto_consume = autoConsume;
+	}
+	
+	public void consume(final String sku){
+		new ConsumeTask(mService, activity) {
+			
+			@Override
+			protected void success(String ticket) {
+				godotPaymentV3.callbackSuccessProductMassConsumed(ticket, "", sku);
+				
+			}
+			
+			@Override
+			protected void error(String message) {
+				godotPaymentV3.callbackFail();
+				
+			}
+		}.consume(sku);
+	}
+	
 	private GodotPaymentV3 godotPaymentV3;
 	private GodotPaymentV3 godotPaymentV3;
 	
 	
 	public void setBaseSingleton(GodotPaymentV3 godotPaymentV3) {
 	public void setBaseSingleton(GodotPaymentV3 godotPaymentV3) {
 		this.godotPaymentV3 = godotPaymentV3;
 		this.godotPaymentV3 = godotPaymentV3;
-		
 	}
 	}
 
 
 }
 }

+ 6 - 2
platform/android/java/src/com/android/godot/payments/PurchaseTask.java

@@ -62,7 +62,11 @@ abstract public class PurchaseTask {
 //		Log.d("XXX", "Buy intent response code: " + responseCode);
 //		Log.d("XXX", "Buy intent response code: " + responseCode);
 		if(responseCode == 1 || responseCode == 3 || responseCode == 4){
 		if(responseCode == 1 || responseCode == 3 || responseCode == 4){
 			canceled();
 			canceled();
-			return ;
+			return;
+		}
+		if(responseCode == 7){
+			alreadyOwned();
+			return;
 		}
 		}
 			
 			
 		
 		
@@ -92,6 +96,6 @@ abstract public class PurchaseTask {
 
 
 	abstract protected void error(String message);
 	abstract protected void error(String message);
 	abstract protected void canceled();
 	abstract protected void canceled();
-
+	abstract protected void alreadyOwned();
 	
 	
 }
 }

+ 0 - 1
platform/bb10/SCsub

@@ -19,4 +19,3 @@ if env['bb10_lgles_override'] == "yes":
 
 
 prog = None
 prog = None
 prog = env_bps.Program('#bin/godot', bb10_lib)
 prog = env_bps.Program('#bin/godot', bb10_lib)
-

+ 2 - 1
platform/bb10/os_bb10.cpp

@@ -195,9 +195,10 @@ void OSBB10::finalize() {
 //		memdelete(debugger_connection_console);
 //		memdelete(debugger_connection_console);
 //}
 //}
 
 
+	memdelete(sample_manager);
+
 	audio_server->finish();
 	audio_server->finish();
 	memdelete(audio_server);
 	memdelete(audio_server);
-	memdelete(sample_manager);
 
 
 	visual_server->finish();
 	visual_server->finish();
 	memdelete(visual_server);
 	memdelete(visual_server);

Some files were not shown because too many files changed in this diff