diff --git a/stepmania/src/RageDisplay.cpp b/stepmania/src/RageDisplay.cpp index 58da5826cd..49687eaada 100644 --- a/stepmania/src/RageDisplay.cpp +++ b/stepmania/src/RageDisplay.cpp @@ -784,10 +784,11 @@ void RageCompiledGeometry::Set( const vector &vMeshes, bool bNeedsNormal { m_bNeedsNormals = bNeedsNormals; - m_bNeedsTextureMatrixScale = false; size_t totalVerts = 0; size_t totalTriangles = 0; + m_bAnyNeedsTextureMatrixScale = false; + m_vMeshInfo.resize( vMeshes.size() ); for( unsigned i=0; i &vMeshes, bool bNeedsNormal const vector &Triangles = mesh.Triangles; MeshInfo& meshInfo = m_vMeshInfo[i]; + meshInfo.m_bNeedsTextureMatrixScale = false; meshInfo.iVertexStart = totalVerts; meshInfo.iVertexCount = Vertices.size(); @@ -806,8 +808,13 @@ void RageCompiledGeometry::Set( const vector &vMeshes, bool bNeedsNormal totalTriangles += Triangles.size(); for( unsigned j = 0; j < Vertices.size(); ++j ) + { if( Vertices[j].TextureMatrixScale.x != 1.0f || Vertices[j].TextureMatrixScale.y != 1.0f ) - m_bNeedsTextureMatrixScale = true; + { + meshInfo.m_bNeedsTextureMatrixScale = true; + m_bAnyNeedsTextureMatrixScale = true; + } + } } this->Allocate( vMeshes ); diff --git a/stepmania/src/RageDisplay.h b/stepmania/src/RageDisplay.h index d1fff1e9a0..d254f7b10f 100644 --- a/stepmania/src/RageDisplay.h +++ b/stepmania/src/RageDisplay.h @@ -33,10 +33,11 @@ protected: int iVertexCount; int iTriangleStart; int iTriangleCount; + bool m_bNeedsTextureMatrixScale; }; vector m_vMeshInfo; bool m_bNeedsNormals; - bool m_bNeedsTextureMatrixScale; + bool m_bAnyNeedsTextureMatrixScale; }; enum PixelFormat diff --git a/stepmania/src/RageDisplay_OGL.cpp b/stepmania/src/RageDisplay_OGL.cpp index e3dcce1101..8081eb2f48 100644 --- a/stepmania/src/RageDisplay_OGL.cpp +++ b/stepmania/src/RageDisplay_OGL.cpp @@ -1059,7 +1059,7 @@ void RageCompiledGeometryHWOGL::UploadData() // AssertNoGLError(); - if( m_bNeedsTextureMatrixScale ) + if( m_bAnyNeedsTextureMatrixScale ) { GLExt.glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nTextureMatrixScale ); GLExt.glBufferDataARB( @@ -1171,19 +1171,28 @@ void RageCompiledGeometryHWOGL::Draw( int iMeshIndex ) const glDisableClientState(GL_NORMAL_ARRAY); } - if( m_bNeedsTextureMatrixScale && g_bTextureMatrixShader != 0 ) + if( meshInfo.m_bNeedsTextureMatrixScale ) { - /* If we're using texture matrix scales, set up that buffer, too, and enable the - * vertex shader. This shader doesn't support all OpenGL state, so only enable it - * if we're using it. */ - GLExt.glEnableVertexAttribArrayARB( ATTRIB_TEXTURE_MATRIX_SCALE ); - AssertNoGLError(); - GLExt.glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nTextureMatrixScale ); - AssertNoGLError(); - GLExt.glVertexAttribPointerARB( ATTRIB_TEXTURE_MATRIX_SCALE, 2, GL_FLOAT, false, 0, NULL ); - AssertNoGLError(); + if( false ) //g_bTextureMatrixShader != 0 ) + { + /* If we're using texture matrix scales, set up that buffer, too, and enable the + * vertex shader. This shader doesn't support all OpenGL state, so only enable it + * if we're using it. */ + GLExt.glEnableVertexAttribArrayARB( ATTRIB_TEXTURE_MATRIX_SCALE ); + AssertNoGLError(); + GLExt.glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nTextureMatrixScale ); + AssertNoGLError(); + GLExt.glVertexAttribPointerARB( ATTRIB_TEXTURE_MATRIX_SCALE, 2, GL_FLOAT, false, 0, NULL ); + AssertNoGLError(); - GLExt.glUseProgramObjectARB( g_bTextureMatrixShader ); + GLExt.glUseProgramObjectARB( g_bTextureMatrixShader ); + } + else + { + // Approximate by applying the texture scale of the first vertex to the whole mesh. + glMatrixMode( GL_TEXTURE ); + glScalef( 0, 0, 0 ); + } } GLExt.glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, m_nTriangles ); @@ -1202,7 +1211,7 @@ void RageCompiledGeometryHWOGL::Draw( int iMeshIndex ) const BUFFER_OFFSET(meshInfo.iTriangleStart*sizeof(msTriangle)) ); AssertNoGLError(); - if( m_bNeedsTextureMatrixScale && g_bTextureMatrixShader != 0 ) + if( meshInfo.m_bNeedsTextureMatrixScale && g_bTextureMatrixShader != 0 ) { GLExt.glDisableVertexAttribArrayARB( ATTRIB_TEXTURE_MATRIX_SCALE ); GLExt.glUseProgramObjectARB( 0 );