@ -62,12 +62,12 @@  
														
													
														
															
																*        When  loading  a  shader ,  the  following  vertex  attributes  and  uniform *        When  loading  a  shader ,  the  following  vertex  attributes  and  uniform  
														
													
														
															
																*        location  names  are  tried  to  be  set  automatically : *        location  names  are  tried  to  be  set  automatically :  
														
													
														
															
																* *  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION      " vertexPosition "     / /  Bound  by  default  to  shader  location :  mi">0  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD      " vertexTexCoord "     / /  Bound  by  default  to  shader  location :  mi">1  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL        " vertexNormal "       / /  Bound  by  default  to  shader  location :  mi">2  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR         " vertexColor "        / /  Bound  by  default  to  shader  location :  mi">3  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT       " vertexTangent "      / /  Bound  by  default  to  shader  location :  mi">4  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2     " vertexTexCoord2 "    / /  Bound  by  default  to  shader  location :  mi">5  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION      " vertexPosition "     / /  Bound  by  default  to  shader  location :  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD      " vertexTexCoord "     / /  Bound  by  default  to  shader  location :  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL        " vertexNormal "       / /  Bound  by  default  to  shader  location :  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR         " vertexColor "        / /  Bound  by  default  to  shader  location :  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT       " vertexTangent "      / /  Bound  by  default  to  shader  location :  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2     " vertexTexCoord2 "    / /  Bound  by  default  to  shader  location :  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_UNIFORM_NAME_MVP          " mvp "                / /  model - view - projection  matrix *        # define  RL_DEFAULT_SHADER_UNIFORM_NAME_MVP          " mvp "                / /  model - view - projection  matrix  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW         " matView "            / /  view  matrix *        # define  RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW         " matView "            / /  view  matrix  
														
													
														
															
																*        # define  RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION   " matProjection "      / /  projection  matrix *        # define  RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION   " matProjection "      / /  projection  matrix  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -349,6 +349,7 @@ typedef struct rlVertexBuffer {  
														
													
														
															
																
 
  
														
													
														
															
																    float  * vertices ;             / /  Vertex  position  ( XYZ  -  3  components  per  vertex )  ( shader - location  =  0 )      float  * vertices ;             / /  Vertex  position  ( XYZ  -  3  components  per  vertex )  ( shader - location  =  0 )   
														
													
														
															
																    float  * texcoords ;            / /  Vertex  texture  coordinates  ( UV  -  2  components  per  vertex )  ( shader - location  =  1 )      float  * texcoords ;            / /  Vertex  texture  coordinates  ( UV  -  2  components  per  vertex )  ( shader - location  =  1 )   
														
													
														
															
																    float  * normals ;              / /  Vertex  normal  ( XYZ  -  3  components  per  vertex )  ( shader - location  =  2 )   
														
													
														
															
																    unsigned  char  * colors ;       / /  Vertex  colors  ( RGBA  -  4  components  per  vertex )  ( shader - location  =  3 )      unsigned  char  * colors ;       / /  Vertex  colors  ( RGBA  -  4  components  per  vertex )  ( shader - location  =  3 )   
														
													
														
															
																# if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) # if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33)  
														
													
														
															
																    unsigned  int  * indices ;       / /  Vertex  indices  ( in  case  vertex  data  comes  indexed )  ( 6  indices  per  quad )      unsigned  int  * indices ;       / /  Vertex  indices  ( in  case  vertex  data  comes  indexed )  ( 6  indices  per  quad )   
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																	
																 
																@ -357,7 +358,7 @@ typedef struct rlVertexBuffer {  
														
													
														
															
																    unsigned  short  * indices ;     / /  Vertex  indices  ( in  case  vertex  data  comes  indexed )  ( 6  indices  per  quad )      unsigned  short  * indices ;     / /  Vertex  indices  ( in  case  vertex  data  comes  indexed )  ( 6  indices  per  quad )   
														
													
														
															
																# endif # endif  
														
													
														
															
																    unsigned  int  vaoId ;          / /  OpenGL  Vertex  Array  Object  id      unsigned  int  vaoId ;          / /  OpenGL  Vertex  Array  Object  id   
														
													
														
															
																    unsigned  int  vboId [ 4 ] ;       / /  OpenGL  Vertex  Buffer  Objects  id  ( 4 types  of  vertex  data )   
														
													
														
															
																    unsigned  int  vboId [ 5 ] ;       / /  OpenGL  Vertex  Buffer  Objects  id  ( 5 types  of  vertex  data )   
														
													
														
															
																}  rlVertexBuffer ; }  rlVertexBuffer ;  
														
													
														
															
																
 
  
														
													
														
															
																/ /  Draw  call  type / /  Draw  call  type  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -930,24 +931,44 @@ RLAPI void rlLoadDrawQuad(void);     // Load and draw a quad  
														
													
														
															
																    # endif      # endif   
														
													
														
															
																# endif # endif  
														
													
														
															
																
 
  
														
													
														
															
																/ /  Default  shader  vertex  attribute  locations  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  0   
														
													
														
															
																# endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  1   
														
													
														
															
																# endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL    2   
														
													
														
															
																# endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR     3   
														
													
														
															
																# endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT   4   
														
													
														
															
																# endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 5   
														
													
														
															
																# endif  
														
													
														
															
																
  
														
													
														
															
																/ /  Default  shader  vertex  attribute  names  to  set  location  points / /  Default  shader  vertex  attribute  names  to  set  location  points  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION # ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION     "vertexPosition"     / /  Bound by default to shader location: 0   
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION     "vertexPosition"     / /  Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION    
														
													
														
															
																# endif # endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD # ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD     "vertexTexCoord"     / /  Bound by default to shader location: 1   
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD     "vertexTexCoord"     / /  Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD    
														
													
														
															
																# endif # endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL # ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL       "vertexNormal"       / /  Bound by default to shader location: 2   
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL       "vertexNormal"       / /  Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL    
														
													
														
															
																# endif # endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR # ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR        "vertexColor"        / /  Bound by default to shader location: 3   
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR        "vertexColor"        / /  Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR    
														
													
														
															
																# endif # endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT # ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT      "vertexTangent"      / /  Bound by default to shader location: 4   
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT      "vertexTangent"      / /  Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT    
														
													
														
															
																# endif # endif  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 # ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2  
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2    "vertexTexCoord2"    / /  Bound by default to shader location: 5   
														
													
														
															
																    # define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2    "vertexTexCoord2"    / /  Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2    
														
													
														
															
																# endif # endif  
														
													
														
															
																
 
  
														
													
														
															
																# ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP # ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -1092,8 +1113,15 @@ static const char *rlGetCompressedFormatName(int format); // Get compressed form  
														
													
														
															
																static  int  rlGetPixelDataSize ( int  width ,  int  height ,  int  format ) ;    / /  Get  pixel  data  size  in  bytes  ( image  or  texture ) static  int  rlGetPixelDataSize ( int  width ,  int  height ,  int  format ) ;    / /  Get  pixel  data  size  in  bytes  ( image  or  texture )  
														
													
														
															
																
 
  
														
													
														
															
																/ /  Auxiliar  matrix  math  functions / /  Auxiliar  matrix  math  functions  
														
													
														
															
																typedef  struct  rl_float16  {  
														
													
														
															
																    float  v [ 16 ] ;   
														
													
														
															
																}  rl_float16 ;  
														
													
														
															
																static  rl_float16  rlMatrixToFloatV ( Matrix  mat ) ;              / /  Get  float  array  of  matrix  data  
														
													
														
															
																# define rlMatrixToFloat(mat) (rlMatrixToFloatV(mat).v)       / /  Get float vector for Matrix  
														
													
														
															
																static  Matrix  rlMatrixIdentity ( void ) ;                        / /  Get  identity  matrix static  Matrix  rlMatrixIdentity ( void ) ;                        / /  Get  identity  matrix  
														
													
														
															
																static  Matrix  rlMatrixMultiply ( Matrix  left ,  Matrix  right ) ;   / /  Multiply  two  matrices static  Matrix  rlMatrixMultiply ( Matrix  left ,  Matrix  right ) ;   / /  Multiply  two  matrices  
														
													
														
															
																static  Matrix  rlMatrixTranspose ( Matrix  mat ) ;                 / /  Transposes  provided  matrix  
														
													
														
															
																static  Matrix  rlMatrixInvert ( Matrix  mat ) ;                    / /  Invert  provided  matrix  
														
													
														
															
																
 
  
														
													
														
															
																/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
														
													
														
															
																/ /  Module  Functions  Definition  -  Matrix  operations / /  Module  Functions  Definition  -  Matrix  operations  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -1456,7 +1484,10 @@ void rlVertex3f(float x, float y, float z)  
														
													
														
															
																    RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . State . vertexCounter ]  =  RLGL . State . texcoordx ;      RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . State . vertexCounter ]  =  RLGL . State . texcoordx ;   
														
													
														
															
																    RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . State . vertexCounter  +  1 ]  =  RLGL . State . texcoordy ;      RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . State . vertexCounter  +  1 ]  =  RLGL . State . texcoordy ;   
														
													
														
															
																
 
  
														
													
														
															
																    / /  WARNING :  By  default  rlVertexBuffer  struct  does  not  store  normals   
														
													
														
															
																    / /  Add  current  normal   
														
													
														
															
																    RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . normals [ 3 * RLGL . State . vertexCounter ]  =  RLGL . State . normalx ;   
														
													
														
															
																    RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . normals [ 3 * RLGL . State . vertexCounter  +  1 ]  =  RLGL . State . normaly ;   
														
													
														
															
																    RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . normals [ 3 * RLGL . State . vertexCounter  +  2 ]  =  RLGL . State . normalz ;   
														
													
														
															
																
 
  
														
													
														
															
																    / /  Add  current  color      / /  Add  current  color   
														
													
														
															
																    RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . State . vertexCounter ]  =  RLGL . State . colorr ;      RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . State . vertexCounter ]  =  RLGL . State . colorr ;   
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -1492,9 +1523,26 @@ void rlTexCoord2f(float x, float y)  
														
													
														
															
																/ /  NOTE :  Normals  limited  to  TRIANGLES  only ? / /  NOTE :  Normals  limited  to  TRIANGLES  only ?  
														
													
														
															
																void  rlNormal3f ( float  x ,  float  y ,  float  z ) void  rlNormal3f ( float  x ,  float  y ,  float  z )  
														
													
														
															
																{ {  
														
													
														
															
																    RLGL . State . normalx  =  x ;   
														
													
														
															
																    RLGL . State . normaly  =  y ;   
														
													
														
															
																    RLGL . State . normalz  =  z ;   
														
													
														
															
																    float  normalx  =  x ;   
														
													
														
															
																    float  normaly  =  y ;   
														
													
														
															
																    float  normalz  =  z ;   
														
													
														
															
																    if  ( RLGL . State . transformRequired )   
														
													
														
															
																    {   
														
													
														
															
																        normalx  =  RLGL . State . transform . m0 * x  +  RLGL . State . transform . m4 * y  +  RLGL . State . transform . m8 * z ;   
														
													
														
															
																        normaly  =  RLGL . State . transform . m1 * x  +  RLGL . State . transform . m5 * y  +  RLGL . State . transform . m9 * z ;   
														
													
														
															
																        normalz  =  RLGL . State . transform . m2 * x  +  RLGL . State . transform . m6 * y  +  RLGL . State . transform . m10 * z ;   
														
													
														
															
																    }   
														
													
														
															
																    float  length  =  sqrtf ( normalx * normalx  +  normaly * normaly  +  normalz * normalz ) ;   
														
													
														
															
																    if  ( length  ! =  0.0f )   
														
													
														
															
																    {   
														
													
														
															
																        float  ilength  =  1.0f  /  length ;   
														
													
														
															
																        normalx  * =  ilength ;   
														
													
														
															
																        normaly  * =  ilength ;   
														
													
														
															
																        normalz  * =  ilength ;   
														
													
														
															
																    }   
														
													
														
															
																    RLGL . State . normalx  =  normalx ;   
														
													
														
															
																    RLGL . State . normaly  =  normaly ;   
														
													
														
															
																    RLGL . State . normalz  =  normalz ;   
														
													
														
															
																} }  
														
													
														
															
																
 
  
														
													
														
															
																/ /  Define  one  vertex  ( color ) / /  Define  one  vertex  ( color )  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -2163,7 +2211,10 @@ void rlglInit(int width, int height)  
														
													
														
															
																    RLGL . State . currentShaderLocs  =  RLGL . State . defaultShaderLocs ;      RLGL . State . currentShaderLocs  =  RLGL . State . defaultShaderLocs ;   
														
													
														
															
																
 
  
														
													
														
															
																    / /  Init  default  vertex  arrays  buffers      / /  Init  default  vertex  arrays  buffers   
														
													
														
															
																    / /  Simulate  that  the  default  shader  has  the  location  RL_SHADER_LOC_VERTEX_NORMAL  to  bind  the  normal  buffer  for  the  default  render  batch   
														
													
														
															
																    RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_NORMAL ]  =  RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL ;   
														
													
														
															
																    RLGL . defaultBatch  =  rlLoadRenderBatch ( RL_DEFAULT_BATCH_BUFFERS ,  RL_DEFAULT_BATCH_BUFFER_ELEMENTS ) ;      RLGL . defaultBatch  =  rlLoadRenderBatch ( RL_DEFAULT_BATCH_BUFFERS ,  RL_DEFAULT_BATCH_BUFFER_ELEMENTS ) ;   
														
													
														
															
																    RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_NORMAL ]  =  - 1 ;   
														
													
														
															
																    RLGL . currentBatch  =  & RLGL . defaultBatch ;      RLGL . currentBatch  =  & RLGL . defaultBatch ;   
														
													
														
															
																
 
  
														
													
														
															
																    / /  Init  stack  matrices  ( emulating  OpenGL  1.1 )      / /  Init  stack  matrices  ( emulating  OpenGL  1.1 )   
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -2608,6 +2659,7 @@ rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)  
														
													
														
															
																
 
  
														
													
														
															
																        batch . vertexBuffer [ i ] . vertices  =  ( float  * ) RL_MALLOC ( bufferElements * 3 * 4 * sizeof ( float ) ) ;         / /  3  float  by  vertex ,  4  vertex  by  quad          batch . vertexBuffer [ i ] . vertices  =  ( float  * ) RL_MALLOC ( bufferElements * 3 * 4 * sizeof ( float ) ) ;         / /  3  float  by  vertex ,  4  vertex  by  quad   
														
													
														
															
																        batch . vertexBuffer [ i ] . texcoords  =  ( float  * ) RL_MALLOC ( bufferElements * 2 * 4 * sizeof ( float ) ) ;        / /  2  float  by  texcoord ,  4  texcoord  by  quad          batch . vertexBuffer [ i ] . texcoords  =  ( float  * ) RL_MALLOC ( bufferElements * 2 * 4 * sizeof ( float ) ) ;        / /  2  float  by  texcoord ,  4  texcoord  by  quad   
														
													
														
															
																        batch . vertexBuffer [ i ] . normals  =  ( float  * ) RL_MALLOC ( bufferElements * 3 * 4 * sizeof ( float ) ) ;         / /  3  float  by  vertex ,  4  vertex  by  quad   
														
													
														
															
																        batch . vertexBuffer [ i ] . colors  =  ( unsigned  char  * ) RL_MALLOC ( bufferElements * 4 * 4 * sizeof ( unsigned  char ) ) ;    / /  4  float  by  color ,  4  colors  by  quad          batch . vertexBuffer [ i ] . colors  =  ( unsigned  char  * ) RL_MALLOC ( bufferElements * 4 * 4 * sizeof ( unsigned  char ) ) ;    / /  4  float  by  color ,  4  colors  by  quad   
														
													
														
															
																# if defined(GRAPHICS_API_OPENGL_33) # if defined(GRAPHICS_API_OPENGL_33)  
														
													
														
															
																        batch . vertexBuffer [ i ] . indices  =  ( unsigned  int  * ) RL_MALLOC ( bufferElements * 6 * sizeof ( unsigned  int ) ) ;       / /  6  int  by  quad  ( indices )          batch . vertexBuffer [ i ] . indices  =  ( unsigned  int  * ) RL_MALLOC ( bufferElements * 6 * sizeof ( unsigned  int ) ) ;       / /  6  int  by  quad  ( indices )   
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																	
																 
																@ -2618,6 +2670,7 @@ rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)  
														
													
														
															
																
 
  
														
													
														
															
																        for  ( int  j  =  0 ;  j  <  ( 3 * 4 * bufferElements ) ;  j + + )  batch . vertexBuffer [ i ] . vertices [ j ]  =  0.0f ;          for  ( int  j  =  0 ;  j  <  ( 3 * 4 * bufferElements ) ;  j + + )  batch . vertexBuffer [ i ] . vertices [ j ]  =  0.0f ;   
														
													
														
															
																        for  ( int  j  =  0 ;  j  <  ( 2 * 4 * bufferElements ) ;  j + + )  batch . vertexBuffer [ i ] . texcoords [ j ]  =  0.0f ;          for  ( int  j  =  0 ;  j  <  ( 2 * 4 * bufferElements ) ;  j + + )  batch . vertexBuffer [ i ] . texcoords [ j ]  =  0.0f ;   
														
													
														
															
																        for  ( int  j  =  0 ;  j  <  ( 3 * 4 * bufferElements ) ;  j + + )  batch . vertexBuffer [ i ] . normals [ j ]  =  0.0f ;   
														
													
														
															
																        for  ( int  j  =  0 ;  j  <  ( 4 * 4 * bufferElements ) ;  j + + )  batch . vertexBuffer [ i ] . colors [ j ]  =  0 ;          for  ( int  j  =  0 ;  j  <  ( 4 * 4 * bufferElements ) ;  j + + )  batch . vertexBuffer [ i ] . colors [ j ]  =  0 ;   
														
													
														
															
																
 
  
														
													
														
															
																        int  k  =  0 ;          int  k  =  0 ;   
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -2667,16 +2720,23 @@ rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)  
														
													
														
															
																        glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ) ;          glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ) ;   
														
													
														
															
																        glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ,  2 ,  GL_FLOAT ,  0 ,  0 ,  0 ) ;          glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ,  2 ,  GL_FLOAT ,  0 ,  0 ,  0 ) ;   
														
													
														
															
																
 
  
														
													
														
															
																        / /  Vertex  color buffer  ( shader - location  =  3 )   
														
													
														
															
																        / /  Vertex  normal buffer  ( shader - location  =  2 )   
														
													
														
															
																        glGenBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 2 ] ) ;          glGenBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 2 ] ) ;   
														
													
														
															
																        glBindBuffer ( GL_ARRAY_BUFFER ,  batch . vertexBuffer [ i ] . vboId [ 2 ] ) ;          glBindBuffer ( GL_ARRAY_BUFFER ,  batch . vertexBuffer [ i ] . vboId [ 2 ] ) ;   
														
													
														
															
																        glBufferData ( GL_ARRAY_BUFFER ,  bufferElements * 3 * 4 * sizeof ( float ) ,  batch . vertexBuffer [ i ] . normals ,  GL_DYNAMIC_DRAW ) ;   
														
													
														
															
																        glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_NORMAL ] ) ;   
														
													
														
															
																        glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_NORMAL ] ,  3 ,  GL_FLOAT ,  0 ,  0 ,  0 ) ;   
														
													
														
															
																
  
														
													
														
															
																        / /  Vertex  color  buffer  ( shader - location  =  3 )   
														
													
														
															
																        glGenBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 3 ] ) ;   
														
													
														
															
																        glBindBuffer ( GL_ARRAY_BUFFER ,  batch . vertexBuffer [ i ] . vboId [ 3 ] ) ;   
														
													
														
															
																        glBufferData ( GL_ARRAY_BUFFER ,  bufferElements * 4 * 4 * sizeof ( unsigned  char ) ,  batch . vertexBuffer [ i ] . colors ,  GL_DYNAMIC_DRAW ) ;          glBufferData ( GL_ARRAY_BUFFER ,  bufferElements * 4 * 4 * sizeof ( unsigned  char ) ,  batch . vertexBuffer [ i ] . colors ,  GL_DYNAMIC_DRAW ) ;   
														
													
														
															
																        glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ) ;          glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ) ;   
														
													
														
															
																        glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ,  4 ,  GL_UNSIGNED_BYTE ,  GL_TRUE ,  0 ,  0 ) ;          glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ,  4 ,  GL_UNSIGNED_BYTE ,  GL_TRUE ,  0 ,  0 ) ;   
														
													
														
															
																
 
  
														
													
														
															
																        / /  Fill  index  buffer          / /  Fill  index  buffer   
														
													
														
															
																        glGenBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 3 ] ) ;   
														
													
														
															
																        glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER ,  batch . vertexBuffer [ i ] . vboId [ 3 ] ) ;   
														
													
														
															
																        glGenBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 4 ] ) ;   
														
													
														
															
																        glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER ,  batch . vertexBuffer [ i ] . vboId [ 4 ] ) ;   
														
													
														
															
																# if defined(GRAPHICS_API_OPENGL_33) # if defined(GRAPHICS_API_OPENGL_33)  
														
													
														
															
																        glBufferData ( GL_ELEMENT_ARRAY_BUFFER ,  bufferElements * 6 * sizeof ( int ) ,  batch . vertexBuffer [ i ] . indices ,  GL_STATIC_DRAW ) ;          glBufferData ( GL_ELEMENT_ARRAY_BUFFER ,  bufferElements * 6 * sizeof ( int ) ,  batch . vertexBuffer [ i ] . indices ,  GL_STATIC_DRAW ) ;   
														
													
														
															
																# endif # endif  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -2731,10 +2791,10 @@ void rlUnloadRenderBatch(rlRenderBatch batch)  
														
													
														
															
																        if  ( RLGL . ExtSupported . vao )          if  ( RLGL . ExtSupported . vao )   
														
													
														
															
																        {          {   
														
													
														
															
																            glBindVertexArray ( batch . vertexBuffer [ i ] . vaoId ) ;              glBindVertexArray ( batch . vertexBuffer [ i ] . vaoId ) ;   
														
													
														
															
																            glDisableVertexAttribArray ( mi">0  ) ;  
														
													
														
															
																            glDisableVertexAttribArray ( mi">1  ) ;  
														
													
														
															
																            glDisableVertexAttribArray ( mi">2  ) ;  
														
													
														
															
																            glDisableVertexAttribArray ( mi">3  ) ;  
														
													
														
															
																            glDisableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  ) ;  
														
													
														
															
																            glDisableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  ) ;  
														
													
														
															
																            glDisableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL  ) ;  
														
													
														
															
																            glDisableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR  ) ;  
														
													
														
															
																            glBindVertexArray ( 0 ) ;              glBindVertexArray ( 0 ) ;   
														
													
														
															
																        }          }   
														
													
														
															
																
 
  
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																	
																 
																@ -2743,6 +2803,7 @@ void rlUnloadRenderBatch(rlRenderBatch batch)  
														
													
														
															
																        glDeleteBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 1 ] ) ;          glDeleteBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 1 ] ) ;   
														
													
														
															
																        glDeleteBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 2 ] ) ;          glDeleteBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 2 ] ) ;   
														
													
														
															
																        glDeleteBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 3 ] ) ;          glDeleteBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 3 ] ) ;   
														
													
														
															
																        glDeleteBuffers ( 1 ,  & batch . vertexBuffer [ i ] . vboId [ 4 ] ) ;   
														
													
														
															
																
 
  
														
													
														
															
																        / /  Delete  VAOs  from  GPU  ( VRAM )          / /  Delete  VAOs  from  GPU  ( VRAM )   
														
													
														
															
																        if  ( RLGL . ExtSupported . vao )  glDeleteVertexArrays ( 1 ,  & batch . vertexBuffer [ i ] . vaoId ) ;          if  ( RLGL . ExtSupported . vao )  glDeleteVertexArrays ( 1 ,  & batch . vertexBuffer [ i ] . vaoId ) ;   
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																	
																 
																@ -2750,6 +2811,7 @@ void rlUnloadRenderBatch(rlRenderBatch batch)  
														
													
														
															
																        / /  Free  vertex  arrays  memory  from  CPU  ( RAM )          / /  Free  vertex  arrays  memory  from  CPU  ( RAM )   
														
													
														
															
																        RL_FREE ( batch . vertexBuffer [ i ] . vertices ) ;          RL_FREE ( batch . vertexBuffer [ i ] . vertices ) ;   
														
													
														
															
																        RL_FREE ( batch . vertexBuffer [ i ] . texcoords ) ;          RL_FREE ( batch . vertexBuffer [ i ] . texcoords ) ;   
														
													
														
															
																        RL_FREE ( batch . vertexBuffer [ i ] . normals ) ;   
														
													
														
															
																        RL_FREE ( batch . vertexBuffer [ i ] . colors ) ;          RL_FREE ( batch . vertexBuffer [ i ] . colors ) ;   
														
													
														
															
																        RL_FREE ( batch . vertexBuffer [ i ] . indices ) ;          RL_FREE ( batch . vertexBuffer [ i ] . indices ) ;   
														
													
														
															
																    }      }   
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -2784,8 +2846,13 @@ void rlDrawRenderBatch(rlRenderBatch *batch)  
														
													
														
															
																        glBufferSubData ( GL_ARRAY_BUFFER ,  0 ,  RLGL . State . vertexCounter * 2 * sizeof ( float ) ,  batch - > vertexBuffer [ batch - > currentBuffer ] . texcoords ) ;          glBufferSubData ( GL_ARRAY_BUFFER ,  0 ,  RLGL . State . vertexCounter * 2 * sizeof ( float ) ,  batch - > vertexBuffer [ batch - > currentBuffer ] . texcoords ) ;   
														
													
														
															
																        / / glBufferData ( GL_ARRAY_BUFFER ,  sizeof ( float ) * 2 * 4 * batch - > vertexBuffer [ batch - > currentBuffer ] . elementCount ,  batch - > vertexBuffer [ batch - > currentBuffer ] . texcoords ,  GL_DYNAMIC_DRAW ) ;  / /  Update  all  buffer          / / glBufferData ( GL_ARRAY_BUFFER ,  sizeof ( float ) * 2 * 4 * batch - > vertexBuffer [ batch - > currentBuffer ] . elementCount ,  batch - > vertexBuffer [ batch - > currentBuffer ] . texcoords ,  GL_DYNAMIC_DRAW ) ;  / /  Update  all  buffer   
														
													
														
															
																
 
  
														
													
														
															
																        / /  Color sbuffer   
														
													
														
															
																        / /  Normal sbuffer   
														
													
														
															
																        glBindBuffer ( GL_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 2 ] ) ;          glBindBuffer ( GL_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 2 ] ) ;   
														
													
														
															
																        glBufferSubData ( GL_ARRAY_BUFFER ,  0 ,  RLGL . State . vertexCounter * 3 * sizeof ( float ) ,  batch - > vertexBuffer [ batch - > currentBuffer ] . normals ) ;   
														
													
														
															
																        / / glBufferData ( GL_ARRAY_BUFFER ,  sizeof ( float ) * 3 * 4 * batch - > vertexBuffer [ batch - > currentBuffer ] . elementCount ,  batch - > vertexBuffer [ batch - > currentBuffer ] . normals ,  GL_DYNAMIC_DRAW ) ;  / /  Update  all  buffer   
														
													
														
															
																
  
														
													
														
															
																        / /  Colors  buffer   
														
													
														
															
																        glBindBuffer ( GL_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 3 ] ) ;   
														
													
														
															
																        glBufferSubData ( GL_ARRAY_BUFFER ,  0 ,  RLGL . State . vertexCounter * 4 * sizeof ( unsigned  char ) ,  batch - > vertexBuffer [ batch - > currentBuffer ] . colors ) ;          glBufferSubData ( GL_ARRAY_BUFFER ,  0 ,  RLGL . State . vertexCounter * 4 * sizeof ( unsigned  char ) ,  batch - > vertexBuffer [ batch - > currentBuffer ] . colors ) ;   
														
													
														
															
																        / / glBufferData ( GL_ARRAY_BUFFER ,  sizeof ( float ) * 4 * 4 * batch - > vertexBuffer [ batch - > currentBuffer ] . elementCount ,  batch - > vertexBuffer [ batch - > currentBuffer ] . colors ,  GL_DYNAMIC_DRAW ) ;     / /  Update  all  buffer          / / glBufferData ( GL_ARRAY_BUFFER ,  sizeof ( float ) * 4 * 4 * batch - > vertexBuffer [ batch - > currentBuffer ] . elementCount ,  batch - > vertexBuffer [ batch - > currentBuffer ] . colors ,  GL_DYNAMIC_DRAW ) ;     / /  Update  all  buffer   
														
													
														
															
																
 
  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -2838,13 +2905,30 @@ void rlDrawRenderBatch(rlRenderBatch *batch)  
														
													
														
															
																
 
  
														
													
														
															
																            / /  Create  modelview - projection  matrix  and  upload  to  shader              / /  Create  modelview - projection  matrix  and  upload  to  shader   
														
													
														
															
																            Matrix  matMVP  =  rlMatrixMultiply ( RLGL . State . modelview ,  RLGL . State . projection ) ;              Matrix  matMVP  =  rlMatrixMultiply ( RLGL . State . modelview ,  RLGL . State . projection ) ;   
														
													
														
															
																            float  matMVPfloat [ 16 ]  =  {   
														
													
														
															
																                matMVP . m0 ,  matMVP . m1 ,  matMVP . m2 ,  matMVP . m3 ,   
														
													
														
															
																                matMVP . m4 ,  matMVP . m5 ,  matMVP . m6 ,  matMVP . m7 ,   
														
													
														
															
																                matMVP . m8 ,  matMVP . m9 ,  matMVP . m10 ,  matMVP . m11 ,   
														
													
														
															
																                matMVP . m12 ,  matMVP . m13 ,  matMVP . m14 ,  matMVP . m15   
														
													
														
															
																            } ;   
														
													
														
															
																            glUniformMatrix4fv ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_MVP ] ,  1 ,  false ,  matMVPfloat ) ;   
														
													
														
															
																            glUniformMatrix4fv ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_MVP ] ,  1 ,  false ,  rlMatrixToFloat ( matMVP ) ) ;   
														
													
														
															
																
  
														
													
														
															
																            if  ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_PROJECTION ]  ! =  - 1 )   
														
													
														
															
																            {   
														
													
														
															
																                glUniformMatrix4fv ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_PROJECTION ] ,  1 ,  false ,  rlMatrixToFloat ( RLGL . State . projection ) ) ;   
														
													
														
															
																            }   
														
													
														
															
																
  
														
													
														
															
																            / /  WARNING :  For  the  following  setup  of  the  view ,  model ,  and  normal  matrices ,  it  is  expected  that   
														
													
														
															
																            / /  transformations  and  rendering  occur  between  rlPushMatrix  and  rlPopMatrix .   
														
													
														
															
																
  
														
													
														
															
																            if  ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_VIEW ]  ! =  - 1 )   
														
													
														
															
																            {   
														
													
														
															
																                glUniformMatrix4fv ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_VIEW ] ,  1 ,  false ,  rlMatrixToFloat ( RLGL . State . modelview ) ) ;   
														
													
														
															
																            }   
														
													
														
															
																
  
														
													
														
															
																            if  ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_MODEL ]  ! =  - 1 )   
														
													
														
															
																            {   
														
													
														
															
																                glUniformMatrix4fv ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_MODEL ] ,  1 ,  false ,  rlMatrixToFloat ( RLGL . State . transform ) ) ;   
														
													
														
															
																            }   
														
													
														
															
																
  
														
													
														
															
																            if  ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_NORMAL ]  ! =  - 1 )   
														
													
														
															
																            {   
														
													
														
															
																                glUniformMatrix4fv ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_MATRIX_NORMAL ] ,  1 ,  false ,  rlMatrixToFloat ( rlMatrixTranspose ( rlMatrixInvert ( RLGL . State . transform ) ) ) ) ;   
														
													
														
															
																            }   
														
													
														
															
																
 
  
														
													
														
															
																            if  ( RLGL . ExtSupported . vao )  glBindVertexArray ( batch - > vertexBuffer [ batch - > currentBuffer ] . vaoId ) ;              if  ( RLGL . ExtSupported . vao )  glBindVertexArray ( batch - > vertexBuffer [ batch - > currentBuffer ] . vaoId ) ;   
														
													
														
															
																            else              else   
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																	
																 
																@ -2859,12 +2943,17 @@ void rlDrawRenderBatch(rlRenderBatch *batch)  
														
													
														
															
																                glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ,  2 ,  GL_FLOAT ,  0 ,  0 ,  0 ) ;                  glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ,  2 ,  GL_FLOAT ,  0 ,  0 ,  0 ) ;   
														
													
														
															
																                glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ) ;                  glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ] ) ;   
														
													
														
															
																
 
  
														
													
														
															
																                / /  Bind  vertex  attrib :  color ( shader - location  =  3 )   
														
													
														
															
																                / /  Bind  vertex  attrib :  normal ( shader - location  =  2 )   
														
													
														
															
																                glBindBuffer ( GL_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 2 ] ) ;                  glBindBuffer ( GL_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 2 ] ) ;   
														
													
														
															
																                glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_NORMAL ] ,  3 ,  GL_FLOAT ,  0 ,  0 ,  0 ) ;   
														
													
														
															
																                glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_NORMAL ] ) ;   
														
													
														
															
																
  
														
													
														
															
																                / /  Bind  vertex  attrib :  color  ( shader - location  =  3 )   
														
													
														
															
																                glBindBuffer ( GL_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 3 ] ) ;   
														
													
														
															
																                glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ,  4 ,  GL_UNSIGNED_BYTE ,  GL_TRUE ,  0 ,  0 ) ;                  glVertexAttribPointer ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ,  4 ,  GL_UNSIGNED_BYTE ,  GL_TRUE ,  0 ,  0 ) ;   
														
													
														
															
																                glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ) ;                  glEnableVertexAttribArray ( RLGL . State . currentShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ] ) ;   
														
													
														
															
																
 
  
														
													
														
															
																                glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 3 ] ) ;   
														
													
														
															
																                glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER ,  batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 4 ] ) ;   
														
													
														
															
																            }              }   
														
													
														
															
																
 
  
														
													
														
															
																            / /  Setup  some  default  shader  values              / /  Setup  some  default  shader  values   
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -4014,12 +4103,12 @@ unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)  
														
													
														
															
																    glAttachShader ( program ,  fShaderId ) ;      glAttachShader ( program ,  fShaderId ) ;   
														
													
														
															
																
 
  
														
													
														
															
																    / /  NOTE :  Default  attribute  shader  locations  must  be  Bound  before  linking      / /  NOTE :  Default  attribute  shader  locations  must  be  Bound  before  linking   
														
													
														
															
																    glBindAttribLocation ( program ,  mi">0  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  mi">1  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  mi">2  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  mi">3  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  mi">4  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  mi">5  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT ) ;  
														
													
														
															
																    glBindAttribLocation ( program ,  n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2  ,  RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 ) ;  
														
													
														
															
																
 
  
														
													
														
															
																    / /  NOTE :  If  some  attrib  name  is  no  found  on  the  shader ,  it  locations  becomes  - 1      / /  NOTE :  If  some  attrib  name  is  no  found  on  the  shader ,  it  locations  becomes  - 1   
														
													
														
															
																
 
  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -4482,10 +4571,10 @@ void rlLoadDrawQuad(void)  
														
													
														
															
																    glBufferData ( GL_ARRAY_BUFFER ,  sizeof ( vertices ) ,  & vertices ,  GL_STATIC_DRAW ) ;      glBufferData ( GL_ARRAY_BUFFER ,  sizeof ( vertices ) ,  & vertices ,  GL_STATIC_DRAW ) ;   
														
													
														
															
																
 
  
														
													
														
															
																    / /  Bind  vertex  attributes  ( position ,  texcoords )      / /  Bind  vertex  attributes  ( position ,  texcoords )   
														
													
														
															
																    glEnableVertexAttribArray ( mi">0  ) ;  
														
													
														
															
																    glVertexAttribPointer ( mi">0  ,  3 ,  GL_FLOAT ,  GL_FALSE ,  5 * sizeof ( float ) ,  ( void  * ) 0 ) ;  / /  Positions  
														
													
														
															
																    glEnableVertexAttribArray ( mi">1  ) ;  
														
													
														
															
																    glVertexAttribPointer ( mi">1  ,  2 ,  GL_FLOAT ,  GL_FALSE ,  5 * sizeof ( float ) ,  ( void  * ) ( 3 * sizeof ( float ) ) ) ;  / /  Texcoords  
														
													
														
															
																    glEnableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  ) ;  
														
													
														
															
																    glVertexAttribPointer ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  ,  3 ,  GL_FLOAT ,  GL_FALSE ,  5 * sizeof ( float ) ,  ( void  * ) 0 ) ;  / /  Positions  
														
													
														
															
																    glEnableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  ) ;  
														
													
														
															
																    glVertexAttribPointer ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  ,  2 ,  GL_FLOAT ,  GL_FALSE ,  5 * sizeof ( float ) ,  ( void  * ) ( 3 * sizeof ( float ) ) ) ;  / /  Texcoords  
														
													
														
															
																
 
  
														
													
														
															
																    / /  Draw  quad      / /  Draw  quad   
														
													
														
															
																    glBindVertexArray ( quadVAO ) ;      glBindVertexArray ( quadVAO ) ;   
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -4556,12 +4645,12 @@ void rlLoadDrawCube(void)  
														
													
														
															
																
 
  
														
													
														
															
																    / /  Bind  vertex  attributes  ( position ,  normals ,  texcoords )      / /  Bind  vertex  attributes  ( position ,  normals ,  texcoords )   
														
													
														
															
																    glBindVertexArray ( cubeVAO ) ;      glBindVertexArray ( cubeVAO ) ;   
														
													
														
															
																    glEnableVertexAttribArray ( mi">0  ) ;  
														
													
														
															
																    glVertexAttribPointer ( mi">0  ,  3 ,  GL_FLOAT ,  GL_FALSE ,  8 * sizeof ( float ) ,  ( void  * ) 0 ) ;  / /  Positions  
														
													
														
															
																    glEnableVertexAttribArray ( mi">1  ) ;  
														
													
														
															
																    glVertexAttribPointer ( mi">1  ,  3 ,  GL_FLOAT ,  GL_FALSE ,  8 * sizeof ( float ) ,  ( void  * ) ( 3 * sizeof ( float ) ) ) ;  / /  Normals  
														
													
														
															
																    glEnableVertexAttribArray ( mi">2  ) ;  
														
													
														
															
																    glVertexAttribPointer ( mi">2  ,  2 ,  GL_FLOAT ,  GL_FALSE ,  8 * sizeof ( float ) ,  ( void  * ) ( 6 * sizeof ( float ) ) ) ;  / /  Texcoords  
														
													
														
															
																    glEnableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  ) ;  
														
													
														
															
																    glVertexAttribPointer ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION  ,  3 ,  GL_FLOAT ,  GL_FALSE ,  8 * sizeof ( float ) ,  ( void  * ) 0 ) ;  / /  Positions  
														
													
														
															
																    glEnableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL  ) ;  
														
													
														
															
																    glVertexAttribPointer ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL  ,  3 ,  GL_FLOAT ,  GL_FALSE ,  8 * sizeof ( float ) ,  ( void  * ) ( 3 * sizeof ( float ) ) ) ;  / /  Normals  
														
													
														
															
																    glEnableVertexAttribArray ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  ) ;  
														
													
														
															
																    glVertexAttribPointer ( n">RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD  ,  2 ,  GL_FLOAT ,  GL_FALSE ,  8 * sizeof ( float ) ,  ( void  * ) ( 6 * sizeof ( float ) ) ) ;  / /  Texcoords  
														
													
														
															
																    glBindBuffer ( GL_ARRAY_BUFFER ,  0 ) ;      glBindBuffer ( GL_ARRAY_BUFFER ,  0 ) ;   
														
													
														
															
																    glBindVertexArray ( 0 ) ;      glBindVertexArray ( 0 ) ;   
														
													
														
															
																
 
  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -4709,14 +4798,14 @@ static void rlLoadShaderDefault(void)  
														
													
														
															
																        TRACELOG ( RL_LOG_INFO ,  " SHADER: [ID %i] Default shader loaded successfully " ,  RLGL . State . defaultShaderId ) ;          TRACELOG ( RL_LOG_INFO ,  " SHADER: [ID %i] Default shader loaded successfully " ,  RLGL . State . defaultShaderId ) ;   
														
													
														
															
																
 
  
														
													
														
															
																        / /  Set  default  shader  locations :  attributes  locations          / /  Set  default  shader  locations :  attributes  locations   
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_VERTEX_POSITION ]  =  glGetAttribLocation ( RLGL . State . defaultShaderId ,  sa"> " vertexPosition "  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ]  =  glGetAttribLocation ( RLGL . State . defaultShaderId ,  sa"> " vertexTexCoord "  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ]  =  glGetAttribLocation ( RLGL . State . defaultShaderId ,  sa"> " vertexColor "  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_VERTEX_POSITION ]  =  glGetAttribLocation ( RLGL . State . defaultShaderId ,  n">RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_VERTEX_TEXCOORD01 ]  =  glGetAttribLocation ( RLGL . State . defaultShaderId ,  n">RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_VERTEX_COLOR ]  =  glGetAttribLocation ( RLGL . State . defaultShaderId ,  n">RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR  ) ;  
														
													
														
															
																
 
  
														
													
														
															
																        / /  Set  default  shader  locations :  uniform  locations          / /  Set  default  shader  locations :  uniform  locations   
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_MATRIX_MVP ]   =  glGetUniformLocation ( RLGL . State . defaultShaderId ,  sa"> " mvp "  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_COLOR_DIFFUSE ]  =  glGetUniformLocation ( RLGL . State . defaultShaderId ,  sa"> " colDiffuse "  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_MAP_DIFFUSE ]  =  glGetUniformLocation ( RLGL . State . defaultShaderId ,  sa"> " texture0 "  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_MATRIX_MVP ]   =  glGetUniformLocation ( RLGL . State . defaultShaderId ,  n">RL_DEFAULT_SHADER_UNIFORM_NAME_MVP  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_COLOR_DIFFUSE ]  =  glGetUniformLocation ( RLGL . State . defaultShaderId ,  n">RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR  ) ;  
														
													
														
															
																        RLGL . State . defaultShaderLocs [ RL_SHADER_LOC_MAP_DIFFUSE ]  =  glGetUniformLocation ( RLGL . State . defaultShaderId ,  n">RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0  ) ;  
														
													
														
															
																    }      }   
														
													
														
															
																    else  TRACELOG ( RL_LOG_WARNING ,  " SHADER: [ID %i] Failed to load default shader " ,  RLGL . State . defaultShaderId ) ;      else  TRACELOG ( RL_LOG_WARNING ,  " SHADER: [ID %i] Failed to load default shader " ,  RLGL . State . defaultShaderId ) ;   
														
													
														
															
																} }  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -4868,6 +4957,31 @@ static int rlGetPixelDataSize(int width, int height, int format)  
														
													
														
															
																
 
  
														
													
														
															
																/ /  Auxiliar  math  functions / /  Auxiliar  math  functions  
														
													
														
															
																
 
  
														
													
														
															
																/ /  Get  float  array  of  matrix  data  
														
													
														
															
																static  rl_float16  rlMatrixToFloatV ( Matrix  mat )  
														
													
														
															
																{  
														
													
														
															
																    rl_float16  result  =  {  0  } ;   
														
													
														
															
																
  
														
													
														
															
																    result . v [ 0 ]  =  mat . m0 ;   
														
													
														
															
																    result . v [ 1 ]  =  mat . m1 ;   
														
													
														
															
																    result . v [ 2 ]  =  mat . m2 ;   
														
													
														
															
																    result . v [ 3 ]  =  mat . m3 ;   
														
													
														
															
																    result . v [ 4 ]  =  mat . m4 ;   
														
													
														
															
																    result . v [ 5 ]  =  mat . m5 ;   
														
													
														
															
																    result . v [ 6 ]  =  mat . m6 ;   
														
													
														
															
																    result . v [ 7 ]  =  mat . m7 ;   
														
													
														
															
																    result . v [ 8 ]  =  mat . m8 ;   
														
													
														
															
																    result . v [ 9 ]  =  mat . m9 ;   
														
													
														
															
																    result . v [ 10 ]  =  mat . m10 ;   
														
													
														
															
																    result . v [ 11 ]  =  mat . m11 ;   
														
													
														
															
																    result . v [ 12 ]  =  mat . m12 ;   
														
													
														
															
																    result . v [ 13 ]  =  mat . m13 ;   
														
													
														
															
																    result . v [ 14 ]  =  mat . m14 ;   
														
													
														
															
																    result . v [ 15 ]  =  mat . m15 ;   
														
													
														
															
																
  
														
													
														
															
																    return  result ;   
														
													
														
															
																}  
														
													
														
															
																
  
														
													
														
															
																/ /  Get  identity  matrix / /  Get  identity  matrix  
														
													
														
															
																static  Matrix  rlMatrixIdentity ( void ) static  Matrix  rlMatrixIdentity ( void )  
														
													
														
															
																{ {  
														
													
												
													
														
															
																
																	
																		
																			 
																	
																	
																		
																			 
																	
																	
																 
																@ -4907,4 +5021,76 @@ static Matrix rlMatrixMultiply(Matrix left, Matrix right)  
														
													
														
															
																    return  result ;      return  result ;   
														
													
														
															
																} }  
														
													
														
															
																
 
  
														
													
														
															
																/ /  Transposes  provided  matrix  
														
													
														
															
																static  Matrix  rlMatrixTranspose ( Matrix  mat )  
														
													
														
															
																{  
														
													
														
															
																    Matrix  result  =  {  0  } ;   
														
													
														
															
																
  
														
													
														
															
																    result . m0  =  mat . m0 ;   
														
													
														
															
																    result . m1  =  mat . m4 ;   
														
													
														
															
																    result . m2  =  mat . m8 ;   
														
													
														
															
																    result . m3  =  mat . m12 ;   
														
													
														
															
																    result . m4  =  mat . m1 ;   
														
													
														
															
																    result . m5  =  mat . m5 ;   
														
													
														
															
																    result . m6  =  mat . m9 ;   
														
													
														
															
																    result . m7  =  mat . m13 ;   
														
													
														
															
																    result . m8  =  mat . m2 ;   
														
													
														
															
																    result . m9  =  mat . m6 ;   
														
													
														
															
																    result . m10  =  mat . m10 ;   
														
													
														
															
																    result . m11  =  mat . m14 ;   
														
													
														
															
																    result . m12  =  mat . m3 ;   
														
													
														
															
																    result . m13  =  mat . m7 ;   
														
													
														
															
																    result . m14  =  mat . m11 ;   
														
													
														
															
																    result . m15  =  mat . m15 ;   
														
													
														
															
																
  
														
													
														
															
																    return  result ;   
														
													
														
															
																}  
														
													
														
															
																
  
														
													
														
															
																/ /  Invert  provided  matrix  
														
													
														
															
																static  Matrix  rlMatrixInvert ( Matrix  mat )  
														
													
														
															
																{  
														
													
														
															
																    Matrix  result  =  {  0  } ;   
														
													
														
															
																
  
														
													
														
															
																    / /  Cache  the  matrix  values  ( speed  optimization )   
														
													
														
															
																    float  a00  =  mat . m0 ,  a01  =  mat . m1 ,  a02  =  mat . m2 ,  a03  =  mat . m3 ;   
														
													
														
															
																    float  a10  =  mat . m4 ,  a11  =  mat . m5 ,  a12  =  mat . m6 ,  a13  =  mat . m7 ;   
														
													
														
															
																    float  a20  =  mat . m8 ,  a21  =  mat . m9 ,  a22  =  mat . m10 ,  a23  =  mat . m11 ;   
														
													
														
															
																    float  a30  =  mat . m12 ,  a31  =  mat . m13 ,  a32  =  mat . m14 ,  a33  =  mat . m15 ;   
														
													
														
															
																
  
														
													
														
															
																    float  b00  =  a00 * a11  -  a01 * a10 ;   
														
													
														
															
																    float  b01  =  a00 * a12  -  a02 * a10 ;   
														
													
														
															
																    float  b02  =  a00 * a13  -  a03 * a10 ;   
														
													
														
															
																    float  b03  =  a01 * a12  -  a02 * a11 ;   
														
													
														
															
																    float  b04  =  a01 * a13  -  a03 * a11 ;   
														
													
														
															
																    float  b05  =  a02 * a13  -  a03 * a12 ;   
														
													
														
															
																    float  b06  =  a20 * a31  -  a21 * a30 ;   
														
													
														
															
																    float  b07  =  a20 * a32  -  a22 * a30 ;   
														
													
														
															
																    float  b08  =  a20 * a33  -  a23 * a30 ;   
														
													
														
															
																    float  b09  =  a21 * a32  -  a22 * a31 ;   
														
													
														
															
																    float  b10  =  a21 * a33  -  a23 * a31 ;   
														
													
														
															
																    float  b11  =  a22 * a33  -  a23 * a32 ;   
														
													
														
															
																
  
														
													
														
															
																    / /  Calculate  the  invert  determinant  ( inlined  to  avoid  double - caching )   
														
													
														
															
																    float  invDet  =  1.0f / ( b00 * b11  -  b01 * b10  +  b02 * b09  +  b03 * b08  -  b04 * b07  +  b05 * b06 ) ;   
														
													
														
															
																
  
														
													
														
															
																    result . m0  =  ( a11 * b11  -  a12 * b10  +  a13 * b09 ) * invDet ;   
														
													
														
															
																    result . m1  =  ( - a01 * b11  +  a02 * b10  -  a03 * b09 ) * invDet ;   
														
													
														
															
																    result . m2  =  ( a31 * b05  -  a32 * b04  +  a33 * b03 ) * invDet ;   
														
													
														
															
																    result . m3  =  ( - a21 * b05  +  a22 * b04  -  a23 * b03 ) * invDet ;   
														
													
														
															
																    result . m4  =  ( - a10 * b11  +  a12 * b08  -  a13 * b07 ) * invDet ;   
														
													
														
															
																    result . m5  =  ( a00 * b11  -  a02 * b08  +  a03 * b07 ) * invDet ;   
														
													
														
															
																    result . m6  =  ( - a30 * b05  +  a32 * b02  -  a33 * b01 ) * invDet ;   
														
													
														
															
																    result . m7  =  ( a20 * b05  -  a22 * b02  +  a23 * b01 ) * invDet ;   
														
													
														
															
																    result . m8  =  ( a10 * b10  -  a11 * b08  +  a13 * b06 ) * invDet ;   
														
													
														
															
																    result . m9  =  ( - a00 * b10  +  a01 * b08  -  a03 * b06 ) * invDet ;   
														
													
														
															
																    result . m10  =  ( a30 * b04  -  a31 * b02  +  a33 * b00 ) * invDet ;   
														
													
														
															
																    result . m11  =  ( - a20 * b04  +  a21 * b02  -  a23 * b00 ) * invDet ;   
														
													
														
															
																    result . m12  =  ( - a10 * b09  +  a11 * b07  -  a12 * b06 ) * invDet ;   
														
													
														
															
																    result . m13  =  ( a00 * b09  -  a01 * b07  +  a02 * b06 ) * invDet ;   
														
													
														
															
																    result . m14  =  ( - a30 * b03  +  a31 * b01  -  a32 * b00 ) * invDet ;   
														
													
														
															
																    result . m15  =  ( a20 * b03  -  a21 * b01  +  a22 * b00 ) * invDet ;   
														
													
														
															
																
  
														
													
														
															
																    return  result ;   
														
													
														
															
																}  
														
													
														
															
																
  
														
													
														
															
																# endif   / /  RLGL_IMPLEMENTATION # endif   / /  RLGL_IMPLEMENTATION