@ -728,6 +728,7 @@ typedef struct DynamicBuffer {
typedef struct DrawCall {
int mode ; / / Drawing mode : LINES , TRIANGLES , QUADS
int vertexCount ; / / Number of vertex of the draw
int vertexAlignment ; / / Number of vertex required for index alignment ( LINES , TRIANGLES )
/ / unsigned int vaoId ; / / Vertex Array id to be used on the draw
/ / unsigned int shaderId ; / / Shader id to be used on the draw
unsigned int textureId ; / / Texture id to be used on the draw
@ -1123,7 +1124,27 @@ void rlBegin(int mode)
/ / NOTE : In all three cases , vertex are accumulated over default internal vertex buffer
if ( draws [ drawsCounter - 1 ] . mode ! = mode )
{
if ( draws [ drawsCounter - 1 ] . vertexCount > 0 ) drawsCounter + + ;
if ( draws [ drawsCounter - 1 ] . vertexCount > 0 )
{
/ / Make sure current draws [ i ] . vertexCount is aligned a multiple of 4 ,
/ / that way , following QUADS drawing will keep aligned with index processing
/ / It implies adding some extra alignment vertex at the end of the draw ,
/ / those vertex are not processed but they are considered as an additional offset
/ / for the next set of vertex to be drawn
if ( draws [ drawsCounter - 1 ] . mode = = RL_LINES ) draws [ drawsCounter - 1 ] . vertexAlignment = ( ( draws [ drawsCounter - 1 ] . vertexCount < 4 ) ? draws [ drawsCounter - 1 ] . vertexCount : draws [ drawsCounter - 1 ] . vertexCount % 4 ) ;
else if ( draws [ drawsCounter - 1 ] . mode = = RL_TRIANGLES ) draws [ drawsCounter - 1 ] . vertexAlignment = ( ( draws [ drawsCounter - 1 ] . vertexCount < 4 ) ? 1 : ( 4 - ( draws [ drawsCounter - 1 ] . vertexCount % 4 ) ) ) ;
if ( rlCheckBufferLimit ( draws [ drawsCounter - 1 ] . vertexAlignment ) ) rlglDraw ( ) ;
else
{
vertexData [ currentBuffer ] . vCounter + = draws [ drawsCounter - 1 ] . vertexAlignment ;
vertexData [ currentBuffer ] . cCounter + = draws [ drawsCounter - 1 ] . vertexAlignment ;
vertexData [ currentBuffer ] . tcCounter + = draws [ drawsCounter - 1 ] . vertexAlignment ;
drawsCounter + + ;
}
}
if ( drawsCounter > = MAX_DRAWCALL_REGISTERED ) rlglDraw ( ) ;
draws [ drawsCounter - 1 ] . mode = mode ;
@ -1135,15 +1156,6 @@ void rlBegin(int mode)
/ / Finish vertex providing
void rlEnd ( void )
{
/ / Make sure current draws [ i ] . vertexCount is multiple of 4 , to align with index processing
/ / NOTE : It implies adding some extra vertex at the end of the draw , those vertex will be
/ / processed but are placed in a single point to not result in a fragment output . . .
/ / TODO : System could be improved ( a bit ) just storing every draw alignment value
/ / and adding it to vertexOffset on drawing . . . maybe in a future . . .
int vertexCount = draws [ drawsCounter - 1 ] . vertexCount ;
int vertexToAlign = ( vertexCount > = 4 ) ? vertexCount % 4 : ( 4 - vertexCount % 4 ) ;
for ( int i = 0 ; i < vertexToAlign ; i + + ) rlVertex3f ( - 1 , - 1 , - 1 ) ;
/ / 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
@ -1283,7 +1295,27 @@ void rlEnableTexture(unsigned int id)
# if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
if ( draws [ drawsCounter - 1 ] . textureId ! = id )
{
if ( draws [ drawsCounter - 1 ] . vertexCount > 0 ) drawsCounter + + ;
if ( draws [ drawsCounter - 1 ] . vertexCount > 0 )
{
/ / Make sure current draws [ i ] . vertexCount is aligned a multiple of 4 ,
/ / that way , following QUADS drawing will keep aligned with index processing
/ / It implies adding some extra alignment vertex at the end of the draw ,
/ / those vertex are not processed but they are considered as an additional offset
/ / for the next set of vertex to be drawn
if ( draws [ drawsCounter - 1 ] . mode = = RL_LINES ) draws [ drawsCounter - 1 ] . vertexAlignment = ( ( draws [ drawsCounter - 1 ] . vertexCount < 4 ) ? draws [ drawsCounter - 1 ] . vertexCount : draws [ drawsCounter - 1 ] . vertexCount % 4 ) ;
else if ( draws [ drawsCounter - 1 ] . mode = = RL_TRIANGLES ) draws [ drawsCounter - 1 ] . vertexAlignment = ( ( draws [ drawsCounter - 1 ] . vertexCount < 4 ) ? 1 : ( 4 - ( draws [ drawsCounter - 1 ] . vertexCount % 4 ) ) ) ;
if ( rlCheckBufferLimit ( draws [ drawsCounter - 1 ] . vertexAlignment ) ) rlglDraw ( ) ;
else
{
vertexData [ currentBuffer ] . vCounter + = draws [ drawsCounter - 1 ] . vertexAlignment ;
vertexData [ currentBuffer ] . cCounter + = draws [ drawsCounter - 1 ] . vertexAlignment ;
vertexData [ currentBuffer ] . tcCounter + = draws [ drawsCounter - 1 ] . vertexAlignment ;
drawsCounter + + ;
}
}
if ( drawsCounter > = MAX_DRAWCALL_REGISTERED ) rlglDraw ( ) ;
draws [ drawsCounter - 1 ] . textureId = id ;
@ -1682,6 +1714,7 @@ void rlglInit(int width, int height)
{
draws [ i ] . mode = RL_QUADS ;
draws [ i ] . vertexCount = 0 ;
draws [ i ] . vertexAlignment = 0 ;
/ / draws [ i ] . vaoId = 0 ;
/ / draws [ i ] . shaderId = 0 ;
draws [ i ] . textureId = defaultTextureId ;
@ -4190,8 +4223,8 @@ static void DrawBuffersDefault(void)
glDrawElements ( GL_TRIANGLES , draws [ i ] . vertexCount / 4 * 6 , GL_UNSIGNED_SHORT , ( GLvoid * ) ( sizeof ( GLushort ) * vertexOffset / 4 * 6 ) ) ;
# endif
}
vertexOffset + = draws [ i ] . vertexCount ;
vertexOffset + = p">( draws [ i ] . vertexCount + draws [ i ] . vertexAlignment ) ;
}
if ( ! vaoSupported )