Ignore:
Timestamp:
06/28/08 16:12:59 (16 years ago)
Author:
mattausch
Message:

worked on renderqueue

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderQueue.cpp

    r2801 r2802  
    44#include "Texture.h" 
    55#include "Material.h" 
     6#include "Camera.h" 
     7 
    68 
    79using namespace std; 
     
    1315{ 
    1416 
     17static Camera *sCam = NULL; 
    1518 
    16 inline static bool CompTexture(SceneEntity *ent1, SceneEntity *ent2) 
     19 
     20inline static bool CompDist(SceneEntity *e1, SceneEntity *e2) 
    1721{ 
    18         // group by texture size 
    19         Texture *t1 = ent1->GetMaterial()->GetTexture(); 
    20         Texture *t2 = ent2->GetMaterial()->GetTexture(); 
    21  
    22         int tsize1 = t1 ? t1->GetByteSize() : 0; 
    23         int tsize2 = t2 ? t2->GetByteSize() : 0; 
    24  
    25         return tsize1 > tsize2; 
     22        return  
     23                (SqrMagnitude(e1->GetBoundingBox().Center() - sCam->GetPosition()) < 
     24                 SqrMagnitude(e2->GetBoundingBox().Center() - sCam->GetPosition())); 
    2625} 
    2726 
    2827 
    29 #ifdef SORT_ALPHA 
    30  
    31 inline static bool CompMat(SceneEntity *ent1, SceneEntity *ent2) 
    32 {  
    33         return ent1->GetMaterial()->IsAlphaTestEnabled() < ent2->GetMaterial()->IsAlphaTestEnabled(); 
     28inline static bool CompDist2(RenderQueueBucket *b1, RenderQueueBucket *b2) 
     29{ 
     30        return (b1->mMinDistance < b2->mMinDistance); 
    3431} 
    3532 
    36 #else 
    3733 
    38 inline static bool CompMat(SceneEntity *ent1, SceneEntity *ent2) 
    39 { 
    40         return ent1->GetMaterial() < ent2->GetMaterial(); 
    41 } 
    42  
    43 #endif 
    44  
    45  
    46 RenderQueue::RenderQueue(): mState(NULL), mMinSizeForSorting(3) 
     34RenderQueue::RenderQueue():  
     35mState(NULL),  
     36mMinSizeForSorting(3), 
     37mCamera(NULL), 
     38mSize(0) 
    4739{ 
    4840} 
    4941 
    5042 
    51 RenderQueue::RenderQueue(RenderState *state): 
    52 mState(state), mMinSizeForSorting(3) 
     43RenderQueue::RenderQueue(RenderState *state, Camera *cam): 
     44mState(state),  
     45mMinSizeForSorting(3), 
     46mCamera(cam), 
     47mSize(0) 
    5348{ 
     49        sCam = cam; 
     50} 
     51 
     52 
     53RenderQueue::~RenderQueue() 
     54{ 
     55        for (size_t i = 0; i < mBuckets.size(); ++ i) 
     56        { 
     57                DEL_PTR(mBuckets[i]); 
     58        } 
     59} 
     60 
     61 
     62bool RenderQueue::FitsInBucket(SceneEntity *ent, size_t idx) const 
     63{ 
     64        Material *mat = ent->GetMaterial(); 
     65 
     66        // test if entity  
     67        if (mat->IsAlphaTestEnabled() != mBuckets[idx]->mAlphaTestEnabled) 
     68                return false; 
     69 
     70        int tsize = mat->GetTexture() ? mat->GetTexture()->GetByteSize() : 0; 
     71        if (tsize != mBuckets[idx]->mTextureSize) 
     72                return false; 
     73 
     74        return true; 
    5475} 
    5576 
     
    5778void RenderQueue::Enqueue(SceneEntity *entity) 
    5879{ 
    59         mEntities.push_back(entity); 
     80        RenderQueueBucket *bucket; 
     81        ++ mSize; 
     82 
     83        if (entity->mRenderQueueBucket) 
     84        { 
     85                bucket = entity->mRenderQueueBucket; 
     86        } 
     87        else 
     88        { 
     89                bool bucketFound = false; 
     90 
     91                size_t i = 0; 
     92 
     93                for (; i < mBuckets.size(); ++ i) 
     94                { 
     95                        if (bucketFound = FitsInBucket(entity, i)) 
     96                                break; 
     97                } 
     98 
     99                // create new bucket 
     100                if (!bucketFound) 
     101                { 
     102                        RenderQueueBucket *bucket = new RenderQueueBucket(); 
     103 
     104                        Material *mat = entity->GetMaterial(); 
     105 
     106                        bucket->mAlphaTestEnabled = mat->IsAlphaTestEnabled(); 
     107                        bucket->mTextureSize = mat->GetTexture() ? mat->GetTexture()->GetByteSize() : 0; 
     108 
     109                        mBuckets.push_back(bucket); 
     110 
     111                        // assume that the incoming nodes are ordered by distance => set min dist 
     112                        // on first incoming node 
     113                        float dist = SqrMagnitude(entity->GetBoundingBox().Center() - mCamera->GetPosition()); 
     114                        mBuckets[i]->mMinDistance = dist; 
     115 
     116                        //cout << "num buckets: " << (int)mBuckets.size() << endl; 
     117                } 
     118 
     119                bucket = mBuckets[i]; 
     120                entity->mRenderQueueBucket = bucket; 
     121        } 
     122 
     123        bucket->mEntities.push_back(entity); 
    60124} 
    61          
     125 
    62126 
    63127void RenderQueue::Clear() 
    64128{ 
    65         mEntities.clear(); 
     129        for (size_t i = 0; i < mBuckets.size(); ++ i) 
     130                mBuckets[i]->mEntities.clear(); 
    66131 
     132        mSize = 0; 
    67133} 
    68134 
     
    76142void RenderQueue::Render() 
    77143{ 
    78         if (mEntities.size() >= mMinSizeForSorting) 
     144        Sort(); 
     145         
     146        // render all buckets 
     147        for (size_t i = 0; i < mBuckets.size(); ++ i) 
    79148        { 
    80                 sortTimer.Entry(); 
    81                 Sort(); 
    82                 sortTimer.Exit(); 
    83         } 
    84          
    85         SceneEntityContainer::const_iterator sit, sit_end = mEntities.end(); 
    86  
    87         for (sit = mEntities.begin(); sit != sit_end; ++ sit) 
    88         { 
    89                 SceneEntity *ent = *sit; 
    90                 ent->Render(mState); 
     149                SceneEntityContainer::const_iterator sit, sit_end = mBuckets[i]->mEntities.end(); 
     150                for (sit = mBuckets[i]->mEntities.begin(); sit != sit_end; ++ sit) 
     151                { 
     152                        SceneEntity *ent = *sit; 
     153                        ent->Render(mState); 
     154                } 
    91155        } 
    92156 
     
    97161void RenderQueue::Print() 
    98162{ 
    99         SceneEntityContainer::const_iterator sit, sit_end = mEntities.end(); 
     163        for (size_t i = 0; i < mBuckets.size(); ++ i) 
     164        { 
     165                Debug << "\n******\nbucket " << i << endl; 
    100166 
    101         Debug << "\nrq size: " << GetSize() << endl; 
    102         Debug << "texture size: " << endl; 
     167                SceneEntityContainer::const_iterator sit, sit_end = mBuckets[i]->mEntities.end(); 
    103168 
    104         // show ordering by texture size 
    105         for (sit = mEntities.begin(); sit != sit_end; ++ sit) 
    106         { 
    107                 SceneEntity *ent = *sit; 
    108                 Texture *t = ent->GetMaterial()->GetTexture(); 
     169                for (sit = mBuckets[i]->mEntities.begin(); sit != sit_end; ++ sit) 
     170                { 
     171                        SceneEntity *ent = *sit; 
    109172         
    110                 int tsize = t ? t->GetByteSize() : 0; 
    111                 Debug << tsize << " "; 
    112         } 
    113  
    114         // show ordering by material 
    115         Debug << "\nmaterial: " << endl; 
    116          
    117         for (sit = mEntities.begin(); sit != sit_end; ++ sit) 
    118         { 
    119 #ifdef SORT_ALPHA 
    120                 Debug << (*sit)->GetMaterial()->IsAlphaTestEnabled() << " "; 
    121 #else 
    122                 Debug << (*sit)->GetMaterial() << " "; 
    123 #endif 
     173                        Material *mat = ent->GetMaterial(); 
     174                        int tsize = mat->GetTexture() ? mat->GetTexture()->GetByteSize() : 0; 
     175                        float dist = SqrMagnitude(ent->GetBoundingBox().Center() - mCamera->GetPosition()); 
     176                        Debug << "e: " << ent << " a: " << mat->IsAlphaTestEnabled() << " s: " << tsize << " d: " << dist << " " << ent->GetBoundingBox() << " g: " << ent->GetGeometry() << " t: " << ent->GetTransformation() << " m: " << ent->GetMaterial() << endl; 
     177                } 
    124178        } 
    125179} 
     
    135189void RenderQueue::Sort() 
    136190{ 
    137 #ifdef SORT_ALPHA 
    138         // sort by texture size 
    139         sort(mEntities.begin(), mEntities.end(), CompTexture); 
    140         // sort by alpha test enabled 
    141         stable_sort(mEntities.begin(), mEntities.end(), CompMat); 
    142 #else 
    143         // sort by material 
    144         sort(mEntities.begin(), mEntities.end(), CompMat); 
    145         // sort by texture size 
    146         stable_sort(mEntities.begin(), mEntities.end(), CompTexture); 
    147 #endif 
     191        // sort buckets itself 
     192        sort(mBuckets.begin(), mBuckets.end(), CompDist2); 
    148193} 
    149194 
Note: See TracChangeset for help on using the changeset viewer.