Changeset 541

Show
Ignore:
Timestamp:
03/06/08 15:15:53 (10 months ago)
Author:
phill
Message:

o Emit one mesh per shader/lmap pair.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/maya2q3/bsp.cpp

    r540 r541  
    9090{ 
    9191        m_unitScale = 0.01F; 
    92         m_combineMeshes = true; //augh! 
     92        m_combineMeshes = false; 
    9393} 
    9494 
     
    248248        std::vector< q3::dshader_t > shaders = ReadLump< q3::dshader_t >( q3::LUMP_SHADERS ); 
    249249 
    250         m_meshes.setLength( (uint)surfs.size() ); 
     250        typedef std::map< int, std::vector< int > > MapSetMap; 
     251        typedef MapSetMap::iterator MapSetIter; 
     252 
     253        MapSetMap materialSets; 
    251254        for( uint i = 0; i < surfs.size(); i++ ) 
    252255        { 
    253256                const q3::dsurface_t &surf = surfs[i]; 
    254257 
     258                int surfIndex; 
    255259                switch( surf.surfaceType ) 
    256260                { 
    257261                case q3::MST_PLANAR: 
    258262                case q3::MST_TRIANGLE_SOUP: 
    259                         { 
    260                                 int shader = GetShaderIndex( shaders, surf.shaderNum, surf.lightmapNum ); 
    261                                 ParseTriangles( verts, indices, shader, surf.firstVert, surf.numVerts, surf.firstIndex, surf.numIndexes ); 
    262                         } 
     263                        surfIndex = (int)i; 
    263264                        break; 
    264265 
     
    267268                                q3::Patch p = q3::SubdividePatchToGrid( surf.patchWidth, surf.patchHeight, &verts[surf.firstVert] ); 
    268269                                p.meshIdx = i; 
     270 
    269271                                m_patchStaging.push_back( p ); 
     272                                surfIndex = -(int)m_patchStaging.size(); 
    270273                        } 
    271274                        break; 
    272275 
    273276                default: 
    274                         warn( "Ignoring surface." ); 
    275                 } 
    276  
    277                 if( m_verts.length() && !m_combineMeshes ) 
    278                 { 
    279                         m_meshes[i] = CreateMesh(); 
    280                         ClearStagingArea(); 
    281                 } 
     277                        continue; 
     278                } 
     279 
     280                int shader = GetShaderIndex( shaders, surf.shaderNum, surf.lightmapNum ); 
     281 
     282                if( shader == -1 ) 
     283                        continue; 
     284 
     285                MapSetIter matIter = materialSets.find( shader ); 
     286                if( matIter == materialSets.end() ) 
     287                { 
     288                        std::pair< MapSetIter, bool > 
     289                                insPos = materialSets.insert( MapSetIter::value_type( shader, std::vector< int >() ) ); 
     290 
     291                        if( !insPos.second ) 
     292                                continue; 
     293 
     294                        matIter = insPos.first; 
     295                } 
     296 
     297                matIter->second.push_back( surfIndex ); 
    282298        } 
    283299 
     
    285301        q3::FixSharedVertexLodError( m_patchStaging ); 
    286302 
    287         { 
    288                 std::vector< int > indices; 
    289                 std::vector< q3::drawVert_t > verts; 
    290  
    291                 for( uint i = 0; i < m_patchStaging.size(); i++ ) 
    292                 { 
    293                         q3::Patch &p = m_patchStaging[i]; 
    294                         const q3::dsurface_t &srcSurf = surfs[p.meshIdx]; 
    295                          
    296                         int shader = GetShaderIndex( shaders, srcSurf.shaderNum, srcSurf.lightmapNum ); 
    297  
    298                         q3::PatchToMesh( p, verts, indices ); 
    299                         ParseTriangles( verts, indices, shader ); 
    300  
    301                         if( m_verts.length() && !m_combineMeshes ) 
     303        std::vector< int > tmpIndices; 
     304        std::vector< q3::drawVert_t > tmpVerts; 
     305 
     306        for( MapSetIter iter = materialSets.begin(); iter != materialSets.end(); ++iter ) 
     307        { 
     308                std::vector< int > &surfIdxs = iter->second; 
     309                for( uint i = 0; i < surfIdxs.size(); i++ ) 
     310                { 
     311                        if( surfIdxs[i] < 0 ) 
    302312                        { 
    303                                 m_meshes[p.meshIdx] = CreateMesh(); 
    304                                 ClearStagingArea(); 
     313                                const q3::Patch &p = m_patchStaging[-surfIdxs[i] - 1]; 
     314 
     315                                q3::PatchToMesh( p, tmpVerts, tmpIndices );  
     316                                ParseTriangles( tmpVerts, tmpIndices, iter->first ); 
    305317                        } 
     318                        else 
     319                        { 
     320                                const q3::dsurface_t &surf = surfs[surfIdxs[i]]; 
     321 
     322                                ParseTriangles( verts, indices, iter->first, surf.firstVert, 
     323                                        surf.numVerts, surf.firstIndex, surf.numIndexes ); 
     324                        } 
     325                } 
     326 
     327                if( !m_combineMeshes && m_verts.length() ) 
     328                { 
     329                        m_meshes.append( CreateMesh() ); 
     330                        ClearStagingArea(); 
    306331                } 
    307332        } 
    308333 
    309334        if( m_verts.length() ) 
    310         { 
    311335                m_meshes.append( CreateMesh() ); 
    312                 ClearStagingArea(); 
    313         } 
     336 
     337        ClearStagingArea(); 
    314338 
    315339        m_patchStaging.clear(); 
     
    340364        check_status( stat ); 
    341365 
    342         MString texCoordSetName( "TexCoords" ); 
    343         stat = mesh.createUVSet( texCoordSetName ); 
    344         check_status( stat ); 
     366        MString texCoordSetName( "map1" ); 
     367        //stat = mesh.createUVSet( texCoordSetName ); 
     368        //check_status( stat ); 
    345369        stat = mesh.setUVs( m_textureU, m_textureV, &texCoordSetName ); 
    346370        check_status( stat ); 
     
    358382        stat = mesh.setCurrentUVSetName( texCoordSetName ); 
    359383        check_status( stat ); 
    360  
    361         mesh.deleteUVSet( "map1" ); 
    362384 
    363385        MString vertexLightName( "VertexLight" );