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

Revision 3114, 5.0 KB checked in by mattausch, 16 years ago (diff)

worked on dynamic objects: now ook, but have to work on render queue

RevLine 
[2767]1#include "RenderQueue.h"
2#include "SceneEntity.h"
3#include "Geometry.h"
4#include "Texture.h"
5#include "Material.h"
[2802]6#include "Camera.h"
[2840]7#include "Shape.h"
[3054]8#include "RenderState.h"
[3071]9#include "Transform3.h"
[2767]10
[3071]11
[2768]12using namespace std;
[2767]13
[2768]14
[2776]15namespace CHCDemoEngine
[2767]16{
17
[2802]18RenderQueue::RenderQueue():
19mState(NULL),
[2844]20mNumEntries(0)
[2802]21{
[2801]22}
23
24
[3061]25RenderQueue::RenderQueue(RenderState *state):
[2802]26mState(state),
[2844]27mNumEntries(0)
[2795]28{
29}
30
31
[2802]32RenderQueue::~RenderQueue()
[2767]33{
[2802]34        for (size_t i = 0; i < mBuckets.size(); ++ i)
35        {
36                DEL_PTR(mBuckets[i]);
37        }
[2767]38}
39
40
[2841]41bool RenderQueue::FitsInBucket(Shape *shape, size_t idx) const
[2767]42{
[3054]43        Technique *tech = shape->GetMaterial()->GetTechnique(mState->GetRenderTechnique());
[2841]44
[2826]45        // test if entity belongs to this bucket
[3054]46        if (tech->IsAlphaTestEnabled() != mBuckets[idx]->mAlphaTestEnabled) { return false; }
47        if (tech->IsCullFaceEnabled() != mBuckets[idx]->mCullFaceEnabled) { return false; }
48        if (tech->IsColorWriteEnabled() != mBuckets[idx]->mColorWriteEnabled) { return false; }
49        if (tech->IsLightingEnabled() != mBuckets[idx]->mLightingEnabled) { return false; }
50        if (tech->IsDepthWriteEnabled() != mBuckets[idx]->mDepthWriteEnabled) { return false; }
[2802]51
[3054]52        //if (tech->IsColorWriteEnabled()) cout << "x";
53
[3042]54        const bool hasTexture = (tech->GetTexture() != NULL);
[2805]55
[3054]56        if (hasTexture != mBuckets[idx]->mHasTexture) { return false; }
[2802]57
[2805]58        if (hasTexture)
59        {
[3054]60                if (tech->GetTexture()->GetWidth() != mBuckets[idx]->mTexWidth) { return false; }
61                if (tech->GetTexture()->GetHeight() != mBuckets[idx]->mTexHeight) {return false; }
62                if (tech->GetTexture()->GetFormat() != mBuckets[idx]->mTexFormat) { return false; }
[2805]63        }
64
[3054]65        //if (!tech->GetFragmentProgram() && mBuckets[idx]->mHasFragmentProgram) { return false; }
66        //if (!tech->GetVertexProgram() && mBuckets[idx]->mHasVertexProgram) { return false; }
67        if (tech->GetFragmentProgram() != mBuckets[idx]->mFragmentProgram) { return false; }
68        if (tech->GetVertexProgram() != mBuckets[idx]->mVertexProgram) { return false; }
[3051]69
[2802]70        return true;
[2767]71}
72
73
[2773]74void RenderQueue::Enqueue(SceneEntity *entity)
[2767]75{
[2844]76        ShapeContainer::iterator sit, sit_end;
[2841]77
[2844]78        entity->GetCurrentLODLevel(sit, sit_end);
[2841]79
[2844]80        for (; sit != sit_end; ++ sit)
[2841]81        {
[3110]82                Enqueue(*sit, entity);
[2841]83        }
84}
85
86
[3110]87void RenderQueue::Enqueue(Shape *shape, SceneEntity *containingEnt)
[2841]88{
[3054]89        Technique *tech = shape->GetMaterial()->GetTechnique(mState->GetRenderTechnique());
90        RenderQueueBucket *bucket = tech->mRenderQueueBucket;
91
[2844]92        ++ mNumEntries;
[2841]93       
[3054]94        if (!bucket)
[2802]95        {
96                bool bucketFound = false;
97
98                size_t i = 0;
99
100                for (; i < mBuckets.size(); ++ i)
101                {
[2842]102                        if (bucketFound = FitsInBucket(shape, i))
[2802]103                                break;
104                }
105
106                // create new bucket
107                if (!bucketFound)
108                {
109                        RenderQueueBucket *bucket = new RenderQueueBucket();
[3060]110                        //bucket->mMinDistance = -1;
[2802]111
[3042]112                        bucket->mAlphaTestEnabled = tech->IsAlphaTestEnabled();
113                        bucket->mCullFaceEnabled = tech->IsCullFaceEnabled();
[2802]114
[3051]115                        bucket->mColorWriteEnabled = tech->IsColorWriteEnabled();
116                        bucket->mLightingEnabled = tech->IsLightingEnabled();
117                        bucket->mDepthWriteEnabled = tech->IsDepthWriteEnabled();
[2805]118
119
[3051]120                        Texture *tex = tech->GetTexture();
[2805]121
[3051]122                        if (tex != NULL)
123                        {
124                                bucket->mHasTexture = true;
125
126                                bucket->mTexWidth = tex->GetWidth();
127                                bucket->mTexHeight = tex->GetHeight();
128
129                                bucket->mTexFormat = tex->GetFormat();
130                        }
131                        else
132                        {
133                                bucket->mHasTexture = false;
134
135                                bucket->mTexWidth = 0;
136                                bucket->mTexHeight = 0;
137                                bucket->mTexFormat = 0;
138                        }
139
[3054]140                        //      bucket->mHasVertexProgram = (tech->GetVertexProgram() != NULL);
141                        //      bucket->mHasFragmentProgram = (tech->GetFragmentProgram() != NULL);
142                        bucket->mVertexProgram = tech->GetVertexProgram();
143                        bucket->mFragmentProgram = tech->GetFragmentProgram();
[3051]144
[2802]145                        mBuckets.push_back(bucket);
[3054]146                        //cout << "increased #buckets to " << (int)mBuckets.size() << endl;
[2802]147                }
148
149                bucket = mBuckets[i];
[3054]150                tech->mRenderQueueBucket = bucket;
[2802]151        }
[2840]152
[3060]153        if (bucket->IsEmpty())
[2844]154        {
[3061]155                // add bucket to the list of currently active buckets that will be rendered
[2844]156                // assume that the incoming nodes are ordered by distance
[3060]157                // => active buckets are sorted by distance
158                mActiveBuckets.push_back(bucket);
[3061]159        }
[2844]160
[3110]161        bucket->mShapes.push_back(ShapePair(shape, containingEnt));
[2767]162}
163
[2802]164
[2767]165void RenderQueue::Clear()
166{
[3060]167        for (size_t i = 0; i < mActiveBuckets.size(); ++ i)
[2844]168        {
[3060]169                mActiveBuckets[i]->mShapes.clear();
[2844]170        }
[2767]171
[2844]172        mNumEntries = 0;
[3060]173        mActiveBuckets.clear();
[2767]174}
175
176
177void RenderQueue::SetRenderState(RenderState *state)
178{
179        mState = state;
180}
181
182
183void RenderQueue::Render()
184{
[2802]185        // render all buckets
[3061]186        for (size_t i = 0; i < mActiveBuckets.size(); ++ i)
[2767]187        {
[3071]188                ShapePairArray::const_iterator sit, sit_end = mActiveBuckets[i]->mShapes.end();
[2840]189
[3061]190                for (sit = mActiveBuckets[i]->mShapes.begin(); sit != sit_end; ++ sit)
[2802]191                {
[3071]192                        ShapePair s = *sit;
193
194                        Shape *shape = s.first;
[3110]195                        SceneEntity *ent = s.second;
[3071]196
[3110]197                        if (ent) ent->Prepare(mState);
[3114]198                        shape->Render(mState, ent);
[3110]199                        if (ent) ent->GetTransform()->Unload(mState);
[2802]200                }
[2767]201        }
[3061]202        //cout << "active: " << (int)mActiveBuckets.size() << endl;
[2767]203}
[2795]204
205
[2842]206void RenderQueue::Apply()
[2767]207{
[2842]208        Render();
209        Clear();
[2767]210}
211
212
213}
Note: See TracBrowser for help on using the repository browser.