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

Revision 3331, 4.3 KB checked in by mattausch, 15 years ago (diff)

performance testing

RevLine 
[2766]1#include "SceneEntity.h"
2#include "Geometry.h"
3#include "Material.h"
[2769]4#include "RenderState.h"
[2840]5#include "Shape.h"
[2844]6#include "Transform3.h"
7#include "Camera.h"
[3110]8#include "glInterface.h"
[2844]9
[2766]10
[2842]11using namespace std;
12
13
[2776]14namespace CHCDemoEngine
[2766]15{
16
[3259]17int sCurrentId = 0;
[2865]18bool SceneEntity::sUseLODs = true;
[3259]19int SceneEntity::sCurrentVisibleId = -1;
[2842]20
[2844]21SceneEntity::SceneEntity(Transform3 *trafo):
[3245]22mTransform(trafo),
23mCurrentLODLevel(0),
24mLODLastUpdated(-1),
25mId(sCurrentId ++),
26mVisibleId(0)
[2766]27{
[2844]28        mBox.Initialize();
[2766]29}
30
31
[2792]32SceneEntity::~SceneEntity()
33{
34}
35
36
[2847]37void SceneEntity::UpdateLODs(const Vector3 &viewPoint)
[2766]38{
[2865]39        mCurrentLODLevel = 0;
40
41        if (!sUseLODs) return;
42
[3070]43        const Vector3 pos = GetWorldCenter();
[2853]44        const float dist = SqrDistance(pos, viewPoint);
[2841]45
[2853]46        // note: we assume that lods are ordered from smallest distance to largest
[2847]47        const int l = (int)mLODLevels.size();
[2839]48
[2844]49        for (int i = 0; i < l; ++ i)
[2766]50        {
[3102]51                if (mLODLevels[i].GetSquaredDistance() > dist) break;
[2844]52                mCurrentLODLevel = i;
[2839]53        }
[2848]54}
[2766]55
[2848]56
57int SceneEntity::GetCurrentLODLevel()
58{
59        if (mLODLastUpdated != LODLevel::sFrameId)
[2841]60        {
[2848]61                mLODLastUpdated = LODLevel::sFrameId;
62                UpdateLODs(LODLevel::sViewPoint);
63        }
64
65        return mCurrentLODLevel;
[2839]66}
[2825]67
[2848]68
[2844]69void SceneEntity::GetCurrentLODLevel(ShapeContainer::iterator &start,
70                                                                         ShapeContainer::iterator &end)
71{
[2847]72        if (mLODLastUpdated != LODLevel::sFrameId)
73        {
74                mLODLastUpdated = LODLevel::sFrameId;
75                UpdateLODs(LODLevel::sViewPoint);
76        }
77
[3070]78        start = mLODLevels[mCurrentLODLevel].GetShapes().begin();
79        end   = mLODLevels[mCurrentLODLevel].GetShapes().end();
[2844]80}
[2825]81
[2844]82
[3034]83void SceneEntity::GetLODLevel(int level,
[2844]84                                                          ShapeContainer::iterator &start,
85                                                          ShapeContainer::iterator &end)
[2839]86{
[3070]87        start = mLODLevels[level].GetShapes().begin();
88        end = mLODLevels[level].GetShapes().end();
[2844]89}
[2839]90
91
[2844]92void SceneEntity::Render(RenderState *state)
93{
94        ShapeContainer::iterator sit, sit_end;
[2841]95
[3070]96        if (!mLODLevels.empty())
[3331]97        {
[3070]98                GetCurrentLODLevel(sit, sit_end);
[3331]99        }
[3070]100        else
101        {
102                sit = mShapes.begin(); sit_end = mShapes.end();
103        }
[2844]104
[3110]105        Prepare(state);
[3071]106
[2844]107        for (; sit != sit_end; ++ sit)
[3331]108        {
[3114]109                (*sit)->Render(state, this);
[3331]110        }
[3071]111
112        mTransform->Unload(state);
[2766]113}
114
115
[2839]116void SceneEntity::AddShape(Shape *shape)
[2766]117{
[2839]118        mShapes.push_back(shape);
[2844]119        mBox.Include(shape->GetBoundingBox());
[2847]120
121        mCenter = mBox.Center();
[2766]122}
123
124
[2840]125void SceneEntity::SetTransform(Transform3 *trafo)
[2766]126{
127        mTransform = trafo;
128}
129
130
[3245]131void SceneEntity::SetLastRenderedFrame(int lastRenderedFrame)
[2766]132{
[3245]133        mLastRenderedFrame = lastRenderedFrame;
[2766]134}
135
136
[3245]137int SceneEntity::GetLastRenderedFrame() const
[2766]138{
[3245]139        return mLastRenderedFrame;
[2766]140}
141
142
[2844]143int SceneEntity::CountNumTriangles(int lodLevel)
[2766]144{
[2842]145        int numTriangles = 0;
[2844]146       
147        ShapeContainer::iterator sit, sit_end;
[2766]148
[2844]149        if (lodLevel == -1)
[2848]150                lodLevel = GetCurrentLODLevel();
[2842]151
[3070]152        return mLODLevels[lodLevel].GetNumTriangles();
[2766]153}
154
155
[3070]156AxisAlignedBox3 SceneEntity::GetWorldBoundingBox() const
[2844]157{
[2961]158        if (mTransform->IsIdentity()) return mBox;
[2957]159        Matrix4x4 mat = mTransform->GetMatrix();
160
161        return Transform(mBox, mat);
[2844]162}
163
164
165AxisAlignedBox3 SceneEntity::GetBoundingBox() const
166{
167        return mBox;
168}
169
[2847]170
[3070]171Vector3 SceneEntity::GetWorldCenter() const
[2847]172{
[3110]173        if (mTransform->IsIdentity()) return mCenter;
[3120]174        return mTransform->GetMatrix() * mCenter;
[2847]175}
176
177
[3110]178void SceneEntity::Prepare(RenderState *state)
179{
[3113]180        /*int id[] = {(mId / (255 * 255)) % 255, (mId / 255) % 255, mId % 255, 0};
[3110]181
182        GLfloat fogColor[4] = {(float)id[0] / 255.0f, (float)id[1] / 255.0f, (float)id[2] / 255.0f, .0f};
[3113]183        glFogfv(GL_FOG_COLOR, fogColor);*/
[3110]184
185        mTransform->Load(state);
[3101]186}
[3110]187
188
[3262]189AxisAlignedBox3 SceneEntity::ComputeBoundingBox(SceneEntity **entities, int numEntities)
190{
191        AxisAlignedBox3 box;
192       
[3268]193        if (numEntities <= 0)
[3262]194        {       // no box => just initialize
195                box.Initialize();
196        }
197        else
198        {
199                box = entities[0]->GetWorldBoundingBox();
200
201                for (int i = 1; i < numEntities; ++ i)
202                {
203                        box.Include(entities[i]->GetWorldBoundingBox());
204                }
205        }
206
207        return box;
208}
209
210
211AxisAlignedBox3 SceneEntity::ComputeBoundingBox(const SceneEntityContainer &entities)
212{
213        AxisAlignedBox3 box;
214       
[3268]215        if (entities.empty())
[3262]216        {       // no box => just initialize
217                box.Initialize();
218        }
219        else
220        {
221                box = entities[0]->GetWorldBoundingBox();
222
223                for (size_t i = 1; i < entities.size(); ++ i)
224                {
225                        box.Include(entities[i]->GetWorldBoundingBox());
226                }
227        }
228
229        return box;
230}
231
232
233
234
[3110]235}
Note: See TracBrowser for help on using the repository browser.