#include "RenderQueue.h" #include "SceneEntity.h" #include "Geometry.h" #include "Texture.h" #include "Material.h" using namespace std; namespace CHCDemoEngine { inline static bool IsLower(SceneEntity *ent1, SceneEntity *ent2) { // group by texture size Texture *t1 = ent1->GetMaterial()->GetTexture(); Texture *t2 = ent2->GetMaterial()->GetTexture(); int tsize1 = t1 ? t1->GetByteSize() : 0; int tsize2 = t2 ? t2->GetByteSize() : 0; return tsize1 > tsize2; } inline static bool IsLower2(SceneEntity *ent1, SceneEntity *ent2) { return ent1->GetMaterial() < ent2->GetMaterial(); } RenderQueue::RenderQueue(): mState(NULL), mMinSizeForSorting(3) { } RenderQueue::RenderQueue(RenderState *state): mState(state) { } void RenderQueue::Enqueue(SceneEntity *entity) { mEntities.push_back(entity); } void RenderQueue::Clear() { mEntities.clear(); } void RenderQueue::SetRenderState(RenderState *state) { mState = state; } void RenderQueue::Render() { if (mEntities.size() >= mMinSizeForSorting) { sortTimer.Entry(); Sort(); sortTimer.Exit(); } SceneEntityContainer::const_iterator sit, sit_end = mEntities.end(); for (sit = mEntities.begin(); sit != sit_end; ++ sit) { SceneEntity *ent = *sit; ent->Render(mState); } //Print(); } void RenderQueue::Print() { SceneEntityContainer::const_iterator sit, sit_end = mEntities.end(); Debug << "\nrq size: " << GetSize() << endl; Debug << "texture size: " << endl; // show ordering by texture size for (sit = mEntities.begin(); sit != sit_end; ++ sit) { SceneEntity *ent = *sit; Texture *t = ent->GetMaterial()->GetTexture(); int tsize = t ? t->GetByteSize() : 0; Debug << tsize << " "; } // show ordering by material Debug << "\nmaterial ptr: " << endl; for (sit = mEntities.begin(); sit != sit_end; ++ sit) { Debug << (*sit)->GetMaterial() << " "; } } void RenderQueue::Apply() { Render(); Clear(); } void RenderQueue::Sort() { // sort by material sort(mEntities.begin(), mEntities.end(), IsLower2); // sort by texture size stable_sort(mEntities.begin(), mEntities.end(), IsLower); } }