From 8c8e449922fac58260d402b03f17a9a7f66cf06a Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Tue, 13 Apr 2004 07:28:25 +0000 Subject: [PATCH] add DrawQuadStrip --- stepmania/src/RageDisplay.h | 1 + stepmania/src/RageDisplay_D3D.cpp | 44 +++++++++++++++++++++++++++++++ stepmania/src/RageDisplay_D3D.h | 1 + stepmania/src/RageDisplay_Null.h | 1 + stepmania/src/RageDisplay_OGL.cpp | 15 +++++++++++ stepmania/src/RageDisplay_OGL.h | 1 + 6 files changed, 63 insertions(+) diff --git a/stepmania/src/RageDisplay.h b/stepmania/src/RageDisplay.h index cd4d2f1468..99889cd0a0 100644 --- a/stepmania/src/RageDisplay.h +++ b/stepmania/src/RageDisplay.h @@ -211,6 +211,7 @@ public: void DrawQuad( const RageSpriteVertex v[] ) { DrawQuads(v,4); } /* alias. upper-left, upper-right, lower-left, lower-right */ virtual void DrawQuads( const RageSpriteVertex v[], int iNumVerts ) = 0; + virtual void DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts ) = 0; virtual void DrawFan( const RageSpriteVertex v[], int iNumVerts ) = 0; virtual void DrawStrip( const RageSpriteVertex v[], int iNumVerts ) = 0; virtual void DrawTriangles( const RageSpriteVertex v[], int iNumVerts ) = 0; diff --git a/stepmania/src/RageDisplay_D3D.cpp b/stepmania/src/RageDisplay_D3D.cpp index 1180471390..637e349d9f 100644 --- a/stepmania/src/RageDisplay_D3D.cpp +++ b/stepmania/src/RageDisplay_D3D.cpp @@ -868,6 +868,50 @@ void RageDisplay_D3D::DrawQuads( const RageSpriteVertex v[], int iNumVerts ) StatsAddVerts( iNumVerts ); } + +void RageDisplay_D3D::DrawQuadStrip( 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 + int iNumQuads = (iNumVerts-2)/2; + int iNumTriangles = iNumQuads*2; + int iNumIndices = iNumTriangles*3; + + // make a temporary index buffer + static vector vIndices; + unsigned uOldSize = vIndices.size(); + unsigned uNewSize = max(uOldSize,(unsigned)iNumIndices); + vIndices.resize( uNewSize ); + for( Uint16 i=(Uint16)uOldSize/6; i<(Uint16)iNumQuads; i++ ) + { + vIndices[i*6+0] = i*2+0; + vIndices[i*6+1] = i*2+1; + vIndices[i*6+2] = i*2+2; + vIndices[i*6+3] = i*2+1; + vIndices[i*6+4] = i*2+2; + vIndices[i*6+5] = i*2+3; + } + + g_pd3dDevice->SetVertexShader( D3DFVF_RageSpriteVertex ); + SEND_CURRENT_MATRICES; + g_pd3dDevice->DrawIndexedPrimitiveUP( + D3DPT_TRIANGLELIST, // PrimitiveType + 0, // MinIndex + iNumVerts, // NumVertices + iNumTriangles, // PrimitiveCount, + &vIndices[0], // pIndexData, + D3DFMT_INDEX16, // IndexDataFormat, + v, // pVertexStreamZeroData, + sizeof(RageSpriteVertex) // VertexStreamZeroStride + ); + + StatsAddVerts( iNumVerts ); +} + void RageDisplay_D3D::DrawFan( const RageSpriteVertex v[], int iNumVerts ) { ASSERT( iNumVerts >= 3 ); diff --git a/stepmania/src/RageDisplay_D3D.h b/stepmania/src/RageDisplay_D3D.h index 05c19ff549..83f234125d 100644 --- a/stepmania/src/RageDisplay_D3D.h +++ b/stepmania/src/RageDisplay_D3D.h @@ -79,6 +79,7 @@ public: 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 ); diff --git a/stepmania/src/RageDisplay_Null.h b/stepmania/src/RageDisplay_Null.h index a3043f0dd9..3fc40ecbfa 100644 --- a/stepmania/src/RageDisplay_Null.h +++ b/stepmania/src/RageDisplay_Null.h @@ -64,6 +64,7 @@ public: 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 ) { } diff --git a/stepmania/src/RageDisplay_OGL.cpp b/stepmania/src/RageDisplay_OGL.cpp index 114fd74ae8..fe1e32e8e4 100644 --- a/stepmania/src/RageDisplay_OGL.cpp +++ b/stepmania/src/RageDisplay_OGL.cpp @@ -1150,6 +1150,21 @@ void RageDisplay_OGL::DrawQuads( const RageSpriteVertex v[], int iNumVerts ) StatsAddVerts( iNumVerts ); } +void RageDisplay_OGL::DrawQuadStrip( const RageSpriteVertex v[], int iNumVerts ) +{ + ASSERT( (iNumVerts%2) == 0 ); + + if(iNumVerts < 4) + return; + + SendCurrentMatrices(); + + SetupVertices( v, iNumVerts ); + glDrawArrays( GL_QUAD_STRIP, 0, iNumVerts ); + + StatsAddVerts( iNumVerts ); +} + void RageDisplay_OGL::DrawFan( const RageSpriteVertex v[], int iNumVerts ) { ASSERT( iNumVerts >= 3 ); diff --git a/stepmania/src/RageDisplay_OGL.h b/stepmania/src/RageDisplay_OGL.h index 6bdf925778..c2df98c23f 100644 --- a/stepmania/src/RageDisplay_OGL.h +++ b/stepmania/src/RageDisplay_OGL.h @@ -65,6 +65,7 @@ public: 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 );