source: trunk/VUT/Ogre/src/OgreSceneNodeHierarchyInterface.cpp @ 87

Revision 87, 4.1 KB checked in by mattausch, 19 years ago (diff)
Line 
1#include "OgreSceneNodeHierarchyInterface.h"
2#include <OgreIteratorWrappers.h>
3#include <OgreCamera.h>
4#include <OgreSceneNode.h>
5
6//#include <windows.h>
7
8namespace Ogre {
9
10//-----------------------------------------------------------------------
11SceneNodeHierarchyInterface::SceneNodeHierarchyInterface(SceneManager *sm, RenderSystem *rsys):
12PlatformHierarchyInterface(sm, rsys)
13{               
14}
15//-----------------------------------------------------------------------
16void SceneNodeHierarchyInterface::TraverseNode(GtpVisibility::HierarchyNode *node)
17{
18        mNumTraversedNodes ++;
19       
20        SceneNode *sceneNode = static_cast<SceneNode *>(node);
21
22        if (HasGeometry(node))
23        {
24                RenderNode(node);
25        }
26
27        // internal node: add children to priority queue for further processing
28        Node::ChildNodeIterator it = sceneNode->getChildIterator();
29                               
30        while (it.hasMoreElements())                   
31        {
32                mDistanceQueue->push(it.getNext());
33        }
34}
35//-----------------------------------------------------------------------
36void SceneNodeHierarchyInterface::RenderNode(GtpVisibility::HierarchyNode *node)
37{
38#ifdef GTP_VISIBILITY_MODIFIED_OGRE
39        SceneNode *sceneNode = static_cast<SceneNode *>(node);
40
41        if (sceneNode->lastRendered() != sceneNode->lastVisited())
42        {
43                sceneNode->setLastRendered(sceneNode->lastVisited());
44                mNumRenderedNodes ++;
45
46                mSceneManager->_renderSceneNode(mCamera, sceneNode);
47        }
48#endif
49}
50//-----------------------------------------------------------------------
51bool SceneNodeHierarchyInterface::IsLeaf(GtpVisibility::HierarchyNode *node) const
52{
53        return (static_cast<SceneNode *>(node)->numChildren() == 0);
54}
55//-----------------------------------------------------------------------
56bool SceneNodeHierarchyInterface::HasGeometry(GtpVisibility::HierarchyNode *node) const
57{
58        return static_cast<SceneNode *>(node)->numAttachedObjects() > 0;
59}
60//-----------------------------------------------------------------------
61void SceneNodeHierarchyInterface::PullUpVisibility(GtpVisibility::HierarchyNode *node)
62{
63#ifdef GTP_VISIBILITY_MODIFIED_OGRE
64        SceneNode *sceneNode = static_cast<SceneNode *>(node);
65
66        while(sceneNode && !sceneNode->isNodeVisible())
67        {
68                sceneNode->setNodeVisible(true);
69                sceneNode = sceneNode->getParentSceneNode();
70        }
71#endif
72}
73//-----------------------------------------------------------------------
74float SceneNodeHierarchyInterface::GetSquaredDistance(GtpVisibility::HierarchyNode *node) const
75{
76        return static_cast<SceneNode *>(node)->getSquaredViewDepth(mCamera);
77}
78//-----------------------------------------------------------------------
79void SceneNodeHierarchyInterface::SetNodeVisible(GtpVisibility::HierarchyNode *node,
80                                                                                                 const bool visible)
81{
82#ifdef GTP_VISIBILITY_MODIFIED_OGRE
83        SceneNode *sceneNode = static_cast<SceneNode *>(node);
84        sceneNode->setNodeVisible(visible);
85#endif
86}
87//-----------------------------------------------------------------------
88void SceneNodeHierarchyInterface::SetLastVisited(GtpVisibility::HierarchyNode *node,
89                                                                                                 const unsigned int frameId)
90{
91#ifdef GTP_VISIBILITY_MODIFIED_OGRE
92        SceneNode *sceneNode = static_cast<SceneNode *>(node);
93        sceneNode->setLastVisited(frameId);
94#endif
95}
96//-----------------------------------------------------------------------
97bool SceneNodeHierarchyInterface::IsNodeVisible(GtpVisibility::HierarchyNode *node) const
98{
99#ifdef GTP_VISIBILITY_MODIFIED_OGRE
100        SceneNode *sceneNode = static_cast<SceneNode *>(node);
101        return sceneNode->isNodeVisible();
102#else
103        return true;
104#endif
105}
106//-----------------------------------------------------------------------
107unsigned int SceneNodeHierarchyInterface::LastVisited(GtpVisibility::HierarchyNode *node) const
108{
109#ifdef GTP_VISIBILITY_MODIFIED_OGRE
110        SceneNode *sceneNode = static_cast<SceneNode *>(node);
111        return sceneNode->lastVisited();
112#else
113        return 0;
114#endif
115}
116//-----------------------------------------------------------------------
117AxisAlignedBox *SceneNodeHierarchyInterface::GetBoundingBox(GtpVisibility::HierarchyNode *node)
118{
119        if(node != mPreviousNode)
120        {
121                mPreviousNode = node;
122
123                mBox = static_cast<SceneNode *>(node)->_getWorldAABB();
124        }
125
126        return &mBox;
127}
128} // namespace Ogre     
Note: See TracBrowser for help on using the repository browser.