Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 8929 in orxonox.OLD for branches/terrain/src/lib/graphics/importer


Ignore:
Timestamp:
Jun 29, 2006, 11:45:59 PM (18 years ago)
Author:
ponder
Message:
  • added a clipping plane for removing popping effects
  • put the update stuff from terrain::draw to terrain::tick.
Location:
branches/terrain/src/lib/graphics/importer
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/terrain/src/lib/graphics/importer/md3/md3_data.h

    r8490 r8929  
    7070
    7171
    72 
    7372//! class to store the md2 data in
    7473class MD3Data : public BaseObject
  • branches/terrain/src/lib/graphics/importer/terrain/terrain.cc

    r8775 r8929  
    171171}
    172172
     173void Terrain::tick( float _dt )
     174{
     175        for ( unsigned int i = 0; i < buffers.size(); ++i )
     176                broker->release( buffers[i].vbIdentifier, buffers[i].ibIdentifier );
     177        buffers.clear();       
     178        pTerrainPage page = NULL;
     179        //Extract the frustum planes out of the modelview matrix.
     180        frustum->extractPlanes();       
     181        // Lets see which pages are visible.
     182        determineVisiblePages( root );
     183        int wantedLeft, wantedRight, wantedBottom, wantedTop, minLOD;
     184        pTerrainPage neighbor = NULL;
     185        page = activePages;
     186        bool dirty;
     187        current = 0;
     188        BufferInfo bi;
     189        broker->acquire( bi.vbIdentifier, bi.ibIdentifier );
     190        buffers.push_back( bi );
     191        int dirtyRounds = 0;
     192        do {
     193                dirtyRounds++;
     194                dirty = false;
     195                page = activePages;
     196                while ( page ) {
     197                        if ( !page->isActive() ) {
     198                                pTerrainPage tmp = page;
     199                                page = tmp->getNext();
     200                                tmp->setVisibility( false );
     201                                continue;
     202                        }
     203                        wantedLeft = wantedRight = wantedBottom = wantedTop = page->getWantedLOD();
     204                        if ( ( neighbor = page->getLeft() ) && ( neighbor->isActive() ) )
     205                                wantedLeft = neighbor->getWantedLOD();
     206                        if ( ( neighbor = page->getRight() ) && ( neighbor->isActive() ) )
     207                                wantedRight = neighbor->getWantedLOD();
     208                        if ( ( neighbor = page->getTop() ) && ( neighbor->isActive() ) )
     209                                wantedTop = neighbor->getWantedLOD();
     210                        if ( ( neighbor = page->getBottom() ) && ( neighbor->isActive() ) )
     211                                wantedBottom = neighbor->getWantedLOD();                       
     212               
     213                        minLOD = std::min( std::min( wantedBottom, wantedTop ),
     214                                std::min( wantedLeft, wantedRight ) ); 
     215                        if ( minLOD < page->getWantedLOD()-1 ) {
     216                                page->setWantedLOD( minLOD+1 );
     217                                dirty = true;
     218                        }       
     219                        page = page->getNext();
     220                }
     221        } while ( dirty );
     222       
     223        page = activePages;
     224        while ( page ) {
     225                assert( page->isActive() );
     226                page->updateTesselation();
     227                page = page->getNext();
     228        }
     229        //If there is some data in the buffer, we need to upload the data
     230        //into the vram...
     231        if ( buffers[current].numIndices != 0 ) {
     232                BufferInfo bi = buffers[current];       
     233                glBindBufferARB( GL_ARRAY_BUFFER_ARB, bi.vbIdentifier );
     234                glBufferDataARB( GL_ARRAY_BUFFER_ARB, MAX_VERTICES*sizeof( Vertex ),
     235                        vertices, GL_DYNAMIC_DRAW_ARB );
     236                glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, bi.ibIdentifier );
     237                glBufferDataARB( GL_ELEMENT_ARRAY_BUFFER_ARB, MAX_INDICES*sizeof( short ),
     238                        indices, GL_DYNAMIC_DRAW_ARB );
     239        }       
     240}
    173241void Terrain::draw( )
    174242{
     243        pTerrainPage page = NULL;
    175244        glGetError();
    176         pTerrainPage page = NULL;
    177         frustum->extractPlanes();
     245        /*pTerrainPage page = NULL;
     246        frustum->extractPlanes();*/
     247        Plane far = frustum->getPlane( Frustum::FAR );
     248        //Due to some reason, the OpenGL implementors chose the plane equation
     249        //to an array of doubles. So we will make them happy.
     250        double farPlane[] = { far.n.x, far.n.y, far.n.z, far.d };
     251        glEnable( GL_CLIP_PLANE0 );
     252        glClipPlane( GL_CLIP_PLANE0, farPlane );
    178253        glPushAttrib( GL_ALL_ATTRIB_BITS );
    179254        glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
     
    198273        cullCount = 0;
    199274       
    200         // Lets see which pages are visible.
     275        /*// Lets see which pages are visible.
    201276        determineVisiblePages( root );
    202277        int wantedLeft, wantedRight, wantedBottom, wantedTop, minLOD;
     
    256331                glBufferDataARB( GL_ELEMENT_ARRAY_BUFFER_ARB, MAX_INDICES*sizeof( short ),
    257332                        indices, GL_DYNAMIC_DRAW_ARB );
    258         }
     333        }*/
    259334        glEnable( GL_BLEND );
    260335        glDepthFunc( GL_LEQUAL );
     
    312387                        page = page->getNext();
    313388                }
    314                 activatedCount = 0; deactivatedCount = 0;
    315         }
    316        
    317         for ( unsigned int i = 0; i < buffers.size(); ++i )
    318                 broker->release( buffers[i].vbIdentifier, buffers[i].ibIdentifier );
    319                
    320         buffers.clear();
    321                
     389        }
     390                       
    322391        glClientActiveTextureARB( GL_TEXTURE1_ARB );   
    323392        glActiveTextureARB( GL_TEXTURE1_ARB );
     
    329398        glPopAttrib();
    330399        glPopClientAttrib();
     400        glDisable( GL_CLIP_PLANE0 );
    331401}
    332402
     
    429499                //not the whole cross products needs to be calculated. Grab yourself
    430500                //pen and paper :)
    431                 _normal.x = -dZ*( alt[0] - alt[1] );                           
    432                 _normal.y = -dZ*dX;
    433                 _normal.z =  dX*( alt[2] - alt[1] );
     501                _normal.x =  dZ*( alt[0] - alt[1] );                           
     502                _normal.y =  dZ*dX;
     503                _normal.z = -dX*( alt[2] - alt[1] );
    434504        }
    435505        else {
     
    442512                //not the whole cross products needs to be calculated. Grab yourself
    443513                //pen and paper :)
    444                 _normal.x =  dZ*( alt[2] - alt[1] );                           
    445                 _normal.y = -dZ*dX;
    446                 _normal.z = -dX*( alt[0] - alt[1] );
     514                _normal.x = -dZ*( alt[2] - alt[1] );                           
     515                _normal.y =  dZ*dX;
     516                _normal.z =  dX*( alt[0] - alt[1] );
    447517        }
    448518}
  • branches/terrain/src/lib/graphics/importer/terrain/terrain.h

    r8775 r8929  
    117117               
    118118                void build();
    119                
     119                void tick( float _dt );
    120120                inline void setActiveList( pTerrainPage _page )
    121121                {
  • branches/terrain/src/lib/graphics/importer/terrain/terrain_page.cc

    r8775 r8929  
    138138                float d = distance.length();
    139139               
    140                 assert( d > 0.000001f );
    141140                float err =  errors[i].diff / d ;
    142141               
Note: See TracChangeset for help on using the changeset viewer.