@ -279,7 +279,56 @@ namespace lunarium
void Renderer2D : : DrawEllipseFilled ( glm : : vec2 center_point , glm : : vec2 radii , Color color , int resolution , float angle )
void Renderer2D : : DrawEllipseFilled ( glm : : vec2 center_point , glm : : vec2 radii , Color color , int resolution , float angle )
{
{
float stride = 362.0f / resolution ;
u32 idx_offset = mEllipseData . VertexBuffer - > GetNumVerts ( ) ;
mEllipseData . verts [ 0 ] . pos = center_point ;
mEllipseData . verts [ 0 ] . color = color ;
mEllipseData . indices [ 0 ] = idx_offset ;
float cur_deg = 0.0f ;
int cur_idx = 0 ;
for ( int i = 1 ; i < = resolution ; i + + , cur_deg + = stride )
{
float rad = cur_deg * 3.14159f / 180.0f ;
mEllipseData . verts [ i ] . pos . x = center_point . x + ( radii . x * cos ( rad ) ) ;
mEllipseData . verts [ i ] . pos . y = center_point . y + ( radii . y * sin ( rad ) ) ;
mEllipseData . verts [ i ] . color = color ;
if ( i = = 1 )
{
mEllipseData . indices [ cur_idx ] = idx_offset ;
mEllipseData . indices [ cur_idx + 1 ] = idx_offset + 1 ;
mEllipseData . indices [ cur_idx + 2 ] = idx_offset + 2 ;
cur_idx + = 3 ;
}
else if ( i = = resolution )
{
mEllipseData . indices [ cur_idx ] = idx_offset ;
mEllipseData . indices [ cur_idx + 1 ] = mEllipseData . indices [ cur_idx - 1 ] ;
mEllipseData . indices [ cur_idx + 2 ] = idx_offset + 1 ;
cur_idx + = 3 ;
}
else
{
mEllipseData . indices [ cur_idx ] = idx_offset ;
mEllipseData . indices [ cur_idx + 1 ] = mEllipseData . indices [ cur_idx - 1 ] ;
mEllipseData . indices [ cur_idx + 2 ] = mEllipseData . indices [ cur_idx - 1 ] + 1 ;
cur_idx + = 3 ;
}
}
mEllipseData . VertexBuffer - > PushVertices ( ( void * ) mEllipseData . verts , resolution + 1 ) ;
mEllipseData . VertexBuffer - > PushIndices ( mEllipseData . indices , cur_idx ) ;
mEllipseData . NumEllipses + + ;
mEllipseData . NumVerts + = resolution + 1 ;
mEllipseData . NumIndices + = cur_idx ;
// Update render stats
mFrameStats . NumTris + = cur_idx / 3 ;
mFrameStats . NumVerts + = resolution ;
}
}
void Renderer2D : : DrawString ( const char * string , Rectangle bounding_box , Color color , float scale , int font )
void Renderer2D : : DrawString ( const char * string , Rectangle bounding_box , Color color , float scale , int font )
@ -318,7 +367,7 @@ namespace lunarium
mQuadData . QuadShader - > SetUniform ( uprojview , ( void * ) glm : : value_ptr ( mpCamera - > GetViewProjection ( ) ) ) . LogIfFailed ( LogCategory : : GRAPHICS ) ;
mQuadData . QuadShader - > SetUniform ( uprojview , ( void * ) glm : : value_ptr ( mpCamera - > GetViewProjection ( ) ) ) . LogIfFailed ( LogCategory : : GRAPHICS ) ;
mQuadData . VertexBuffer - > Bind ( ) ;
//mQuadData.VertexBuffer->Bind();
mQuadData . VertexBuffer - > DrawArray ( mQuadData . NumQuads * 6 ) ;
mQuadData . VertexBuffer - > DrawArray ( mQuadData . NumQuads * 6 ) ;
@ -365,7 +414,7 @@ namespace lunarium
mLineData . Shader - > SetUniform ( uprojview , ( void * ) glm : : value_ptr ( mpCamera - > GetViewProjection ( ) ) ) . LogIfFailed ( LogCategory : : GRAPHICS ) ;
mLineData . Shader - > SetUniform ( uprojview , ( void * ) glm : : value_ptr ( mpCamera - > GetViewProjection ( ) ) ) . LogIfFailed ( LogCategory : : GRAPHICS ) ;
mLineData . VertexBuffer - > Bind ( ) ;
//mLineData.VertexBuffer->Bind();
//glDrawElements(GL_LINES, mLineData.NumLines * 2, GL_UNSIGNED_INT, nullptr);
//glDrawElements(GL_LINES, mLineData.NumLines * 2, GL_UNSIGNED_INT, nullptr);
glLineWidth ( mLineData . Thickness ) ;
glLineWidth ( mLineData . Thickness ) ;
@ -379,6 +428,19 @@ namespace lunarium
if ( mEllipseData . NumEllipses > 0 & & flush_mode & FlushMode : : Ellipses > 0 )
if ( mEllipseData . NumEllipses > 0 & & flush_mode & FlushMode : : Ellipses > 0 )
{
{
mEllipseData . MarkedForReset = true ;
mEllipseData . MarkedForReset = true ;
mEllipseData . Shader - > Use ( ) ;
Uniform uprojview ;
uprojview . Type = UniformType : : FMAT4 ;
uprojview . Location = - 1 ;
uprojview . Name = " projview " ;
mEllipseData . Shader - > SetUniform ( uprojview , ( void * ) glm : : value_ptr ( mpCamera - > GetViewProjection ( ) ) ) . LogIfFailed ( LogCategory : : GRAPHICS ) ;
// mEllipseData.VertexBuffer->Bind();
mEllipseData . VertexBuffer - > DrawArray ( ) ;
mFrameStats . DrawCalls + + ;
}
}
// Reset drawing data
// Reset drawing data
@ -503,7 +565,14 @@ namespace lunarium
" EllipseData::Vertex struct size does not match the vertex layout size! struct: %d, layout: %d " , struct_size , layout_size ) ;
" EllipseData::Vertex struct size does not match the vertex layout size! struct: %d, layout: %d " , struct_size , layout_size ) ;
}
}
// Shader
std : : string vert_source = File : : ReadTextFile ( " ellipse.vert " ) ;
std : : string frag_source = File : : ReadTextFile ( " ellipse.frag " ) ;
mEllipseData . Shader = new Shader ( vert_source . c_str ( ) , nullptr , frag_source . c_str ( ) ) ;
if ( ! mEllipseData . Shader - > IsValid ( ) )
{
return OpRes : : Fail ( " Failed to create the ellipse shader " ) ;
}
return OpRes : : OK ( ) ;
return OpRes : : OK ( ) ;
}
}
@ -544,6 +613,11 @@ namespace lunarium
// Reset Ellipse Data
// Reset Ellipse Data
if ( mEllipseData . MarkedForReset )
if ( mEllipseData . MarkedForReset )
{
{
mEllipseData . NumEllipses = 0 ;
mEllipseData . NumVerts = 0 ;
mEllipseData . NumIndices = 0 ;
mEllipseData . VertexBuffer - > Clear ( ) ;
mEllipseData . MarkedForReset = false ;
mEllipseData . MarkedForReset = false ;
}
}