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"):
 	pass
 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']
 
 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":
 		env.vs_incs = []
 		env.vs_srcs = []
-		
+
 		def AddToVSProject( sources ):
 			for x in sources:
 				if type(x) == type(""):
@@ -197,12 +197,12 @@ if selected_platform in platform_list:
 					basename = pieces[0]
 					basename = basename.replace('\\\\','/')
 					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=""
-	
+
 	if 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)
 	detect.configure(env)
 
-        #env['platform_libsuffix'] = env['LIBSUFFIX']
+	#env['platform_libsuffix'] = env['LIBSUFFIX']
 
 	suffix="."+selected_platform
 
@@ -284,10 +284,11 @@ if selected_platform in platform_list:
 
 	if (env['musepack']=='yes'):
 		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'):
 		env.Append(CPPPATH=['#drivers/builtin_zlib/zlib'])
@@ -337,7 +338,7 @@ if selected_platform in platform_list:
 
 	if (env['colored']=='yes'):
 		methods.colored(sys,env)
-		
+
 	if (env['etc1']=='yes'):
 		env.Append(CPPFLAGS=['-DETC1_ENABLED'])
 
@@ -356,22 +357,22 @@ if selected_platform in platform_list:
 	SConscript("main/SCsub")
 
 	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.main_sources)
-		AddToVSProject(env.modules_sources)	
+		AddToVSProject(env.modules_sources)
 		AddToVSProject(env.scene_sources)
 		AddToVSProject(env.servers_sources)
 		AddToVSProject(env.tool_sources)
-		
+
 		#env['MSVS_VERSION']='9.0'
 		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['MSVSCLEANCOM'] = "scons --clean platform=" + selected_platform + " target=" + env["target"] + " bits=" + env["bits"] + " tools=yes"
-			
+
 		debug_variants = ['Debug|Win32']+['Debug|x64']
 		release_variants = ['Release|Win32']+['Release|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
 		msvproj = env.MSVSProject(target = ['#godot' + env['MSVSPROJECTSUFFIX'] ],
 								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:
 

+ 0 - 2
bin/tests/SCsub

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

+ 0 - 2
core/SCsub

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

+ 0 - 2
core/bind/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.core_sources,"*.cpp")
 
 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")
 
 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 'f': res=12; break;
 							case 'r': res=13; break;
-							case '\"': res='\"'; break;
-							case '\\': res='\\'; break;
-							case '/': res='/'; break; //wtf
 							case 'u': {
 								//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;
+							//case '\"': res='\"'; break;
+							//case '\\': res='\\'; break;
+							//case '/': res='/'; break;
 							default: {
-
-								r_err_str="Invalid escape sequence";
-								return ERR_PARSE_ERROR;
+								res = next;
+								//r_err_str="Invalid escape sequence";
+								//return ERR_PARSE_ERROR;
 							} break;
 						}
 

+ 0 - 2
core/math/SCsub

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

+ 1 - 1
core/math/quat.h

@@ -73,7 +73,7 @@ public:
 			-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;
 		q *= this->inverse();

+ 0 - 2
core/os/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.core_sources,"*.cpp")
 
 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) {
 
+	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)
-		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, ...) {

+ 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,inverse);
 	VCALL_LOCALMEM1R(Quat,dot);
+	VCALL_LOCALMEM1R(Quat,xform);
 	VCALL_LOCALMEM2R(Quat,slerp);
 	VCALL_LOCALMEM2R(Quat,slerpni);
 	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,inverse,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,slerpni,QUAT,"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;
 				DEFAULT_OP_LOCALMEM_NUM(*,VECTOR3,Vector3);
 				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);
 				case MATRIX3: {
 
@@ -2573,7 +2587,7 @@ bool Variant::in(const Variant& p_index, bool *r_valid) const {
 				String idx=p_index;
 				const String *str=reinterpret_cast<const String*>(_data._mem);
 
-				return str->find("idx")!=-1;
+				return str->find(idx)!=-1;
 			}
 
 		} break;

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

@@ -2,3 +2,4 @@
 
 name="Area 2D Input Events"
 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"
 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"
 main_scene="res://fog.scn"
-icon="icon.png"
+icon="res://icon.png"
 
 [input]
 

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

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

BIN
demos/2d/hdr/icon.png


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

@@ -2,6 +2,7 @@
 
 name="Isometric 2D + Lighting"
 main_scene="res://map.scn"
+icon="res://icon.png"
 
 [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"
 main_scene="res://lightmask.scn"
+icon="res://icon.png"
 
 [rasterizer]
 

BIN
demos/2d/light_mask/icon.png


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

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

BIN
demos/2d/lights_shadows/icon.png


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

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

BIN
demos/2d/navpoly/icon.png


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

@@ -2,6 +2,7 @@
 
 name="2D Normal Mapping"
 main_scene="res://normalmap.scn"
+icon="res://icon.png"
 
 [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"
 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"
 main_scene="res://screen_shaders.scn"
+icon="res://icon.png"
 
 [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"
 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"
 main_scene="res://splash.xml"
+icon="res://icon.png"
 
 [display]
 

BIN
demos/2d/splash/icon.png


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

@@ -2,3 +2,4 @@
 
 name="2D Shaders for Sprites"
 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"
 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"
 main_scene="res://controls.scn"
-icon="icon.png"
 
 [display]
 

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

@@ -2,3 +2,4 @@
 
 name="Rich Text Label (BBCode)"
 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"
 main_scene="res://container.scn"
+icon="res://icon.png"
 
 [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()
 
-func update_expression():
-	regex.compile(get_node("Expression").get_text())
+func update_expression(text):
+	regex.compile(text)
 	update_text()
 
 func update_text():
 	var text = get_node("Text").get_text()
-	regex.find(text)
 	var list = get_node("List")
 	for child in list.get_children():
 		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():
 	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"
 main_scene="res://main.xml"
-icon="icon.png"
+icon="res://icon.png"
 target_fps=60
 
 [display]

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

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

+ 13 - 8
drivers/SCsub

@@ -69,21 +69,27 @@ for f in env.drivers_sources:
 		fname = env.File(f).path
 	else:
 		fname = env.File(f)[0].path
-	#base = string.join(fname.split("/")[:-1], "/")
 	fname = fname.replace("\\", "/")
 	base = string.join(fname.split("/")[:2], "/")
 	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
 	cur_base = base
 	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=[]
 env.add_source_files(drivers_base,"*.cpp")
@@ -93,4 +99,3 @@ env.Prepend(LIBS=lib_list)
 
 #lib = env.Library("drivers",env.drivers_sources)
 #env.Prepend(LIBS=[lib])
-

+ 0 - 2
drivers/alsa/SCsub

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

+ 1 - 1
drivers/builtin_zlib/SCsub

@@ -1,7 +1,7 @@
 Import('env')
 
 zlib_sources = [
-	
+
 	"builtin_zlib/zlib/adler32.c",
 	"builtin_zlib/zlib/compress.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")
 
 Export('env')
-
-

+ 0 - 1
drivers/dds/SCsub

@@ -8,4 +8,3 @@ dds_sources = [
 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)
 
 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,"*.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);
 
 		rt->fbo=0;
+		rt->depth=0;
+		rt->color=0;
 		rt->width=0;
 		rt->height=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);
 
 	//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
 	glGenTextures(1, &rt->color);
@@ -4644,6 +4648,9 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const {
 			enablers.push_back("#define USE_TIME\n");
 			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);
 	} 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_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;
 	}
 
+#ifdef TOOLS_ENABLED
 	framebuffer.active=use_fbo;
+#else
+	framebuffer.active=use_fbo && !low_memory_2d;
+#endif
 	framebuffer.width=dwidth;
 	framebuffer.height=dheight;
 	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_shadow_mapping=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);
 	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;
 
 	bool use_half_float;
-
+	bool low_memory_2d;
 
 	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);
 
-	class RenderTarget;
+	struct RenderTarget;
 
 	struct Texture {
 
@@ -305,7 +305,7 @@ class RasterizerGLES2 : public Rasterizer {
 		virtual ~GeometryOwner() {}
 	};
 
-	class Mesh;
+	struct Mesh;
 
 	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) {
 					vertex_code_writes_vertex=true;
 				}
+				if (vnode->name == vname_position && p_assign_left) {
+					vertex_code_writes_position = true;
+				}
 				if (vnode->name==vname_color_interp) {
 					flags->use_color_interp=true;
 				}
@@ -663,6 +666,7 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT
 	uses_texpixel_size=false;
 	uses_worldvec=false;
 	vertex_code_writes_vertex=false;
+	vertex_code_writes_position = false;
 	uses_shadow_color=false;
 	uniforms=r_uniforms;
 	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_texpos=uses_texpos;
 	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_screen_uv=uses_screen_uv;
 	r_flags.uses_light=uses_light;
@@ -782,127 +787,129 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
 	replace_table["texscreen"]= "texscreen";
 	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
-	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[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[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_var2_interp="VAR2";
 	vname_vertex="VERTEX";
+	vname_position = "POSITION";
 	vname_light="LIGHT";
 	vname_time="TIME";
 	vname_normalmap="NORMALMAP";

+ 4 - 1
drivers/gles2/shader_compiler_gles2.h

@@ -34,7 +34,7 @@ class ShaderCompilerGLES2 {
 
 	class Uniform;
 public:
-	class Flags;
+	struct Flags;
 private:
 
 	ShaderLanguage::ProgramNode *program_node;
@@ -55,6 +55,7 @@ private:
 	bool uses_texpixel_size;
 	bool uses_worldvec;
 	bool vertex_code_writes_vertex;
+	bool vertex_code_writes_position;
 	bool uses_shadow_color;
 
 	bool sinh_used;
@@ -76,6 +77,7 @@ private:
 	StringName vname_var1_interp;
 	StringName vname_var2_interp;
 	StringName vname_vertex;
+	StringName vname_position;
 	StringName vname_light;
 	StringName vname_time;
 	StringName vname_normalmap;
@@ -107,6 +109,7 @@ public:
 		bool uses_texpos;
 		bool uses_normalmap;
 		bool vertex_code_writes_vertex;
+		bool vertex_code_writes_position;
 		bool uses_discard;
 		bool uses_screen_uv;
 		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('blur.glsl');
 	env.GLSL120GLES('copy.glsl');
-
-

+ 0 - 1
drivers/jpg/SCsub

@@ -10,4 +10,3 @@ jpg_sources = [
 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)
 
 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,"*.c")
-

+ 26 - 31
drivers/nrex/README.md

@@ -18,47 +18,42 @@ More details about its use is documented in `nrex.hpp`
 
 Currently supported features:
  * Capturing `()` and non-capturing `(?:)` groups
- * Any character `.`
+ * Any character `.` (includes newlines)
  * 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 `+`
  * Range quantifiers `{0,1}`
  * Lazy (non-greedy) quantifiers `*?`
  * Begining `^` and end `$` anchors
+ * Word boundaries `\b`
  * Alternation `|`
- * Backreferences `\1` to `\99`
-
-To do list:
+ * ASCII `\xFF` 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
 
 Copyright (c) 2015, Zher Huei Lee
 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')
 
 sources = [
@@ -6,4 +5,3 @@ sources = [
 	'regex.cpp',
 ]
 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
          * nrex::match() to work. The size is actually the number of capture
          * 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
          */
@@ -95,10 +96,13 @@ class nrex
          * runtime error nrex_compile_error if it encounters a problem when
          * 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
          */
-        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

+ 6 - 4
drivers/nrex/regex.cpp

@@ -15,7 +15,7 @@
 
 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("clear"),&RegEx::clear);
 	ObjectTypeDB::bind_method(_MD("is_valid"),&RegEx::is_valid);
@@ -54,7 +54,9 @@ bool RegEx::is_valid() const {
 };
 
 int RegEx::get_capture_count() const {
-	
+
+	ERR_FAIL_COND_V( !exp.valid(), 0 );
+
 	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();
 
-	exp.compile(p_pattern.c_str());
+	exp.compile(p_pattern.c_str(), expanded);
 
 	ERR_FAIL_COND_V( !exp.valid(), FAILED );
 

+ 1 - 1
drivers/nrex/regex.h

@@ -36,7 +36,7 @@ public:
 	bool is_valid() const;
 	int get_capture_count() 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;
 
 	RegEx();

+ 0 - 1
drivers/ogg/SCsub

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

+ 0 - 1
drivers/squish/SCsub

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

+ 0 - 3
drivers/theora/SCsub

@@ -1,4 +1,3 @@
-
 Import('env')
 
 sources = [
@@ -34,5 +33,3 @@ sources = [
 
 if env['use_theoraplayer_binary'] != "yes":
 	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                  bx;
   int                  by;
+  int		       _rlimit1;
+  int		       _rlimit2;
   rdst=_dst;
   rsrc=_src;
-  for(bx=0;bx<8;bx++){
+  for(bx=0;bx<8;++bx){
     cdst=rdst;
     csrc=rsrc;
-    for(by=0;by<10;by++){
+    _rlimit1 = _rlimit2 = _flimit;
+    for(by=0;by<10;++by){
       r[by]=*csrc;
       csrc+=_src_ystride;
     }
     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);
     *_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+=_dst_ystride;
       *cdst=(unsigned char)(r[0]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
       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+
          r[by+4]+r[by+5]+r[by+6]+4>>3);
         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);
     }
     else{
-      for(by=1;by<=8;by++){
+      for(by=1;by<=8;++by){
         *cdst=(unsigned char)r[by];
         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                  bx;
   int                  by;
+  int		       _rlimit1;
+  int		       _rlimit2;
   cdst=_dst;
-  for(by=0;by<8;by++){
+  for(by=0;by<8;++by){
     rsrc=cdst-1;
     rdst=cdst;
-    for(bx=0;bx<10;bx++)r[bx]=*rsrc++;
+    for(bx=0;bx<10;++bx)r[bx]=*rsrc++;
     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[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]*2+r[1]+r[2]*2+r[3]+r[4]+r[5]+4>>3);
       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 */
 	int stateflag = 0;
 
-    int audio_track_skip=audio_track;
+	int audio_track_skip=audio_track;
+
+
 	while(!stateflag){
 		int ret=buffer_data();
 		if(ret==0)break;
@@ -269,15 +271,21 @@ void VideoStreamPlaybackTheora::set_file(const String& p_file) {
 				copymem(&to,&test,sizeof(test));
 				theora_p=1;
 			}else if(!vorbis_p && vorbis_synthesis_headerin(&vi,&vc,&op)>=0){
+
+
 				/* 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{
 				/* whatever it is, we don't care about it */
 				ogg_stream_clear(&test);

+ 0 - 2
drivers/unix/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.drivers_sources,"*.cpp")
 
 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)
 		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')
 
 sources = [
@@ -37,4 +36,3 @@ env.drivers_sources += sources
 
 if env['theora'] != "yes" or env['use_theoraplayer_binary'] != "yes":
 	env.drivers_sources += sources_lib
-

+ 1 - 1
drivers/vorbis/audio_stream_ogg_vorbis.h

@@ -85,7 +85,7 @@ public:
 	virtual void stop();
 	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 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)
 
 Export('env')
-

+ 0 - 2
drivers/windows/SCsub

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

+ 0 - 2
main/SCsub

@@ -8,5 +8,3 @@ Export('env')
 lib = env.Library("main",env.main_sources)
 
 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();
 	
 	print_help(execpath);
-	
 
 	if (performance)
 		memdelete(performance);
@@ -812,6 +811,8 @@ Error Main::setup(const char *execpath,int argc, char *argv[],bool p_second_phas
 		memdelete(packed_data);
 	if (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 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 );
 //#endif
 
-
+	unregister_core_driver_types();
 	unregister_core_types();
 	
 	OS::get_singleton()->_cmdline.clear();
@@ -1007,8 +1008,21 @@ bool Main::start() {
 	bool export_debug=false;
 	List<String> args = OS::get_singleton()->get_cmdline_args();
 	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
-		if (i < (args.size()-1)) {
+		else if (i < (args.size()-1)) {
+			bool parsed_pair=true;
 			if (args[i]=="-doctool") {
 				doc_tool=args[i+1];
 			} else if (args[i]=="-script" || args[i]=="-s") {
@@ -1037,20 +1051,13 @@ bool Main::start() {
 			} else if (args[i]=="-dumpstrings") {
 				editor=true; //needs editor
 				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)
 
 env.Prepend(LIBS=[lib])
-
-

+ 0 - 2
modules/gdscript/SCsub

@@ -3,5 +3,3 @@ Import('env')
 env.add_source_files(env.modules_sources,"*.cpp")
 
 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;
 
-	//see if inheritance happens from a file
 	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) {
 
 		Variant constant = tokenizer->get_token_constant();

+ 0 - 1
modules/gdscript/gd_parser.h

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

+ 0 - 3
modules/gridmap/SCsub

@@ -1,6 +1,3 @@
 Import('env')
 
 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:
-	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:
-	shutil.copy(x,abspath+"/java/libs")	
+	shutil.copy(x,abspath+"/java/libs")
 
 
 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) {
 			skip=true;
 		}
+		
+		if (file.begins_with("META-INF") && _signed) {
+			skip=true;
+		}
 
 		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);				
 			}
 		});
-	};
+	}
 	
 /*	public string requestPurchasedTicket(){
 	    activity.getPaymentsManager()
@@ -42,7 +42,7 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 	
 	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;
 	}
 
@@ -54,7 +54,6 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 				activity.getPaymentsManager().consumeUnconsumedPurchases();				
 			}
 		});
-		
 	}
 
 	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){
-//        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(){
-        GodotLib.calldeferred(purchaseCallbackId, "no_validation_required", new Object[]{});
+		GodotLib.calldeferred(purchaseCallbackId, "no_validation_required", new Object[]{});
 	}
 	
 	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(){
@@ -89,6 +89,10 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 //		GodotLib.callobject(purchaseCallbackId, "purchase_cancel", new Object[]{});
 	}
 	
+	public void callbackAlreadyOwned(String sku){
+		GodotLib.calldeferred(purchaseCallbackId, "purchase_owned", new Object[]{sku});
+	}
+	
 	public int getPurchaseCallbackId() {
 		return purchaseCallbackId;
 	}
@@ -97,8 +101,6 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 		this.purchaseCallbackId = purchaseCallbackId;
 	}
 
-
-
 	public String getPurchaseValidationUrlPrefix(){
 		return this.purchaseValidationUrlPrefix ;
 	}
@@ -107,12 +109,10 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 		this.purchaseValidationUrlPrefix = url;
 	}
 
-
 	public String getAccessToken() {
 		return accessToken;
 	}
 
-
 	public void setAccessToken(String accessToken) {
 		this.accessToken = accessToken;
 	}
@@ -125,4 +125,30 @@ public class GodotPaymentV3 extends Godot.SingletonBase {
 		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 static final int BILLING_RESPONSE_RESULT_OK = 0;
-
-	
 	public static final int REQUEST_CODE_FOR_PURCHASE = 0x1001;
-	
+	private static boolean auto_consume = true;
 	
 	private Activity activity;
 	IInAppBillingService mService;
@@ -69,13 +67,12 @@ public class PaymentsManager {
 	    }
 
 	    @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()) {
 			
 			@Override
@@ -88,6 +85,12 @@ public class PaymentsManager {
 			protected void canceled() {
 				godotPaymentV3.callbackCancel();
 			}
+			
+			@Override
+			protected void alreadyOwned() {
+				godotPaymentV3.callbackAlreadyOwned(sku);
+			}
+			
 		}.purchase(sku, transactionId);
 
 	}
@@ -114,26 +117,82 @@ public class PaymentsManager {
 		}.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) {
 		new HandlePurchaseTask(activity){
 
 			@Override
 			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(ticket);
@@ -151,7 +210,7 @@ public class PaymentsManager {
 				godotPaymentV3.callbackCancel();
 				
 			}
-			}.handlePurchaseRequest(resultCode, data);
+		}.handlePurchaseRequest(resultCode, data);
 	}
 	
 	public void validatePurchase(String purchaseToken, final String sku){
@@ -165,7 +224,7 @@ public class PaymentsManager {
 					
 					@Override
 					protected void success(String ticket) {
-						godotPaymentV3.callbackSuccess(ticket, null);
+						godotPaymentV3.callbackSuccess(ticket, null, sku);
 						
 					}
 					
@@ -192,11 +251,31 @@ public class PaymentsManager {
 		}.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;
 	
 	public void setBaseSingleton(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);
 		if(responseCode == 1 || responseCode == 3 || responseCode == 4){
 			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 canceled();
-
+	abstract protected void alreadyOwned();
 	
 }

+ 0 - 1
platform/bb10/SCsub

@@ -19,4 +19,3 @@ if env['bb10_lgles_override'] == "yes":
 
 prog = None
 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(sample_manager);
+
 	audio_server->finish();
 	memdelete(audio_server);
-	memdelete(sample_manager);
 
 	visual_server->finish();
 	memdelete(visual_server);

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