move rendundant renderer code to be shared by all

This commit is contained in:
Chris Danford
2004-04-15 05:24:28 +00:00
parent feb14c6b84
commit 3dc41e5d94
7 changed files with 129 additions and 100 deletions
+75 -2
View File
@@ -168,7 +168,7 @@ void RageDisplay::DrawPolyLine(const RageSpriteVertex &p1, const RageSpriteVerte
} }
void RageDisplay::DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth ) void RageDisplay::DrawLineStripInternal( const RageSpriteVertex v[], int iNumVerts, float LineWidth )
{ {
ASSERT( iNumVerts >= 2 ); ASSERT( iNumVerts >= 2 );
@@ -184,7 +184,7 @@ void RageDisplay::DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, floa
DrawCircle( v[i], LineWidth/2 ); DrawCircle( v[i], LineWidth/2 );
} }
void RageDisplay::DrawCircle( const RageSpriteVertex &p, float radius ) void RageDisplay::DrawCircleInternal( const RageSpriteVertex &p, float radius )
{ {
const int subdivisions = 32; const int subdivisions = 32;
RageSpriteVertex v[subdivisions+2]; RageSpriteVertex v[subdivisions+2];
@@ -678,3 +678,76 @@ bool RageDisplay::SaveScreenshot( CString sPath, GraphicsFileFormat format )
return true; return true;
} }
void RageDisplay::DrawQuads( const RageSpriteVertex v[], int iNumVerts )
{
ASSERT( (iNumVerts%4) == 0 );
if(iNumVerts == 0)
return;
this->DrawQuadsInternal(v,iNumVerts);
StatsAddVerts(iNumVerts);
}
void RageDisplay::DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts )
{
ASSERT( (iNumVerts%2) == 0 );
if(iNumVerts < 4)
return;
this->DrawQuadStripInternal(v,iNumVerts);
StatsAddVerts(iNumVerts);
}
void RageDisplay::DrawFan( const RageSpriteVertex v[], int iNumVerts )
{
ASSERT( iNumVerts >= 3 );
this->DrawFanInternal(v,iNumVerts);
StatsAddVerts(iNumVerts);
}
void RageDisplay::DrawStrip( const RageSpriteVertex v[], int iNumVerts )
{
ASSERT( iNumVerts >= 3 );
this->DrawStripInternal(v,iNumVerts);
StatsAddVerts(iNumVerts);
}
void RageDisplay::DrawTriangles( const RageSpriteVertex v[], int iNumVerts )
{
if( iNumVerts == 0 )
return;
ASSERT( iNumVerts >= 3 );
this->DrawTrianglesInternal(v,iNumVerts);
StatsAddVerts(iNumVerts);
}
void RageDisplay::DrawIndexedTriangles( const RageModelVertexArray *p )
{
this->DrawIndexedTrianglesInternal(p);
StatsAddVerts(p->sizeTriangles()*3);
}
void RageDisplay::DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth )
{
ASSERT( iNumVerts >= 2 );
this->DrawLineStripInternal( v, iNumVerts, LineWidth );
}
void RageDisplay::DrawCircle( const RageSpriteVertex &v, float radius )
{
this->DrawCircleInternal( v, radius );
}
+18 -9
View File
@@ -209,17 +209,17 @@ public:
virtual RageModelVertexArray* CreateRageModelVertexArray() = 0; virtual RageModelVertexArray* CreateRageModelVertexArray() = 0;
virtual void DeleteRageModelVertexArray( RageModelVertexArray* p ) = 0; virtual void DeleteRageModelVertexArray( RageModelVertexArray* p ) = 0;
void DrawQuad( const RageSpriteVertex v[] ) { DrawQuads(v,4); } /* alias. upper-left, upper-right, lower-left, lower-right */ void DrawQuads( const RageSpriteVertex v[], int iNumVerts );
virtual void DrawQuads( const RageSpriteVertex v[], int iNumVerts ) = 0; void DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts );
virtual void DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts ) = 0; void DrawFan( const RageSpriteVertex v[], int iNumVerts );
virtual void DrawFan( const RageSpriteVertex v[], int iNumVerts ) = 0; void DrawStrip( const RageSpriteVertex v[], int iNumVerts );
virtual void DrawStrip( const RageSpriteVertex v[], int iNumVerts ) = 0; void DrawTriangles( const RageSpriteVertex v[], int iNumVerts );
virtual void DrawTriangles( const RageSpriteVertex v[], int iNumVerts ) = 0; void DrawIndexedTriangles( const RageModelVertexArray *p );
virtual void DrawIndexedTriangles( const RageModelVertexArray *p ) = 0; void DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth );
virtual void DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth );
void DrawCircle( const RageSpriteVertex &v, float radius ); void DrawCircle( const RageSpriteVertex &v, float radius );
void DrawQuad( const RageSpriteVertex v[] ) { DrawQuads(v,4); } /* alias. upper-left, upper-right, lower-left, lower-right */
enum GraphicsFileFormat enum GraphicsFileFormat
{ {
SAVE_LOSSLESS, // bmp SAVE_LOSSLESS, // bmp
@@ -231,6 +231,15 @@ public:
virtual CString GetTextureDiagnostics( unsigned id ) const { return ""; } virtual CString GetTextureDiagnostics( unsigned id ) const { return ""; }
protected: protected:
virtual void DrawQuadsInternal( const RageSpriteVertex v[], int iNumVerts ) = 0;
virtual void DrawQuadStripInternal( const RageSpriteVertex v[], int iNumVerts ) = 0;
virtual void DrawFanInternal( const RageSpriteVertex v[], int iNumVerts ) = 0;
virtual void DrawStripInternal( const RageSpriteVertex v[], int iNumVerts ) = 0;
virtual void DrawTrianglesInternal( const RageSpriteVertex v[], int iNumVerts ) = 0;
virtual void DrawIndexedTrianglesInternal( const RageModelVertexArray *p ) = 0;
virtual void DrawLineStripInternal( const RageSpriteVertex v[], int iNumVerts, float LineWidth );
virtual void DrawCircleInternal( const RageSpriteVertex &v, float radius );
// Return "" if mode change was successful, an error message otherwise. // Return "" if mode change was successful, an error message otherwise.
// bNewDeviceOut is set true if a new device was created and textures // bNewDeviceOut is set true if a new device was created and textures
// need to be reloaded. // need to be reloaded.
+6 -30
View File
@@ -826,13 +826,8 @@ void RageDisplay_D3D::DeleteRageModelVertexArray( RageModelVertexArray* p )
delete p; delete p;
} }
void RageDisplay_D3D::DrawQuads( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_D3D::DrawQuadsInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( (iNumVerts%4) == 0 );
if(iNumVerts == 0)
return;
// there isn't a quad primitive in D3D, so we have to fake it with indexed triangles // there isn't a quad primitive in D3D, so we have to fake it with indexed triangles
int iNumQuads = iNumVerts/4; int iNumQuads = iNumVerts/4;
int iNumTriangles = iNumQuads*2; int iNumTriangles = iNumQuads*2;
@@ -865,17 +860,10 @@ void RageDisplay_D3D::DrawQuads( const RageSpriteVertex v[], int iNumVerts )
v, // pVertexStreamZeroData, v, // pVertexStreamZeroData,
sizeof(RageSpriteVertex) // VertexStreamZeroStride sizeof(RageSpriteVertex) // VertexStreamZeroStride
); );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_D3D::DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_D3D::DrawQuadStripInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( (iNumVerts%2) == 0 );
if(iNumVerts < 4)
return;
// there isn't a quad strip primitive in D3D, so we have to fake it with indexed triangles // there isn't a quad strip primitive in D3D, so we have to fake it with indexed triangles
int iNumQuads = (iNumVerts-2)/2; int iNumQuads = (iNumVerts-2)/2;
int iNumTriangles = iNumQuads*2; int iNumTriangles = iNumQuads*2;
@@ -908,13 +896,10 @@ void RageDisplay_D3D::DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts )
v, // pVertexStreamZeroData, v, // pVertexStreamZeroData,
sizeof(RageSpriteVertex) // VertexStreamZeroStride sizeof(RageSpriteVertex) // VertexStreamZeroStride
); );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_D3D::DrawFan( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_D3D::DrawFanInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( iNumVerts >= 3 );
g_pd3dDevice->SetVertexShader( D3DFVF_RageSpriteVertex ); g_pd3dDevice->SetVertexShader( D3DFVF_RageSpriteVertex );
SEND_CURRENT_MATRICES; SEND_CURRENT_MATRICES;
g_pd3dDevice->DrawPrimitiveUP( g_pd3dDevice->DrawPrimitiveUP(
@@ -923,12 +908,10 @@ void RageDisplay_D3D::DrawFan( const RageSpriteVertex v[], int iNumVerts )
v, // pVertexStreamZeroData, v, // pVertexStreamZeroData,
sizeof(RageSpriteVertex) sizeof(RageSpriteVertex)
); );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_D3D::DrawStrip( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_D3D::DrawStripInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( iNumVerts >= 3 );
g_pd3dDevice->SetVertexShader( D3DFVF_RageSpriteVertex ); g_pd3dDevice->SetVertexShader( D3DFVF_RageSpriteVertex );
SEND_CURRENT_MATRICES; SEND_CURRENT_MATRICES;
g_pd3dDevice->DrawPrimitiveUP( g_pd3dDevice->DrawPrimitiveUP(
@@ -937,14 +920,10 @@ void RageDisplay_D3D::DrawStrip( const RageSpriteVertex v[], int iNumVerts )
v, // pVertexStreamZeroData, v, // pVertexStreamZeroData,
sizeof(RageSpriteVertex) sizeof(RageSpriteVertex)
); );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_D3D::DrawTriangles( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_D3D::DrawTrianglesInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
if( iNumVerts == 0 )
return;
ASSERT( iNumVerts >= 3 );
g_pd3dDevice->SetVertexShader( D3DFVF_RageSpriteVertex ); g_pd3dDevice->SetVertexShader( D3DFVF_RageSpriteVertex );
SEND_CURRENT_MATRICES; SEND_CURRENT_MATRICES;
g_pd3dDevice->DrawPrimitiveUP( g_pd3dDevice->DrawPrimitiveUP(
@@ -953,16 +932,13 @@ void RageDisplay_D3D::DrawTriangles( const RageSpriteVertex v[], int iNumVerts )
v, // pVertexStreamZeroData, v, // pVertexStreamZeroData,
sizeof(RageSpriteVertex) sizeof(RageSpriteVertex)
); );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_D3D::DrawIndexedTriangles( const RageModelVertexArray *p ) void RageDisplay_D3D::DrawIndexedTrianglesInternal( const RageModelVertexArray *p )
{ {
SEND_CURRENT_MATRICES; SEND_CURRENT_MATRICES;
p->Draw(); p->Draw();
StatsAddVerts( p->sizeTriangles()*3 );
} }
/* Use the default poly-based implementation. D3D lines apparently don't support /* Use the default poly-based implementation. D3D lines apparently don't support
+7 -8
View File
@@ -78,15 +78,14 @@ public:
RageModelVertexArray* CreateRageModelVertexArray(); RageModelVertexArray* CreateRageModelVertexArray();
void DeleteRageModelVertexArray( RageModelVertexArray* p ); void DeleteRageModelVertexArray( RageModelVertexArray* p );
void DrawQuads( const RageSpriteVertex v[], int iNumVerts );
void DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts );
void DrawFan( const RageSpriteVertex v[], int iNumVerts );
void DrawStrip( const RageSpriteVertex v[], int iNumVerts );
void DrawTriangles( const RageSpriteVertex v[], int iNumVerts );
void DrawIndexedTriangles( const RageModelVertexArray *p );
// void DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth );
protected: protected:
void DrawQuadsInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawQuadStripInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawFanInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawStripInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawTrianglesInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawIndexedTrianglesInternal( const RageModelVertexArray *p );
CString TryVideoMode( VideoModeParams params, bool &bNewDeviceOut ); CString TryVideoMode( VideoModeParams params, bool &bNewDeviceOut );
SDL_Surface* CreateScreenshot(); SDL_Surface* CreateScreenshot();
void SetViewport(int shift_left, int shift_down); void SetViewport(int shift_left, int shift_down);
+8 -8
View File
@@ -63,15 +63,15 @@ public:
RageModelVertexArray* CreateRageModelVertexArray(); RageModelVertexArray* CreateRageModelVertexArray();
void DeleteRageModelVertexArray( RageModelVertexArray* p ); void DeleteRageModelVertexArray( RageModelVertexArray* p );
void DrawQuads( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawFan( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawStrip( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawTriangles( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawIndexedTriangles( const RageModelVertexArray *p ) { }
void DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth ) { }
protected: protected:
void DrawQuadsInternal( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawQuadStripInternal( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawFanInternal( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawStripInternal( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawTrianglesInternal( const RageSpriteVertex v[], int iNumVerts ) { }
void DrawIndexedTrianglesInternal( const RageModelVertexArray *p ) { }
void DrawLineStripInternal( const RageSpriteVertex v[], int iNumVerts, float LineWidth ) { }
VideoModeParams m_Params; VideoModeParams m_Params;
CString TryVideoMode( VideoModeParams params, bool &bNewDeviceOut ) { m_Params = params; return ""; } CString TryVideoMode( VideoModeParams params, bool &bNewDeviceOut ) { m_Params = params; return ""; }
SDL_Surface* CreateScreenshot(); SDL_Surface* CreateScreenshot();
+7 -35
View File
@@ -1146,85 +1146,57 @@ void RageDisplay_OGL::DeleteRageModelVertexArray( RageModelVertexArray* p )
delete p; delete p;
} }
void RageDisplay_OGL::DrawQuads( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_OGL::DrawQuadsInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( (iNumVerts%4) == 0 );
if(iNumVerts == 0)
return;
SendCurrentMatrices(); SendCurrentMatrices();
SetupVertices( v, iNumVerts ); SetupVertices( v, iNumVerts );
glDrawArrays( GL_QUADS, 0, iNumVerts ); glDrawArrays( GL_QUADS, 0, iNumVerts );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_OGL::DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_OGL::DrawQuadStripInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( (iNumVerts%2) == 0 );
if(iNumVerts < 4)
return;
SendCurrentMatrices(); SendCurrentMatrices();
SetupVertices( v, iNumVerts ); SetupVertices( v, iNumVerts );
glDrawArrays( GL_QUAD_STRIP, 0, iNumVerts ); glDrawArrays( GL_QUAD_STRIP, 0, iNumVerts );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_OGL::DrawFan( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_OGL::DrawFanInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( iNumVerts >= 3 );
glMatrixMode( GL_PROJECTION ); glMatrixMode( GL_PROJECTION );
SendCurrentMatrices(); SendCurrentMatrices();
SetupVertices( v, iNumVerts ); SetupVertices( v, iNumVerts );
glDrawArrays( GL_TRIANGLE_FAN, 0, iNumVerts ); glDrawArrays( GL_TRIANGLE_FAN, 0, iNumVerts );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_OGL::DrawStrip( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_OGL::DrawStripInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
ASSERT( iNumVerts >= 3 );
SendCurrentMatrices(); SendCurrentMatrices();
SetupVertices( v, iNumVerts ); SetupVertices( v, iNumVerts );
glDrawArrays( GL_TRIANGLE_STRIP, 0, iNumVerts ); glDrawArrays( GL_TRIANGLE_STRIP, 0, iNumVerts );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_OGL::DrawTriangles( const RageSpriteVertex v[], int iNumVerts ) void RageDisplay_OGL::DrawTrianglesInternal( const RageSpriteVertex v[], int iNumVerts )
{ {
if( iNumVerts == 0 )
return;
ASSERT( (iNumVerts%3) == 0 );
SendCurrentMatrices(); SendCurrentMatrices();
SetupVertices( v, iNumVerts ); SetupVertices( v, iNumVerts );
glDrawArrays( GL_TRIANGLES, 0, iNumVerts ); glDrawArrays( GL_TRIANGLES, 0, iNumVerts );
StatsAddVerts( iNumVerts );
} }
void RageDisplay_OGL::DrawIndexedTriangles( const RageModelVertexArray *p ) void RageDisplay_OGL::DrawIndexedTrianglesInternal( const RageModelVertexArray *p )
{ {
SendCurrentMatrices(); SendCurrentMatrices();
p->Draw(); p->Draw();
StatsAddVerts( p->sizeTriangles()*3 );
} }
void RageDisplay_OGL::DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth ) void RageDisplay_OGL::DrawLineStripInternal( const RageSpriteVertex v[], int iNumVerts, float LineWidth )
{ {
ASSERT( iNumVerts >= 2 );
if( !GetVideoModeParams().bSmoothLines ) if( !GetVideoModeParams().bSmoothLines )
{ {
RageDisplay::DrawLineStrip(v, iNumVerts, LineWidth ); RageDisplay::DrawLineStrip(v, iNumVerts, LineWidth );
+8 -8
View File
@@ -64,17 +64,17 @@ public:
RageModelVertexArray* CreateRageModelVertexArray(); RageModelVertexArray* CreateRageModelVertexArray();
void DeleteRageModelVertexArray( RageModelVertexArray* p ); void DeleteRageModelVertexArray( RageModelVertexArray* p );
void DrawQuads( const RageSpriteVertex v[], int iNumVerts );
void DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts );
void DrawFan( const RageSpriteVertex v[], int iNumVerts );
void DrawStrip( const RageSpriteVertex v[], int iNumVerts );
void DrawTriangles( const RageSpriteVertex v[], int iNumVerts );
void DrawIndexedTriangles( const RageModelVertexArray *p );
void DrawLineStrip( const RageSpriteVertex v[], int iNumVerts, float LineWidth );
CString GetTextureDiagnostics( unsigned id ) const; CString GetTextureDiagnostics( unsigned id ) const;
protected: protected:
void DrawQuadsInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawQuadStripInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawFanInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawStripInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawTrianglesInternal( const RageSpriteVertex v[], int iNumVerts );
void DrawIndexedTrianglesInternal( const RageModelVertexArray *p );
void DrawLineStripInternal( const RageSpriteVertex v[], int iNumVerts, float LineWidth );
CString TryVideoMode( VideoModeParams params, bool &bNewDeviceOut ); CString TryVideoMode( VideoModeParams params, bool &bNewDeviceOut );
SDL_Surface* CreateScreenshot(); SDL_Surface* CreateScreenshot();
void SetViewport(int shift_left, int shift_down); void SetViewport(int shift_left, int shift_down);