source: GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTreeHierarchyInterface.cpp @ 1173

Revision 1173, 4.3 KB checked in by szydlowski, 18 years ago (diff)

Finished kdtree hierarchy interface, started modifications to kdtree scene manager

Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of the GameTools Project
4http://www.gametools.org
5
6Author: Martin Szydlowski
7-----------------------------------------------------------------------------
8*/
9
10#include "OgreKdRenderable.h"
11#include "OgreKdTreeSceneManager.h"
12#include "OgreKdTreeHierarchyInterface.h"
13
14namespace Ogre
15{
16
17KdTreeHierarchyInterface::KdTreeHierarchyInterface(KdTreeSceneManager *sm, RenderSystem *rsys):
18PlatformHierarchyInterface(sm, rsys)
19{
20
21}
22
23bool KdTreeHierarchyInterface::IsLeaf(GtpVisibility::HierarchyNode *node) const
24{
25        return KDNODEPTR_CAST(node)->isLeaf();
26}
27
28void KdTreeHierarchyInterface::TraverseNode(GtpVisibility::HierarchyNode *node)
29{
30        ++ mNumTraversedNodes;
31
32        KdTree::Node * kdnode = KDNODEPTR_CAST(node);
33
34        // if the node is a leaf and has geometry => render it
35        if (kdnode->isLeaf())
36        {
37                if (!kdnode->isEmpty())
38                {
39                        RenderNode(node);
40                }
41        }
42        else
43        {
44                KdTree::Branch * kdbranch = KDBRANCHPTR_CAST(node);
45                if (kdbranch->mLeft)
46                        mDistanceQueue->push(kdbranch->mLeft);
47                if (kdbranch->mRight)
48                        mDistanceQueue->push(kdbranch->mRight);
49        }
50}
51
52void KdTreeHierarchyInterface::RenderNode(GtpVisibility::HierarchyNode *node)
53{
54        KdTree::Node * kdnode = KDNODEPTR_CAST(node);
55        if (kdnode->lastRendered() != mFrameId)
56        {
57                kdnode->setLastRendered(mFrameId);
58                KdTreeSceneManager * ksm = static_cast<KdTreeSceneManager *>(mSceneManager);
59
60                // render only if the node is a leaf
61                if (kdnode->isLeaf())
62                {
63                        ksm->_renderNodes(KDLEAFPTR_CAST(node)->mKdRenderables, mCamera,
64                                mOnlyShadowCasters, mLeavePassesInQueue);
65                }       
66
67                mVisibleNodes.push_back(node);
68        }
69}
70
71void KdTreeHierarchyInterface::PullUpVisibility(GtpVisibility::HierarchyNode *node) const
72{
73        KdTree::Node * kdnode = KDNODEPTR_CAST(node);
74
75        while (kdnode && !kdnode->isNodeVisible())
76        {
77                kdnode->setNodeVisible(true);
78                kdnode = kdnode->getParent();
79        }
80}
81
82float KdTreeHierarchyInterface::GetSquaredDistance(GtpVisibility::HierarchyNode *node) const
83{
84        const Vector3 pos = KDNODEPTR_CAST(node)->mAABB.getCenter();
85        return (mCameraPosition - pos).squaredLength();
86}
87
88AxisAlignedBox * KdTreeHierarchyInterface::GetBoundingBox(GtpVisibility::HierarchyNode *node)
89{
90        // reuse box if node is the same
91        // only create renderable bounding box for new node
92        if (node != mSavedNode)
93        {
94                mSavedNode = node;
95                mBox = KDNODEPTR_CAST(node)->_getWorldAABB();
96        }
97
98        return &mBox;
99}
100
101bool KdTreeHierarchyInterface::HasGeometry(GtpVisibility::HierarchyNode *node) const
102{
103        return KDNODEPTR_CAST(node)->hasGeometry();
104}
105
106void KdTreeHierarchyInterface::SetNodeVisible(GtpVisibility::HierarchyNode *node, const bool visible) const
107{
108        KDNODEPTR_CAST(node)->setNodeVisible(visible);
109}
110
111bool KdTreeHierarchyInterface::IsNodeVisible(GtpVisibility::HierarchyNode *node) const
112{
113        return KDNODEPTR_CAST(node)->isNodeVisible();
114}
115
116void KdTreeHierarchyInterface::SetLastVisited(GtpVisibility::HierarchyNode *node, const unsigned int frameId) const
117{
118        KDNODEPTR_CAST(node)->setLastVisited(frameId);
119}
120
121unsigned int KdTreeHierarchyInterface::LastVisited(GtpVisibility::HierarchyNode *node) const
122{
123        return KDNODEPTR_CAST(node)->lastVisited();
124}
125
126void KdTreeHierarchyInterface::VisualizeCulledNode(GtpVisibility::HierarchyNode *node,
127                                                                                                   GtpVisibility::CullingType type) const
128{
129        WireBoundingBox *box = KDNODEPTR_CAST(node)->getWireBoundingBox();
130
131        if (type == GtpVisibility::FRUSTUM_CULLED)
132        {
133                box->setMaterial("FrustumCulledNodesMaterial");
134        }
135        else // type == GtpVisibility::QUERY_CULLED
136        {
137                box->setMaterial("QueryCulledNodesMaterial");
138        }
139
140        // TODO: maybe boxlist?
141        dynamic_cast<KdTreeSceneManager *>(mSceneManager)->getRenderQueue()->addRenderable(box);
142}
143
144void KdTreeHierarchyInterface::GetNodeGeometryList(GtpVisibility::HierarchyNode *node,
145                                                                                                   GtpVisibility::GeometryVector *geometryList,
146                                                                                                   bool includeChildren)
147{
148        KdTree::Node * kdnode = KDNODEPTR_CAST(node);
149        if (kdnode->isLeaf())
150        {
151                KdTree::Leaf * kdleaf = KDLEAFPTR_CAST(node);
152                KdRenderableList::iterator it = kdleaf->mKdRenderables.begin();
153                KdRenderableList::iterator end = kdleaf->mKdRenderables.end();
154                while (it != end)
155                {
156                        (*it)->getGeometryList(geometryList);
157                        it++;
158                }
159        }
160}
161
162} // namespace Ogre
Note: See TracBrowser for help on using the repository browser.