2016-11-19 13:23:37 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "sky_box.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "io/image_loader.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SkyBox : : set_radiance_size ( RadianceSize  p_size )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX ( p_size , RADIANCE_SIZE_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									radiance_size = p_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_radiance_changed ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SkyBox : : RadianceSize  SkyBox : : get_radiance_size ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  radiance_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  SkyBox : : _bind_methods ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 23:03:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( _MD ( " set_radiance_size " , " size " ) , & SkyBox : : set_radiance_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( _MD ( " get_radiance_size " ) , & SkyBox : : get_radiance_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-19 13:23:37 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " radiance_size " , PROPERTY_HINT_ENUM , " 256,512,1024,2048 " ) , _SCS ( " set_radiance_size " ) , _SCS ( " get_radiance_size " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  RADIANCE_SIZE_256  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  RADIANCE_SIZE_512  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  RADIANCE_SIZE_1024  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  RADIANCE_SIZE_2048  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  RADIANCE_SIZE_MAX  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SkyBox : : SkyBox ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									radiance_size = RADIANCE_SIZE_512 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/////////////////////////////////////////
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ImageSkyBox : : _radiance_changed ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( cube_map_valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										static  const  int  size [ RADIANCE_SIZE_MAX ] = { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											256 , 512 , 1024 , 2048 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										VS : : get_singleton ( ) - > skybox_set_texture ( sky_box , cube_map , size [ get_radiance_size ( ) ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ImageSkyBox : : set_image_path ( ImagePath  p_image , const  String  & p_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX ( p_image , IMAGE_PATH_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									image_path [ p_image ] = p_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  all_ok = true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for ( int  i = 0 ; i < IMAGE_PATH_MAX ; i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( image_path [ i ] = = String ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											all_ok = false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cube_map_valid = false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( all_ok )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Image  images [ IMAGE_PATH_MAX ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  w = 0 , h = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Image : : Format  format ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for ( int  i = 0 ; i < IMAGE_PATH_MAX ; i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Error  err  =  ImageLoader : : load_image ( image_path [ i ] , & images [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_PRINTS ( " Error loading image for skybox:  " + image_path [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( i = = 0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												w = images [ 0 ] . get_width ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												h = images [ 0 ] . get_height ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												format = images [ 0 ] . get_format ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( images [ i ] . get_width ( ) ! = w  | |  images [ i ] . get_height ( ) ! = h  | |  images [ i ] . get_format ( ) ! = format )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ERR_PRINTS ( " Image size mismatch ( " + itos ( images [ i ] . get_width ( ) ) + " , " + itos ( images [ i ] . get_height ( ) ) + " : " + Image : : get_format_name ( images [ i ] . get_format ( ) ) + "  when it should be  " + itos ( w ) + " , " + itos ( h ) + " : " + Image : : get_format_name ( format ) + " ):  " + image_path [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										VS : : get_singleton ( ) - > texture_allocate ( cube_map , w , h , format , VS : : TEXTURE_FLAG_FILTER | VS : : TEXTURE_FLAG_CUBEMAP | VS : : TEXTURE_FLAG_MIPMAPS ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for ( int  i = 0 ; i < IMAGE_PATH_MAX ; i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											VS : : get_singleton ( ) - > texture_set_data ( cube_map , images [ i ] , VS : : CubeMapSide ( i ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cube_map_valid = true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_radiance_changed ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								String  ImageSkyBox : : get_image_path ( ImagePath  p_image )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_image , IMAGE_PATH_MAX , String ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  image_path [ p_image ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								RID  ImageSkyBox : : get_rid ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  sky_box ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  ImageSkyBox : : _bind_methods ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 23:03:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( _MD ( " set_image_path " , " image " , " path " ) , & ImageSkyBox : : set_image_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( _MD ( " get_image_path " , " image " ) , & ImageSkyBox : : get_image_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-11-19 13:23:37 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < String >  extensions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ImageLoader : : get_recognized_extensions ( & extensions ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  hints ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for ( List < String > : : Element  * E = extensions . front ( ) ; E ; E = E - > next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( hints ! = String ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											hints + = " , " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										hints + = " *. " + E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : STRING , " image_path/negative_x " , PROPERTY_HINT_FILE , hints ) , _SCS ( " set_image_path " ) , _SCS ( " get_image_path " ) , IMAGE_PATH_NEGATIVE_X ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : STRING , " image_path/positive_x " , PROPERTY_HINT_FILE , hints ) , _SCS ( " set_image_path " ) , _SCS ( " get_image_path " ) , IMAGE_PATH_POSITIVE_X ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : STRING , " image_path/negative_y " , PROPERTY_HINT_FILE , hints ) , _SCS ( " set_image_path " ) , _SCS ( " get_image_path " ) , IMAGE_PATH_NEGATIVE_Y ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : STRING , " image_path/positive_y " , PROPERTY_HINT_FILE , hints ) , _SCS ( " set_image_path " ) , _SCS ( " get_image_path " ) , IMAGE_PATH_POSITIVE_Y ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : STRING , " image_path/negative_z " , PROPERTY_HINT_FILE , hints ) , _SCS ( " set_image_path " ) , _SCS ( " get_image_path " ) , IMAGE_PATH_NEGATIVE_Z ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ADD_PROPERTYI ( PropertyInfo ( Variant : : STRING , " image_path/positive_z " , PROPERTY_HINT_FILE , hints ) , _SCS ( " set_image_path " ) , _SCS ( " get_image_path " ) , IMAGE_PATH_POSITIVE_Z ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  IMAGE_PATH_NEGATIVE_X  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  IMAGE_PATH_POSITIVE_X  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  IMAGE_PATH_NEGATIVE_Y  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  IMAGE_PATH_POSITIVE_Y  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  IMAGE_PATH_NEGATIVE_Z  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  IMAGE_PATH_POSITIVE_Z  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BIND_CONSTANT (  IMAGE_PATH_MAX  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ImageSkyBox : : ImageSkyBox ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cube_map = VS : : get_singleton ( ) - > texture_create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sky_box = VS : : get_singleton ( ) - > skybox_create ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cube_map_valid = false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ImageSkyBox : : ~ ImageSkyBox ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VS : : get_singleton ( ) - > free ( cube_map ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									VS : : get_singleton ( ) - > free ( sky_box ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}