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

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