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

Revision 3053, 5.6 KB checked in by mattausch, 16 years ago (diff)

debug render queue

Line 
1#include "RenderQueue.h"
2#include "SceneEntity.h"
3#include "Geometry.h"
4#include "Texture.h"
5#include "Material.h"
6#include "Camera.h"
7#include "Shape.h"
8
9
10using namespace std;
11
12
13namespace CHCDemoEngine
14{
15
16
17inline static bool CompDist(RenderQueueBucket *b1, RenderQueueBucket *b2)
18{
19        return (b1->mMinDistance < b2->mMinDistance);
20}
21
22
23
24RenderQueue::RenderQueue():
25mState(NULL),
26mMinSizeForSorting(3),
27mCamera(NULL),
28mNumEntries(0)
29{
30}
31
32
33RenderQueue::RenderQueue(RenderState *state, Camera *cam):
34mState(state),
35mMinSizeForSorting(3),
36mCamera(cam),
37mNumEntries(0)
38{
39}
40
41
42RenderQueue::~RenderQueue()
43{
44        for (size_t i = 0; i < mBuckets.size(); ++ i)
45        {
46                DEL_PTR(mBuckets[i]);
47        }
48}
49
50
51bool RenderQueue::FitsInBucket(Shape *shape, size_t idx) const
52{
53        Technique *tech = shape->GetMaterial()->GetDefaultTechnique();
54
55        // test if entity belongs to this bucket
56        // note: rather slows down the application for some reason!!
57        if (tech->IsAlphaTestEnabled() != mBuckets[idx]->mAlphaTestEnabled) { cout << "a"; return false; }
58        if (tech->IsCullFaceEnabled() != mBuckets[idx]->mCullFaceEnabled) { cout << "b"; return false; }
59        if (tech->IsColorWriteEnabled() != mBuckets[idx]->mColorWriteEnabled) { cout << "c"; return false; }
60        if (tech->IsLightingEnabled() != mBuckets[idx]->mLightingEnabled) { cout << "d"; return false; }
61        if (tech->IsDepthWriteEnabled() != mBuckets[idx]->mDepthWriteEnabled) { cout << "e"; return false; }
62
63        const bool hasTexture = (tech->GetTexture() != NULL);
64
65        if (hasTexture != mBuckets[idx]->mHasTexture) { cout << "f"; return false; }
66
67        if (hasTexture)
68        {
69                if (tech->GetTexture()->GetWidth() != mBuckets[idx]->mTexWidth) { cout << "g"; return false; }
70                if (tech->GetTexture()->GetHeight() != mBuckets[idx]->mTexHeight) { cout << "h"; return false; }
71                if (tech->GetTexture()->GetFormat() != mBuckets[idx]->mTexFormat) { cout << "i"; return false; }
72        }
73
74        if (!tech->GetFragmentProgram() && mBuckets[idx]->mHasFragmentProgram) { cout << "j"; return false; }
75        if (!tech->GetVertexProgram() && mBuckets[idx]->mHasVertexProgram) { cout << "h"; return false; }
76
77
78        return true;
79}
80
81
82void RenderQueue::Enqueue(SceneEntity *entity)
83{
84        ShapeContainer::iterator sit, sit_end;
85
86        entity->GetCurrentLODLevel(sit, sit_end);
87
88        for (; sit != sit_end; ++ sit)
89        {
90                Enqueue(*sit);
91        }
92}
93
94
95void RenderQueue::Enqueue(Shape *shape)
96{
97        RenderQueueBucket *bucket;
98        ++ mNumEntries;
99       
100        if (shape->mRenderQueueBucket)
101        {
102                bucket = shape->mRenderQueueBucket;
103        }
104        else
105        {
106                bool bucketFound = false;
107
108                size_t i = 0;
109
110                for (; i < mBuckets.size(); ++ i)
111                {
112                        if (bucketFound = FitsInBucket(shape, i))
113                                break;
114                }
115
116                // create new bucket
117                if (!bucketFound)
118                {
119                        RenderQueueBucket *bucket = new RenderQueueBucket();
120                        bucket->mMinDistance = -1;
121
122                        Technique *tech = shape->GetMaterial()->GetDefaultTechnique();
123
124                        bucket->mAlphaTestEnabled = tech->IsAlphaTestEnabled();
125                        bucket->mCullFaceEnabled = tech->IsCullFaceEnabled();
126
127                        bucket->mColorWriteEnabled = tech->IsColorWriteEnabled();
128                        bucket->mLightingEnabled = tech->IsLightingEnabled();
129                        bucket->mDepthWriteEnabled = tech->IsDepthWriteEnabled();
130
131
132                        Texture *tex = tech->GetTexture();
133
134                        if (tex != NULL)
135                        {
136                                bucket->mHasTexture = true;
137
138                                bucket->mTexWidth = tex->GetWidth();
139                                bucket->mTexHeight = tex->GetHeight();
140
141                                bucket->mTexFormat = tex->GetFormat();
142                        }
143                        else
144                        {
145                                bucket->mHasTexture = false;
146
147                                bucket->mTexWidth = 0;
148                                bucket->mTexHeight = 0;
149                                bucket->mTexFormat = 0;
150                        }
151
152                        bucket->mHasVertexProgram = tech->GetVertexProgram() != NULL;
153                        bucket->mHasFragmentProgram = tech->GetFragmentProgram() != NULL;
154
155                        mBuckets.push_back(bucket);
156
157                        cout << "num buckets: " << (int)mBuckets.size() << endl;
158                }
159
160                bucket = mBuckets[i];
161                shape->mRenderQueueBucket = bucket;
162        }
163
164        if (bucket->mMinDistance < .0f)
165        {
166                // assume that the incoming nodes are ordered by distance
167                // => set min dist on first incoming node
168                const Vector3 v = shape->GetCenter() - mCamera->GetPosition();
169               
170                const float dist = SqrMagnitude(v);
171                bucket->mMinDistance = dist;
172        }
173
174        bucket->mShapes.push_back(shape);
175}
176
177
178void RenderQueue::Clear()
179{
180        for (size_t i = 0; i < mBuckets.size(); ++ i)
181        {
182                mBuckets[i]->mMinDistance = -1;
183                mBuckets[i]->mShapes.clear();
184        }
185
186        mNumEntries = 0;
187}
188
189
190void RenderQueue::SetRenderState(RenderState *state)
191{
192        mState = state;
193}
194
195
196void RenderQueue::Render()
197{
198        // sort the buckets
199        Sort();
200
201        // render all buckets
202        for (size_t i = 0; i < mBuckets.size(); ++ i)
203        {
204                ShapeContainer::const_iterator sit, sit_end = mBuckets[i]->mShapes.end();
205
206                for (sit = mBuckets[i]->mShapes.begin(); sit != sit_end; ++ sit)
207                {
208                        Shape *shape = *sit;
209                        shape->Render(mState);
210                }
211        }
212        //Print();
213}
214
215
216void RenderQueue::Print()
217{
218        for (size_t i = 0; i < mBuckets.size(); ++ i)
219        {
220                Debug << "\n******\nbucket " << (int)i << endl;
221
222                ShapeContainer::const_iterator sit, sit_end = mBuckets[i]->mShapes.end();
223
224                for (sit = mBuckets[i]->mShapes.begin(); sit != sit_end; ++ sit)
225                {
226                        Shape *shape = *sit;
227                       
228                        Technique *tech = shape->GetMaterial()->GetDefaultTechnique();
229                        int tsize = tech->GetTexture() ? tech->GetTexture()->GetByteSize() : 0;
230                       
231                        float dist = SqrMagnitude(shape->GetBoundingBox().Center() - mCamera->GetPosition());
232                       
233                        Debug << "e: " << shape << " a: " << tech->IsAlphaTestEnabled() << " s: " << tsize << " d: " << dist << " " << endl;
234                }
235        }
236}
237
238
239void RenderQueue::Sort()
240{
241        // sort buckets itself
242        sort(mBuckets.begin(), mBuckets.end(), CompDist);
243}
244
245
246void RenderQueue::Apply()
247{
248        Render();
249        Clear();
250}
251
252
253}
Note: See TracBrowser for help on using the repository browser.