[372] | 1 | #ifndef _SceneGraph_H__
|
---|
| 2 | #define _SceneGraph_H__
|
---|
| 3 |
|
---|
| 4 | #include <string>
|
---|
| 5 | #include "Containers.h"
|
---|
| 6 | #include "AxisAlignedBox3.h"
|
---|
[2609] | 7 | #include "Matrix4x4.h"
|
---|
[372] | 8 |
|
---|
[860] | 9 | namespace GtpVisibilityPreprocessor {
|
---|
[2600] | 10 |
|
---|
[2678] | 11 | class SceneGraphLeafIntersectable;
|
---|
| 12 | class CKTB;
|
---|
| 13 |
|
---|
| 14 |
|
---|
| 15 | /** Basic scene graph node, we are interested only in bounding boxes and topology
|
---|
| 16 | of the scene graph
|
---|
| 17 | */
|
---|
| 18 | class SceneGraphNode
|
---|
| 19 | {
|
---|
[372] | 20 | public:
|
---|
| 21 |
|
---|
[2600] | 22 | virtual ~SceneGraphNode();
|
---|
[2678] | 23 | virtual bool IsLeaf() const = 0;
|
---|
| 24 |
|
---|
[2600] | 25 | virtual void UpdateBox() = 0;
|
---|
[2678] | 26 |
|
---|
| 27 | virtual AxisAlignedBox3 GetBox() const { return mBox; }
|
---|
| 28 |
|
---|
| 29 | protected:
|
---|
| 30 |
|
---|
| 31 | AxisAlignedBox3 mBox;
|
---|
| 32 | };
|
---|
| 33 |
|
---|
| 34 |
|
---|
| 35 |
|
---|
| 36 | /** Scene graph interior node.
|
---|
| 37 | */
|
---|
| 38 | class SceneGraphInterior: public SceneGraphNode
|
---|
| 39 | {
|
---|
| 40 | public:
|
---|
| 41 | virtual bool IsLeaf() const { return false; }
|
---|
[2600] | 42 | virtual void UpdateBox();
|
---|
[2678] | 43 |
|
---|
| 44 | ~SceneGraphInterior();
|
---|
| 45 |
|
---|
| 46 | //protected:
|
---|
| 47 |
|
---|
| 48 | SceneGraphNodeContainer mChildren;
|
---|
| 49 | };
|
---|
| 50 |
|
---|
| 51 |
|
---|
| 52 | /** Scene graph leaf node.
|
---|
| 53 | */
|
---|
| 54 | class SceneGraphLeaf: public SceneGraphNode
|
---|
| 55 | {
|
---|
| 56 | public:
|
---|
[2702] | 57 | /** Copy constructor.
|
---|
| 58 | */
|
---|
| 59 | SceneGraphLeaf(SceneGraphLeaf const&);
|
---|
[2678] | 60 | SceneGraphLeaf();
|
---|
| 61 | SceneGraphLeaf(bool isDynamic);
|
---|
| 62 | ~SceneGraphLeaf();
|
---|
[2615] | 63 |
|
---|
| 64 | void LoadTransform(const Matrix4x4 &m);
|
---|
| 65 |
|
---|
| 66 | void GetTransform(Matrix4x4 &m) const;
|
---|
| 67 |
|
---|
| 68 | virtual AxisAlignedBox3 GetBox() const;
|
---|
[2694] | 69 | /** Returns the box without the trafo.
|
---|
| 70 | */
|
---|
| 71 | virtual AxisAlignedBox3 GetOriginalBox() const;
|
---|
[2678] | 72 |
|
---|
| 73 | virtual void ApplyTransform(const Matrix4x4 &trafo);
|
---|
| 74 | virtual bool IsDynamic() const { return mIsDynamic;}
|
---|
| 75 | virtual bool IsLeaf() const { return true; }
|
---|
[2600] | 76 | virtual void UpdateBox();
|
---|
[2621] | 77 |
|
---|
[2709] | 78 | bool HasChanged() { return mHasChanged; }
|
---|
| 79 |
|
---|
| 80 | void SetHasChanged(bool hasChanged) {mHasChanged = hasChanged;}
|
---|
[2678] | 81 | SceneGraphLeafIntersectable *GetIntersectable() { return mIntersectable; }
|
---|
[372] | 82 |
|
---|
[2702] | 83 | const Matrix4x4 &GetTransformation() const { return mTrafo; }
|
---|
| 84 |
|
---|
| 85 | //void SetGeometry(ObjectContainer *geometry);
|
---|
| 86 |
|
---|
| 87 | /// used as actual pvs entry: note should be pointer to geometry!!
|
---|
[2678] | 88 | ObjectContainer mGeometry;
|
---|
[2702] | 89 |
|
---|
[2678] | 90 | protected:
|
---|
[2600] | 91 |
|
---|
[2678] | 92 | SceneGraphLeafIntersectable *mIntersectable;
|
---|
[2600] | 93 |
|
---|
[2678] | 94 | bool mIsDynamic;
|
---|
[2709] | 95 | bool mHasChanged;
|
---|
| 96 |
|
---|
[2678] | 97 | Matrix4x4 mTrafo;
|
---|
[2715] | 98 |
|
---|
| 99 | bool mDeleteGeometry;
|
---|
[2678] | 100 | };
|
---|
| 101 |
|
---|
| 102 |
|
---|
| 103 |
|
---|
[2609] | 104 | /** Scene graph class
|
---|
| 105 | */
|
---|
| 106 | class SceneGraph
|
---|
| 107 | {
|
---|
[372] | 108 |
|
---|
| 109 | public:
|
---|
[1002] | 110 |
|
---|
[1328] | 111 | SceneGraph();
|
---|
[1002] | 112 | ~SceneGraph();
|
---|
[1328] | 113 |
|
---|
[2176] | 114 | bool Export(const std::string filename);
|
---|
[372] | 115 |
|
---|
[2601] | 116 | int CollectObjects(ObjectContainer &instances);
|
---|
[492] | 117 |
|
---|
[1328] | 118 | int AssignObjectIds();
|
---|
[492] | 119 |
|
---|
[1328] | 120 | void GetStatistics(int &intersectables, int &faces) const;
|
---|
[372] | 121 |
|
---|
[2615] | 122 | AxisAlignedBox3 GetBox() const { return mRoot->GetBox(); }
|
---|
[1328] | 123 | /** Exports binary version of the scene.
|
---|
| 124 | */
|
---|
[2176] | 125 | void ExportScene(const std::string filename);
|
---|
[1328] | 126 | /** Loads binary version of the scene.
|
---|
| 127 | */
|
---|
[2176] | 128 | void LoadScene(const std::string filename);
|
---|
[1166] | 129 |
|
---|
[2601] | 130 | SceneGraphInterior *GetRoot();
|
---|
[1328] | 131 |
|
---|
[2601] | 132 | //void SetRoot(SceneGraphNode *sgNnode);
|
---|
| 133 | void SetRoot(SceneGraphInterior *sgNnode);
|
---|
[1328] | 134 |
|
---|
[2601] | 135 | void AddChild(SceneGraphNode *node);
|
---|
[1958] | 136 |
|
---|
[2601] | 137 | int GetSize() const;
|
---|
| 138 |
|
---|
[372] | 139 | protected:
|
---|
[1328] | 140 |
|
---|
[2601] | 141 | SceneGraphInterior *mRoot;
|
---|
[372] | 142 | };
|
---|
| 143 |
|
---|
| 144 |
|
---|
[860] | 145 | }
|
---|
[372] | 146 |
|
---|
| 147 | #endif
|
---|