source: trunk/VUT/GtpVisibility/src/CoherentHierarchicalCullingManager.cpp @ 113

Revision 113, 2.9 KB checked in by mattausch, 19 years ago (diff)

fixed problems with visualization

RevLine 
[59]1#include "CoherentHierarchicalCullingManager.h"
[94]2#include <OgreLogManager.h>
[59]3
4namespace GtpVisibility {
5
6//-----------------------------------------------------------------------
7void CoherentHierarchicalCullingManager::RenderScene()
8{
[111]9        //InitFrame();
[85]10        QueryQueue queryQueue;
[86]11        unsigned int visiblePixels = 0;
12        bool isAvailable = false;
[87]13       
[59]14        //-- PART 1: process finished occlusion queries
15        while (!mHierarchyInterface->GetQueue()->empty() || !queryQueue.empty())
16        {
17                while (!queryQueue.empty() &&
[86]18                           queryQueue.front().second->GetQueryResult(visiblePixels,
19                                                                        mHierarchyInterface->GetQueue()->empty()))
[59]20                {
[94]21                HierarchyNode *node = queryQueue.front().first;
[86]22                                               
[59]23                        queryQueue.pop();
24
[96]25                        if (visiblePixels > mVisibilityThreshold)
[59]26                        {
27                                mHierarchyInterface->PullUpVisibility(node);
28                                mHierarchyInterface->TraverseNode(node);
29                        }
30                        else
[112]31                        {       //if (mHierarchyInterface->mIsShadowPass)
[59]32                                mNumQueryCulledNodes ++;
[112]33                               
34                                if(mVisualizeCulledNodes)
35                                {
36                                        mHierarchyInterface->VisualizeCulledNode(node, QUERY_CULLED);
37                                }
[59]38                        }
[85]39                }
[87]40               
[59]41                //-- PART 2: hierarchical traversal
42                if (!mHierarchyInterface->GetQueue()->empty())
43                {
44                        HierarchyNode *node = mHierarchyInterface->GetQueue()->top();
45                        mHierarchyInterface->GetQueue()->pop();
46                               
47                        bool intersects = false;
48
[74]49                        if (!mHierarchyInterface->CheckFrustumVisible(node, intersects))
[112]50                        {//if (mHierarchyInterface->mIsShadowPass)
[59]51                                mNumFrustumCulledNodes ++;
[112]52                               
53                                if(mVisualizeCulledNodes)
54                                {
[113]55                                        mHierarchyInterface->VisualizeCulledNode(node, FRUSTUM_CULLED);
[112]56                                }
[59]57                        }
[74]58                        else
[59]59                        {
[74]60                                // if intersects near plane => skip occlusion query because wrong results possible
61                                if (intersects)
62                                {
63                                        // update octant's visited flag
64                                        mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
[59]65
[74]66                                        mHierarchyInterface->PullUpVisibility(node);                   
67                                        mHierarchyInterface->TraverseNode(node);
[59]68
[74]69                                        continue;
70                                }
[59]71
[74]72                                // identify previously visible nodes
73                                bool wasVisible = mHierarchyInterface->IsNodeVisible(node) &&
74                                        (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1);
[59]75                               
[74]76                                // identify nodes that we cannot skip queries for
[87]77                                // geometry not only in leaves => test for renderable geometry
78                                bool issueQuery = !wasVisible || mHierarchyInterface->HasGeometry(node);
[95]79                               
[74]80                                // reset node's visibility classification
81                                mHierarchyInterface->SetNodeVisible(node, false);
[59]82
[74]83                                // update node's visited flag
84                                mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());
[59]85                       
[87]86                                // skip testing previously visible nodes without geometry
87                                if (issueQuery)
[74]88                                {
[87]89                                        mNumQueriesIssued ++;
90
91                                        queryQueue.push(QueryPair(node, mHierarchyInterface->
92                                                IssueOcclusionQuery(node, wasVisible)));
[74]93                                }
[59]94                                       
[74]95                                // always traverse a node if it was visible
96                                if (wasVisible)
97                                {
98                                        mHierarchyInterface->TraverseNode(node);
99                                }
[59]100                        }
101                }
102        }
103}
104
105} // namespace GtpVisibility
Note: See TracBrowser for help on using the repository browser.