mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	Fixes
-=-=-= -Added missing quaternion constructor -code completion fixes -winrt fixes
This commit is contained in:
		
							parent
							
								
									7dbc19f32d
								
							
						
					
					
						commit
						a36a774897
					
				
					 23 changed files with 398 additions and 235 deletions
				
			
		|  | @ -12,9 +12,9 @@ Ref<ResourceInteractiveLoader> _ResourceLoader::load_interactive(const String& p | ||||||
| 	return ResourceLoader::load_interactive(p_path,p_type_hint); | 	return ResourceLoader::load_interactive(p_path,p_type_hint); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| RES _ResourceLoader::load(const String &p_path,const String& p_type_hint) { | RES _ResourceLoader::load(const String &p_path,const String& p_type_hint, bool p_no_cache) { | ||||||
| 
 | 
 | ||||||
| 	RES ret =  ResourceLoader::load(p_path,p_type_hint); | 	RES ret =  ResourceLoader::load(p_path,p_type_hint, p_no_cache); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -59,7 +59,7 @@ void _ResourceLoader::_bind_methods() { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	ObjectTypeDB::bind_method(_MD("load_interactive:ResourceInteractiveLoader","path","type_hint"),&_ResourceLoader::load_interactive,DEFVAL("")); | 	ObjectTypeDB::bind_method(_MD("load_interactive:ResourceInteractiveLoader","path","type_hint"),&_ResourceLoader::load_interactive,DEFVAL("")); | ||||||
| 	ObjectTypeDB::bind_method(_MD("load:Resource","path","type_hint"),&_ResourceLoader::load,DEFVAL("")); | 	ObjectTypeDB::bind_method(_MD("load:Resource","path","type_hint", "p_no_cache"),&_ResourceLoader::load,DEFVAL(""), DEFVAL(false)); | ||||||
| 	ObjectTypeDB::bind_method(_MD("get_recognized_extensions_for_type","type"),&_ResourceLoader::get_recognized_extensions_for_type); | 	ObjectTypeDB::bind_method(_MD("get_recognized_extensions_for_type","type"),&_ResourceLoader::get_recognized_extensions_for_type); | ||||||
| 	ObjectTypeDB::bind_method(_MD("set_abort_on_missing_resources","abort"),&_ResourceLoader::set_abort_on_missing_resources); | 	ObjectTypeDB::bind_method(_MD("set_abort_on_missing_resources","abort"),&_ResourceLoader::set_abort_on_missing_resources); | ||||||
| 	ObjectTypeDB::bind_method(_MD("get_dependencies"),&_ResourceLoader::get_dependencies); | 	ObjectTypeDB::bind_method(_MD("get_dependencies"),&_ResourceLoader::get_dependencies); | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 	static _ResourceLoader *get_singleton() { return singleton; } | 	static _ResourceLoader *get_singleton() { return singleton; } | ||||||
| 	Ref<ResourceInteractiveLoader> load_interactive(const String& p_path,const String& p_type_hint=""); | 	Ref<ResourceInteractiveLoader> load_interactive(const String& p_path,const String& p_type_hint=""); | ||||||
| 	RES load(const String &p_path,const String& p_type_hint=""); | 	RES load(const String &p_path,const String& p_type_hint="", bool p_no_cache = false); | ||||||
| 	DVector<String> get_recognized_extensions_for_type(const String& p_type); | 	DVector<String> get_recognized_extensions_for_type(const String& p_type); | ||||||
| 	void set_abort_on_missing_resources(bool p_abort); | 	void set_abort_on_missing_resources(bool p_abort); | ||||||
| 	StringArray get_dependencies(const String& p_path); | 	StringArray get_dependencies(const String& p_path); | ||||||
|  |  | ||||||
|  | @ -136,7 +136,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 		static int b; | 		static int b; | ||||||
| 
 | 
 | ||||||
| #if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0603 // windows 8?
 | #if (defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0603) || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP // windows 8 phone?
 | ||||||
| 		b = (int)((a>0.0f) ? (a + 0.5f):(a -0.5f)); | 		b = (int)((a>0.0f) ? (a + 0.5f):(a -0.5f)); | ||||||
| 
 | 
 | ||||||
| #elif defined(_MSC_VER) && _MSC_VER < 1800 | #elif defined(_MSC_VER) && _MSC_VER < 1800 | ||||||
|  |  | ||||||
|  | @ -110,6 +110,7 @@ void register_core_types() { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	ObjectTypeDB::register_type<Reference>(); | 	ObjectTypeDB::register_type<Reference>(); | ||||||
|  | 	ObjectTypeDB::register_type<WeakRef>(); | ||||||
| 	ObjectTypeDB::register_type<ResourceImportMetadata>(); | 	ObjectTypeDB::register_type<ResourceImportMetadata>(); | ||||||
| 	ObjectTypeDB::register_type<Resource>(); | 	ObjectTypeDB::register_type<Resource>(); | ||||||
| 	ObjectTypeDB::register_type<FuncRef>(); | 	ObjectTypeDB::register_type<FuncRef>(); | ||||||
|  |  | ||||||
|  | @ -757,6 +757,11 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var | ||||||
| 		r_ret=Quat(*p_args[0],*p_args[1],*p_args[2],*p_args[3]); | 		r_ret=Quat(*p_args[0],*p_args[1],*p_args[2],*p_args[3]); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |     static void Quat_init2(Variant& r_ret,const Variant** p_args) { | ||||||
|  | 
 | ||||||
|  |         r_ret=Quat(((Vector3)(*p_args[0])),((float)(*p_args[1]))); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| 	static void Color_init1(Variant& r_ret,const Variant** p_args) { | 	static void Color_init1(Variant& r_ret,const Variant** p_args) { | ||||||
| 
 | 
 | ||||||
| 		r_ret=Color(*p_args[0],*p_args[1],*p_args[2],*p_args[3]); | 		r_ret=Color(*p_args[0],*p_args[1],*p_args[2],*p_args[3]); | ||||||
|  | @ -1509,6 +1514,7 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl | ||||||
| 	_VariantCall::add_constructor(_VariantCall::Plane_init3,Variant::PLANE,"normal",Variant::VECTOR3,"d",Variant::REAL); | 	_VariantCall::add_constructor(_VariantCall::Plane_init3,Variant::PLANE,"normal",Variant::VECTOR3,"d",Variant::REAL); | ||||||
| 
 | 
 | ||||||
| 	_VariantCall::add_constructor(_VariantCall::Quat_init1,Variant::QUAT,"x",Variant::REAL,"y",Variant::REAL,"z",Variant::REAL,"w",Variant::REAL); | 	_VariantCall::add_constructor(_VariantCall::Quat_init1,Variant::QUAT,"x",Variant::REAL,"y",Variant::REAL,"z",Variant::REAL,"w",Variant::REAL); | ||||||
|  |     _VariantCall::add_constructor(_VariantCall::Quat_init2,Variant::QUAT,"axis",Variant::VECTOR3,"angle",Variant::REAL); | ||||||
| 
 | 
 | ||||||
| 	_VariantCall::add_constructor(_VariantCall::Color_init1,Variant::COLOR,"r",Variant::REAL,"g",Variant::REAL,"b",Variant::REAL,"a",Variant::REAL); | 	_VariantCall::add_constructor(_VariantCall::Color_init1,Variant::COLOR,"r",Variant::REAL,"g",Variant::REAL,"b",Variant::REAL,"a",Variant::REAL); | ||||||
| 	_VariantCall::add_constructor(_VariantCall::Color_init2,Variant::COLOR,"r",Variant::REAL,"g",Variant::REAL,"b",Variant::REAL); | 	_VariantCall::add_constructor(_VariantCall::Color_init2,Variant::COLOR,"r",Variant::REAL,"g",Variant::REAL,"b",Variant::REAL); | ||||||
|  |  | ||||||
|  | @ -341,7 +341,11 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; | ||||||
| #  ifdef _WINDOWS_  /* Favor Windows over C runtime fns */ | #  ifdef _WINDOWS_  /* Favor Windows over C runtime fns */ | ||||||
| #    define CVT_PTR(ptr)         (ptr) | #    define CVT_PTR(ptr)         (ptr) | ||||||
| #    define CVT_PTR_NOCHECK(ptr) (ptr) | #    define CVT_PTR_NOCHECK(ptr) (ptr) | ||||||
| #    define png_strlen  lstrlenA | #    ifdef WINRT_ENABLED | ||||||
|  | #      define png_strlen  strlen | ||||||
|  | #    else | ||||||
|  | #      define png_strlen  lstrlenA | ||||||
|  | #    endif | ||||||
| #    define png_memcmp  memcmp | #    define png_memcmp  memcmp | ||||||
| #    define png_memcpy  CopyMemory | #    define png_memcpy  CopyMemory | ||||||
| #    define png_memset  memset | #    define png_memset  memset | ||||||
|  |  | ||||||
|  | @ -120,7 +120,7 @@ static inline int vorbis_ftoi(double f){  /* yes, double!  Otherwise, | ||||||
| 
 | 
 | ||||||
| /* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the
 | /* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the
 | ||||||
|  * 64 bit compiler */ |  * 64 bit compiler */ | ||||||
| #if defined(_MSC_VER) && !defined(_WIN64) && !defined(_WIN32_WCE) | #if defined(_MSC_VER) && !defined(_WIN64) && !defined(_WIN32_WCE) && !defined(WINDOWSPHONE_ENABLED) | ||||||
| #  define VORBIS_FPU_CONTROL | #  define VORBIS_FPU_CONTROL | ||||||
| 
 | 
 | ||||||
| typedef ogg_int16_t vorbis_fpu_control; | typedef ogg_int16_t vorbis_fpu_control; | ||||||
|  |  | ||||||
|  | @ -606,6 +606,16 @@ static bool _guess_expression_type(GDCompletionContext& context,const GDParser:: | ||||||
| 
 | 
 | ||||||
| 				if (base.type==Variant::OBJECT) { | 				if (base.type==Variant::OBJECT) { | ||||||
| 
 | 
 | ||||||
|  | 					if (id.operator String()=="new" && base.value.get_type()==Variant::OBJECT) { | ||||||
|  | 						Object *obj = base.value; | ||||||
|  | 						if (obj && obj->cast_to<GDNativeClass>()) { | ||||||
|  | 							GDNativeClass *gdnc = obj->cast_to<GDNativeClass>(); | ||||||
|  | 							r_type.type=Variant::OBJECT; | ||||||
|  | 							r_type.value=Variant(); | ||||||
|  | 							r_type.obj_type=gdnc->get_name(); | ||||||
|  | 							return true; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					if (ObjectTypeDB::has_method(base.obj_type,id)) { | 					if (ObjectTypeDB::has_method(base.obj_type,id)) { | ||||||
| 
 | 
 | ||||||
|  | @ -677,7 +687,8 @@ static bool _guess_expression_type(GDCompletionContext& context,const GDParser:: | ||||||
| 					v.get_method_list(&mi); | 					v.get_method_list(&mi); | ||||||
| 					for (List<MethodInfo>::Element *E=mi.front();E;E=E->next()) { | 					for (List<MethodInfo>::Element *E=mi.front();E;E=E->next()) { | ||||||
| 
 | 
 | ||||||
| 						if (E->get().name==id.operator String()) { | 						if (!E->get().name.begins_with("_") && E->get().name==id.operator String()) { | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 							MethodInfo mi = E->get(); | 							MethodInfo mi = E->get(); | ||||||
| 							r_type.type=mi.return_val.type; | 							r_type.type=mi.return_val.type; | ||||||
|  | @ -934,7 +945,7 @@ static bool _guess_identifier_type(GDCompletionContext& context,int p_line,const | ||||||
| 		block=block->parent_block; | 		block=block->parent_block; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	//TODO guess identifier type of arguments (ONLY if this is a virtual function)
 | 	//guess from argument if virtual
 | ||||||
| 	if (context.function && context.function->name!=StringName()) { | 	if (context.function && context.function->name!=StringName()) { | ||||||
| 
 | 
 | ||||||
| 		int argindex = -1; | 		int argindex = -1; | ||||||
|  | @ -995,7 +1006,7 @@ static bool _guess_identifier_type(GDCompletionContext& context,int p_line,const | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (context.function && !context.function->_static) { | 	if (!(context.function && context.function->_static)) { | ||||||
| 
 | 
 | ||||||
| 		for(int i=0;i<context._class->variables.size();i++) { | 		for(int i=0;i<context._class->variables.size();i++) { | ||||||
| 
 | 
 | ||||||
|  | @ -1136,6 +1147,8 @@ static void _find_identifiers_in_class(GDCompletionContext& context,bool p_stati | ||||||
| 				List<MethodInfo> methods; | 				List<MethodInfo> methods; | ||||||
| 				ObjectTypeDB::get_method_list(type,&methods); | 				ObjectTypeDB::get_method_list(type,&methods); | ||||||
| 				for(List<MethodInfo>::Element *E=methods.front();E;E=E->next()) { | 				for(List<MethodInfo>::Element *E=methods.front();E;E=E->next()) { | ||||||
|  | 					if (E->get().name.begins_with("_")) | ||||||
|  | 						continue; | ||||||
| 					if (E->get().arguments.size()) | 					if (E->get().arguments.size()) | ||||||
| 						result.insert(E->get().name+"("); | 						result.insert(E->get().name+"("); | ||||||
| 					else | 					else | ||||||
|  | @ -1196,7 +1209,7 @@ static void _find_identifiers(GDCompletionContext& context,int p_line,bool p_onl | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static String _get_visual_datatype(const PropertyInfo& p_info) { | static String _get_visual_datatype(const PropertyInfo& p_info,bool p_isarg=true) { | ||||||
| 
 | 
 | ||||||
| 	String n = p_info.name; | 	String n = p_info.name; | ||||||
| 	int idx = n.find(":"); | 	int idx = n.find(":"); | ||||||
|  | @ -1206,8 +1219,12 @@ static String _get_visual_datatype(const PropertyInfo& p_info) { | ||||||
| 
 | 
 | ||||||
| 	if (p_info.type==Variant::OBJECT && p_info.hint==PROPERTY_HINT_RESOURCE_TYPE) | 	if (p_info.type==Variant::OBJECT && p_info.hint==PROPERTY_HINT_RESOURCE_TYPE) | ||||||
| 		return p_info.hint_string; | 		return p_info.hint_string; | ||||||
| 	if (p_info.type==Variant::NIL) | 	if (p_info.type==Variant::NIL) { | ||||||
| 		return "void"; | 		if (p_isarg) | ||||||
|  | 			return "var"; | ||||||
|  | 		else | ||||||
|  | 			return "void"; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return Variant::get_type_name(p_info.type); | 	return Variant::get_type_name(p_info.type); | ||||||
| } | } | ||||||
|  | @ -1297,7 +1314,7 @@ static void _find_type_arguments(const GDParser::Node*p_node,int p_line,const St | ||||||
| 
 | 
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		arghint = _get_visual_datatype(m->get_argument_info(-1))+" "+p_method.operator String()+String("("); | 		arghint = _get_visual_datatype(m->get_argument_info(-1),false)+" "+p_method.operator String()+String("("); | ||||||
| 
 | 
 | ||||||
| 		for(int i=0;i<m->get_argument_count();i++) { | 		for(int i=0;i<m->get_argument_count();i++) { | ||||||
| 			if (i>0) | 			if (i>0) | ||||||
|  | @ -1361,7 +1378,7 @@ static void _find_call_arguments(GDCompletionContext& context,const GDParser::No | ||||||
| 		const GDParser::BuiltInFunctionNode *fn = static_cast<const GDParser::BuiltInFunctionNode*>(op->arguments[0]); | 		const GDParser::BuiltInFunctionNode *fn = static_cast<const GDParser::BuiltInFunctionNode*>(op->arguments[0]); | ||||||
| 		MethodInfo mi = GDFunctions::get_info(fn->function); | 		MethodInfo mi = GDFunctions::get_info(fn->function); | ||||||
| 
 | 
 | ||||||
| 		arghint = _get_visual_datatype(mi.return_val)+" "+GDFunctions::get_func_name(fn->function)+String("("); | 		arghint = _get_visual_datatype(mi.return_val,false)+" "+GDFunctions::get_func_name(fn->function)+String("("); | ||||||
| 		for(int i=0;i<mi.arguments.size();i++) { | 		for(int i=0;i<mi.arguments.size();i++) { | ||||||
| 			if (i>0) | 			if (i>0) | ||||||
| 				arghint+=", "; | 				arghint+=", "; | ||||||
|  | @ -1674,7 +1691,6 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base | ||||||
| 			isfunction=true; | 			isfunction=true; | ||||||
| 		case GDParser::COMPLETION_INDEX: { | 		case GDParser::COMPLETION_INDEX: { | ||||||
| 
 | 
 | ||||||
| 			print_line("index"); |  | ||||||
| 			const GDParser::Node *node = p.get_completion_node(); | 			const GDParser::Node *node = p.get_completion_node(); | ||||||
| 			if (node->type!=GDParser::Node::TYPE_OPERATOR) | 			if (node->type!=GDParser::Node::TYPE_OPERATOR) | ||||||
| 				break; | 				break; | ||||||
|  | @ -1686,6 +1702,32 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base | ||||||
| 			if (_guess_expression_type(context,static_cast<const GDParser::OperatorNode *>(node)->arguments[0],p.get_completion_line(),t)) { | 			if (_guess_expression_type(context,static_cast<const GDParser::OperatorNode *>(node)->arguments[0],p.get_completion_line(),t)) { | ||||||
| 
 | 
 | ||||||
| 				if (t.type==Variant::OBJECT && t.obj_type!=StringName()) { | 				if (t.type==Variant::OBJECT && t.obj_type!=StringName()) { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 					if (t.value.get_type()) { | ||||||
|  | 						Object *obj=t.value; | ||||||
|  | 						if (obj) { | ||||||
|  | 							GDScript *scr = obj->cast_to<GDScript>(); | ||||||
|  | 							while (scr) { | ||||||
|  | 
 | ||||||
|  | 								if (!isfunction) { | ||||||
|  | 									for (const Map<StringName,Variant>::Element *E=scr->get_constants().front();E;E=E->next()) { | ||||||
|  | 										options.insert(E->key()); | ||||||
|  | 									} | ||||||
|  | 								} | ||||||
|  | 								for (const Map<StringName,GDFunction>::Element *E=scr->get_member_functions().front();E;E=E->next()) { | ||||||
|  | 									options.insert(E->key()); | ||||||
|  | 								} | ||||||
|  | 
 | ||||||
|  | 								if (scr->get_base().is_valid()) | ||||||
|  | 									scr=scr->get_base().ptr(); | ||||||
|  | 								else | ||||||
|  | 									scr=NULL; | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 					if (!isfunction) { | 					if (!isfunction) { | ||||||
| 						ObjectTypeDB::get_integer_constant_list(t.obj_type,r_options); | 						ObjectTypeDB::get_integer_constant_list(t.obj_type,r_options); | ||||||
| 					} | 					} | ||||||
|  | @ -1693,6 +1735,9 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base | ||||||
| 					ObjectTypeDB::get_method_list(t.obj_type,&mi); | 					ObjectTypeDB::get_method_list(t.obj_type,&mi); | ||||||
| 					for (List<MethodInfo>::Element *E=mi.front();E;E=E->next()) { | 					for (List<MethodInfo>::Element *E=mi.front();E;E=E->next()) { | ||||||
| 
 | 
 | ||||||
|  | 						if (E->get().name.begins_with("_")) | ||||||
|  | 							continue; | ||||||
|  | 
 | ||||||
| 						if (E->get().arguments.size()) | 						if (E->get().arguments.size()) | ||||||
| 							options.insert(E->get().name+"("); | 							options.insert(E->get().name+"("); | ||||||
| 						else | 						else | ||||||
|  | @ -1700,6 +1745,7 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base | ||||||
| 
 | 
 | ||||||
| 					} | 					} | ||||||
| 				} else { | 				} else { | ||||||
|  | 
 | ||||||
| 					if (t.value.get_type()==Variant::NIL) { | 					if (t.value.get_type()==Variant::NIL) { | ||||||
| 						Variant::CallError ce; | 						Variant::CallError ce; | ||||||
| 						t.value=Variant::construct(t.type,NULL,0,ce); | 						t.value=Variant::construct(t.type,NULL,0,ce); | ||||||
|  | @ -1728,7 +1774,6 @@ Error GDScriptLanguage::complete_code(const String& p_code, const String& p_base | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		} break; | 		} break; | ||||||
| 		case GDParser::COMPLETION_CALL_ARGUMENTS: { | 		case GDParser::COMPLETION_CALL_ARGUMENTS: { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1756,6 +1756,7 @@ bool GDScript::_update_exports() { | ||||||
| 	return changed; | 	return changed; | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | 	return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GDScript::update_exports() { | void GDScript::update_exports() { | ||||||
|  |  | ||||||
|  | @ -178,7 +178,7 @@ static Windows::Foundation::Point _get_pixel_position(CoreWindow^ window, Window | ||||||
| 	// Compute coordinates normalized from 0..1.
 | 	// Compute coordinates normalized from 0..1.
 | ||||||
| 	// If the coordinates need to be sized to the SDL window,
 | 	// If the coordinates need to be sized to the SDL window,
 | ||||||
| 	// we'll do that after.
 | 	// we'll do that after.
 | ||||||
| 	#if WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP | 	#if 1 || WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP | ||||||
| 	outputPosition.X = rawPosition.X / window->Bounds.Width; | 	outputPosition.X = rawPosition.X / window->Bounds.Width; | ||||||
| 	outputPosition.Y = rawPosition.Y / window->Bounds.Height; | 	outputPosition.Y = rawPosition.Y / window->Bounds.Height; | ||||||
| 	#else | 	#else | ||||||
|  | @ -357,16 +357,29 @@ void App::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ ar | ||||||
|     // On Windows Phone 8.1, the window size changes when the device is rotated.
 |     // On Windows Phone 8.1, the window size changes when the device is rotated.
 | ||||||
|     // The default framebuffer will not be automatically resized when this occurs.
 |     // The default framebuffer will not be automatically resized when this occurs.
 | ||||||
|     // It is therefore up to the app to handle rotation-specific logic in its rendering code.
 |     // It is therefore up to the app to handle rotation-specific logic in its rendering code.
 | ||||||
|  | 	//os->screen_size_changed();
 | ||||||
|  | 	UpdateWindowSize(args->Size); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void App::UpdateWindowSize(Size size) | void App::UpdateWindowSize(Size size) | ||||||
| { | { | ||||||
| 	/*
 | 	float dpi; | ||||||
|     DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); | #if (WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) | ||||||
|     Size pixelSize(ConvertDipsToPixels(size.Width, currentDisplayInformation->LogicalDpi), ConvertDipsToPixels(size.Height, currentDisplayInformation->LogicalDpi)); | 	DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); | ||||||
|  | 	dpi = currentDisplayInformation->LogicalDpi; | ||||||
|  | #else if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) | ||||||
|  | 	dpi = DisplayProperties::LogicalDpi; | ||||||
|  | #endif | ||||||
|  | 	Size pixelSize(ConvertDipsToPixels(size.Width, dpi), ConvertDipsToPixels(size.Height, dpi)); | ||||||
| 
 | 
 | ||||||
|     mWindowWidth = static_cast<GLsizei>(pixelSize.Width); |     mWindowWidth = static_cast<GLsizei>(pixelSize.Width); | ||||||
|     mWindowHeight = static_cast<GLsizei>(pixelSize.Height); |     mWindowHeight = static_cast<GLsizei>(pixelSize.Height); | ||||||
| 	*/ | 
 | ||||||
|  | 	OS::VideoMode vm; | ||||||
|  | 	vm.width = mWindowWidth; | ||||||
|  | 	vm.height = mWindowHeight; | ||||||
|  | 	vm.fullscreen = true; | ||||||
|  | 	vm.resizable = false; | ||||||
|  | 	os->set_video_mode(vm); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -30,38 +30,99 @@ def get_flags(): | ||||||
| def configure(env): | def configure(env): | ||||||
| 
 | 
 | ||||||
| 	env.Append(CPPPATH=['#platform/winrt', '#platform/winrt/include']) | 	env.Append(CPPPATH=['#platform/winrt', '#platform/winrt/include']) | ||||||
|  | 	arch = "" | ||||||
| 
 | 
 | ||||||
| 	env.Append(LINKFLAGS=['/MANIFEST:NO', '/NXCOMPAT', '/DYNAMICBASE', "kernel32.lib", '/MACHINE:X64', '/WINMD', '/APPCONTAINER', '/MANIFESTUAC:NO', '/ERRORREPORT:PROMPT', '/NOLOGO', '/TLBID:1']) | 	if os.getenv('PLATFORM') == "ARM": | ||||||
| 
 | 
 | ||||||
| 	env.Append(LIBPATH=['#platform/winrt/x64/lib']) | 		# compiler commandline | ||||||
|  | 		# debug:   /Yu"pch.h" /MP /GS     /analyze- /W3 /wd"4453" /wd"28204"     /Zc:wchar_t /I"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\App2\App2.WindowsPhone\" /I"Generated Files\" /I"ARM\Debug\"   /I"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\App2\App2.Shared\" /ZW:nostdlib /Zi /Gm- /Od /sdl /Fd"ARM\Debug\vc120.pdb"   /fp:precise /D "PSAPI_VERSION=2" /D "WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP" /D "_UITHREADCTXT_SUPPORT=0" /D "_UNICODE" /D "UNICODE" /D "_DEBUG" /errorReport:prompt /WX- /Zc:forScope /RTC1 /ZW /Gd /Oy- /MDd    /Fa"ARM\Debug\"   /EHsc /nologo /Fo"ARM\Debug\"   /Fp"ARM\Debug\App2.WindowsPhone.pch" | ||||||
|  | 		# release: /Yu"pch.h" /MP /GS /GL /analyze- /W3 /wd"4453" /wd"28204" /Gy /Zc:wchar_t /I"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\App2\App2.WindowsPhone\" /I"Generated Files\" /I"ARM\Release\" /I"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\App2\App2.Shared\" /ZW:nostdlib /Zi /Gm- /O2 /sdl /Fd"ARM\Release\vc120.pdb" /fp:precise /D "PSAPI_VERSION=2" /D "WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP" /D "_UITHREADCTXT_SUPPORT=0" /D "_UNICODE" /D "UNICODE"             /errorReport:prompt /WX- /Zc:forScope       /ZW /Gd /Oy- /Oi /MD /Fa"ARM\Release\" /EHsc /nologo /Fo"ARM\Release\" /Fp"ARM\Release\App2.WindowsPhone.pch" | ||||||
|  | 
 | ||||||
|  | 		# linker commandline | ||||||
|  | 		# debug:   /OUT:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Debug\App2.WindowsPhone\App2.WindowsPhone.exe"   /MANIFEST:NO       /NXCOMPAT /PDB:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Debug\App2.WindowsPhone\App2.WindowsPhone.pdb"   /DYNAMICBASE "WindowsPhoneCore.lib" "RuntimeObject.lib" "PhoneAppModelHost.lib" /DEBUG /MACHINE:ARM /NODEFAULTLIB:"kernel32.lib" /NODEFAULTLIB:"ole32.lib" /WINMD /APPCONTAINER /INCREMENTAL /PGD:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Debug\App2.WindowsPhone\App2.WindowsPhone.pgd"   /WINMDFILE:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Debug\App2.WindowsPhone\App2.winmd"   /SUBSYSTEM:WINDOWS /MANIFESTUAC:NO /ManifestFile:"ARM\Debug\App2.WindowsPhone.exe.intermediate.manifest"            /ERRORREPORT:PROMPT /NOLOGO /TLBID:1 | ||||||
|  | 		# release: /OUT:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Release\App2.WindowsPhone\App2.WindowsPhone.exe" /MANIFEST:NO /LTCG /NXCOMPAT /PDB:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Release\App2.WindowsPhone\App2.WindowsPhone.pdb" /DYNAMICBASE "WindowsPhoneCore.lib" "RuntimeObject.lib" "PhoneAppModelHost.lib" /DEBUG /MACHINE:ARM /NODEFAULTLIB:"kernel32.lib" /NODEFAULTLIB:"ole32.lib" /WINMD /APPCONTAINER /OPT:REF     /PGD:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Release\App2.WindowsPhone\App2.WindowsPhone.pgd" /WINMDFILE:"C:\Users\ariel\Documents\Visual Studio 2013\Projects\App2\ARM\Release\App2.WindowsPhone\App2.winmd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:NO /ManifestFile:"ARM\Release\App2.WindowsPhone.exe.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1 | ||||||
|  | 
 | ||||||
|  | 		arch = "arm" | ||||||
|  | 
 | ||||||
|  | 		env.Append(LINKFLAGS=['/INCREMENTAL:NO', '/MANIFEST:NO', '/NXCOMPAT', '/DYNAMICBASE', "WindowsPhoneCore.lib", "RuntimeObject.lib", "PhoneAppModelHost.lib", "/DEBUG", "/MACHINE:ARM", '/NODEFAULTLIB:"kernel32.lib"', '/NODEFAULTLIB:"ole32.lib"', '/WINMD', '/APPCONTAINER', '/MANIFESTUAC:NO', '/ERRORREPORT:PROMPT', '/NOLOGO', '/TLBID:1']) | ||||||
|  | 		env.Append(LIBPATH=['#platform/winrt/ARM/lib']) | ||||||
|  | 
 | ||||||
|  | 		env.Append(CCFLAGS=string.split('/MP /GS /wd"4453" /wd"28204" /analyze- /Zc:wchar_t /Zi /Gm- /Od /fp:precise /fp:precise /D "PSAPI_VERSION=2" /D "WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP" /DWINDOWSPHONE_ENABLED /D "_UITHREADCTXT_SUPPORT=0" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /RTC1 /Gd /EHsc /nologo')) | ||||||
|  | 		env.Append(CXXFLAGS=string.split('/ZW')) | ||||||
|  | 
 | ||||||
|  | 		if (env["target"]=="release"): | ||||||
|  | 
 | ||||||
|  | 			env.Append(CCFLAGS=['/O2']) | ||||||
|  | 			env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS']) | ||||||
|  | 
 | ||||||
|  | 		elif (env["target"]=="test"): | ||||||
|  | 
 | ||||||
|  | 			env.Append(CCFLAGS=['/O2','/DDEBUG_ENABLED','/DD3D_DEBUG_INFO']) | ||||||
|  | 			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) | ||||||
|  | 
 | ||||||
|  | 		elif (env["target"]=="debug"): | ||||||
|  | 
 | ||||||
|  | 			env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DD3D_DEBUG_INFO']) | ||||||
|  | 			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) | ||||||
|  | 			env.Append(LINKFLAGS=['/DEBUG', '/D_DEBUG']) | ||||||
|  | 
 | ||||||
|  | 		elif (env["target"]=="profile"): | ||||||
|  | 
 | ||||||
|  | 			env.Append(CCFLAGS=['-g','-pg']) | ||||||
|  | 			env.Append(LINKFLAGS=['-pg']) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	if (env["target"]=="release"): | 		env['ENV'] = os.environ; | ||||||
|  | 		# fix environment for windows phone 8.1 | ||||||
|  | 		env['ENV']['WINDOWSPHONEKITDIR'] = env['ENV']['WINDOWSPHONEKITDIR'].replace("8.0", "8.1") # wtf | ||||||
|  | 		env['ENV']['INCLUDE'] = env['ENV']['INCLUDE'].replace("8.0", "8.1") | ||||||
|  | 		env['ENV']['LIB'] = env['ENV']['LIB'].replace("8.0", "8.1") | ||||||
|  | 		env['ENV']['PATH'] = env['ENV']['PATH'].replace("8.0", "8.1") | ||||||
|  | 		env['ENV']['LIBPATH'] = env['ENV']['LIBPATH'].replace("8.0\\Windows Metadata", "8.1\\References\\CommonConfiguration\\Neutral") | ||||||
| 
 | 
 | ||||||
| 		env.Append(CCFLAGS=['/O2']) | 	else: | ||||||
| 		env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS']) |  | ||||||
| 		env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup']) |  | ||||||
| 
 | 
 | ||||||
| 	elif (env["target"]=="test"): | 		arch = "x64" | ||||||
|  | 		env.Append(LINKFLAGS=['/MANIFEST:NO', '/NXCOMPAT', '/DYNAMICBASE', "kernel32.lib", '/MACHINE:X64', '/WINMD', '/APPCONTAINER', '/MANIFESTUAC:NO', '/ERRORREPORT:PROMPT', '/NOLOGO', '/TLBID:1']) | ||||||
| 
 | 
 | ||||||
| 		env.Append(CCFLAGS=['/O2','/DDEBUG_ENABLED','/DD3D_DEBUG_INFO']) | 		env.Append(LIBPATH=['#platform/winrt/x64/lib']) | ||||||
| 		env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) |  | ||||||
| 
 |  | ||||||
| 	elif (env["target"]=="debug"): |  | ||||||
| 
 |  | ||||||
| 		env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DD3D_DEBUG_INFO']) |  | ||||||
| 		env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) |  | ||||||
| 		env.Append(LINKFLAGS=['/DEBUG', '/D_DEBUG']) |  | ||||||
| 
 |  | ||||||
| 	elif (env["target"]=="profile"): |  | ||||||
| 
 |  | ||||||
| 		env.Append(CCFLAGS=['-g','-pg']) |  | ||||||
| 		env.Append(LINKFLAGS=['-pg']) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	env.Append(CCFLAGS=string.split('/MP /GS /wd"4453" /wd"28204" /Zc:wchar_t /Gm- /Od /fp:precise /D "_UNICODE" /D "UNICODE" /D "WINAPI_FAMILY=WINAPI_FAMILY_APP" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /EHsc /nologo')) | 		if (env["target"]=="release"): | ||||||
| 	env.Append(CXXFLAGS=string.split('/ZW')) | 
 | ||||||
| 	env.Append(CCFLAGS=['/AI', os.environ['VCINSTALLDIR']+'\\vcpackages', '/AI', os.environ['WINDOWSSDKDIR']+'\\References\\CommonConfiguration\\Neutral']) | 			env.Append(CCFLAGS=['/O2']) | ||||||
|  | 			env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS']) | ||||||
|  | 			env.Append(LINKFLAGS=['/ENTRY:mainCRTStartup']) | ||||||
|  | 
 | ||||||
|  | 		elif (env["target"]=="test"): | ||||||
|  | 
 | ||||||
|  | 			env.Append(CCFLAGS=['/O2','/DDEBUG_ENABLED','/DD3D_DEBUG_INFO']) | ||||||
|  | 			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) | ||||||
|  | 
 | ||||||
|  | 		elif (env["target"]=="debug"): | ||||||
|  | 
 | ||||||
|  | 			env.Append(CCFLAGS=['/Zi','/DDEBUG_ENABLED','/DD3D_DEBUG_INFO']) | ||||||
|  | 			env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE']) | ||||||
|  | 			env.Append(LINKFLAGS=['/DEBUG', '/D_DEBUG']) | ||||||
|  | 
 | ||||||
|  | 		elif (env["target"]=="profile"): | ||||||
|  | 
 | ||||||
|  | 			env.Append(CCFLAGS=['-g','-pg']) | ||||||
|  | 			env.Append(LINKFLAGS=['-pg']) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		env.Append(CCFLAGS=string.split('/MP /GS /wd"4453" /wd"28204" /Zc:wchar_t /Gm- /Od /fp:precise /D "_UNICODE" /D "UNICODE" /D "WINAPI_FAMILY=WINAPI_FAMILY_APP" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /EHsc /nologo')) | ||||||
|  | 		env.Append(CXXFLAGS=string.split('/ZW')) | ||||||
|  | 		env.Append(CCFLAGS=['/AI', os.environ['VCINSTALLDIR']+'\\vcpackages', '/AI', os.environ['WINDOWSSDKDIR']+'\\References\\CommonConfiguration\\Neutral']) | ||||||
|  | 		env.Append(CCFLAGS=['/DWINAPI_FAMILY=WINAPI_FAMILY_APP', '/D_WIN32_WINNT=0x0603', '/DNTDDI_VERSION=0x06030000']) | ||||||
|  | 
 | ||||||
|  | 		env['ENV'] = os.environ; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	env["PROGSUFFIX"]="."+arch+env["PROGSUFFIX"] | ||||||
|  | 	env["OBJSUFFIX"]="."+arch+env["OBJSUFFIX"] | ||||||
|  | 	env["LIBSUFFIX"]="."+arch+env["LIBSUFFIX"] | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 	#env.Append(CCFLAGS=['/Gd','/GR','/nologo', '/EHsc']) | 	#env.Append(CCFLAGS=['/Gd','/GR','/nologo', '/EHsc']) | ||||||
| 	#env.Append(CXXFLAGS=['/TP', '/ZW']) | 	#env.Append(CXXFLAGS=['/TP', '/ZW']) | ||||||
|  | @ -69,7 +130,6 @@ def configure(env): | ||||||
| 	##env.Append(CCFLAGS=['/I'+os.getenv("WindowsSdkDir")+"/Include"]) | 	##env.Append(CCFLAGS=['/I'+os.getenv("WindowsSdkDir")+"/Include"]) | ||||||
| 	env.Append(CCFLAGS=['/DWINRT_ENABLED']) | 	env.Append(CCFLAGS=['/DWINRT_ENABLED']) | ||||||
| 	env.Append(CCFLAGS=['/DWINDOWS_ENABLED']) | 	env.Append(CCFLAGS=['/DWINDOWS_ENABLED']) | ||||||
| 	env.Append(CCFLAGS=['/DWINAPI_FAMILY=WINAPI_FAMILY_APP', '/D_WIN32_WINNT=0x0603', '/DNTDDI_VERSION=0x06030000']) |  | ||||||
| 	env.Append(CCFLAGS=['/DRTAUDIO_ENABLED']) | 	env.Append(CCFLAGS=['/DRTAUDIO_ENABLED']) | ||||||
| 	#env.Append(CCFLAGS=['/DWIN32']) | 	#env.Append(CCFLAGS=['/DWIN32']) | ||||||
| 	env.Append(CCFLAGS=['/DTYPED_METHOD_BIND']) | 	env.Append(CCFLAGS=['/DTYPED_METHOD_BIND']) | ||||||
|  | @ -92,5 +152,5 @@ def configure(env): | ||||||
| 	env.Append( BUILDERS = { 'HLSL9' : env.Builder(action = methods.build_hlsl_dx9_headers, suffix = 'hlsl.h',src_suffix = '.hlsl') } ) | 	env.Append( BUILDERS = { 'HLSL9' : env.Builder(action = methods.build_hlsl_dx9_headers, suffix = 'hlsl.h',src_suffix = '.hlsl') } ) | ||||||
| 	env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } ) | 	env.Append( BUILDERS = { 'GLSL120GLES' : env.Builder(action = methods.build_gles2_headers, suffix = 'glsl.h',src_suffix = '.glsl') } ) | ||||||
| 
 | 
 | ||||||
| 	env['ENV'] = os.environ; |  | ||||||
| 
 | 
 | ||||||
|  | #/c/Program Files (x86)/Windows Phone Kits/8.1/lib/ARM/WindowsPhoneCore.lib | ||||||
|  |  | ||||||
|  | @ -1,5 +1,7 @@ | ||||||
| #include "gl_context_egl.h" | #include "gl_context_egl.h" | ||||||
| 
 | 
 | ||||||
|  | #include "EGL/eglext.h" | ||||||
|  | 
 | ||||||
| using namespace Platform; | using namespace Platform; | ||||||
| 
 | 
 | ||||||
| void ContextEGL::release_current() { | void ContextEGL::release_current() { | ||||||
|  | @ -22,6 +24,14 @@ int ContextEGL::get_window_height() { | ||||||
| 	return height; | 	return height; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | void ContextEGL::reset() { | ||||||
|  | 
 | ||||||
|  | 	cleanup(); | ||||||
|  | 
 | ||||||
|  | 	window = CoreWindow::GetForCurrentThread(); | ||||||
|  | 	initialize(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| void ContextEGL::swap_buffers() { | void ContextEGL::swap_buffers() { | ||||||
| 
 | 
 | ||||||
| 	if (eglSwapBuffers(mEglDisplay, mEglSurface) != EGL_TRUE) | 	if (eglSwapBuffers(mEglDisplay, mEglSurface) != EGL_TRUE) | ||||||
|  | @ -63,7 +73,23 @@ Error ContextEGL::initialize() { | ||||||
| 
 | 
 | ||||||
| 	try { | 	try { | ||||||
| 
 | 
 | ||||||
| 		display = eglGetDisplay(EGL_DEFAULT_DISPLAY); | 		const EGLint displayAttributes[] = | ||||||
|  | 		{ | ||||||
|  | 			EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, | ||||||
|  | 			EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, 9, | ||||||
|  | 			EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, 3, | ||||||
|  | 			EGL_NONE, | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(eglGetProcAddress("eglGetPlatformDisplayEXT")); | ||||||
|  | 
 | ||||||
|  | 		if (!eglGetPlatformDisplayEXT) | ||||||
|  | 		{ | ||||||
|  | 			throw Exception::CreateException(E_FAIL, L"Failed to get function eglGetPlatformDisplayEXT"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, displayAttributes); | ||||||
|  | 
 | ||||||
| 		if (display == EGL_NO_DISPLAY) | 		if (display == EGL_NO_DISPLAY) | ||||||
| 		{ | 		{ | ||||||
| 			throw Exception::CreateException(E_FAIL, L"Failed to get default EGL display"); | 			throw Exception::CreateException(E_FAIL, L"Failed to get default EGL display"); | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ public: | ||||||
| 	virtual void swap_buffers(); | 	virtual void swap_buffers(); | ||||||
| 
 | 
 | ||||||
| 	virtual Error initialize(); | 	virtual Error initialize(); | ||||||
|  | 	void reset(); | ||||||
| 
 | 
 | ||||||
| 	void cleanup(); | 	void cleanup(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -432,31 +432,38 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSu | ||||||
| #define EGL_ANGLE_direct3d_display 1 | #define EGL_ANGLE_direct3d_display 1 | ||||||
| #define EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ((EGLNativeDisplayType)-2) | #define EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ((EGLNativeDisplayType)-2) | ||||||
| #define EGL_D3D11_ONLY_DISPLAY_ANGLE ((EGLNativeDisplayType)-3) | #define EGL_D3D11_ONLY_DISPLAY_ANGLE ((EGLNativeDisplayType)-3) | ||||||
| #define EGL_D3D11_FL9_3_ONLY_DISPLAY_ANGLE ((EGLNativeDisplayType)-4) |  | ||||||
| #endif /* EGL_ANGLE_direct3d_display */ | #endif /* EGL_ANGLE_direct3d_display */ | ||||||
| 
 | 
 | ||||||
| #ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle | #ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle | ||||||
| #define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 | #define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 | ||||||
| #endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ | #endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ | ||||||
| 
 | 
 | ||||||
|  | #ifndef EGL_ANGLE_surface_d3d_render_to_back_buffer | ||||||
|  | #define EGL_ANGLE_surface_d3d_render_to_back_buffer 1 | ||||||
|  | #define EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER 0x320B | ||||||
|  | #define EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER 0x320C | ||||||
|  | #endif /* EGL_ANGLE_surface_d3d_render_to_back_buffer */ | ||||||
|  | 
 | ||||||
| #ifndef EGL_ANGLE_platform_angle | #ifndef EGL_ANGLE_platform_angle | ||||||
| #define EGL_ANGLE_platform_angle 1 | #define EGL_ANGLE_platform_angle 1 | ||||||
| #define EGL_PLATFORM_ANGLE_ANGLE          0x3201 | #define EGL_PLATFORM_ANGLE_ANGLE          0x3201 | ||||||
| #define EGL_PLATFORM_ANGLE_TYPE_ANGLE     0x3202 | #define EGL_PLATFORM_ANGLE_TYPE_ANGLE     0x3202 | ||||||
| #define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3203 | #define EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE 0x3203 | ||||||
|  | #define EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE 0x3204 | ||||||
|  | #define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3205 | ||||||
| #endif /* EGL_ANGLE_platform_angle */ | #endif /* EGL_ANGLE_platform_angle */ | ||||||
| 
 | 
 | ||||||
| #ifndef EGL_ANGLE_platform_angle_d3d | #ifndef EGL_ANGLE_platform_angle_d3d | ||||||
| #define EGL_ANGLE_platform_angle_d3d 1 | #define EGL_ANGLE_platform_angle_d3d 1 | ||||||
| #define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3204 | #define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3206 | ||||||
| #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3205 | #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3207 | ||||||
| #define EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE 0x3206 | #define EGL_PLATFORM_ANGLE_USE_WARP_ANGLE 0x3208 | ||||||
| #endif /* EGL_ANGLE_platform_angle_d3d */ | #endif /* EGL_ANGLE_platform_angle_d3d */ | ||||||
| 
 | 
 | ||||||
| #ifndef EGL_ANGLE_platform_angle_opengl | #ifndef EGL_ANGLE_platform_angle_opengl | ||||||
| #define EGL_ANGLE_platform_angle_opengl 1 | #define EGL_ANGLE_platform_angle_opengl 1 | ||||||
| #define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x3207 | #define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x3209 | ||||||
| #define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x3208 | #define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320A | ||||||
| #endif /* EGL_ANGLE_platform_angle_opengl */ | #endif /* EGL_ANGLE_platform_angle_opengl */ | ||||||
| 
 | 
 | ||||||
| #ifndef EGL_ARM_pixmap_multisample_discard | #ifndef EGL_ARM_pixmap_multisample_discard | ||||||
|  |  | ||||||
|  | @ -76,12 +76,12 @@ | ||||||
| typedef HDC     EGLNativeDisplayType; | typedef HDC     EGLNativeDisplayType; | ||||||
| typedef HBITMAP EGLNativePixmapType; | typedef HBITMAP EGLNativePixmapType; | ||||||
| 
 | 
 | ||||||
| #if defined(WINAPI_FAMILY) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) | #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PC_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) /* Windows Store */ | ||||||
| #include <inspectable.h> | #include <inspectable.h> | ||||||
| typedef IInspectable* EGLNativeWindowType; | typedef IInspectable* EGLNativeWindowType; | ||||||
| #else | #else | ||||||
| typedef HWND    EGLNativeWindowType; | typedef HWND    EGLNativeWindowType; | ||||||
| #endif // defined(WINAPI_FAMILY) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 | #endif | ||||||
| 
 | 
 | ||||||
| #elif defined(__WINSCW__) || defined(__SYMBIAN32__)  /* Symbian */ | #elif defined(__WINSCW__) || defined(__SYMBIAN32__)  /* Symbian */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -27,6 +27,10 @@ | ||||||
| 
 | 
 | ||||||
| #include "KHR/khrplatform.h" | #include "KHR/khrplatform.h" | ||||||
| 
 | 
 | ||||||
|  | #include <map> | ||||||
|  | #include <string> | ||||||
|  | #include <vector> | ||||||
|  | 
 | ||||||
| //
 | //
 | ||||||
| // This is the platform independent interface between an OGL driver
 | // This is the platform independent interface between an OGL driver
 | ||||||
| // and the shading language compiler.
 | // and the shading language compiler.
 | ||||||
|  | @ -39,20 +43,20 @@ typedef unsigned int GLenum; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Must be included after GLenum proxy typedef
 | // Must be included after GLenum proxy typedef
 | ||||||
|  | // Note: make sure to increment ANGLE_SH_VERSION when changing ShaderVars.h
 | ||||||
| #include "ShaderVars.h" | #include "ShaderVars.h" | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| // Version number for shader translation API.
 | // Version number for shader translation API.
 | ||||||
| // It is incremented every time the API changes.
 | // It is incremented every time the API changes.
 | ||||||
| #define ANGLE_SH_VERSION 129 | #define ANGLE_SH_VERSION 132 | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|   SH_GLES2_SPEC = 0x8B40, |   SH_GLES2_SPEC = 0x8B40, | ||||||
|   SH_WEBGL_SPEC = 0x8B41, |   SH_WEBGL_SPEC = 0x8B41, | ||||||
| 
 | 
 | ||||||
|  |   SH_GLES3_SPEC = 0x8B86, | ||||||
|  |   SH_WEBGL2_SPEC = 0x8B87, | ||||||
|  | 
 | ||||||
|   // The CSS Shaders spec is a subset of the WebGL spec.
 |   // The CSS Shaders spec is a subset of the WebGL spec.
 | ||||||
|   //
 |   //
 | ||||||
|   // In both CSS vertex and fragment shaders, ANGLE:
 |   // In both CSS vertex and fragment shaders, ANGLE:
 | ||||||
|  | @ -84,31 +88,6 @@ typedef enum { | ||||||
|   SH_HLSL11_OUTPUT = 0x8B48 |   SH_HLSL11_OUTPUT = 0x8B48 | ||||||
| } ShShaderOutput; | } ShShaderOutput; | ||||||
| 
 | 
 | ||||||
| typedef enum { |  | ||||||
|   SH_PRECISION_HIGHP     = 0x5001, |  | ||||||
|   SH_PRECISION_MEDIUMP   = 0x5002, |  | ||||||
|   SH_PRECISION_LOWP      = 0x5003, |  | ||||||
|   SH_PRECISION_UNDEFINED = 0 |  | ||||||
| } ShPrecisionType; |  | ||||||
| 
 |  | ||||||
| typedef enum { |  | ||||||
|   SH_INFO_LOG_LENGTH                = 0x8B84, |  | ||||||
|   SH_OBJECT_CODE_LENGTH             = 0x8B88,  // GL_SHADER_SOURCE_LENGTH
 |  | ||||||
|   SH_ACTIVE_UNIFORMS                = 0x8B86, |  | ||||||
|   SH_ACTIVE_UNIFORM_MAX_LENGTH      = 0x8B87, |  | ||||||
|   SH_ACTIVE_ATTRIBUTES              = 0x8B89, |  | ||||||
|   SH_ACTIVE_ATTRIBUTE_MAX_LENGTH    = 0x8B8A, |  | ||||||
|   SH_VARYINGS                       = 0x8BBB, |  | ||||||
|   SH_VARYING_MAX_LENGTH             = 0x8BBC, |  | ||||||
|   SH_MAPPED_NAME_MAX_LENGTH         = 0x6000, |  | ||||||
|   SH_NAME_MAX_LENGTH                = 0x6001, |  | ||||||
|   SH_HASHED_NAME_MAX_LENGTH         = 0x6002, |  | ||||||
|   SH_HASHED_NAMES_COUNT             = 0x6003, |  | ||||||
|   SH_SHADER_VERSION                 = 0x6004, |  | ||||||
|   SH_RESOURCES_STRING_LENGTH        = 0x6005, |  | ||||||
|   SH_OUTPUT_TYPE                    = 0x6006 |  | ||||||
| } ShShaderInfo; |  | ||||||
| 
 |  | ||||||
| // Compile options.
 | // Compile options.
 | ||||||
| typedef enum { | typedef enum { | ||||||
|   SH_VALIDATE                = 0, |   SH_VALIDATE                = 0, | ||||||
|  | @ -188,6 +167,11 @@ typedef enum { | ||||||
|   // This flag scalarizes vec/ivec/bvec/mat constructor args.
 |   // This flag scalarizes vec/ivec/bvec/mat constructor args.
 | ||||||
|   // It is intended as a workaround for Linux/Mac driver bugs.
 |   // It is intended as a workaround for Linux/Mac driver bugs.
 | ||||||
|   SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS = 0x40000, |   SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS = 0x40000, | ||||||
|  | 
 | ||||||
|  |   // This flag overwrites a struct name with a unique prefix.
 | ||||||
|  |   // It is intended as a workaround for drivers that do not handle
 | ||||||
|  |   // struct scopes correctly, including all Mac drivers and Linux AMD.
 | ||||||
|  |   SH_REGENERATE_STRUCT_NAMES = 0x80000, | ||||||
| } ShCompileOptions; | } ShCompileOptions; | ||||||
| 
 | 
 | ||||||
| // Defines alternate strategies for implementing array index clamping.
 | // Defines alternate strategies for implementing array index clamping.
 | ||||||
|  | @ -202,14 +186,14 @@ typedef enum { | ||||||
| //
 | //
 | ||||||
| // Driver must call this first, once, before doing any other
 | // Driver must call this first, once, before doing any other
 | ||||||
| // compiler operations.
 | // compiler operations.
 | ||||||
| // If the function succeeds, the return value is nonzero, else zero.
 | // If the function succeeds, the return value is true, else false.
 | ||||||
| //
 | //
 | ||||||
| COMPILER_EXPORT int ShInitialize(); | COMPILER_EXPORT bool ShInitialize(); | ||||||
| //
 | //
 | ||||||
| // Driver should call this at shutdown.
 | // Driver should call this at shutdown.
 | ||||||
| // If the function succeeds, the return value is nonzero, else zero.
 | // If the function succeeds, the return value is true, else false.
 | ||||||
| //
 | //
 | ||||||
| COMPILER_EXPORT int ShFinalize(); | COMPILER_EXPORT bool ShFinalize(); | ||||||
| 
 | 
 | ||||||
| // The 64 bits hash function. The first parameter is the input string; the
 | // The 64 bits hash function. The first parameter is the input string; the
 | ||||||
| // second parameter is the string length.
 | // second parameter is the string length.
 | ||||||
|  | @ -240,6 +224,12 @@ typedef struct | ||||||
|     int EXT_frag_depth; |     int EXT_frag_depth; | ||||||
|     int EXT_shader_texture_lod; |     int EXT_shader_texture_lod; | ||||||
| 
 | 
 | ||||||
|  |     // Set to 1 to enable replacing GL_EXT_draw_buffers #extension directives
 | ||||||
|  |     // with GL_NV_draw_buffers in ESSL output. This flag can be used to emulate
 | ||||||
|  |     // EXT_draw_buffers by using it in combination with GLES3.0 glDrawBuffers
 | ||||||
|  |     // function. This applies to Tegra K1 devices.
 | ||||||
|  |     int NV_draw_buffers; | ||||||
|  | 
 | ||||||
|     // Set to 1 if highp precision is supported in the fragment language.
 |     // Set to 1 if highp precision is supported in the fragment language.
 | ||||||
|     // Default is 0.
 |     // Default is 0.
 | ||||||
|     int FragmentPrecisionHigh; |     int FragmentPrecisionHigh; | ||||||
|  | @ -268,8 +258,10 @@ typedef struct | ||||||
| 
 | 
 | ||||||
| //
 | //
 | ||||||
| // Initialize built-in resources with minimum expected values.
 | // Initialize built-in resources with minimum expected values.
 | ||||||
|  | // Parameters:
 | ||||||
|  | // resources: The object to initialize. Will be comparable with memcmp.
 | ||||||
| //
 | //
 | ||||||
| COMPILER_EXPORT void ShInitBuiltInResources(ShBuiltInResources* resources); | COMPILER_EXPORT void ShInitBuiltInResources(ShBuiltInResources *resources); | ||||||
| 
 | 
 | ||||||
| //
 | //
 | ||||||
| // ShHandle held by but opaque to the driver.  It is allocated,
 | // ShHandle held by but opaque to the driver.  It is allocated,
 | ||||||
|  | @ -278,18 +270,15 @@ COMPILER_EXPORT void ShInitBuiltInResources(ShBuiltInResources* resources); | ||||||
| //
 | //
 | ||||||
| // If handle creation fails, 0 will be returned.
 | // If handle creation fails, 0 will be returned.
 | ||||||
| //
 | //
 | ||||||
| typedef void* ShHandle; | typedef void *ShHandle; | ||||||
| 
 | 
 | ||||||
| //
 | //
 | ||||||
| // Returns the a concatenated list of the items in ShBuiltInResources as a string.
 | // Returns the a concatenated list of the items in ShBuiltInResources as a
 | ||||||
|  | // null-terminated string.
 | ||||||
| // This function must be updated whenever ShBuiltInResources is changed.
 | // This function must be updated whenever ShBuiltInResources is changed.
 | ||||||
| // Parameters:
 | // Parameters:
 | ||||||
| // handle: Specifies the handle of the compiler to be used.
 | // handle: Specifies the handle of the compiler to be used.
 | ||||||
| // outStringLen: Specifies the size of the buffer, in number of characters. The size
 | COMPILER_EXPORT const std::string &ShGetBuiltInResourcesString(const ShHandle handle); | ||||||
| //               of the buffer required to store the resources string can be obtained
 |  | ||||||
| //               by calling ShGetInfo with SH_RESOURCES_STRING_LENGTH.
 |  | ||||||
| // outStr: Returns a null-terminated string representing all the built-in resources.
 |  | ||||||
| COMPILER_EXPORT void ShGetBuiltInResourcesString(const ShHandle handle, size_t outStringLen, char *outStr); |  | ||||||
| 
 | 
 | ||||||
| //
 | //
 | ||||||
| // Driver calls these to create and destroy compiler objects.
 | // Driver calls these to create and destroy compiler objects.
 | ||||||
|  | @ -307,12 +296,12 @@ COMPILER_EXPORT ShHandle ShConstructCompiler( | ||||||
|     sh::GLenum type, |     sh::GLenum type, | ||||||
|     ShShaderSpec spec, |     ShShaderSpec spec, | ||||||
|     ShShaderOutput output, |     ShShaderOutput output, | ||||||
|     const ShBuiltInResources* resources); |     const ShBuiltInResources *resources); | ||||||
| COMPILER_EXPORT void ShDestruct(ShHandle handle); | COMPILER_EXPORT void ShDestruct(ShHandle handle); | ||||||
| 
 | 
 | ||||||
| //
 | //
 | ||||||
| // Compiles the given shader source.
 | // Compiles the given shader source.
 | ||||||
| // If the function succeeds, the return value is nonzero, else zero.
 | // If the function succeeds, the return value is true, else false.
 | ||||||
| // Parameters:
 | // Parameters:
 | ||||||
| // handle: Specifies the handle of compiler to be used.
 | // handle: Specifies the handle of compiler to be used.
 | ||||||
| // shaderStrings: Specifies an array of pointers to null-terminated strings
 | // shaderStrings: Specifies an array of pointers to null-terminated strings
 | ||||||
|  | @ -334,123 +323,36 @@ COMPILER_EXPORT void ShDestruct(ShHandle handle); | ||||||
| // SH_VARIABLES: Extracts attributes, uniforms, and varyings.
 | // SH_VARIABLES: Extracts attributes, uniforms, and varyings.
 | ||||||
| //               Can be queried by calling ShGetVariableInfo().
 | //               Can be queried by calling ShGetVariableInfo().
 | ||||||
| //
 | //
 | ||||||
| COMPILER_EXPORT int ShCompile( | COMPILER_EXPORT bool ShCompile( | ||||||
|     const ShHandle handle, |     const ShHandle handle, | ||||||
|     const char* const shaderStrings[], |     const char * const shaderStrings[], | ||||||
|     size_t numStrings, |     size_t numStrings, | ||||||
|     int compileOptions |     int compileOptions); | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
| // Returns a parameter from a compiled shader.
 | // Return the version of the shader language.
 | ||||||
|  | COMPILER_EXPORT int ShGetShaderVersion(const ShHandle handle); | ||||||
|  | 
 | ||||||
|  | // Return the currently set language output type.
 | ||||||
|  | COMPILER_EXPORT ShShaderOutput ShGetShaderOutputType( | ||||||
|  |     const ShHandle handle); | ||||||
|  | 
 | ||||||
|  | // Returns null-terminated information log for a compiled shader.
 | ||||||
| // Parameters:
 | // Parameters:
 | ||||||
| // handle: Specifies the compiler
 | // handle: Specifies the compiler
 | ||||||
| // pname: Specifies the parameter to query.
 | COMPILER_EXPORT const std::string &ShGetInfoLog(const ShHandle handle); | ||||||
| // The following parameters are defined:
 |  | ||||||
| // SH_INFO_LOG_LENGTH: the number of characters in the information log
 |  | ||||||
| //                     including the null termination character.
 |  | ||||||
| // SH_OBJECT_CODE_LENGTH: the number of characters in the object code
 |  | ||||||
| //                        including the null termination character.
 |  | ||||||
| // SH_ACTIVE_ATTRIBUTES: the number of active attribute variables.
 |  | ||||||
| // SH_ACTIVE_ATTRIBUTE_MAX_LENGTH: the length of the longest active attribute
 |  | ||||||
| //                                 variable name including the null
 |  | ||||||
| //                                 termination character.
 |  | ||||||
| // SH_ACTIVE_UNIFORMS: the number of active uniform variables.
 |  | ||||||
| // SH_ACTIVE_UNIFORM_MAX_LENGTH: the length of the longest active uniform
 |  | ||||||
| //                               variable name including the null
 |  | ||||||
| //                               termination character.
 |  | ||||||
| // SH_VARYINGS: the number of varying variables.
 |  | ||||||
| // SH_VARYING_MAX_LENGTH: the length of the longest varying variable name
 |  | ||||||
| //                        including the null termination character.
 |  | ||||||
| // SH_MAPPED_NAME_MAX_LENGTH: the length of the mapped variable name including
 |  | ||||||
| //                            the null termination character.
 |  | ||||||
| // SH_NAME_MAX_LENGTH: the max length of a user-defined name including the
 |  | ||||||
| //                     null termination character.
 |  | ||||||
| // SH_HASHED_NAME_MAX_LENGTH: the max length of a hashed name including the
 |  | ||||||
| //                            null termination character.
 |  | ||||||
| // SH_HASHED_NAMES_COUNT: the number of hashed names from the latest compile.
 |  | ||||||
| // SH_SHADER_VERSION: the version of the shader language
 |  | ||||||
| // SH_OUTPUT_TYPE: the currently set language output type
 |  | ||||||
| //
 |  | ||||||
| // params: Requested parameter
 |  | ||||||
| COMPILER_EXPORT void ShGetInfo(const ShHandle handle, |  | ||||||
|                                ShShaderInfo pname, |  | ||||||
|                                size_t* params); |  | ||||||
| 
 |  | ||||||
| // Returns nul-terminated information log for a compiled shader.
 |  | ||||||
| // Parameters:
 |  | ||||||
| // handle: Specifies the compiler
 |  | ||||||
| // infoLog: Specifies an array of characters that is used to return
 |  | ||||||
| //          the information log. It is assumed that infoLog has enough memory
 |  | ||||||
| //          to accomodate the information log. The size of the buffer required
 |  | ||||||
| //          to store the returned information log can be obtained by calling
 |  | ||||||
| //          ShGetInfo with SH_INFO_LOG_LENGTH.
 |  | ||||||
| COMPILER_EXPORT void ShGetInfoLog(const ShHandle handle, char* infoLog); |  | ||||||
| 
 | 
 | ||||||
| // Returns null-terminated object code for a compiled shader.
 | // Returns null-terminated object code for a compiled shader.
 | ||||||
| // Parameters:
 | // Parameters:
 | ||||||
| // handle: Specifies the compiler
 | // handle: Specifies the compiler
 | ||||||
| // infoLog: Specifies an array of characters that is used to return
 | COMPILER_EXPORT const std::string &ShGetObjectCode(const ShHandle handle); | ||||||
| //          the object code. It is assumed that infoLog has enough memory to
 |  | ||||||
| //          accomodate the object code. The size of the buffer required to
 |  | ||||||
| //          store the returned object code can be obtained by calling
 |  | ||||||
| //          ShGetInfo with SH_OBJECT_CODE_LENGTH.
 |  | ||||||
| COMPILER_EXPORT void ShGetObjectCode(const ShHandle handle, char* objCode); |  | ||||||
| 
 | 
 | ||||||
| // Returns information about a shader variable.
 | // Returns a (original_name, hash) map containing all the user defined
 | ||||||
|  | // names in the shader, including variable names, function names, struct
 | ||||||
|  | // names, and struct field names.
 | ||||||
| // Parameters:
 | // Parameters:
 | ||||||
| // handle: Specifies the compiler
 | // handle: Specifies the compiler
 | ||||||
| // variableType: Specifies the variable type; options include
 | COMPILER_EXPORT const std::map<std::string, std::string> *ShGetNameHashingMap( | ||||||
| //               SH_ACTIVE_ATTRIBUTES, SH_ACTIVE_UNIFORMS, SH_VARYINGS.
 |     const ShHandle handle); | ||||||
| // index: Specifies the index of the variable to be queried.
 |  | ||||||
| // length: Returns the number of characters actually written in the string
 |  | ||||||
| //         indicated by name (excluding the null terminator) if a value other
 |  | ||||||
| //         than NULL is passed.
 |  | ||||||
| // size: Returns the size of the variable.
 |  | ||||||
| // type: Returns the data type of the variable.
 |  | ||||||
| // precision: Returns the precision of the variable.
 |  | ||||||
| // staticUse: Returns 1 if the variable is accessed in a statement after
 |  | ||||||
| //            pre-processing, whether or not run-time flow of control will
 |  | ||||||
| //            cause that statement to be executed.
 |  | ||||||
| //            Returns 0 otherwise.
 |  | ||||||
| // name: Returns a null terminated string containing the name of the
 |  | ||||||
| //       variable. It is assumed that name has enough memory to accormodate
 |  | ||||||
| //       the variable name. The size of the buffer required to store the
 |  | ||||||
| //       variable name can be obtained by calling ShGetInfo with
 |  | ||||||
| //       SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, SH_ACTIVE_UNIFORM_MAX_LENGTH,
 |  | ||||||
| //       SH_VARYING_MAX_LENGTH.
 |  | ||||||
| // mappedName: Returns a null terminated string containing the mapped name of
 |  | ||||||
| //             the variable, It is assumed that mappedName has enough memory
 |  | ||||||
| //             (SH_MAPPED_NAME_MAX_LENGTH), or NULL if don't care about the
 |  | ||||||
| //             mapped name. If the name is not mapped, then name and mappedName
 |  | ||||||
| //             are the same.
 |  | ||||||
| COMPILER_EXPORT void ShGetVariableInfo(const ShHandle handle, |  | ||||||
|                                        ShShaderInfo variableType, |  | ||||||
|                                        int index, |  | ||||||
|                                        size_t* length, |  | ||||||
|                                        int* size, |  | ||||||
|                                        sh::GLenum* type, |  | ||||||
|                                        ShPrecisionType* precision, |  | ||||||
|                                        int* staticUse, |  | ||||||
|                                        char* name, |  | ||||||
|                                        char* mappedName); |  | ||||||
| 
 |  | ||||||
| // Returns information about a name hashing entry from the latest compile.
 |  | ||||||
| // Parameters:
 |  | ||||||
| // handle: Specifies the compiler
 |  | ||||||
| // index: Specifies the index of the name hashing entry to be queried.
 |  | ||||||
| // name: Returns a null terminated string containing the user defined name.
 |  | ||||||
| //       It is assumed that name has enough memory to accomodate the name.
 |  | ||||||
| //       The size of the buffer required to store the user defined name can
 |  | ||||||
| //       be obtained by calling ShGetInfo with SH_NAME_MAX_LENGTH.
 |  | ||||||
| // hashedName: Returns a null terminated string containing the hashed name of
 |  | ||||||
| //             the uniform variable, It is assumed that hashedName has enough
 |  | ||||||
| //             memory to accomodate the name. The size of the buffer required
 |  | ||||||
| //             to store the name can be obtained by calling ShGetInfo with
 |  | ||||||
| //             SH_HASHED_NAME_MAX_LENGTH.
 |  | ||||||
| COMPILER_EXPORT void ShGetNameHashingEntry(const ShHandle handle, |  | ||||||
|                                            int index, |  | ||||||
|                                            char* name, |  | ||||||
|                                            char* hashedName); |  | ||||||
| 
 | 
 | ||||||
| // Shader variable inspection.
 | // Shader variable inspection.
 | ||||||
| // Returns a pointer to a list of variables of the designated type.
 | // Returns a pointer to a list of variables of the designated type.
 | ||||||
|  | @ -470,17 +372,17 @@ typedef struct | ||||||
|     int size; |     int size; | ||||||
| } ShVariableInfo; | } ShVariableInfo; | ||||||
| 
 | 
 | ||||||
| // Returns 1 if the passed in variables pack in maxVectors following
 | // Returns true if the passed in variables pack in maxVectors following
 | ||||||
| // the packing rules from the GLSL 1.017 spec, Appendix A, section 7.
 | // the packing rules from the GLSL 1.017 spec, Appendix A, section 7.
 | ||||||
| // Returns 0 otherwise. Also look at the SH_ENFORCE_PACKING_RESTRICTIONS
 | // Returns false otherwise. Also look at the SH_ENFORCE_PACKING_RESTRICTIONS
 | ||||||
| // flag above.
 | // flag above.
 | ||||||
| // Parameters:
 | // Parameters:
 | ||||||
| // maxVectors: the available rows of registers.
 | // maxVectors: the available rows of registers.
 | ||||||
| // varInfoArray: an array of variable info (types and sizes).
 | // varInfoArray: an array of variable info (types and sizes).
 | ||||||
| // varInfoArraySize: the size of the variable array.
 | // varInfoArraySize: the size of the variable array.
 | ||||||
| COMPILER_EXPORT int ShCheckVariablesWithinPackingLimits( | COMPILER_EXPORT bool ShCheckVariablesWithinPackingLimits( | ||||||
|     int maxVectors, |     int maxVectors, | ||||||
|     ShVariableInfo* varInfoArray, |     ShVariableInfo *varInfoArray, | ||||||
|     size_t varInfoArraySize); |     size_t varInfoArraySize); | ||||||
| 
 | 
 | ||||||
| // Gives the compiler-assigned register for an interface block.
 | // Gives the compiler-assigned register for an interface block.
 | ||||||
|  | @ -491,7 +393,7 @@ COMPILER_EXPORT int ShCheckVariablesWithinPackingLimits( | ||||||
| // interfaceBlockName: Specifies the interface block
 | // interfaceBlockName: Specifies the interface block
 | ||||||
| // indexOut: output variable that stores the assigned register
 | // indexOut: output variable that stores the assigned register
 | ||||||
| COMPILER_EXPORT bool ShGetInterfaceBlockRegister(const ShHandle handle, | COMPILER_EXPORT bool ShGetInterfaceBlockRegister(const ShHandle handle, | ||||||
|                                                  const char *interfaceBlockName, |                                                  const std::string &interfaceBlockName, | ||||||
|                                                  unsigned int *indexOut); |                                                  unsigned int *indexOut); | ||||||
| 
 | 
 | ||||||
| // Gives the compiler-assigned register for uniforms in the default
 | // Gives the compiler-assigned register for uniforms in the default
 | ||||||
|  | @ -503,11 +405,7 @@ COMPILER_EXPORT bool ShGetInterfaceBlockRegister(const ShHandle handle, | ||||||
| // interfaceBlockName: Specifies the uniform
 | // interfaceBlockName: Specifies the uniform
 | ||||||
| // indexOut: output variable that stores the assigned register
 | // indexOut: output variable that stores the assigned register
 | ||||||
| COMPILER_EXPORT bool ShGetUniformRegister(const ShHandle handle, | COMPILER_EXPORT bool ShGetUniformRegister(const ShHandle handle, | ||||||
|                                           const char *uniformName, |                                           const std::string &uniformName, | ||||||
|                                           unsigned int *indexOut); |                                           unsigned int *indexOut); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #endif // _COMPILER_INTERFACE_INCLUDED_
 | #endif // _COMPILER_INTERFACE_INCLUDED_
 | ||||||
|  |  | ||||||
|  | @ -15,6 +15,7 @@ | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| 
 | 
 | ||||||
| // Assume ShaderLang.h is included before ShaderVars.h, for sh::GLenum
 | // Assume ShaderLang.h is included before ShaderVars.h, for sh::GLenum
 | ||||||
|  | // Note: make sure to increment ANGLE_SH_VERSION when changing ShaderVars.h
 | ||||||
| 
 | 
 | ||||||
| namespace sh | namespace sh | ||||||
| { | { | ||||||
|  | @ -39,7 +40,7 @@ enum BlockLayoutType | ||||||
| // Note: we must override the copy constructor and assignment operator so we can
 | // Note: we must override the copy constructor and assignment operator so we can
 | ||||||
| // work around excessive GCC binary bloating:
 | // work around excessive GCC binary bloating:
 | ||||||
| // See https://code.google.com/p/angleproject/issues/detail?id=697
 | // See https://code.google.com/p/angleproject/issues/detail?id=697
 | ||||||
| struct ShaderVariable | struct COMPILER_EXPORT ShaderVariable | ||||||
| { | { | ||||||
|     ShaderVariable(); |     ShaderVariable(); | ||||||
|     ShaderVariable(GLenum typeIn, unsigned int arraySizeIn); |     ShaderVariable(GLenum typeIn, unsigned int arraySizeIn); | ||||||
|  | @ -49,6 +50,22 @@ struct ShaderVariable | ||||||
| 
 | 
 | ||||||
|     bool isArray() const { return arraySize > 0; } |     bool isArray() const { return arraySize > 0; } | ||||||
|     unsigned int elementCount() const { return std::max(1u, arraySize); } |     unsigned int elementCount() const { return std::max(1u, arraySize); } | ||||||
|  |     bool isStruct() const { return !fields.empty(); } | ||||||
|  | 
 | ||||||
|  |     // All of the shader's variables are described using nested data
 | ||||||
|  |     // structures. This is needed in order to disambiguate similar looking
 | ||||||
|  |     // types, such as two structs containing the same fields, but in
 | ||||||
|  |     // different orders. "findInfoByMappedName" provides an easy query for
 | ||||||
|  |     // users to dive into the data structure and fetch the unique variable
 | ||||||
|  |     // instance corresponding to a dereferencing chain of the top-level
 | ||||||
|  |     // variable.
 | ||||||
|  |     // Given a mapped name like 'a[0].b.c[0]', return the ShaderVariable
 | ||||||
|  |     // that defines 'c' in |leafVar|, and the original name 'A[0].B.C[0]'
 | ||||||
|  |     // in |originalName|, based on the assumption that |this| defines 'a'.
 | ||||||
|  |     // If no match is found, return false.
 | ||||||
|  |     bool findInfoByMappedName(const std::string &mappedFullName, | ||||||
|  |                               const ShaderVariable **leafVar, | ||||||
|  |                               std::string* originalFullName) const; | ||||||
| 
 | 
 | ||||||
|     GLenum type; |     GLenum type; | ||||||
|     GLenum precision; |     GLenum precision; | ||||||
|  | @ -56,58 +73,97 @@ struct ShaderVariable | ||||||
|     std::string mappedName; |     std::string mappedName; | ||||||
|     unsigned int arraySize; |     unsigned int arraySize; | ||||||
|     bool staticUse; |     bool staticUse; | ||||||
|  |     std::vector<ShaderVariable> fields; | ||||||
|  |     std::string structName; | ||||||
|  | 
 | ||||||
|  |   protected: | ||||||
|  |     bool isSameVariableAtLinkTime(const ShaderVariable &other, | ||||||
|  |                                   bool matchPrecision) const; | ||||||
|  | 
 | ||||||
|  |     bool operator==(const ShaderVariable &other) const; | ||||||
|  |     bool operator!=(const ShaderVariable &other) const | ||||||
|  |     { | ||||||
|  |         return !operator==(other); | ||||||
|  |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct Uniform : public ShaderVariable | struct COMPILER_EXPORT Uniform : public ShaderVariable | ||||||
| { | { | ||||||
|     Uniform(); |     Uniform(); | ||||||
|     ~Uniform(); |     ~Uniform(); | ||||||
|     Uniform(const Uniform &other); |     Uniform(const Uniform &other); | ||||||
|     Uniform &operator=(const Uniform &other); |     Uniform &operator=(const Uniform &other); | ||||||
|  |     bool operator==(const Uniform &other) const; | ||||||
|  |     bool operator!=(const Uniform &other) const | ||||||
|  |     { | ||||||
|  |         return !operator==(other); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     bool isStruct() const { return !fields.empty(); } |     // Decide whether two uniforms are the same at shader link time,
 | ||||||
| 
 |     // assuming one from vertex shader and the other from fragment shader.
 | ||||||
|     std::vector<Uniform> fields; |     // See GLSL ES Spec 3.00.3, sec 4.3.5.
 | ||||||
|  |     bool isSameUniformAtLinkTime(const Uniform &other) const; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct Attribute : public ShaderVariable | struct COMPILER_EXPORT Attribute : public ShaderVariable | ||||||
| { | { | ||||||
|     Attribute(); |     Attribute(); | ||||||
|     ~Attribute(); |     ~Attribute(); | ||||||
|     Attribute(const Attribute &other); |     Attribute(const Attribute &other); | ||||||
|     Attribute &operator=(const Attribute &other); |     Attribute &operator=(const Attribute &other); | ||||||
|  |     bool operator==(const Attribute &other) const; | ||||||
|  |     bool operator!=(const Attribute &other) const | ||||||
|  |     { | ||||||
|  |         return !operator==(other); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     int location; |     int location; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct InterfaceBlockField : public ShaderVariable | struct COMPILER_EXPORT InterfaceBlockField : public ShaderVariable | ||||||
| { | { | ||||||
|     InterfaceBlockField(); |     InterfaceBlockField(); | ||||||
|     ~InterfaceBlockField(); |     ~InterfaceBlockField(); | ||||||
|     InterfaceBlockField(const InterfaceBlockField &other); |     InterfaceBlockField(const InterfaceBlockField &other); | ||||||
|     InterfaceBlockField &operator=(const InterfaceBlockField &other); |     InterfaceBlockField &operator=(const InterfaceBlockField &other); | ||||||
|  |     bool operator==(const InterfaceBlockField &other) const; | ||||||
|  |     bool operator!=(const InterfaceBlockField &other) const | ||||||
|  |     { | ||||||
|  |         return !operator==(other); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     bool isStruct() const { return !fields.empty(); } |     // Decide whether two InterfaceBlock fields are the same at shader
 | ||||||
|  |     // link time, assuming one from vertex shader and the other from
 | ||||||
|  |     // fragment shader.
 | ||||||
|  |     // See GLSL ES Spec 3.00.3, sec 4.3.7.
 | ||||||
|  |     bool isSameInterfaceBlockFieldAtLinkTime( | ||||||
|  |         const InterfaceBlockField &other) const; | ||||||
| 
 | 
 | ||||||
|     bool isRowMajorMatrix; |     bool isRowMajorLayout; | ||||||
|     std::vector<InterfaceBlockField> fields; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct Varying : public ShaderVariable | struct COMPILER_EXPORT Varying : public ShaderVariable | ||||||
| { | { | ||||||
|     Varying(); |     Varying(); | ||||||
|     ~Varying(); |     ~Varying(); | ||||||
|     Varying(const Varying &other); |     Varying(const Varying &otherg); | ||||||
|     Varying &operator=(const Varying &other); |     Varying &operator=(const Varying &other); | ||||||
|  |     bool operator==(const Varying &other) const; | ||||||
|  |     bool operator!=(const Varying &other) const | ||||||
|  |     { | ||||||
|  |         return !operator==(other); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     bool isStruct() const { return !fields.empty(); } |     // Decide whether two varyings are the same at shader link time,
 | ||||||
|  |     // assuming one from vertex shader and the other from fragment shader.
 | ||||||
|  |     // See GLSL ES Spec 3.00.3, sec 4.3.9.
 | ||||||
|  |     bool isSameVaryingAtLinkTime(const Varying &other) const; | ||||||
| 
 | 
 | ||||||
|     InterpolationType interpolation; |     InterpolationType interpolation; | ||||||
|     std::vector<Varying> fields; |     bool isInvariant; | ||||||
|     std::string structName; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct InterfaceBlock | struct COMPILER_EXPORT InterfaceBlock | ||||||
| { | { | ||||||
|     InterfaceBlock(); |     InterfaceBlock(); | ||||||
|     ~InterfaceBlock(); |     ~InterfaceBlock(); | ||||||
|  | @ -116,6 +172,7 @@ struct InterfaceBlock | ||||||
| 
 | 
 | ||||||
|     std::string name; |     std::string name; | ||||||
|     std::string mappedName; |     std::string mappedName; | ||||||
|  |     std::string instanceName; | ||||||
|     unsigned int arraySize; |     unsigned int arraySize; | ||||||
|     BlockLayoutType layout; |     BlockLayoutType layout; | ||||||
|     bool isRowMajorLayout; |     bool isRowMajorLayout; | ||||||
|  |  | ||||||
|  | @ -142,6 +142,11 @@ void OSWinrt::set_gl_context(ContextEGL* p_context) { | ||||||
| 	gl_context = p_context; | 	gl_context = p_context; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | void OSWinrt::screen_size_changed() { | ||||||
|  | 
 | ||||||
|  | 	gl_context->reset(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| void OSWinrt::initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver) { | void OSWinrt::initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver) { | ||||||
| 
 | 
 | ||||||
|     main_loop=NULL; |     main_loop=NULL; | ||||||
|  | @ -568,8 +573,12 @@ Error OSWinrt::shell_open(String p_uri) { | ||||||
| 
 | 
 | ||||||
| String OSWinrt::get_locale() const { | String OSWinrt::get_locale() const { | ||||||
| 
 | 
 | ||||||
|  | #if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP // this should work on phone 8.1, but it doesn't
 | ||||||
|  | 	return "en"; | ||||||
|  | #else | ||||||
| 	Platform::String ^language = Windows::Globalization::Language::CurrentInputMethodLanguageTag; | 	Platform::String ^language = Windows::Globalization::Language::CurrentInputMethodLanguageTag; | ||||||
| 	return language->Data(); | 	return language->Data(); | ||||||
|  | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void OSWinrt::release_rendering_thread() { | void OSWinrt::release_rendering_thread() { | ||||||
|  |  | ||||||
|  | @ -228,6 +228,7 @@ public: | ||||||
| 	virtual String get_data_dir() const; | 	virtual String get_data_dir() const; | ||||||
| 
 | 
 | ||||||
| 	void set_gl_context(ContextEGL* p_context); | 	void set_gl_context(ContextEGL* p_context); | ||||||
|  | 	void screen_size_changed(); | ||||||
| 
 | 
 | ||||||
| 	virtual void release_rendering_thread(); | 	virtual void release_rendering_thread(); | ||||||
| 	virtual void make_rendering_thread(); | 	virtual void make_rendering_thread(); | ||||||
|  |  | ||||||
|  | @ -41,7 +41,6 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { | ||||||
| 
 | 
 | ||||||
| 	bool solids=build_mode==BUILD_SOLIDS; | 	bool solids=build_mode==BUILD_SOLIDS; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 	if (solids) { | 	if (solids) { | ||||||
| 
 | 
 | ||||||
| 		//here comes the sun, lalalala
 | 		//here comes the sun, lalalala
 | ||||||
|  | @ -51,6 +50,8 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { | ||||||
| 			Ref<ConvexPolygonShape2D> convex = memnew( ConvexPolygonShape2D ); | 			Ref<ConvexPolygonShape2D> convex = memnew( ConvexPolygonShape2D ); | ||||||
| 			convex->set_points(decomp[i]); | 			convex->set_points(decomp[i]); | ||||||
| 			co->add_shape(convex,get_transform()); | 			co->add_shape(convex,get_transform()); | ||||||
|  | 			if (trigger) | ||||||
|  | 				co->set_shape_as_trigger(co->get_shape_count()-1,true); | ||||||
| 
 | 
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -71,6 +72,8 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { | ||||||
| 		concave->set_segments(segments); | 		concave->set_segments(segments); | ||||||
| 
 | 
 | ||||||
| 		co->add_shape(concave,get_transform()); | 		co->add_shape(concave,get_transform()); | ||||||
|  | 		if (trigger) | ||||||
|  | 			co->set_shape_as_trigger(co->get_shape_count()-1,true); | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -166,6 +169,18 @@ Rect2 CollisionPolygon2D::get_item_rect() const { | ||||||
| 	return aabb; | 	return aabb; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CollisionPolygon2D::set_trigger(bool p_trigger) { | ||||||
|  | 
 | ||||||
|  | 	trigger=p_trigger; | ||||||
|  | 	_update_parent(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool CollisionPolygon2D::is_trigger() const{ | ||||||
|  | 
 | ||||||
|  | 	return trigger; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| void CollisionPolygon2D::_bind_methods() { | void CollisionPolygon2D::_bind_methods() { | ||||||
| 
 | 
 | ||||||
| 	ObjectTypeDB::bind_method(_MD("_add_to_collision_object"),&CollisionPolygon2D::_add_to_collision_object); | 	ObjectTypeDB::bind_method(_MD("_add_to_collision_object"),&CollisionPolygon2D::_add_to_collision_object); | ||||||
|  | @ -175,14 +190,19 @@ void CollisionPolygon2D::_bind_methods() { | ||||||
| 	ObjectTypeDB::bind_method(_MD("set_build_mode"),&CollisionPolygon2D::set_build_mode); | 	ObjectTypeDB::bind_method(_MD("set_build_mode"),&CollisionPolygon2D::set_build_mode); | ||||||
| 	ObjectTypeDB::bind_method(_MD("get_build_mode"),&CollisionPolygon2D::get_build_mode); | 	ObjectTypeDB::bind_method(_MD("get_build_mode"),&CollisionPolygon2D::get_build_mode); | ||||||
| 
 | 
 | ||||||
|  | 	ObjectTypeDB::bind_method(_MD("set_trigger"),&CollisionPolygon2D::set_trigger); | ||||||
|  | 	ObjectTypeDB::bind_method(_MD("is_trigger"),&CollisionPolygon2D::is_trigger); | ||||||
|  | 
 | ||||||
| 	ADD_PROPERTY( PropertyInfo(Variant::INT,"build_mode",PROPERTY_HINT_ENUM,"Solids,Segments"),_SCS("set_build_mode"),_SCS("get_build_mode")); | 	ADD_PROPERTY( PropertyInfo(Variant::INT,"build_mode",PROPERTY_HINT_ENUM,"Solids,Segments"),_SCS("set_build_mode"),_SCS("get_build_mode")); | ||||||
| 	ADD_PROPERTY( PropertyInfo(Variant::VECTOR2_ARRAY,"polygon"),_SCS("set_polygon"),_SCS("get_polygon")); | 	ADD_PROPERTY( PropertyInfo(Variant::VECTOR2_ARRAY,"polygon"),_SCS("set_polygon"),_SCS("get_polygon")); | ||||||
|  | 	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"trigger"),_SCS("set_trigger"),_SCS("is_trigger")); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CollisionPolygon2D::CollisionPolygon2D() { | CollisionPolygon2D::CollisionPolygon2D() { | ||||||
| 
 | 
 | ||||||
| 	aabb=Rect2(-10,-10,20,20); | 	aabb=Rect2(-10,-10,20,20); | ||||||
| 	build_mode=BUILD_SOLIDS; | 	build_mode=BUILD_SOLIDS; | ||||||
|  | 	trigger=false; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ protected: | ||||||
| 	Rect2 aabb; | 	Rect2 aabb; | ||||||
| 	BuildMode build_mode; | 	BuildMode build_mode; | ||||||
| 	Vector<Point2> polygon; | 	Vector<Point2> polygon; | ||||||
|  | 	bool trigger; | ||||||
| 
 | 
 | ||||||
| 	void _add_to_collision_object(Object *p_obj); | 	void _add_to_collision_object(Object *p_obj); | ||||||
| 	void _update_parent(); | 	void _update_parent(); | ||||||
|  | @ -60,6 +61,9 @@ protected: | ||||||
| 	static void _bind_methods(); | 	static void _bind_methods(); | ||||||
| public: | public: | ||||||
| 
 | 
 | ||||||
|  | 	void set_trigger(bool p_trigger); | ||||||
|  | 	bool is_trigger() const; | ||||||
|  | 
 | ||||||
| 	void set_build_mode(BuildMode p_mode); | 	void set_build_mode(BuildMode p_mode); | ||||||
| 	BuildMode get_build_mode() const; | 	BuildMode get_build_mode() const; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -858,7 +858,8 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) { | ||||||
| 		//motion recover
 | 		//motion recover
 | ||||||
| 		for(int i=0;i<get_shape_count();i++) { | 		for(int i=0;i<get_shape_count();i++) { | ||||||
| 
 | 
 | ||||||
| 
 | 			if (is_shape_set_as_trigger(i)) | ||||||
|  | 				continue; | ||||||
| 			if (dss->collide_shape(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i),Vector2(),margin,sr,max_shapes,res_shapes,exclude,get_layer_mask(),mask)) | 			if (dss->collide_shape(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i),Vector2(),margin,sr,max_shapes,res_shapes,exclude,get_layer_mask(),mask)) | ||||||
| 				collided=true; | 				collided=true; | ||||||
| 
 | 
 | ||||||
|  | @ -902,6 +903,8 @@ Vector2 KinematicBody2D::move(const Vector2& p_motion) { | ||||||
| 
 | 
 | ||||||
| 	for(int i=0;i<get_shape_count();i++) { | 	for(int i=0;i<get_shape_count();i++) { | ||||||
| 
 | 
 | ||||||
|  | 		if (is_shape_set_as_trigger(i)) | ||||||
|  | 			continue; | ||||||
| 
 | 
 | ||||||
| 		float lsafe,lunsafe; | 		float lsafe,lunsafe; | ||||||
| 		bool valid = dss->cast_motion(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i), p_motion, 0,lsafe,lunsafe,exclude,get_layer_mask(),mask); | 		bool valid = dss->cast_motion(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i), p_motion, 0,lsafe,lunsafe,exclude,get_layer_mask(),mask); | ||||||
|  |  | ||||||
|  | @ -870,6 +870,9 @@ Vector3 KinematicBody::move(const Vector3& p_motion) { | ||||||
| 		for(int j=0;j<8;j++) { | 		for(int j=0;j<8;j++) { | ||||||
| 			for(int i=0;i<res_shapes;i++) { | 			for(int i=0;i<res_shapes;i++) { | ||||||
| 
 | 
 | ||||||
|  | 				if (is_shape_set_as_trigger(i)) | ||||||
|  | 					continue; | ||||||
|  | 
 | ||||||
| 				Vector3 a = sr[i*2+0]; | 				Vector3 a = sr[i*2+0]; | ||||||
| 				Vector3 b = sr[i*2+1]; | 				Vector3 b = sr[i*2+1]; | ||||||
| 				//print_line(String()+a+" -> "+b);
 | 				//print_line(String()+a+" -> "+b);
 | ||||||
|  | @ -930,6 +933,8 @@ Vector3 KinematicBody::move(const Vector3& p_motion) { | ||||||
| 	for(int i=0;i<get_shape_count();i++) { | 	for(int i=0;i<get_shape_count();i++) { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 		if (is_shape_set_as_trigger(i)) | ||||||
|  | 			continue; | ||||||
| 
 | 
 | ||||||
| 		float lsafe,lunsafe; | 		float lsafe,lunsafe; | ||||||
| 		PhysicsDirectSpaceState::ShapeRestInfo lrest; | 		PhysicsDirectSpaceState::ShapeRestInfo lrest; | ||||||
|  | @ -1041,6 +1046,8 @@ bool KinematicBody::can_move_to(const Vector3& p_position, bool p_discrete) { | ||||||
| 	//fill exclude list..
 | 	//fill exclude list..
 | ||||||
| 	for(int i=0;i<get_shape_count();i++) { | 	for(int i=0;i<get_shape_count();i++) { | ||||||
| 
 | 
 | ||||||
|  | 		if (is_shape_set_as_trigger(i)) | ||||||
|  | 			continue; | ||||||
| 
 | 
 | ||||||
| 		bool col = dss->intersect_shape(get_shape(i)->get_rid(), xform * get_shape_transform(i),0,NULL,0,exclude,get_layer_mask(),mask); | 		bool col = dss->intersect_shape(get_shape(i)->get_rid(), xform * get_shape_transform(i),0,NULL,0,exclude,get_layer_mask(),mask); | ||||||
| 		if (col) | 		if (col) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Juan Linietsky
						Juan Linietsky