source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderQueue.cpp @ 2800

Revision 2800, 2.2 KB checked in by mattausch, 16 years ago (diff)

friendly culling debug version with timers, no materials

Line 
1#include "RenderQueue.h"
2#include "SceneEntity.h"
3#include "Geometry.h"
4#include "Texture.h"
5#include "Material.h"
6
7using namespace std;
8
9
10namespace CHCDemoEngine
11{
12
13
14inline static bool IsLower(SceneEntity *ent1, SceneEntity *ent2)
15{
16        // group by texture size
17        Texture *t1 = ent1->GetMaterial()->GetTexture();
18        Texture *t2 = ent2->GetMaterial()->GetTexture();
19
20        int tsize1 = t1 ? t1->GetByteSize() : 0;
21        int tsize2 = t2 ? t2->GetByteSize() : 0;
22
23        return tsize1 > tsize2;
24}
25
26
27inline static bool IsLower2(SceneEntity *ent1, SceneEntity *ent2)
28{
29        return ent1->GetMaterial() < ent2->GetMaterial();
30}
31
32
33RenderQueue::RenderQueue(): mState(NULL), mMinSizeForSorting(3)
34{
35}
36
37
38RenderQueue::RenderQueue(RenderState *state):
39mState(state)
40{
41}
42
43
44void RenderQueue::Enqueue(SceneEntity *entity)
45{
46        mEntities.push_back(entity);
47}
48       
49
50void RenderQueue::Clear()
51{
52        mEntities.clear();
53
54}
55
56
57void RenderQueue::SetRenderState(RenderState *state)
58{
59        mState = state;
60}
61
62
63void RenderQueue::Render()
64{
65        if (mEntities.size() >= mMinSizeForSorting)
66        {
67                sortTimer.Entry();
68                Sort();
69                sortTimer.Exit();
70        }
71       
72        SceneEntityContainer::const_iterator sit, sit_end = mEntities.end();
73
74        for (sit = mEntities.begin(); sit != sit_end; ++ sit)
75        {
76                SceneEntity *ent = *sit;
77                ent->Render(mState);
78        }
79
80        //Print();
81}
82
83
84void RenderQueue::Print()
85{
86        SceneEntityContainer::const_iterator sit, sit_end = mEntities.end();
87
88        Debug << "\nrq size: " << GetSize() << endl;
89        Debug << "texture size: " << endl;
90
91        // show ordering by texture size
92        for (sit = mEntities.begin(); sit != sit_end; ++ sit)
93        {
94                SceneEntity *ent = *sit;
95                Texture *t = ent->GetMaterial()->GetTexture();
96       
97                int tsize = t ? t->GetByteSize() : 0;
98                Debug << tsize << " ";
99        }
100
101        // show ordering by material
102        Debug << "\nmaterial ptr: " << endl;
103       
104        for (sit = mEntities.begin(); sit != sit_end; ++ sit)
105        {
106                Debug << (*sit)->GetMaterial() << " ";
107        }
108}
109
110
111void RenderQueue::Apply()
112{
113        Render();
114        Clear();
115}
116
117
118void RenderQueue::Sort()
119{
120        // sort by material
121        sort(mEntities.begin(), mEntities.end(), IsLower2);
122        // sort by texture size
123        stable_sort(mEntities.begin(), mEntities.end(), IsLower);
124}
125
126
127}
Note: See TracBrowser for help on using the repository browser.