Ignore:
Timestamp:
09/03/08 01:57:45 (16 years ago)
Author:
mattausch
Message:

improved shadow mapping

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/chcdemo.cpp

    r2896 r2897  
    8383RenderQueue *renderQueue = NULL; 
    8484 
     85// traverses and renders the hierarchy 
     86RenderTraverser *shadowTraverser = NULL; 
     87 
     88 
    8589/// these values get scaled with the frame rate 
    8690static float keyForwardMotion = 30.0f; 
     
    211215void MiddleMotion(int x, int y); 
    212216void CalcDecimalPoint(string &str, int d); 
    213 void ResetTraverser(); 
     217 
     218RenderTraverser *CreateTraverser(Camera *cam); 
    214219 
    215220void KeyHorizontalMotion(float shift); 
     
    427432        bvh->SetVirtualLeaves(trianglesPerVirtualLeaf); 
    428433 
    429         bvh->SetCamera(camera); 
     434        //bvh->SetCamera(camera); 
    430435         
    431436        InitCg(); 
     
    435440 
    436441        // initialize the render traverser 
    437         ResetTraverser(); 
     442        traverser = CreateTraverser(camera); 
    438443 
    439444        visualization = new Visualization(bvh, camera, NULL, &state); 
    440  
     445         
     446        state.SetRenderType(RenderState::FIXED); 
    441447        sceneQuery = new SceneQuery(bvh->GetBox(), traverser); 
    442448 
     
    691697 
    692698 
    693 void ResetTraverser() 
    694 { 
    695         DEL_PTR(traverser); 
    696  
     699RenderTraverser *CreateTraverser(Camera *cam) 
     700{ 
     701        RenderTraverser *tr; 
     702         
    697703        bvh->ResetNodeClassifications(); 
    698704 
     
    700706        { 
    701707        case RenderTraverser::CULL_FRUSTUM: 
    702                 traverser = new FrustumCullingTraverser(); 
     708                tr = new FrustumCullingTraverser(); 
    703709                break; 
    704710        case RenderTraverser::STOP_AND_WAIT: 
    705                 traverser = new StopAndWaitTraverser(); 
     711                tr = new StopAndWaitTraverser(); 
    706712                break; 
    707713        case RenderTraverser::CHC: 
    708                 traverser = new CHCTraverser(); 
     714                tr = new CHCTraverser(); 
    709715                break; 
    710716        case RenderTraverser::CHCPLUSPLUS: 
    711                 traverser = new CHCPlusPlusTraverser(); 
     717                tr = new CHCPlusPlusTraverser(); 
    712718                break; 
    713719         
    714720        default: 
    715                 traverser = new FrustumCullingTraverser(); 
    716         } 
    717  
    718         traverser->SetCamera(camera); 
    719         traverser->SetHierarchy(bvh); 
    720         traverser->SetRenderQueue(renderQueue); 
    721         traverser->SetRenderState(&state); 
    722         traverser->SetUseOptimization(useOptimization); 
    723         traverser->SetUseRenderQueue(useRenderQueue); 
    724         traverser->SetVisibilityThreshold(threshold); 
    725         traverser->SetAssumedVisibleFrames(assumedVisibleFrames); 
    726         traverser->SetMaxBatchSize(maxBatchSize); 
    727         traverser->SetUseMultiQueries(useMultiQueries); 
    728         traverser->SetUseTightBounds(useTightBounds); 
    729         traverser->SetUseDepthPass(renderType == RenderState::DEPTH_PASS); 
    730         traverser->SetRenderQueue(renderQueue); 
     721                tr = new FrustumCullingTraverser(); 
     722        } 
     723 
     724        tr->SetCamera(cam); 
     725        tr->SetHierarchy(bvh); 
     726        tr->SetRenderQueue(renderQueue); 
     727        tr->SetRenderState(&state); 
     728        tr->SetUseOptimization(useOptimization); 
     729        tr->SetUseRenderQueue(useRenderQueue); 
     730        tr->SetVisibilityThreshold(threshold); 
     731        tr->SetAssumedVisibleFrames(assumedVisibleFrames); 
     732        tr->SetMaxBatchSize(maxBatchSize); 
     733        tr->SetUseMultiQueries(useMultiQueries); 
     734        tr->SetUseTightBounds(useTightBounds); 
     735        tr->SetUseDepthPass(renderType == RenderState::DEPTH_PASS); 
     736        tr->SetRenderQueue(renderQueue); 
     737 
     738        return tr; 
    731739} 
    732740 
     
    866874        } 
    867875         
    868         if (showShadowMap && !shadowMap) 
    869         { 
    870                 const float shadowSize = 4096; 
    871                 shadowMap = new ShadowMap(shadowSize, bvh->GetBox(), camera); 
    872         } 
    873876 
    874877        // render without shading 
     
    908911        case RenderState::DEFERRED: 
    909912 
    910                 // change CHC state (must be done for each change of camera) 
    911                 BvhNode::SetCurrentState(1); 
    912  
    913                 if (showShadowMap && shadowChanged) 
     913                if (showShadowMap)// && shadowChanged) 
    914914                { 
     915                        if (!shadowMap) 
     916                        { 
     917                                const float shadowSize = 4096; 
     918                                shadowMap = new ShadowMap(light, shadowSize, bvh->GetBox(), camera); 
     919                        } 
     920 
     921                        // change CHC state (must be done for each change of camera) 
     922                        BvhNode::SetCurrentState(1); 
     923 
     924                        if (!shadowTraverser) 
     925                                shadowTraverser = CreateTraverser(shadowMap->GetShadowCamera()); 
     926 
    915927                        shadowChanged = false; 
    916928 
     
    921933 
    922934                        // the scene is rendered withouth any shading    
    923                         shadowMap->ComputeShadowMap(light, traverser); 
     935                        shadowMap->ComputeShadowMap(shadowTraverser); 
    924936 
    925937                        // change back state 
     
    10731085        case 32: //space 
    10741086                renderMode = (renderMode + 1) % RenderTraverser::NUM_TRAVERSAL_TYPES; 
    1075                 ResetTraverser(); 
     1087 
     1088                DEL_PTR(traverser); 
     1089                traverser = CreateTraverser(camera); 
     1090 
     1091                if (shadowTraverser && shadowMap)  
     1092                { 
     1093                        DEL_PTR(shadowTraverser); 
     1094                        //shadowTraverser = CreateTraverser(shadowMap->GetShadowCamera()); 
     1095                } 
     1096 
    10761097                break; 
    10771098        case 'h': 
Note: See TracChangeset for help on using the changeset viewer.