diff --git a/stepmania/src/RageDisplay.cpp b/stepmania/src/RageDisplay.cpp index bd792656db..3cb9837ecc 100644 --- a/stepmania/src/RageDisplay.cpp +++ b/stepmania/src/RageDisplay.cpp @@ -30,8 +30,6 @@ RageDisplay* DISPLAY = NULL; //////////// const int MAX_NUM_VERTICIES = 1000; SDL_Surface *g_screen = NULL; // this class is a singleton, so there can be only one -vector g_matModelStack; // model matrix stack -RageMatrix& GetTopModelMatrix() { return g_matModelStack.back(); } int g_flags = 0; /* SDL video flags */ GLenum g_vertMode = GL_TRIANGLES; RageVertex g_vertQueue[MAX_NUM_VERTICIES]; @@ -42,7 +40,7 @@ int g_iFPS, g_iVPF, g_iDPF; int g_PerspectiveMode = 0; int g_CurrentHeight, g_CurrentWidth, g_CurrentBPP; - +int g_ModelMatrixCnt=0; int RageDisplay::GetFPS() const { return g_iFPS; } int RageDisplay::GetVPF() const { return g_iVPF; } int RageDisplay::GetDPF() const { return g_iDPF; } @@ -67,7 +65,6 @@ void GetGLExtensions(set &ext) RageDisplay::RageDisplay( bool windowed, int width, int height, int bpp, int rate, bool vsync ) { // LOG->Trace( "RageDisplay::RageDisplay()" ); - m_oglspecs = new oglspecs_t; SDL_InitSubSystem(SDL_INIT_VIDEO); @@ -404,7 +401,9 @@ void RageDisplay::DrawLoop( const RageVertex v[], int iNumVerts, float LineWidth * if both scale factors in the matrix are ~0. (Actually, I think * it's true if two of the three scale factors are ~0, but we don't * use this for anything 3d at the moment anyway ...) */ - RageMatrix &mat = GetTopModelMatrix(); + RageMatrix mat; + glGetFloatv( GL_MODELVIEW_MATRIX, (float*)mat ); + if(mat.m[0][0] < 1e-5 && mat.m[1][1] < 1e-5) return; @@ -425,8 +424,7 @@ void RageDisplay::AddVerts( const RageVertex v[], int iNumVerts ) if( g_iNumVerts+1 > MAX_NUM_VERTICIES ) FlushQueue(); - // transform the verticies as we copy - RageVec3TransformCoord( &g_vertQueue[g_iNumVerts].p, &v[i].p, &GetTopModelMatrix() ); + g_vertQueue[g_iNumVerts].p = v[i].p; g_vertQueue[g_iNumVerts].c = v[i].c; g_vertQueue[g_iNumVerts].t = v[i].t; g_iNumVerts++; @@ -447,24 +445,16 @@ void RageDisplay::FlushQueue() g_iDrawsSinceLastCheck++; } -void RageDisplay::ResetMatrixStack() -{ - RageMatrix ident; - RageMatrixIdentity( &ident ); - g_matModelStack.clear(); - g_matModelStack.push_back(ident); -} - void RageDisplay::PushMatrix() { - g_matModelStack.push_back( GetTopModelMatrix() ); - ASSERT(g_matModelStack.size()<20); // check for infinite loop + glPushMatrix(); + ASSERT(++g_ModelMatrixCnt<20); } void RageDisplay::PopMatrix() { - g_matModelStack.erase( g_matModelStack.end()-1, g_matModelStack.end() ); - ASSERT(g_matModelStack.size()>=1); // popped a matrix we didn't push + glPopMatrix(); + ASSERT(g_ModelMatrixCnt-->0); } /* Switch from orthogonal to perspective view. @@ -508,7 +498,9 @@ void RageDisplay::EnterPerspective(float fov, bool preserve_loc) glScalef(1, -1, 1); if(preserve_loc) { - RageMatrix &matTop = GetTopModelMatrix(); + RageMatrix matTop; + glGetFloatv( GL_MODELVIEW_MATRIX, (float*)matTop ); + { /* Pull out the 2d translation. */ float x = matTop.m[3][0], y = matTop.m[3][1]; @@ -539,7 +531,7 @@ void RageDisplay::EnterPerspective(float fov, bool preserve_loc) matTop.m[2][2] == 1.f && matTop.m[3][2] == 0.f && matTop.m[3][3] == 1.f); /* Reset the matrix back to identity. */ - RageMatrixIdentity( &matTop ); + glLoadIdentity(); } glMatrixMode( GL_MODELVIEW ); @@ -573,62 +565,49 @@ void RageDisplay::LookAt(const RageVector3 &Eye, const RageVector3 &At, const Ra glGetFloatv( GL_MODELVIEW_MATRIX, (float*)view ); /* cheesy :) */ glPopMatrix(); - RageMatrix& matTop = GetTopModelMatrix(); - RageMatrixMultiply( &matTop, &view, &matTop ); + smPostMultMatrixf(view); } void RageDisplay::Translate( float x, float y, float z ) { - RageMatrix matTemp; - RageMatrixTranslation( &matTemp, x, y, z ); - - RageMatrix& matTop = GetTopModelMatrix(); - RageMatrixMultiply( &matTop, &matTemp, &matTop ); + glTranslatef(x, y, z); } + void RageDisplay::TranslateLocal( float x, float y, float z ) { RageMatrix matTemp; RageMatrixTranslation( &matTemp, x, y, z ); - RageMatrix& matTop = GetTopModelMatrix(); - RageMatrixMultiply( &matTop, &matTop, &matTemp ); + smPostMultMatrixf(matTemp); } void RageDisplay::Scale( float x, float y, float z ) { - RageMatrix matTemp; - RageMatrixScaling( &matTemp, x, y, z ); - - RageMatrix& matTop = GetTopModelMatrix(); - RageMatrixMultiply( &matTop, &matTemp, &matTop ); + glScalef(x, y, z); } void RageDisplay::RotateX( float r ) { - RageMatrix matTemp; - RageMatrixRotationX( &matTemp, r ); - - RageMatrix& matTop = GetTopModelMatrix(); - RageMatrixMultiply( &matTop, &matTemp, &matTop ); + glRotatef(r* 180/PI, 1, 0, 0); } void RageDisplay::RotateY( float r ) { - RageMatrix matTemp; - RageMatrixRotationY( &matTemp, r ); - - RageMatrix& matTop = GetTopModelMatrix(); - RageMatrixMultiply( &matTop, &matTemp, &matTop ); + glRotatef(r* 180/PI, 0, 1, 0); } void RageDisplay::RotateZ( float r ) { - RageMatrix matTemp; - RageMatrixRotationZ( &matTemp, r ); + glRotatef(r* 180/PI, 0, 0, 1); +} - RageMatrix& matTop = GetTopModelMatrix(); - RageMatrixMultiply( &matTop, &matTemp, &matTop ); +void RageDisplay::smPostMultMatrixf( const RageMatrix &f ) +{ + RageMatrix m; + glGetFloatv( GL_MODELVIEW_MATRIX, (float*)m ); + RageMatrixMultiply( &m, &f, &m ); + glLoadMatrixf((const float*) m); } void RageDisplay::SetTexture( RageTexture* pTexture ) diff --git a/stepmania/src/RageDisplay.h b/stepmania/src/RageDisplay.h index 8e86e45da1..00bdd3b8ac 100644 --- a/stepmania/src/RageDisplay.h +++ b/stepmania/src/RageDisplay.h @@ -41,7 +41,6 @@ public: int GetHeight() const; int GetBPP() const; - void ResetMatrixStack(); void PushMatrix(); void PopMatrix(); void Translate( float x, float y, float z ); @@ -50,6 +49,7 @@ public: void RotateX( float r ); void RotateY( float r ); void RotateZ( float r ); + void smPostMultMatrixf( const RageMatrix &f ); void SetTexture( RageTexture* pTexture ); diff --git a/stepmania/src/StepMania.cpp b/stepmania/src/StepMania.cpp index b52a053fd3..f86cc9c75e 100644 --- a/stepmania/src/StepMania.cpp +++ b/stepmania/src/StepMania.cpp @@ -436,7 +436,6 @@ static void GameLoop() * Render */ DISPLAY->Clear(); - DISPLAY->ResetMatrixStack(); SCREENMAN->Draw(); // draw the game