source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SceneEntity.cpp @ 2847

Revision 2847, 3.0 KB checked in by mattausch, 16 years ago (diff)
Line 
1#include "SceneEntity.h"
2#include "Geometry.h"
3#include "Material.h"
4#include "RenderState.h"
5#include "Shape.h"
6#include "Transform3.h"
7#include "Camera.h"
8
9#include "glInterface.h"
10#include <Cg/cg.h>
11#include <Cg/cgGL.h>
12
13
14using namespace std;
15
16
17namespace CHCDemoEngine
18{
19
20
21SceneEntity::SceneEntity(Transform3 *trafo):
22mTransform(trafo), mCurrentLODLevel(0), mLODLastUpdated(-1)
23{
24        mBox.Initialize();
25}
26
27
28SceneEntity::~SceneEntity()
29{
30}
31
32
33void SceneEntity::UpdateLODs(const Vector3 &viewPoint)
34{
35        const Vector3 pos = GetCenter();
36
37        const float distance = SqrDistance(pos, viewPoint);
38
39        mCurrentLODLevel = 0;
40
41        const int l = (int)mLODLevels.size();
42
43        for (int i = 0; i < l; ++ i)
44        {
45                LODLevel *lod = mLODLevels[i];
46
47                if (lod->mSquaredDistance > distance)
48                        break;
49
50                mCurrentLODLevel = i;
51        }
52
53        /*if (mLODLevels.size() > 1)
54        {
55                Debug << "dist: " << distance << " numshapes: " << mLODLevels[mCurrentLODLevel]->mShapes.size() << " lod: " << mCurrentLODLevel << " of " << mLODLevels.size() << endl;
56        }*/
57}
58
59void SceneEntity::GetCurrentLODLevel(ShapeContainer::iterator &start,
60                                                                         ShapeContainer::iterator &end)
61{
62        if (mLODLastUpdated != LODLevel::sFrameId)
63        {
64                mLODLastUpdated = LODLevel::sFrameId;
65                UpdateLODs(LODLevel::sViewPoint);
66        }
67
68        start = mLODLevels[mCurrentLODLevel]->mShapes.begin();
69        end = mLODLevels[mCurrentLODLevel]->mShapes.end();
70}
71
72
73void SceneEntity::GetLODLevel(int level,
74                                                          ShapeContainer::iterator &start,
75                                                          ShapeContainer::iterator &end)
76{
77        LODLevel *lod = mLODLevels[level];
78
79        start = lod->mShapes.begin();
80        end = lod->mShapes.end();
81}
82
83
84void SceneEntity::Render(RenderState *state)
85{
86        ShapeContainer::iterator sit, sit_end;
87
88        GetCurrentLODLevel(sit, sit_end);
89
90        for (; sit != sit_end; ++ sit)
91        {
92                (*sit)->Render(state);
93        }
94}
95
96
97void SceneEntity::AddShape(Shape *shape)
98{
99        mShapes.push_back(shape);
100        mBox.Include(shape->GetBoundingBox());
101
102        mCenter = mBox.Center();
103}
104
105
106void SceneEntity::SetTransform(Transform3 *trafo)
107{
108        mTransform = trafo;
109}
110
111
112void SceneEntity::SetLastRendered(int lastRendered)
113{
114        mLastRendered = lastRendered;
115}
116
117
118int SceneEntity::GetLastRendered() const
119{
120        return mLastRendered;
121}
122
123
124int SceneEntity::CountNumTriangles(int lodLevel)
125{
126        int numTriangles = 0;
127       
128        ShapeContainer::iterator sit, sit_end;
129
130        if (lodLevel == -1)
131        {
132                GetCurrentLODLevel(sit, sit_end);
133        }
134        else
135        {
136                GetLODLevel(lodLevel, sit, sit_end);
137        }
138
139
140        for (; sit != sit_end; ++ sit)
141        {
142                numTriangles += (*sit)->GetGeometry()->GetNumTriangles();
143        }
144
145        return numTriangles;
146}
147
148
149AxisAlignedBox3 SceneEntity::GetTransformedBoundingBox() const
150{
151        Matrix4x4 *mat = mTransform->GetMatrix();
152
153        if (!mat)
154                return mBox;
155
156        return Transform(mBox, *mat);
157}
158
159
160AxisAlignedBox3 SceneEntity::GetBoundingBox() const
161{
162        return mBox;
163}
164
165
166Vector3 SceneEntity::GetCenter() const
167{
168        Matrix4x4 *mat = mTransform->GetMatrix();
169
170        if (!mat)
171                return mCenter;
172
173        return (*mat) * mCenter;
174}
175
176
177}
Note: See TracBrowser for help on using the repository browser.