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

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