From 53f23a32db67687bf6abbdf42e326f0833a4c873 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Mon, 1 Mar 2004 10:19:07 +0000 Subject: [PATCH] process Model temp vertices on update - not on every draw --- stepmania/src/Model.cpp | 72 +++++++++++++++++++++-------------------- stepmania/src/Model.h | 2 +- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/stepmania/src/Model.cpp b/stepmania/src/Model.cpp index f81642d2ad..498ffa8d8a 100644 --- a/stepmania/src/Model.cpp +++ b/stepmania/src/Model.cpp @@ -29,13 +29,14 @@ Model::Model () { m_bTextureWrapping = true; SetUseZBuffer( true ); - SetUseZBuffer( true ); + SetCullMode( CULL_BACK ); m_pGeometry = NULL; m_pCurAnimation = NULL; m_bRevertToDefaultAnimation = false; m_fDefaultAnimationRate = 1; m_fCurAnimationRate = 1; m_iRefCount = 1; + m_bUseTempVertices = false; } Model::~Model () @@ -110,8 +111,8 @@ void Model::LoadPieces( CString sMeshesPath, CString sMaterialsPath, CString sBo // // Setup temp vertices (if necessary) // - bUseTempVertices = m_mapNameToAnimation[DEFAULT_ANIMATION_NAME].Bones.size() > 0; // if there are no bones, then there's no reason to use temp vertices - if( bUseTempVertices ) + m_bUseTempVertices = m_mapNameToAnimation[DEFAULT_ANIMATION_NAME].Bones.size() > 0; // if there are no bones, then there's no reason to use temp vertices + if( m_bUseTempVertices ) { m_vTempVerticesByMesh.resize( m_pGeometry->m_Meshes.size() ); for (int i = 0; i < (int)m_pGeometry->m_Meshes.size(); i++) @@ -428,36 +429,6 @@ void Model::DrawPrimitives() DISPLAY->Scale( 1, -1, 1 ); // flip Y so positive is up - // - // process vertices - // - if( bUseTempVertices ) - { - for (int i = 0; i < (int)m_pGeometry->m_Meshes.size(); i++) - { - msMesh *pMesh = &m_pGeometry->m_Meshes[i]; - RageModelVertexVector& TempVertices = m_vTempVerticesByMesh[i]; - for (int j = 0; j < (int)pMesh->Vertices.size(); j++) - { - RageModelVertex& tempVert = TempVertices[j]; - RageModelVertex& originalVert = pMesh->Vertices[j]; - - tempVert.t = originalVert.t; - - if( originalVert.boneIndex == -1 ) - { - tempVert.n = originalVert.n; - tempVert.p = originalVert.p; - } - else - { - int bone = originalVert.boneIndex; - RageVec3TransformNormal( &tempVert.n, &originalVert.n, &m_vpBones[bone].mFinal ); - RageVec3TransformCoord( &tempVert.p, &originalVert.p, &m_vpBones[bone].mFinal ); - } - } - } - } ////////////////////// // render the diffuse pass @@ -469,7 +440,7 @@ void Model::DrawPrimitives() for (int i = 0; i < (int)m_pGeometry->m_Meshes.size(); i++) { msMesh *pMesh = &m_pGeometry->m_Meshes[i]; - RageModelVertexVector& TempVertices = bUseTempVertices ? m_vTempVerticesByMesh[i] : pMesh->Vertices; + RageModelVertexVector& TempVertices = m_bUseTempVertices ? m_vTempVerticesByMesh[i] : pMesh->Vertices; if( pMesh->nMaterialIndex != -1 ) // has a material { @@ -539,7 +510,7 @@ void Model::DrawPrimitives() for (int i = 0; i < (int)m_pGeometry->m_Meshes.size(); i++) { msMesh *pMesh = &m_pGeometry->m_Meshes[i]; - RageModelVertexVector& TempVertices = bUseTempVertices ? m_vTempVerticesByMesh[i] : pMesh->Vertices; + RageModelVertexVector& TempVertices = m_bUseTempVertices ? m_vTempVerticesByMesh[i] : pMesh->Vertices; // apply material if( pMesh->nMaterialIndex != -1 ) @@ -812,6 +783,37 @@ void Model::Update( float fDelta ) m_Materials[i].diffuse.ani.Update( fDelta ); m_Materials[i].alpha.ani.Update( fDelta ); } + + // + // process vertices + // + if( m_bUseTempVertices && m_pGeometry ) + { + for (int i = 0; i < (int)m_pGeometry->m_Meshes.size(); i++) + { + msMesh *pMesh = &m_pGeometry->m_Meshes[i]; + RageModelVertexVector& TempVertices = m_vTempVerticesByMesh[i]; + for (int j = 0; j < (int)pMesh->Vertices.size(); j++) + { + RageModelVertex& tempVert = TempVertices[j]; + RageModelVertex& originalVert = pMesh->Vertices[j]; + + tempVert.t = originalVert.t; + + if( originalVert.boneIndex == -1 ) + { + tempVert.n = originalVert.n; + tempVert.p = originalVert.p; + } + else + { + int bone = originalVert.boneIndex; + RageVec3TransformNormal( &tempVert.n, &originalVert.n, &m_vpBones[bone].mFinal ); + RageVec3TransformCoord( &tempVert.p, &originalVert.p, &m_vpBones[bone].mFinal ); + } + } + } + } } void Model::SetState( int iNewState ) diff --git a/stepmania/src/Model.h b/stepmania/src/Model.h index 90e01b7341..9fb30b6acd 100644 --- a/stepmania/src/Model.h +++ b/stepmania/src/Model.h @@ -68,7 +68,7 @@ private: // true if any vertex has a bone weight. // If true, then render from m_vTempVerticesByBone. // Otherwise, render directly from the mesh's vertices - bool bUseTempVertices; + bool m_bUseTempVertices; typedef vector RageModelVertexVector; vector m_vTempVerticesByMesh;