#include "RenderQueue.h" #include "SceneEntity.h" #include "Geometry.h" #include "Texture.h" #include "Material.h" using namespace std; namespace CHCDemo { inline static bool IsLower(SceneEntity *ent1, SceneEntity *ent2) { Texture *t1 = ent1->GetMaterial()->GetTexture(); Texture *t2 = ent2->GetMaterial()->GetTexture(); int tsize1 = t1 ? t1->GetByteSize() : 0; int tsize2 = t2 ? t2->GetByteSize() : 0; if (tsize1 == tsize2) return ent1->GetMaterial() < ent2->GetMaterial(); return tsize1 < tsize2; } RenderQueue::RenderQueue(): mState(NULL), mMinSizeForSorting(5) { } RenderQueue::RenderQueue(RenderState *state): mState(state) { } void RenderQueue::Enqueue(SceneEntity **entities, int size) { for (int i = 0; i < size; ++ i) mEntities.push_back(entities[i]); } void RenderQueue::Clear() { mEntities.clear(); } void RenderQueue::SetRenderState(RenderState *state) { mState = state; } void RenderQueue::Render() { if (mEntities.size() >= mMinSizeForSorting) Sort(); //if (!mEntities.empty()) Debug << "rendering render queue" << endl; SceneEntityContainer::const_iterator sit, sit_end = mEntities.end(); for (sit = mEntities.begin(); sit != sit_end; ++ sit) { SceneEntity *ent = *sit; ent->Render(mState); /*if (ent->GetMaterial()->GetTexture()) Debug << " " << ent->GetMaterial()->GetTexture()->GetWidth(); else Debug << " 0";*/ } } void RenderQueue::Sort() { //InitTiming(); //long t1, t2; //t1 = GetTime(); sort(mEntities.begin(), mEntities.end(), IsLower); //t2 = GetTime(); //cout << "sort: " << TimeDiff(t1, t2) << endl; } }