Ignore:
Timestamp:
11/21/06 11:10:53 (18 years ago)
Author:
gumbau
Message:

Improved Demo_LodStrips.exe
Changed Scene appearance.
Added F2 key (shadows on-off) and F3 key (manual vs automatic LOD).

Location:
GTP/trunk/App/Demos/Geom/Demo_LodStrips
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Geom/Demo_LodStrips/main.cpp

    r1561 r1775  
    2626 
    2727//Global variables 
     28 
    2829Entity* entity; 
    2930Geometry::LodStripsLibrary* myStrips; 
     
    4243OverlayElement* mInfo2; 
    4344OverlayElement* mHelp; 
    44  
    45 char HelpString[]="(F1) Help\n" 
     45OverlayElement* mLOD; 
     46OverlayElement* mShad; 
     47SceneManager* SceneMgrAux; 
     48 
     49char LODStringAuto[]="(F3) LOD Mode: AUTOMATIC"; 
     50char LODStringManu[]="(F3) LOD Mode: MANUAL"; 
     51char ShadON[]       ="(F2) Shadows ON"; 
     52char ShadOFF[]      ="(F2) Shadows OFF"; 
     53 
     54int degAA=0, degABAB=0; 
     55 
     56char HelpString[]="(F1) Quit Help\n" 
    4657                        "This demo shows an example of the LODStrips model in action. The models in the scene\n" 
    4758                        "are associated to a LodStrips object that manage their level of detail.\n" 
     
    5061                        "closer to them the level of detail increases to restore the original geometry of the\n" 
    5162                        "model.\n" 
    52                         "The current level of detail can be seen in real-time in the top-left corner of the screen.\n" 
     63                        "The current level of detail can be seen in real-time in the bottom-left corner of the screen.\n" 
    5364                        "The level of detail begins to decrease at a certain distance of the crowd, and stops\n" 
    5465                        "decreasing when the objects reach the their minimum LOD. This 'lodding' distance is\n" 
    55                         "customizable from the source code of the demo."; 
    56  
    57 char NoHelpString[]="(F1) Help\n"; 
     66                        "customizable from the source code of the demo.\n\n" 
     67                        "(F3) LOD Mode   ( AUTOMATIC  vs  MANUAL )\n" 
     68                        "           MANUAL MODE:  Use (+) and (-) keys to change de LOD\n"; 
     69 
     70char NoHelpString[]="\n\n\n\n\n\n\n\n\n\n\n\n\n(F1) Help\n"; 
     71 
     72int num_ogres = 90; 
    5873 
    5974 
     
    8297        } 
    8398        virtual void End(){ 
     99                int v0, v1, v2, v3; 
     100                unsigned int i; 
     101 
     102                v0 = pIdx[0]; 
     103                v1 = pIdx[1]; 
     104                for ( i=2; i < mRenderOp.indexData->indexCount; i++) 
     105                { 
     106                        if ( v0 == v1 ) degAA++; 
     107                        v0 = v1; 
     108                        v1 = pIdx[i]; 
     109                } 
     110 
     111                v0 = pIdx[0]; 
     112                v1 = pIdx[1]; 
     113                v2 = pIdx[2]; 
     114                v3 = pIdx[3]; 
     115        for ( i=4; i < mRenderOp.indexData->indexCount; i++) 
     116                { 
     117                        if ( ( v0 == v2 ) && ( v1 == v3 ) ) 
     118                        { 
     119                                v0 = v2; 
     120                                v1 = v3; 
     121                                v2 = pIdx[i]; 
     122                                if ( i < mRenderOp.indexData->indexCount ) 
     123                                { 
     124                                        i++; 
     125                                        v3 = pIdx[i]; 
     126                                } 
     127                                else v3 = -1; 
     128 
     129                                degABAB++; 
     130                        } 
     131                        else 
     132                        { 
     133                            v0 = v1; 
     134                            v1 = v2; 
     135                                v2 = v3; 
     136                                v3 = pIdx[i]; 
     137                        } 
     138                } 
     139 
    84140                ibuf->unlock(); 
    85141        } 
     
    89145class FresnelFrameListener : public ExampleFrameListener 
    90146{ 
    91         int manage; 
     147        float miButtonTimer; 
    92148 
    93149public: 
     
    96152        : ExampleFrameListener(win, cam, false, false) 
    97153    { 
    98                 manage=1; 
     154                miButtonTimer=0; 
    99155        } 
    100156 
     
    102158    { 
    103159                Vector3 dist;  
    104                 int distance=0,inc2=0,d; 
    105                 unsigned int nlod,diflods; 
     160                int distance=0,inc2=0; 
     161            static int modo=0; 
     162                static int shadows=1; 
     163 
     164                float tiempo = evt.timeSinceLastFrame; 
     165                miButtonTimer -= tiempo; 
     166 
     167                if (shadows == 0) 
     168                { 
     169                        SceneMgrAux->setShadowTechnique(SHADOWTYPE_NONE); 
     170                } 
     171                else 
     172                { 
     173                        SceneMgrAux->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); 
     174                } 
     175 
    106176 
    107177                // Move upto 80 units/second 
     
    131201 
    132202                //LOD selection 
    133                 int difdist = dist_max - dist_min; 
    134          
    135                 int i=0; 
    136  
     203                static float lodfactor=0; 
     204                static float lodfactorBefore = -1.0f; 
     205                 
    137206                dist = node->getPosition() - mCamera->getPosition();  
    138207                distance =dist.length(); 
    139208 
    140                 float lodfactor = (float)(distance - dist_min) / (float)(dist_max - dist_min); 
    141                 lodfactor = 1.0f - lodfactor; 
     209                if ( modo == 0 )      //Automatic LOD 
     210                { 
     211                        int difdist = dist_max - dist_min; 
     212         
     213                        int i=0; 
     214 
     215                        lodfactor = (float)(distance - dist_min) / (float)(dist_max - dist_min); 
     216                        lodfactor = 1.0f - lodfactor; 
     217                } 
     218                else 
     219                { 
     220          //  lodfactor = lodfactorBefore; 
     221                } 
     222 
     223                         
     224        if (( mInputDevice->isKeyDown(Ogre::KC_ADD) ) && (modo == 1)) 
     225                                lodfactor += 0.001f; 
     226            if (( mInputDevice->isKeyDown(Ogre::KC_SUBTRACT) ) && (modo == 1)) 
     227                                lodfactor -= 0.001f; 
    142228 
    143229                if (lodfactor<0.0f) 
     
    146232                        lodfactor=1.0f; 
    147233 
    148                 static float lodfactorBefore = -1.0f; 
    149234                if (fabsf(lodfactorBefore-lodfactor)>0.03f ||  
    150235                        (lodfactorBefore>0.0f && lodfactor==0.0f) || 
    151236                        (lodfactorBefore<1.0f && lodfactor==1.0f)) 
    152237                { 
     238                        degAA=0; degABAB=0; 
    153239                        myStrips->GoToLod(lodfactor); 
    154240                        lodfactorBefore=lodfactor; 
     241                } 
     242 
     243                if ( mInputDevice->isKeyDown(Ogre::KC_F3) && ( miButtonTimer <= 0 ) ) 
     244                { 
     245                            miButtonTimer = 0.5; 
     246                                 
     247                                if (modo == 0) 
     248                                { 
     249                                        modo=1; 
     250                                        mLOD->setCaption(LODStringManu); 
     251                                } 
     252                                else  
     253                                { 
     254                                        modo=0; 
     255                                        mLOD->setCaption(LODStringAuto); 
     256                                } 
     257                } 
     258 
     259                if ( mInputDevice->isKeyDown(Ogre::KC_F2) && ( miButtonTimer <= 0 ) ) 
     260                { 
     261                            miButtonTimer = 0.5; 
     262                                 
     263                                if (shadows == 0) 
     264                                { 
     265                                        shadows = 1; 
     266                                        mShad->setCaption(ShadON); 
     267                                } 
     268                                else  
     269                                { 
     270                                        shadows = 0; 
     271                                        mShad->setCaption(ShadOFF); 
     272                                } 
    155273                } 
    156274 
     
    215333        } 
    216334 
     335                SceneMgrAux->setShadowFarDistance(distance + 200); 
    217336 
    218337                char cadena[256]; 
    219  
     338        const RenderTarget::FrameStats& stats = mWindow->getStatistics(); 
    220339                                 
    221                 sprintf(cadena,"Distance: %d",distance); 
    222                  
     340                sprintf(cadena,"\nDistance: %d\nLOD factor: %f\nTriangle Count: %d\nDegenerated AA: %d\nDegenerated ABAB: %d" 
     341                                     ,    distance,      lodfactor,stats.triangleCount,    degAA*num_ogres,    degABAB*num_ogres); 
    223342                mInfo->setCaption(cadena); 
    224  
    225                 sprintf(cadena,"LOD factor: %f",lodfactor); 
    226  
     343                sprintf(cadena,"Current FPS: %f\n",stats.lastFPS); 
    227344                mInfo2->setCaption(cadena); 
     345 
     346                //sprintf(cadena,"LOD factor: %f",lodfactor); 
     347 
     348                //mInfo2->setCaption(cadena); 
    228349 
    229350                mCamera->yaw(mRotX); 
     
    248369    void createScene(void) 
    249370    { 
    250                 Entity* pEnt; 
     371                SceneMgrAux = mSceneMgr; 
     372        mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2)); 
     373                mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); 
     374                mSceneMgr->setShadowTextureSettings(2048,1); 
     375                mSceneMgr->setShadowFarDistance(1024); 
     376                mSceneMgr->setShadowColour(ColourValue(0.5, 0.5, 0.5)); 
    251377 
    252378                mat = new MaterialPtr[1]; 
    253379 
    254         theCam = mCamera; 
    255         theCam->setPosition(0,50,dist_min-600.0f); 
     380                theCam = mCamera; 
     381        theCam->setPosition(-35,50,dist_min-600.0f); 
    256382        // Set ambient light 
    257         mSceneMgr->setAmbientLight(ColourValue(0.3, 0.3, 0.3)); 
    258383 
    259384        // Create a directional light 
    260385        Light* l = mSceneMgr->createLight("MainLight"); 
    261386        l->setType(Light::LT_DIRECTIONAL); 
    262         l->setDirection(0.0,0.0,-1.0); 
    263         
    264         
     387        l->setDirection(-0.5,-1.0,-1.0); 
     388                l->setCastShadows(true); 
     389 
    265390        mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox"); 
    266391 
     
    273398                MeshManager::getSingleton().createPlane("ground", 
    274399                        ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 
    275                         4000,4000,6,6,true,1,10,10,Vector3::UNIT_Z); 
     400                        20000,10000,6,6,true,1,250,250,Vector3::UNIT_Z); 
    276401 
    277402                Entity* groundEntity = mSceneMgr->createEntity( "GroundEntity", "ground" ); 
    278403                mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(groundEntity); 
    279404                 
    280                 groundEntity->setMaterialName("RockTerrain"); 
    281                 groundEntity->setCastShadows(false);        
     405                groundEntity->setMaterialName("SnowTerrain"); 
     406                groundEntity->setCastShadows(false); 
    282407 
    283408                std::string model_file=model_name; 
     
    294419        node = mSceneMgr->getRootSceneNode()->createChildSceneNode(); 
    295420        node->attachObject( entity ); 
    296                 node->setVisible(false); 
     421                node->setVisible(false);                 
    297422 
    298423                std::string lod_file="../../media/GT/"; 
     
    310435                entity->setMaterialName("LODStripsDemo/Ogro"); 
    311436 
    312                 for (int i=-3; i<6; i++) // 7 
    313                         for (int j=0; j<10; j++) // 4 
     437 
     438                num_ogres=0; 
     439 
     440                for (int i=-4; i<4; i++) // 7 
     441                        for (int j=0; j<8; j++) // 4 
    314442                        { 
    315443                                char newObjName[16]=""; 
     
    322450                                float randomsepx = (float)((rand()%18)-9); 
    323451                                float randomsepy = (float)((rand()%12)-6); 
    324                                 auxnode->translate(i*70.0f+randomsepx,0.0f,-j*70.0f-randomsepx); 
     452                                auxnode->translate(i*70.0f+randomsepx,-0.3f,-j*70.0f-randomsepx); 
    325453                                auxen->setNormaliseNormals(true); 
     454                                auxen->setCastShadows(true); 
     455 
     456                                num_ogres++; 
    326457                        } 
    327458 
     
    333464                mInfo2 = OverlayManager::getSingleton().getOverlayElement("Demo_LodStrips/Info_2"); 
    334465                mHelp = OverlayManager::getSingleton().getOverlayElement("Demo_LodStrips/Help"); 
     466                mLOD = OverlayManager::getSingleton().getOverlayElement("Demo_LodStrips/ModoLOD"); 
     467                mShad = OverlayManager::getSingleton().getOverlayElement("Demo_LodStrips/Shadows"); 
    335468                mHelp->setCaption(NoHelpString); 
    336             pOver->show(); 
     469                mLOD->setCaption(LODStringAuto); 
     470                mShad->setCaption(ShadON); 
     471                pOver->show(); 
     472                //mWindow->getStatistics(); 
    337473 
    338474    } 
     
    341477    { 
    342478        mFrameListener= new FresnelFrameListener(mWindow, mCamera); 
    343         mFrameListener->showDebugOverlay(true); 
     479        mFrameListener->showDebugOverlay(false); 
    344480        mRoot->addFrameListener(mFrameListener); 
    345481    } 
Note: See TracChangeset for help on using the changeset viewer.