@ -358,6 +358,9 @@ static void UnloadBuffersDefault(void);     // Unload default internal buffers v  
		
	
		
			
			static  void  GenDrawCube ( void ) ;               / /  Generate  and  draw  cube  
		
	
		
			
			static  void  GenDrawQuad ( void ) ;               / /  Generate  and  draw  quad  
		
	
		
			
			
  
		
	
		
			
			/ /  Get  OpenGL  internal  formats  and  data  type  from  raylib  PixelFormat  
		
	
		
			
			static  void  GetGlFormats ( int  format ,  int  * glInternalFormat ,  int  * glFormat ,  int  * glType ) ;  
		
	
		
			
			
  
		
	
		
			
			# if defined(SUPPORT_VR_SIMULATOR)  
		
	
		
			
			static  void  SetStereoConfig ( VrDeviceInfo  info ) ;  / /  Configure  stereo  rendering  ( including  distortion  shader )  with  HMD  device  parameters  
		
	
		
			
			static  void  SetStereoView ( int  eye ,  Matrix  matProjection ,  Matrix  matModelView ) ;  / /  Set  internal  projection  and  modelview  matrix  depending  on  eye  
		
	
	
		
			
				
				
					
						 
				
				
					
						 
				
				
				 
			
			@ -1418,7 +1421,6 @@ unsigned int rlLoadTexture(void *data, int width, int height, int format, int mi  
		
	
		
			
			
  
		
	
		
			
			    glPixelStorei ( GL_UNPACK_ALIGNMENT ,  1 ) ;   
		
	
		
			
			
  
		
	
		
			
			
  
		
	
		
			
			    glGenTextures ( 1 ,  & id ) ;               / /  Generate  Pointer  to  the  texture   
		
	
		
			
			
  
		
	
		
			
			# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)  
		
	
	
		
			
				
				
				
				
					
						 
				
				 
			
			@ -1436,76 +1438,28 @@ unsigned int rlLoadTexture(void *data, int width, int height, int format, int mi  
		
	
		
			
			    {   
		
	
		
			
			        unsigned  int  mipSize  =  GetPixelDataSize ( mipWidth ,  mipHeight ,  format ) ;   
		
	
		
			
			          
		
	
		
			
			        switch  ( format )   
		
	
		
			
			        int  glInternalFormat ,  glFormat ,  glType ;   
		
	
		
			
			        GetGlFormats ( format ,  & glInternalFormat ,  & glFormat ,  & glType ) ;   
		
	
		
			
			          
		
	
		
			
			        TraceLog ( LOG_INFO ,  " Mip level %i (%i x %i), size: %i, formats: %i - %i " ,  i ,  mipWidth ,  mipHeight ,  mipSize ,  glInternalFormat ,  glFormat ) ;   
		
	
		
			
			          
		
	
		
			
			        if  ( glInternalFormat  ! =  - 1 )   
		
	
		
			
			        {   
		
	
		
			
			        # if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_21) || defined(GRAPHICS_API_OPENGL_ES2)   
		
	
		
			
			            / /  NOTE :  on  OpenGL  ES  2.0  ( WebGL ) ,  internalFormat  must  match  format  and  options  allowed  are :  GL_LUMINANCE ,  GL_RGB ,  GL_RGBA   
		
	
		
			
			            case  UNCOMPRESSED_GRAYSCALE :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_LUMINANCE ,  mipWidth ,  mipHeight ,  0 ,  GL_LUMINANCE ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_GRAY_ALPHA :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_LUMINANCE_ALPHA ,  mipWidth ,  mipHeight ,  0 ,  GL_LUMINANCE_ALPHA ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R5G6B5 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGB ,  mipWidth ,  mipHeight ,  0 ,  GL_RGB ,  GL_UNSIGNED_SHORT_5_6_5 ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R8G8B8 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGB ,  mipWidth ,  mipHeight ,  0 ,  GL_RGB ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R5G5B5A1 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGBA ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_UNSIGNED_SHORT_5_5_5_1 ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R4G4B4A4 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGBA ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_UNSIGNED_SHORT_4_4_4_4 ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R8G8B8A8 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGBA ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            # if !defined(GRAPHICS_API_OPENGL_11)   
		
	
		
			
			            case  UNCOMPRESSED_R32 :  if  ( texFloatSupported )  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_LUMINANCE ,  mipWidth ,  mipHeight ,  0 ,  GL_LUMINANCE ,  GL_FLOAT ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   / /  NOTE :  Requires  extension  OES_texture_float   
		
	
		
			
			            case  UNCOMPRESSED_R32G32B32 :  if  ( texFloatSupported )  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGB ,  mipWidth ,  mipHeight ,  0 ,  GL_RGB ,  GL_FLOAT ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   / /  NOTE :  Requires  extension  OES_texture_float   
		
	
		
			
			            case  UNCOMPRESSED_R32G32B32A32 :  if  ( texFloatSupported )  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGBA ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_FLOAT ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   / /  NOTE :  Requires  extension  OES_texture_float   
		
	
		
			
			            # endif   
		
	
		
			
			        # elif defined(GRAPHICS_API_OPENGL_33)   
		
	
		
			
			            / /  NOTE :  We  define  internal  ( GPU )  format  as  GL_RGBA8  ( probably  BGRA8  in  practice ,  driver  takes  care )   
		
	
		
			
			            / /  NOTE :  On  embedded  systems ,  we  let  the  driver  choose  the  best  internal  format   
		
	
		
			
			
  
		
	
		
			
			            / /  Support  for  multiple  color  modes  ( 16 bit  color  modes  and  grayscale )   
		
	
		
			
			            / /  ( sized ) internalFormat     format           type   
		
	
		
			
			            / /  GL_R                      GL_RED       GL_UNSIGNED_BYTE   
		
	
		
			
			            / /  GL_RGB565                 GL_RGB       GL_UNSIGNED_BYTE ,  GL_UNSIGNED_SHORT_5_6_5   
		
	
		
			
			            / /  GL_RGB5_A1                GL_RGBA      GL_UNSIGNED_BYTE ,  GL_UNSIGNED_SHORT_5_5_5_1   
		
	
		
			
			            / /  GL_RGBA4                  GL_RGBA      GL_UNSIGNED_BYTE ,  GL_UNSIGNED_SHORT_4_4_4_4   
		
	
		
			
			            / /  GL_RGBA8                  GL_RGBA      GL_UNSIGNED_BYTE   
		
	
		
			
			            / /  GL_RGB8                   GL_RGB       GL_UNSIGNED_BYTE   
		
	
		
			
			
  
		
	
		
			
			            case  UNCOMPRESSED_GRAYSCALE :   
		
	
		
			
			            if  ( format  <  COMPRESSED_DXT1_RGB )  glTexImage2D ( GL_TEXTURE_2D ,  i ,  glInternalFormat ,  mipWidth ,  mipHeight ,  0 ,  glFormat ,  glType ,  ( unsigned  char  * ) data  +  mipOffset ) ;   
		
	
		
			
			            else  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  glInternalFormat ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;   
		
	
		
			
			          
		
	
		
			
			        # if defined(GRAPHICS_API_OPENGL_33)   
		
	
		
			
			            if  ( format  = =  UNCOMPRESSED_GRAYSCALE )   
		
	
		
			
			            {   
		
	
		
			
			                glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_R8 ,  mipWidth ,  mipHeight ,  0 ,  GL_RED ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;   
		
	
		
			
			
  
		
	
		
			
			                / /  With  swizzleMask  we  define  how  a  one  channel  texture  will  be  mapped  to  RGBA   
		
	
		
			
			                / /  Required  GL  > =  3.3  or  EXT_texture_swizzle / ARB_texture_swizzle   
		
	
		
			
			                GLint  swizzleMask [ ]  =  {  GL_RED ,  GL_RED ,  GL_RED ,  GL_ONE  } ;   
		
	
		
			
			                glTexParameteriv ( GL_TEXTURE_2D ,  GL_TEXTURE_SWIZZLE_RGBA ,  swizzleMask ) ;   
		
	
		
			
			
  
		
	
		
			
			                TraceLog ( LOG_DEBUG ,  " [TEX ID %i] Grayscale texture loaded and swizzled " ,  id ) ;   
		
	
		
			
			            }  break ;   
		
	
		
			
			            case  UNCOMPRESSED_GRAY_ALPHA :   
		
	
		
			
			            }   
		
	
		
			
			            else  if  ( format  = =  UNCOMPRESSED_GRAY_ALPHA )   
		
	
		
			
			            {   
		
	
		
			
			                glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RG8 ,  mipWidth ,  mipHeight ,  0 ,  GL_RG ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;   
		
	
		
			
			
  
		
	
		
			
			                GLint  swizzleMask [ ]  =  {  GL_RED ,  GL_RED ,  GL_RED ,  GL_GREEN  } ;   
		
	
		
			
			                glTexParameteriv ( GL_TEXTURE_2D ,  GL_TEXTURE_SWIZZLE_RGBA ,  swizzleMask ) ;   
		
	
		
			
			            }  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R5G6B5 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGB565 ,  mipWidth ,  mipHeight ,  0 ,  GL_RGB ,  GL_UNSIGNED_SHORT_5_6_5 ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R8G8B8 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGB8 ,  mipWidth ,  mipHeight ,  0 ,  GL_RGB ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R5G5B5A1 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGB5_A1 ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_UNSIGNED_SHORT_5_5_5_1 ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R4G4B4A4 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGBA4 ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_UNSIGNED_SHORT_4_4_4_4 ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R8G8B8A8 :  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGBA8 ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R32 :  if  ( texFloatSupported )  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_R32F ,  mipWidth ,  mipHeight ,  0 ,  GL_RED ,  GL_FLOAT ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R32G32B32 :  if  ( texFloatSupported )  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGB32F ,  mipWidth ,  mipHeight ,  0 ,  GL_RGB ,  GL_FLOAT ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  UNCOMPRESSED_R32G32B32A32 :  if  ( texFloatSupported )  glTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_RGBA32F ,  mipWidth ,  mipHeight ,  0 ,  GL_RGBA ,  GL_FLOAT ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			        # endif   
		
	
		
			
			        # if !defined(GRAPHICS_API_OPENGL_11)   
		
	
		
			
			            case  COMPRESSED_DXT1_RGB :  if  ( texCompDXTSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGB_S3TC_DXT1_EXT ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  COMPRESSED_DXT1_RGBA :  if  ( texCompDXTSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   
		
	
		
			
			            case  COMPRESSED_DXT3_RGBA :  if  ( texCompDXTSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;       / /  NOTE :  Not  supported  by  WebGL   
		
	
		
			
			            case  COMPRESSED_DXT5_RGBA :  if  ( texCompDXTSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;       / /  NOTE :  Not  supported  by  WebGL   
		
	
		
			
			            case  COMPRESSED_ETC1_RGB :  if  ( texCompETC1Supported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_ETC1_RGB8_OES ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;                       / /  NOTE :  Requires  OpenGL  ES  2.0  or  OpenGL  4.3   
		
	
		
			
			            case  COMPRESSED_ETC2_RGB :  if  ( texCompETC2Supported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGB8_ETC2 ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;                / /  NOTE :  Requires  OpenGL  ES  3.0  or  OpenGL  4.3   
		
	
		
			
			            case  COMPRESSED_ETC2_EAC_RGBA :  if  ( texCompETC2Supported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGBA8_ETC2_EAC ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;      / /  NOTE :  Requires  OpenGL  ES  3.0  or  OpenGL  4.3   
		
	
		
			
			            case  COMPRESSED_PVRT_RGB :  if  ( texCompPVRTSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;     / /  NOTE :  Requires  PowerVR  GPU   
		
	
		
			
			            case  COMPRESSED_PVRT_RGBA :  if  ( texCompPVRTSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   / /  NOTE :  Requires  PowerVR  GPU   
		
	
		
			
			            case  COMPRESSED_ASTC_4x4_RGBA :  if  ( texCompASTCSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGBA_ASTC_4x4_KHR ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   / /  NOTE :  Requires  OpenGL  ES  3.1  or  OpenGL  4.3   
		
	
		
			
			            case  COMPRESSED_ASTC_8x8_RGBA :  if  ( texCompASTCSupported )  glCompressedTexImage2D ( GL_TEXTURE_2D ,  i ,  GL_COMPRESSED_RGBA_ASTC_8x8_KHR ,  mipWidth ,  mipHeight ,  0 ,  mipSize ,  ( unsigned  char  * ) data  +  mipOffset ) ;  break ;   / /  NOTE :  Requires  OpenGL  ES  3.1  or  OpenGL  4.3   
		
	
		
			
			            }   
		
	
		
			
			        # endif   
		
	
		
			
			            default :  TraceLog ( LOG_WARNING ,  " Texture format not supported " ) ;  break ;   
		
	
		
			
			        }   
		
	
		
			
			      
		
	
		
			
			        mipWidth  / =  2 ;   
		
	
	
		
			
				
				
					
						 
				
				
					
						 
				
				
				 
			
			@ -1567,33 +1521,15 @@ unsigned int rlLoadTexture(void *data, int width, int height, int format, int mi  
		
	
		
			
			void  rlUpdateTexture ( unsigned  int  id ,  int  width ,  int  height ,  int  format ,  const  void  * data )  
		
	
		
			
			{  
		
	
		
			
			    glBindTexture ( GL_TEXTURE_2D ,  id ) ;   
		
	
		
			
			     
		
	
		
			
			    int  glInternalFormat ,  glFormat ,  glType ;   
		
	
		
			
			    GetGlFormats ( format ,  & glInternalFormat ,  & glFormat ,  & glType ) ;   
		
	
		
			
			
  
		
	
		
			
			# if defined(GRAPHICS_API_OPENGL_33)  
		
	
		
			
			    switch  ( format )   
		
	
		
			
			    {   
		
	
		
			
			        case  UNCOMPRESSED_GRAYSCALE :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RED ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_GRAY_ALPHA :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RG ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G6B5 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGB ,  GL_UNSIGNED_SHORT_5_6_5 ,  ( unsigned  short  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGB ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G5B5A1 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGBA ,  GL_UNSIGNED_SHORT_5_5_5_1 ,  ( unsigned  short  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R4G4B4A4 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGBA ,  GL_UNSIGNED_SHORT_4_4_4_4 ,  ( unsigned  short  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8A8 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGBA ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        default :  TraceLog ( LOG_WARNING ,  " Texture format updating not supported " ) ;  break ;   
		
	
		
			
			    }   
		
	
		
			
			# elif defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_ES2)  
		
	
		
			
			    / /  NOTE :  on  OpenGL  ES  2.0  ( WebGL ) ,  internalFormat  must  match  format  and  options  allowed  are :  GL_LUMINANCE ,  GL_RGB ,  GL_RGBA   
		
	
		
			
			    switch  ( format )   
		
	
		
			
			    if  ( ( glInternalFormat  ! =  - 1 )  & &  ( format  <  COMPRESSED_DXT1_RGB ) )   
		
	
		
			
			    {   
		
	
		
			
			        case  UNCOMPRESSED_GRAYSCALE :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_LUMINANCE ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_GRAY_ALPHA :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_LUMINANCE_ALPHA ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G6B5 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGB ,  GL_UNSIGNED_SHORT_5_6_5 ,  ( unsigned  short  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGB ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G5B5A1 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGBA ,  GL_UNSIGNED_SHORT_5_5_5_1 ,  ( unsigned  short  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R4G4B4A4 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGBA ,  GL_UNSIGNED_SHORT_4_4_4_4 ,  ( unsigned  short  * ) data ) ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8A8 :  glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  GL_RGBA ,  GL_UNSIGNED_BYTE ,  ( unsigned  char  * ) data ) ;  break ;   
		
	
		
			
			        default :  TraceLog ( LOG_WARNING ,  " Texture format updating not supported " ) ;  break ;   
		
	
		
			
			        glTexSubImage2D ( GL_TEXTURE_2D ,  0 ,  0 ,  0 ,  width ,  height ,  glFormat ,  glType ,  ( unsigned  char  * ) data ) ;   
		
	
		
			
			    }   
		
	
		
			
			# endif  
		
	
		
			
			    else  TraceLog ( LOG_WARNING ,  " Texture format updating not supported " ) ;   
		
	
		
			
			}  
		
	
		
			
			
  
		
	
		
			
			/ /  Unload  texture  from  GPU  memory  
		
	
	
		
			
				
				
					
						 
				
				
					
						 
				
				
				 
			
			@ -2211,44 +2147,28 @@ void *rlReadTexturePixels(Texture2D texture)  
		
	
		
			
			    glGetTexLevelParameteriv ( GL_TEXTURE_2D ,  0 ,  GL_TEXTURE_INTERNAL_FORMAT ,  & format ) ;   
		
	
		
			
			    / /  Other  texture  info :  GL_TEXTURE_RED_SIZE ,  GL_TEXTURE_GREEN_SIZE ,  GL_TEXTURE_BLUE_SIZE ,  GL_TEXTURE_ALPHA_SIZE   
		
	
		
			
			    */   
		
	
		
			
			
  
		
	
		
			
			    int  glFormat  =  0 ,  glType  =  0 ;   
		
	
		
			
			
  
		
	
		
			
			    unsigned  int  size  =  texture . width * texture . height ;   
		
	
		
			
			
  
		
	
		
			
			    / /  NOTE :  GL_LUMINANCE  and  GL_LUMINANCE_ALPHA  are  removed  since  OpenGL  3.1   
		
	
		
			
			    / /  Must  be  replaced  by  GL_RED  and  GL_RG  on  Core  OpenGL  3.3   
		
	
		
			
			
  
		
	
		
			
			    switch  ( texture . format )   
		
	
		
			
			    {   
		
	
		
			
			# if defined(GRAPHICS_API_OPENGL_11)  
		
	
		
			
			        case  UNCOMPRESSED_GRAYSCALE :  pixels  =  ( unsigned  char  * ) malloc ( size ) ;  glFormat  =  GL_LUMINANCE ;  glType  =  GL_UNSIGNED_BYTE ;  break ;             / /  8  bit  per  pixel  ( no  alpha )   
		
	
		
			
			        case  UNCOMPRESSED_GRAY_ALPHA :  pixels  =  ( unsigned  char  * ) malloc ( size * 2 ) ;  glFormat  =  GL_LUMINANCE_ALPHA ;  glType  =  GL_UNSIGNED_BYTE ;  break ;    / /  16  bpp  ( 2  channels )   
		
	
		
			
			# elif defined(GRAPHICS_API_OPENGL_33)  
		
	
		
			
			        case  UNCOMPRESSED_GRAYSCALE :  pixels  =  ( unsigned  char  * ) malloc ( size ) ;  glFormat  =  GL_RED ;  glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_GRAY_ALPHA :  pixels  =  ( unsigned  char  * ) malloc ( size * 2 ) ;  glFormat  =  GL_RG ;  glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			# endif  
		
	
		
			
			        case  UNCOMPRESSED_R5G6B5 :  pixels  =  ( unsigned  short  * ) malloc ( size ) ;  glFormat  =  GL_RGB ;  glType  =  GL_UNSIGNED_SHORT_5_6_5 ;  break ;              / /  16  bpp   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8 :  pixels  =  ( unsigned  char  * ) malloc ( size * 3 ) ;  glFormat  =  GL_RGB ;  glType  =  GL_UNSIGNED_BYTE ;  break ;                    / /  24  bpp   
		
	
		
			
			        case  UNCOMPRESSED_R5G5B5A1 :  pixels  =  ( unsigned  short  * ) malloc ( size ) ;  glFormat  =  GL_RGBA ;  glType  =  GL_UNSIGNED_SHORT_5_5_5_1 ;  break ;         / /  16  bpp  ( 1  bit  alpha )   
		
	
		
			
			        case  UNCOMPRESSED_R4G4B4A4 :  pixels  =  ( unsigned  short  * ) malloc ( size ) ;  glFormat  =  GL_RGBA ;  glType  =  GL_UNSIGNED_SHORT_4_4_4_4 ;  break ;         / /  16  bpp  ( 4  bit  alpha )   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8A8 :  pixels  =  ( unsigned  char  * ) malloc ( size * 4 ) ;  glFormat  =  GL_RGBA ;  glType  =  GL_UNSIGNED_BYTE ;  break ;                 / /  32  bpp   
		
	
		
			
			        default :  TraceLog ( LOG_WARNING ,  " Texture data retrieval, format not suported " ) ;  break ;   
		
	
		
			
			    }   
		
	
		
			
			
  
		
	
		
			
			      
		
	
		
			
			    / /  NOTE :  Each  row  written  to  or  read  from  by  OpenGL  pixel  operations  like  glGetTexImage  are  aligned  to  a  4  byte  boundary  by  default ,  which  may  add  some  padding .   
		
	
		
			
			    / /  Use  glPixelStorei  to  modify  padding  with  the  GL_ [ UN ] PACK_ALIGNMENT  setting .   
		
	
		
			
			    / /  GL_PACK_ALIGNMENT  affects  operations  that  read  from  OpenGL  memory  ( glReadPixels ,  glGetTexImage ,  etc . )   
		
	
		
			
			    / /  GL_UNPACK_ALIGNMENT  affects  operations  that  write  to  OpenGL  memory  ( glTexImage ,  etc . )   
		
	
		
			
			    glPixelStorei ( GL_PACK_ALIGNMENT ,  1 ) ;   
		
	
		
			
			
  
		
	
		
			
			    glGetTexImage ( GL_TEXTURE_2D ,  0 ,  glFormat ,  glType ,  pixels ) ;   
		
	
		
			
			    int  glInternalFormat ,  glFormat ,  glType ;   
		
	
		
			
				GetGlFormats ( texture . format ,  & glInternalFormat ,  & glFormat ,  & glType ) ;   
		
	
		
			
			    unsigned  int  size  =  GetPixelDataSize ( texture . width ,  texture . height ,  texture . format ) ;   
		
	
		
			
			      
		
	
		
			
			    if  ( ( glInternalFormat  ! =  - 1 )  & &  ( texture . format  <  COMPRESSED_DXT1_RGB ) )   
		
	
		
			
			    {   
		
	
		
			
			        pixels  =  ( unsigned  char  * ) malloc ( size ) ;   
		
	
		
			
			        glGetTexImage ( GL_TEXTURE_2D ,  0 ,  glFormat ,  glType ,  pixels ) ;   
		
	
		
			
			    }   
		
	
		
			
			    else  TraceLog ( LOG_WARNING ,  " Texture data retrieval not suported for pixel format " ) ;   
		
	
		
			
			
  
		
	
		
			
			    glBindTexture ( GL_TEXTURE_2D ,  0 ) ;   
		
	
		
			
			# endif  
		
	
		
			
			
  
		
	
		
			
			# if defined(GRAPHICS_API_OPENGL_ES2)  
		
	
		
			
			
  
		
	
		
			
			    RenderTexture2D  fbo  =  rlLoadRenderTexture ( texture . width ,  texture . height ) ;   
		
	
		
			
			
  
		
	
		
			
			    / /  NOTE :  Two  possible  Options :   
		
	
	
		
			
				
				
					
						 
				
				
					
						 
				
				
				 
			
			@ -3989,6 +3909,58 @@ static void GenDrawCube(void)  
		
	
		
			
			    glDeleteVertexArrays ( 1 ,  & cubeVAO ) ;   
		
	
		
			
			}  
		
	
		
			
			
  
		
	
		
			
			/ /  Get  OpenGL  internal  formats  and  data  type  from  raylib  PixelFormat  
		
	
		
			
			static  void  GetGlFormats ( int  format ,  int  * glInternalFormat ,  int  * glFormat ,  int  * glType )  
		
	
		
			
			{  
		
	
		
			
			    * glInternalFormat  =  - 1 ;   
		
	
		
			
			    * glFormat  =  - 1 ;   
		
	
		
			
			    * glType  =  - 1 ;   
		
	
		
			
			      
		
	
		
			
			    switch  ( format )   
		
	
		
			
			    {   
		
	
		
			
			    # if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_21) || defined(GRAPHICS_API_OPENGL_ES2)   
		
	
		
			
			        / /  NOTE :  on  OpenGL  ES  2.0  ( WebGL ) ,  internalFormat  must  match  format  and  options  allowed  are :  GL_LUMINANCE ,  GL_RGB ,  GL_RGBA   
		
	
		
			
			        case  UNCOMPRESSED_GRAYSCALE :  * glInternalFormat  =  GL_LUMINANCE ;  * glFormat  =  GL_LUMINANCE ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_GRAY_ALPHA :  * glInternalFormat  =  GL_LUMINANCE_ALPHA ;  * glFormat  =  GL_LUMINANCE_ALPHA ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G6B5 :  * glInternalFormat  =  GL_RGB ;  * glFormat  =  GL_RGB ;  * glType  =  GL_UNSIGNED_SHORT_5_6_5 ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8 :  * glInternalFormat  =  GL_RGB ;  * glFormat  =  GL_RGB ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G5B5A1 :  * glInternalFormat  =  GL_RGBA ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_UNSIGNED_SHORT_5_5_5_1 ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R4G4B4A4 :  * glInternalFormat  =  GL_RGBA ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_UNSIGNED_SHORT_4_4_4_4 ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8A8 :  * glInternalFormat  =  GL_RGBA ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        # if !defined(GRAPHICS_API_OPENGL_11)   
		
	
		
			
			        case  UNCOMPRESSED_R32 :  if  ( texFloatSupported )  * glInternalFormat  =  GL_LUMINANCE ;  * glFormat  =  GL_LUMINANCE ;  * glType  =  GL_FLOAT ;  break ;    / /  NOTE :  Requires  extension  OES_texture_float   
		
	
		
			
			        case  UNCOMPRESSED_R32G32B32 :  if  ( texFloatSupported )  * glInternalFormat  =  GL_RGB ;  * glFormat  =  GL_RGB ;  * glType  =  GL_FLOAT ;  break ;          / /  NOTE :  Requires  extension  OES_texture_float   
		
	
		
			
			        case  UNCOMPRESSED_R32G32B32A32 :  if  ( texFloatSupported )  * glInternalFormat  =  GL_RGBA ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_FLOAT ;  break ;     / /  NOTE :  Requires  extension  OES_texture_float   
		
	
		
			
			        # endif   
		
	
		
			
			    # elif defined(GRAPHICS_API_OPENGL_33)   
		
	
		
			
			        case  UNCOMPRESSED_GRAYSCALE :  * glInternalFormat  =  GL_R8 ;  * glFormat  =  GL_RED ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_GRAY_ALPHA :  * glInternalFormat  =  GL_RG8 ;  * glFormat  =  GL_RG ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G6B5 :  * glInternalFormat  =  GL_RGB565 ;  * glFormat  =  GL_RGB ;  * glType  =  GL_UNSIGNED_SHORT_5_6_5 ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8 :  * glInternalFormat  =  GL_RGB8 ;  * glFormat  =  GL_RGB ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R5G5B5A1 :  * glInternalFormat  =  GL_RGB5_A1 ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_UNSIGNED_SHORT_5_5_5_1 ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R4G4B4A4 :  * glInternalFormat  =  GL_RGBA4 ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_UNSIGNED_SHORT_4_4_4_4 ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R8G8B8A8 :  * glInternalFormat  =  GL_RGBA8 ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_UNSIGNED_BYTE ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R32 :  if  ( texFloatSupported )  * glInternalFormat  =  GL_R32F ;  * glFormat  =  GL_RED ;  * glType  =  GL_FLOAT ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R32G32B32 :  if  ( texFloatSupported )  * glInternalFormat  =  GL_RGB32F ;  * glFormat  =  GL_RGB ;  * glType  =  GL_FLOAT ;  break ;   
		
	
		
			
			        case  UNCOMPRESSED_R32G32B32A32 :  if  ( texFloatSupported )  * glInternalFormat  =  GL_RGBA32F ;  * glFormat  =  GL_RGBA ;  * glType  =  GL_FLOAT ;  break ;   
		
	
		
			
			    # endif   
		
	
		
			
			        # if !defined(GRAPHICS_API_OPENGL_11)   
		
	
		
			
			        case  COMPRESSED_DXT1_RGB :  if  ( texCompDXTSupported )  * glInternalFormat  =  GL_COMPRESSED_RGB_S3TC_DXT1_EXT ;  break ;   
		
	
		
			
			        case  COMPRESSED_DXT1_RGBA :  if  ( texCompDXTSupported )  * glInternalFormat  =  GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ;  break ;   
		
	
		
			
			        case  COMPRESSED_DXT3_RGBA :  if  ( texCompDXTSupported )  * glInternalFormat  =  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ;  break ;   
		
	
		
			
			        case  COMPRESSED_DXT5_RGBA :  if  ( texCompDXTSupported )  * glInternalFormat  =  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ;  break ;   
		
	
		
			
			        case  COMPRESSED_ETC1_RGB :  if  ( texCompETC1Supported )  * glInternalFormat  =  GL_ETC1_RGB8_OES ;  break ;                       / /  NOTE :  Requires  OpenGL  ES  2.0  or  OpenGL  4.3   
		
	
		
			
			        case  COMPRESSED_ETC2_RGB :  if  ( texCompETC2Supported )  * glInternalFormat  =  GL_COMPRESSED_RGB8_ETC2 ;  break ;                / /  NOTE :  Requires  OpenGL  ES  3.0  or  OpenGL  4.3   
		
	
		
			
			        case  COMPRESSED_ETC2_EAC_RGBA :  if  ( texCompETC2Supported )  * glInternalFormat  =  GL_COMPRESSED_RGBA8_ETC2_EAC ;  break ;      / /  NOTE :  Requires  OpenGL  ES  3.0  or  OpenGL  4.3   
		
	
		
			
			        case  COMPRESSED_PVRT_RGB :  if  ( texCompPVRTSupported )  * glInternalFormat  =  GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG ;  break ;     / /  NOTE :  Requires  PowerVR  GPU   
		
	
		
			
			        case  COMPRESSED_PVRT_RGBA :  if  ( texCompPVRTSupported )  * glInternalFormat  =  GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG ;  break ;   / /  NOTE :  Requires  PowerVR  GPU   
		
	
		
			
			        case  COMPRESSED_ASTC_4x4_RGBA :  if  ( texCompASTCSupported )  * glInternalFormat  =  GL_COMPRESSED_RGBA_ASTC_4x4_KHR ;  break ;   / /  NOTE :  Requires  OpenGL  ES  3.1  or  OpenGL  4.3   
		
	
		
			
			        case  COMPRESSED_ASTC_8x8_RGBA :  if  ( texCompASTCSupported )  * glInternalFormat  =  GL_COMPRESSED_RGBA_ASTC_8x8_KHR ;  break ;   / /  NOTE :  Requires  OpenGL  ES  3.1  or  OpenGL  4.3   
		
	
		
			
			        # endif   
		
	
		
			
			        default :  TraceLog ( LOG_WARNING ,  " Texture format not supported " ) ;  break ;   
		
	
		
			
			    }   
		
	
		
			
			}  
		
	
		
			
			
  
		
	
		
			
			# if defined(SUPPORT_VR_SIMULATOR)  
		
	
		
			
			/ /  Configure  stereo  rendering  ( including  distortion  shader )  with  HMD  device  parameters  
		
	
		
			
			/ /  NOTE :  It  modifies  the  global  variable :  VrStereoConfig  vrConfig