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

Revision 3085, 3.1 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
10
11using namespace std;
12
13
14namespace CHCDemoEngine
15{
16
17bool SceneEntity::sUseLODs = true;
18
19
20SceneEntity::SceneEntity(Transform3 *trafo):
21mTransform(trafo), mCurrentLODLevel(0), mLODLastUpdated(-1)
22{
23        mBox.Initialize();
24}
25
26
27SceneEntity::~SceneEntity()
28{
29}
30
31
32void SceneEntity::UpdateLODs(const Vector3 &viewPoint)
33{
34        mCurrentLODLevel = 0;
35
36        if (!sUseLODs) return;
37
38        const Vector3 pos = GetWorldCenter();
39
40        const float dist = SqrDistance(pos, viewPoint);
41
42        // note: we assume that lods are ordered from smallest distance to largest
43        const int l = (int)mLODLevels.size();
44
45        for (int i = 0; i < l; ++ i)
46        {
47                if (mLODLevels[i].GetSquaredDistance() > dist)
48                        break;
49
50                mCurrentLODLevel = i;
51        }
52}
53
54
55int SceneEntity::GetCurrentLODLevel()
56{
57        if (mLODLastUpdated != LODLevel::sFrameId)
58        {
59                mLODLastUpdated = LODLevel::sFrameId;
60                UpdateLODs(LODLevel::sViewPoint);
61        }
62
63        return mCurrentLODLevel;
64}
65
66
67void SceneEntity::GetCurrentLODLevel(ShapeContainer::iterator &start,
68                                                                         ShapeContainer::iterator &end)
69{
70        if (mLODLastUpdated != LODLevel::sFrameId)
71        {
72                mLODLastUpdated = LODLevel::sFrameId;
73                UpdateLODs(LODLevel::sViewPoint);
74        }
75
76        start = mLODLevels[mCurrentLODLevel].GetShapes().begin();
77        end   = mLODLevels[mCurrentLODLevel].GetShapes().end();
78}
79
80
81void SceneEntity::GetLODLevel(int level,
82                                                          ShapeContainer::iterator &start,
83                                                          ShapeContainer::iterator &end)
84{
85        start = mLODLevels[level].GetShapes().begin();
86        end = mLODLevels[level].GetShapes().end();
87}
88
89
90void SceneEntity::Render(RenderState *state)
91{
92        ShapeContainer::iterator sit, sit_end;
93
94        if (!mLODLevels.empty())
95                GetCurrentLODLevel(sit, sit_end);
96        else
97        {
98                sit = mShapes.begin(); sit_end = mShapes.end();
99        }
100
101        mTransform->Load(state);
102
103        for (; sit != sit_end; ++ sit)
104        {
105                (*sit)->Render(state);
106        }
107
108        mTransform->Unload(state);
109}
110
111
112void SceneEntity::AddShape(Shape *shape)
113{
114        mShapes.push_back(shape);
115        mBox.Include(shape->GetBoundingBox());
116
117        mCenter = mBox.Center();
118}
119
120
121void SceneEntity::SetTransform(Transform3 *trafo)
122{
123        mTransform = trafo;
124}
125
126
127void SceneEntity::SetLastRendered(int lastRendered)
128{
129        mLastRendered = lastRendered;
130}
131
132
133int SceneEntity::GetLastRendered() const
134{
135        return mLastRendered;
136}
137
138
139int SceneEntity::CountNumTriangles(int lodLevel)
140{
141        int numTriangles = 0;
142       
143        ShapeContainer::iterator sit, sit_end;
144
145        if (lodLevel == -1)
146        {
147                lodLevel = GetCurrentLODLevel();
148        }
149
150        return mLODLevels[lodLevel].GetNumTriangles();
151}
152
153
154AxisAlignedBox3 SceneEntity::GetWorldBoundingBox() const
155{
156        if (mTransform->IsIdentity()) return mBox;
157
158        Matrix4x4 mat = mTransform->GetMatrix();
159
160        return Transform(mBox, mat);
161}
162
163
164AxisAlignedBox3 SceneEntity::GetBoundingBox() const
165{
166        return mBox;
167}
168
169
170Vector3 SceneEntity::GetWorldCenter() const
171{
172        if (mTransform->IsIdentity())
173                return mCenter;
174
175        return mTransform->GetMatrix() *  mCenter;
176}
177
178
179}
Note: See TracBrowser for help on using the repository browser.