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

Revision 2844, 2.9 KB checked in by mattausch, 16 years ago (diff)

lod starting to work

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)
23{
24        mBox.Initialize();
25}
26
27
28SceneEntity::~SceneEntity()
29{
30}
31
32
33void SceneEntity::UpdateLODs(Camera *cam)
34{
35        const Vector3 pos = GetTransformedBoundingBox().Center();
36
37        const float distance = SqrDistance(pos, cam->GetPosition());
38
39        mCurrentLODLevel = 0;
40
41        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        start = mLODLevels[mCurrentLODLevel]->mShapes.begin();
63        end = mLODLevels[mCurrentLODLevel]->mShapes.end();
64}
65
66
67void SceneEntity::GetLODLevel(int level,
68                                                          ShapeContainer::iterator &start,
69                                                          ShapeContainer::iterator &end)
70{
71        LODLevel *lod = mLODLevels[level];
72
73        start = lod->mShapes.begin();
74        end = lod->mShapes.end();
75}
76
77
78void SceneEntity::Render(RenderState *state)
79{
80        ShapeContainer::iterator sit, sit_end;
81
82        /*if (mShapes.size() > 8)
83        {
84                sit = mShapes.begin() + 6;
85                sit_end = mShapes.begin() + 6;
86        }
87        else*/
88                GetCurrentLODLevel(sit, sit_end);
89
90        //if (mShapes.size() > 1)
91                //mShapes[0]->Render(state);
92        for (; sit != sit_end; ++ sit)
93        {
94                (*sit)->Render(state);
95        }
96}
97
98
99void SceneEntity::AddShape(Shape *shape)
100{
101        mShapes.push_back(shape);
102        mBox.Include(shape->GetBoundingBox());
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}
Note: See TracBrowser for help on using the repository browser.