source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SceneEntity.h @ 3262

Revision 3262, 5.4 KB checked in by mattausch, 15 years ago (diff)

working on pompeii loading. fixed bug in obj conversion

Line 
1#ifndef __SCENEENTITY_H
2#define __SCENEENTITY_H
3
4#include "common.h"
5#include "AxisAlignedBox3.h"
6#include "Triangle3.h"
7#include "LODInfo.h"
8
9
10namespace CHCDemoEngine
11{
12
13class Material;
14class Geometry;
15class RenderState;
16class Transform3;
17class Camera;
18
19
20/** Class representing a scene entity.
21    A scene entity basically consists of one or more shapes and a transformation.
22*/
23class SceneEntity
24{
25        friend class RenderQueue;
26
27public:
28       
29        /** Creates a scene entity.
30        */
31        SceneEntity(Transform3 *trafo);
32        /** Destructor.
33        */
34        virtual ~SceneEntity();
35        /** Renders this node.
36        */
37        virtual void Render(RenderState *state);       
38        /** Set pointer to the shape
39        */
40        void AddShape(Shape *shape);
41        /** See set
42        */
43        inline Shape *GetShape(int i) const;
44        /** Returns number of shapes in vector.
45        */
46        inline int GetNumShapes() const;
47        /** Set pointer to the geometry
48        */
49        void SetTransform(Transform3 *trafo);
50        /** set frame where we last rendered this node
51        */
52        void SetLastRenderedFrame(int lastRendered);
53        /** returns frame where we last visited this node
54        */
55        int GetLastRenderedFrame() const;
56        /** Returns the trafo of this scene entity.
57        */
58        inline Transform3 *GetTransform() const;
59        /** Counts number of triangles in this entity using the specified lod level
60                with 0 being the highest or the current lod level (if the argument is -1).
61        */
62        int CountNumTriangles(int lodLevel = -1);
63        /** Returns the local bounding box.
64        */
65        AxisAlignedBox3 GetBoundingBox() const;
66        /** Returns the transformed bounding box.
67        */
68        AxisAlignedBox3 GetWorldBoundingBox() const;
69        /** Only the scene entities are visible that match the global id.
70        */
71        void SetVisibleId(int id);
72        /** See set
73        */
74        int GetVisibleId(int id) const;
75        /** Returns true if this entity is visible.
76        */
77        bool IsVisible() const;
78
79
80        ////////////////
81
82       
83        /** Returns shapes of specified lod level
84        */
85        void GetLODLevel(int level, ShapeContainer::iterator &start, ShapeContainer::iterator &end);
86        /** Returns shapes of current lod level
87        */
88        void GetCurrentLODLevel(ShapeContainer::iterator &start, ShapeContainer::iterator &end);
89        /** Adds a new lod level.
90        */
91        void AddLODLevel(const LODLevel &lod);
92        /** Returns numbers of lod levels.
93        */
94        int GetNumLODLevels() const;
95        /** Returns center point of this shape.
96        */
97        Vector3 GetCenter() const;
98        /** Returns transformed center point of this shape.
99        */
100        Vector3 GetWorldCenter() const;
101        /** Prepare this scene entity for rendering, i.e., sets the state and the transform.
102                This is used with the render queue. When a shape belonging to this scene entity
103                is rendered, this function is called in beforehand.
104        */
105        void Prepare(RenderState *state);
106
107
108        /////////////
109        //-- static functions
110
111        /** If false, the highest (=most detailed) LOD level is used for all entities.
112        */
113        static void SetUseLODs(bool useLODs);
114        /** See set
115        */
116        static bool GetUseLODs();
117        /** Sets the global visible id. Scene entities are visible only if
118                this id is -1 or their id matches this id.
119        */
120        static void SetCurrentVisibleId(int id);
121        /** Returns the id that indicates a visible object.
122        */
123        static int GetCurrentVisibleId();
124
125        static AxisAlignedBox3 ComputeBoundingBox(SceneEntity **entities, int numEntities);
126        static AxisAlignedBox3 ComputeBoundingBox(const SceneEntityContainer &entities);
127
128
129protected:
130
131        /** Internally updates current lod level.
132        */
133        void UpdateLODs(const Vector3 &viewPoint);
134        /** Returns updated index of current lod level.
135        */
136        int GetCurrentLODLevel();
137
138
139        /////////////////////
140
141        /// the bounding box
142        AxisAlignedBox3 mBox;
143        /// describes a 3D transform
144        Transform3 *mTransform;
145        /// Stores information about the LOD levels
146        LODLevelArray mLODLevels;
147        /// the renderable shapes
148        ShapeContainer mShapes;
149        /// when this entity was last rendered
150        int mLastRenderedFrame;
151        /// the LOD level currently used for rendering
152        int mCurrentLODLevel;
153        /// frame number in which the LODs were last updated
154        int mLODLastUpdated;
155        /// the center of gravity of this entity
156        Vector3 mCenter;
157        /// generic id
158        int mId;
159        /// used to find out if this scene entity is in the current pvs
160        int mVisibleId;
161        static int sCurrentVisibleId;
162        /// if LODs are used for rendering: otherwise we always take the highest lod
163        static bool sUseLODs;
164};
165
166
167inline void SceneEntity::AddLODLevel(const LODLevel &lod)
168{
169        mLODLevels.push_back(lod);
170}
171
172
173inline int SceneEntity::GetNumLODLevels() const
174{
175        return (int)mLODLevels.size();
176}
177
178
179inline Vector3 SceneEntity::GetCenter() const
180{
181        return mCenter;
182}
183
184
185inline void SceneEntity::SetUseLODs(bool useLODs)
186{
187        sUseLODs = useLODs;
188}
189
190
191inline bool SceneEntity::GetUseLODs()
192{
193        return sUseLODs;
194}
195
196
197inline Shape *SceneEntity::GetShape(int i) const
198{
199        return mShapes[i];
200}
201
202
203inline int SceneEntity::GetNumShapes() const
204{
205        return (int)mShapes.size();
206}
207
208
209inline Transform3 *SceneEntity::GetTransform() const 
210{
211        return mTransform;
212}
213
214
215inline void SceneEntity::SetVisibleId(int id)
216{
217        mVisibleId = id;
218}
219
220
221inline void SceneEntity::SetCurrentVisibleId(int id)
222{
223        sCurrentVisibleId = id;
224}
225
226
227inline int SceneEntity::GetCurrentVisibleId()
228{
229        return sCurrentVisibleId;
230}
231
232
233inline int SceneEntity::GetVisibleId(int id) const
234{
235        return mVisibleId;
236}
237
238
239inline bool SceneEntity::IsVisible() const
240{
241        return (sCurrentVisibleId == -1) || (mVisibleId == sCurrentVisibleId);
242}
243
244
245}
246
247#endif // __SCENEENTITY_H
Note: See TracBrowser for help on using the repository browser.