@ -288,10 +288,6 @@ typedef enum {
typedef struct rlVertexBuffer {
int elementCount ; / / Number of elements in the buffer ( QUADS )
int vCounter ; / / Vertex position counter to process ( and draw ) from full buffer
int tcCounter ; / / Vertex texcoord counter to process ( and draw ) from full buffer
int cCounter ; / / Vertex color counter to process ( and draw ) from full buffer
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 )
unsigned char * colors ; / / Vertex colors ( RGBA - 4 components per vertex ) ( shader - location = 3 )
@ -851,11 +847,16 @@ typedef struct rlglData {
rlRenderBatch defaultBatch ; / / Default internal render batch
struct {
int vertexCounter ; / / Vertex counter to process ( and draw ) from full buffer
float texcoordx , texcoordy ; / / Current active texture coordinate
float normalx , normaly , normalz ; / / Current active normal
unsigned char colorr , colorg , colorb , colora ; / / Current active color
int currentMatrixMode ; / / Current matrix mode
Matrix * currentMatrix ; / / Current matrix pointer
Matrix modelview ; / / Default modelview matrix
Matrix projection ; / / Default projection matrix
Matrix transform ; / / Transform matrix to be used with rlTranslate , rlRotate , rlScale
Matrix * currentMatrix ; / / Current matrix pointer
Matrix modelview ; / / Default modelview matrix
Matrix projection ; / / Default projection matrix
Matrix transform ; / / Transform matrix to be used with rlTranslate , rlRotate , rlScale
bool transformRequired ; / / Require transform matrix application to current draw - call vertex ( if required )
Matrix stack [ RL_MAX_MATRIX_STACK_SIZE ] ; / / Matrix stack for push / pop
int stackCounter ; / / Matrix stack counter
@ -870,8 +871,8 @@ typedef struct rlglData {
int * currentShaderLocs ; / / Current shader locations pointer to be used on rendering ( by default , defaultShaderLocs )
bool stereoRender ; / / Stereo rendering flag
Matrix projectionStereo [ 2 ] ; / / VR stereo rendering eyes projection matrices
Matrix viewOffsetStereo [ 2 ] ; / / VR stereo rendering eyes view offset matrices
Matrix projectionStereo [ 2 ] ; / / VR stereo rendering eyes projection matrices
Matrix viewOffsetStereo [ 2 ] ; / / VR stereo rendering eyes view offset matrices
int currentBlendMode ; / / Blending mode active
int glBlendSrcFactor ; / / Blending source factor
@ -1232,10 +1233,7 @@ void rlBegin(int mode)
if ( ! rlCheckRenderBatchLimit ( RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ) )
{
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . State . vertexCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . currentBatch - > drawCounter + + ;
}
}
@ -1251,39 +1249,6 @@ void rlBegin(int mode)
/ / Finish vertex providing
void rlEnd ( void )
{
/ / Make sure vertexCount is the same for vertices , texcoords , colors and normals
/ / NOTE : In OpenGL 1.1 , one glColor call can be made for all the subsequent glVertex calls
/ / Make sure colors count match vertex count
if ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter ! = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter )
{
int addColors = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter - RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter ;
for ( int i = 0 ; i < addColors ; i + + )
{
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter ] = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter - 4 ] ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + 1 ] = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter - 3 ] ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + 2 ] = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter - 2 ] ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + 3 ] = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter - 1 ] ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + + ;
}
}
/ / Make sure texcoords count match vertex count
if ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter ! = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter )
{
int addTexCoords = RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter - RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter ;
for ( int i = 0 ; i < addTexCoords ; i + + )
{
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter ] = 0.0f ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter + 1 ] = 0.0f ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter + + ;
}
}
/ / TODO : Make sure normals count match vertex count . . . if normals support is added in a future . . . : P
/ / NOTE : Depth increment is dependant on rlOrtho ( ) : z - near and z - far values ,
/ / as well as depth buffer bit - depth ( 16 bit or 24 bit or 32 bit )
/ / Correct increment formula would be : depthInc = ( zfar - znear ) / pow ( 2 , bits )
@ -1291,8 +1256,7 @@ void rlEnd(void)
/ / Verify internal buffers limits
/ / NOTE : This check is combined with usage of rlCheckRenderBatchLimit ( )
if ( ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter ) > =
( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . elementCount * 4 - 4 ) )
if ( RLGL . State . vertexCounter > = ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . elementCount * 4 - 4 ) )
{
/ / WARNING : If we are between rlPushMatrix ( ) and rlPopMatrix ( ) and we need to force a rlDrawRenderBatch ( ) ,
/ / we need to call rlPopMatrix ( ) before to recover * RLGL . State . currentMatrix ( RLGL . State . modelview ) for the next forced draw call !
@ -1319,13 +1283,28 @@ void rlVertex3f(float x, float y, float z)
}
/ / Verify that current vertex buffer elements limit has not been reached
if ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . v Counter < ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . elementCount * 4 ) )
if ( RLGL . State . vertex Counter < ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . elementCount * 4 ) )
{
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vertices [ 3 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter ] = tx ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vertices [ 3 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter + 1 ] = ty ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vertices [ 3 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter + 2 ] = tz ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter + + ;
/ / Add vertices
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vertices [ 3 * RLGL . State . vertexCounter ] = tx ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vertices [ 3 * RLGL . State . vertexCounter + 1 ] = ty ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vertices [ 3 * RLGL . State . vertexCounter + 2 ] = tz ;
/ / Add current texcoord
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 ;
/ / Add current normal
/ / TODO .
/ / 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 + 1 ] = RLGL . State . colorg ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . State . vertexCounter + 2 ] = RLGL . State . colorb ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . State . vertexCounter + 3 ] = RLGL . State . colora ;
RLGL . State . vertexCounter + + ;
RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexCount + + ;
}
else TRACELOG ( RL_LOG_ERROR , " RLGL: Batch elements overflow " ) ;
@ -1347,26 +1326,26 @@ void rlVertex2i(int x, int y)
/ / NOTE : Texture coordinates are limited to QUADS only
void rlTexCoord2f ( float x , float y )
{
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter ] = x ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . texcoords [ 2 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter + 1 ] = y ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter + + ;
RLGL . State . texcoordx = x ;
RLGL . State . texcoordy = y ;
}
/ / Define one vertex ( normal )
/ / NOTE : Normals limited to TRIANGLES only ?
void rlNormal3f ( float x , float y , float z )
{
/ / TODO : Normals usage . . .
RLGL . State . normalx = x ;
RLGL . State . normaly = y ;
RLGL . State . normalz = z ;
}
/ / Define one vertex ( color )
void rlColor4ub ( unsigned char x , unsigned char y , unsigned char z , unsigned char w )
{
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter ] = x ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + 1 ] = y ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + 2 ] = z ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . colors [ 4 * RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + 3 ] = w ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + + ;
RLGL . State . colorr = x ;
RLGL . State . colorg = y ;
RLGL . State . colorb = z ;
RLGL . State . colora = w ;
}
/ / Define one vertex ( color )
@ -1396,7 +1375,7 @@ void rlSetTexture(unsigned int id)
rlDisableTexture ( ) ;
# else
/ / NOTE : If quads batch limit is reached , we force a draw call and next batch starts
if ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . v Counter > =
if ( RLGL . State . vertex Counter > =
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . elementCount * 4 )
{
rlDrawRenderBatch ( RLGL . currentBatch ) ;
@ -1423,9 +1402,7 @@ void rlSetTexture(unsigned int id)
if ( ! rlCheckRenderBatchLimit ( RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ) )
{
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . vCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . cCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . tcCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . State . vertexCounter + = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . vertexAlignment ;
RLGL . currentBatch - > drawCounter + + ;
}
@ -2207,9 +2184,7 @@ rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)
k + + ;
}
batch . vertexBuffer [ i ] . vCounter = 0 ;
batch . vertexBuffer [ i ] . tcCounter = 0 ;
batch . vertexBuffer [ i ] . cCounter = 0 ;
RLGL . State . vertexCounter = 0 ;
}
TRACELOG ( RL_LOG_INFO , " RLGL: Render batch vertex buffers loaded successfully in RAM (CPU) " ) ;
@ -2337,24 +2312,24 @@ void rlDrawRenderBatch(rlRenderBatch *batch)
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / NOTE : If there is not vertex data , buffers doesn ' t need to be updated ( vertexCount > 0 )
/ / TODO : If no data changed on the CPU arrays - - > No need to re - update GPU arrays ( change flag required )
if ( batch - > vertexBuffer [ batch - > currentBuffer ] . v Counter > 0 )
if ( RLGL . State . vertex Counter > 0 )
{
/ / Activate elements VAO
if ( RLGL . ExtSupported . vao ) glBindVertexArray ( batch - > vertexBuffer [ batch - > currentBuffer ] . vaoId ) ;
/ / Vertex positions buffer
glBindBuffer ( GL_ARRAY_BUFFER , batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 0 ] ) ;
glBufferSubData ( GL_ARRAY_BUFFER , 0 , batch - > vertexBuffer [ batch - > currentBuffer ] . v Counter* 3 * sizeof ( float ) , batch - > vertexBuffer [ batch - > currentBuffer ] . vertices ) ;
glBufferSubData ( GL_ARRAY_BUFFER , 0 , RLGL . State . vertex Counter* 3 * sizeof ( float ) , batch - > vertexBuffer [ batch - > currentBuffer ] . vertices ) ;
/ / glBufferData ( GL_ARRAY_BUFFER , sizeof ( float ) * 3 * 4 * batch - > vertexBuffer [ batch - > currentBuffer ] . elementCount , batch - > vertexBuffer [ batch - > currentBuffer ] . vertices , GL_DYNAMIC_DRAW ) ; / / Update all buffer
/ / Texture coordinates buffer
glBindBuffer ( GL_ARRAY_BUFFER , batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 1 ] ) ;
glBufferSubData ( GL_ARRAY_BUFFER , 0 , batch - > vertexBuffer [ batch - > currentBuffer ] . v Counter* 2 * sizeof ( float ) , batch - > vertexBuffer [ batch - > currentBuffer ] . texcoords ) ;
glBufferSubData ( GL_ARRAY_BUFFER , 0 , RLGL . State . vertex Counter* 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
/ / Colors buffer
glBindBuffer ( GL_ARRAY_BUFFER , batch - > vertexBuffer [ batch - > currentBuffer ] . vboId [ 2 ] ) ;
glBufferSubData ( GL_ARRAY_BUFFER , 0 , batch - > vertexBuffer [ batch - > currentBuffer ] . v Counter* 4 * sizeof ( unsigned char ) , batch - > vertexBuffer [ batch - > currentBuffer ] . colors ) ;
glBufferSubData ( GL_ARRAY_BUFFER , 0 , RLGL . State . vertex Counter* 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
/ / NOTE : glMapBuffer ( ) causes sync issue .
@ -2399,7 +2374,7 @@ void rlDrawRenderBatch(rlRenderBatch *batch)
}
/ / Draw buffers
if ( batch - > vertexBuffer [ batch - > currentBuffer ] . v Counter > 0 )
if ( RLGL . State . vertex Counter > 0 )
{
/ / Set current shader and upload current MVP matrix
glUseProgram ( RLGL . State . currentShaderId ) ;
@ -2494,9 +2469,7 @@ void rlDrawRenderBatch(rlRenderBatch *batch)
/ / Reset batch buffers
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / Reset vertex counters for next frame
batch - > vertexBuffer [ batch - > currentBuffer ] . vCounter = 0 ;
batch - > vertexBuffer [ batch - > currentBuffer ] . tcCounter = 0 ;
batch - > vertexBuffer [ batch - > currentBuffer ] . cCounter = 0 ;
RLGL . State . vertexCounter = 0 ;
/ / Reset depth for next draw
batch - > currentDepth = - 1.0f ;
@ -2552,7 +2525,7 @@ bool rlCheckRenderBatchLimit(int vCount)
bool overflow = false ;
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
if ( ( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . v Counter + vCount ) > =
if ( ( RLGL . State . vertex Counter + vCount ) > =
( RLGL . currentBatch - > vertexBuffer [ RLGL . currentBatch - > currentBuffer ] . elementCount * 4 ) )
{
int currentMode = RLGL . currentBatch - > draws [ RLGL . currentBatch - > drawCounter - 1 ] . mode ;