- Timestamp:
- 06/28/08 16:12:59 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderQueue.cpp
r2801 r2802 4 4 #include "Texture.h" 5 5 #include "Material.h" 6 #include "Camera.h" 7 6 8 7 9 using namespace std; … … 13 15 { 14 16 17 static Camera *sCam = NULL; 15 18 16 inline static bool CompTexture(SceneEntity *ent1, SceneEntity *ent2) 19 20 inline static bool CompDist(SceneEntity *e1, SceneEntity *e2) 17 21 { 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())); 26 25 } 27 26 28 27 29 #ifdef SORT_ALPHA 30 31 inline static bool CompMat(SceneEntity *ent1, SceneEntity *ent2) 32 { 33 return ent1->GetMaterial()->IsAlphaTestEnabled() < ent2->GetMaterial()->IsAlphaTestEnabled(); 28 inline static bool CompDist2(RenderQueueBucket *b1, RenderQueueBucket *b2) 29 { 30 return (b1->mMinDistance < b2->mMinDistance); 34 31 } 35 32 36 #else37 33 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) 34 RenderQueue::RenderQueue(): 35 mState(NULL), 36 mMinSizeForSorting(3), 37 mCamera(NULL), 38 mSize(0) 47 39 { 48 40 } 49 41 50 42 51 RenderQueue::RenderQueue(RenderState *state): 52 mState(state), mMinSizeForSorting(3) 43 RenderQueue::RenderQueue(RenderState *state, Camera *cam): 44 mState(state), 45 mMinSizeForSorting(3), 46 mCamera(cam), 47 mSize(0) 53 48 { 49 sCam = cam; 50 } 51 52 53 RenderQueue::~RenderQueue() 54 { 55 for (size_t i = 0; i < mBuckets.size(); ++ i) 56 { 57 DEL_PTR(mBuckets[i]); 58 } 59 } 60 61 62 bool 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; 54 75 } 55 76 … … 57 78 void RenderQueue::Enqueue(SceneEntity *entity) 58 79 { 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); 60 124 } 61 125 62 126 63 127 void RenderQueue::Clear() 64 128 { 65 mEntities.clear(); 129 for (size_t i = 0; i < mBuckets.size(); ++ i) 130 mBuckets[i]->mEntities.clear(); 66 131 132 mSize = 0; 67 133 } 68 134 … … 76 142 void RenderQueue::Render() 77 143 { 78 if (mEntities.size() >= mMinSizeForSorting) 144 Sort(); 145 146 // render all buckets 147 for (size_t i = 0; i < mBuckets.size(); ++ i) 79 148 { 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 } 91 155 } 92 156 … … 97 161 void RenderQueue::Print() 98 162 { 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; 100 166 101 Debug << "\nrq size: " << GetSize() << endl; 102 Debug << "texture size: " << endl; 167 SceneEntityContainer::const_iterator sit, sit_end = mBuckets[i]->mEntities.end(); 103 168 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; 109 172 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 } 124 178 } 125 179 } … … 135 189 void RenderQueue::Sort() 136 190 { 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); 148 193 } 149 194
Note: See TracChangeset
for help on using the changeset viewer.