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

RevLine 
[2764]1#ifndef __SCENEENTITY_H
2#define __SCENEENTITY_H
3
4#include "common.h"
5#include "AxisAlignedBox3.h"
6#include "Triangle3.h"
[2839]7#include "LODInfo.h"
[2764]8
[2819]9
[2776]10namespace CHCDemoEngine
[2764]11{
12
13class Material;
14class Geometry;
15class RenderState;
[2840]16class Transform3;
[2844]17class Camera;
[2764]18
[2840]19
[2764]20/** Class representing a scene entity.
[3260]21    A scene entity basically consists of one or more shapes and a transformation.
[2764]22*/
23class SceneEntity
24{
[2802]25        friend class RenderQueue;
26
[2764]27public:
[2839]28       
[2764]29        /** Creates a scene entity.
30        */
[2840]31        SceneEntity(Transform3 *trafo);
[3070]32        /** Destructor.
33        */
[3042]34        virtual ~SceneEntity();
[2764]35        /** Renders this node.
36        */
[3042]37        virtual void Render(RenderState *state);       
[2839]38        /** Set pointer to the shape
[2764]39        */
[2839]40        void AddShape(Shape *shape);
[2764]41        /** See set
42        */
[3245]43        inline Shape *GetShape(int i) const;
[2839]44        /** Returns number of shapes in vector.
45        */
[3259]46        inline int GetNumShapes() const;
[2764]47        /** Set pointer to the geometry
48        */
[2840]49        void SetTransform(Transform3 *trafo);
[2764]50        /** set frame where we last rendered this node
51        */
[3245]52        void SetLastRenderedFrame(int lastRendered);
[2764]53        /** returns frame where we last visited this node
54        */
[3245]55        int GetLastRenderedFrame() const;
[2839]56        /** Returns the trafo of this scene entity.
57        */
[3245]58        inline Transform3 *GetTransform() const;
[2844]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        */
[2848]62        int CountNumTriangles(int lodLevel = -1);
[3070]63        /** Returns the local bounding box.
[2844]64        */
65        AxisAlignedBox3 GetBoundingBox() const;
66        /** Returns the transformed bounding box.
67        */
[3070]68        AxisAlignedBox3 GetWorldBoundingBox() const;
[3245]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;
[2764]78
[2841]79
[2844]80        ////////////////
[2842]81
[2847]82       
[2844]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        */
[3245]91        void AddLODLevel(const LODLevel &lod);
[2844]92        /** Returns numbers of lod levels.
93        */
[3245]94        int GetNumLODLevels() const;
[3120]95        /** Returns center point of this shape.
96        */
[3245]97        Vector3 GetCenter() const;
[2847]98        /** Returns transformed center point of this shape.
99        */
[3070]100        Vector3 GetWorldCenter() const;
[3110]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
[3260]111        /** If false, the highest (=most detailed) LOD level is used for all entities.
[2865]112        */
[3245]113        static void SetUseLODs(bool useLODs);
[3110]114        /** See set
115        */
[3245]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        */
[3259]120        static void SetCurrentVisibleId(int id);
[3260]121        /** Returns the id that indicates a visible object.
122        */
[3259]123        static int GetCurrentVisibleId();
[3251]124
[3262]125        static AxisAlignedBox3 ComputeBoundingBox(SceneEntity **entities, int numEntities);
126        static AxisAlignedBox3 ComputeBoundingBox(const SceneEntityContainer &entities);
[3259]127
[3262]128
[2764]129protected:
130
[2847]131        /** Internally updates current lod level.
132        */
133        void UpdateLODs(const Vector3 &viewPoint);
[2848]134        /** Returns updated index of current lod level.
135        */
136        int GetCurrentLODLevel();
[2847]137
138
[3110]139        /////////////////////
140
[2847]141        /// the bounding box
[2844]142        AxisAlignedBox3 mBox;
[3071]143        /// describes a 3D transform
[2840]144        Transform3 *mTransform;
145        /// Stores information about the LOD levels
[3070]146        LODLevelArray mLODLevels;
[2840]147        /// the renderable shapes
[2839]148        ShapeContainer mShapes;
[2840]149        /// when this entity was last rendered
[3245]150        int mLastRenderedFrame;
[3071]151        /// the LOD level currently used for rendering
[2844]152        int mCurrentLODLevel;
[3071]153        /// frame number in which the LODs were last updated
[2847]154        int mLODLastUpdated;
[3071]155        /// the center of gravity of this entity
[2847]156        Vector3 mCenter;
[3259]157        /// generic id
[3243]158        int mId;
[3259]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
[2865]163        static bool sUseLODs;
[2764]164};
165
[3109]166
[3245]167inline void SceneEntity::AddLODLevel(const LODLevel &lod)
168{
169        mLODLevels.push_back(lod);
[2764]170}
171
[3245]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
[3259]203inline int SceneEntity::GetNumShapes() const
[3245]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
[3259]221inline void SceneEntity::SetCurrentVisibleId(int id)
[3245]222{
[3259]223        sCurrentVisibleId = id;
[3245]224}
225
226
[3259]227inline int SceneEntity::GetCurrentVisibleId()
[3251]228{
[3259]229        return sCurrentVisibleId;
[3251]230}
231
232
[3245]233inline int SceneEntity::GetVisibleId(int id) const
234{
235        return mVisibleId;
236}
237
238
239inline bool SceneEntity::IsVisible() const
240{
[3259]241        return (sCurrentVisibleId == -1) || (mVisibleId == sCurrentVisibleId);
[3245]242}
243
244
245}
246
[2764]247#endif // __SCENEENTITY_H
Note: See TracBrowser for help on using the repository browser.