Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef RenderQueue_INCLUDE_ONCE
00033 #define RenderQueue_INCLUDE_ONCE
00034
00035 #include <vlGraphics/RenderQueueSorter.hpp>
00036
00037 namespace vl
00038 {
00039
00040
00041
00045 class RenderQueue: public Object
00046 {
00047 VL_INSTRUMENT_CLASS(vl::RenderQueue, Object)
00048
00049 public:
00050 RenderQueue(): mSize(0), mSizeMP(0)
00051 {
00052 VL_DEBUG_SET_OBJECT_NAME()
00053 mList.reserve(100);
00054 mListMP.reserve(100);
00055 }
00056
00057 const RenderToken* at(int i) const { return mList[i].get(); }
00058
00059 RenderToken* at(int i) { return mList[i].get(); }
00060
00061 RenderToken* newToken(bool multipass)
00062 {
00063 if (multipass)
00064 {
00065 ++mSizeMP;
00066 if ( mSizeMP > (int)mListMP.size() )
00067 mListMP.push_back( new RenderToken );
00068 return mListMP[mSizeMP-1].get();
00069 }
00070 else
00071 {
00072 ++mSize;
00073 if ( mSize > (int)mList.size() )
00074 mList.push_back( new RenderToken );
00075 return mList[mSize-1].get();
00076 }
00077 }
00078
00079 void clear()
00080 {
00081 mSize = 0;
00082 mSizeMP = 0;
00083 }
00084
00085 bool empty()
00086 {
00087 return mSize == 0;
00088 }
00089
00090 int size() const
00091 {
00092 return mSize;
00093 }
00094
00095 void sort(RenderQueueSorter* sorter, Camera* camera)
00096 {
00097 if (sorter->mightNeedZCameraDistance())
00098 {
00099 for(int i=0; i<size(); ++i)
00100 {
00101 RenderToken* tok = at(i);
00102 vec3 center = tok->mRenderable->boundingBox().isNull() ? vec3(0,0,0) : tok->mRenderable->boundingBox().center();
00103 if ( sorter->confirmZCameraDistanceNeed(tok) )
00104 {
00105 if (tok->mActor->transform())
00106
00107 tok->mCameraDistance = -( camera->viewMatrix() * (tok->mActor->transform()->worldMatrix() * center) ).z();
00108 else
00109
00110 tok->mCameraDistance = -( camera->viewMatrix() * center ).z();
00111 }
00112 else
00113 tok->mCameraDistance = 0;
00114 }
00115 }
00116
00117 VL_CHECK( sorter )
00118 std::sort( mList.begin(), mList.begin() + size(), Sorter( sorter ) );
00119 }
00120
00121 private:
00122 class Sorter
00123 {
00124 public:
00125 Sorter(const RenderQueueSorter* sorter): mRenderQueueSorter(sorter) {}
00126 bool operator()(const ref<RenderToken>& a, const ref<RenderToken>& b) const
00127 {
00128 VL_CHECK(a && b);
00129 return mRenderQueueSorter->operator()(a.get(), b.get());
00130 }
00131 protected:
00132 const RenderQueueSorter* mRenderQueueSorter;
00133 };
00134
00135 protected:
00136
00137
00138
00139
00140
00141
00142 std::vector< ref<RenderToken> > mList;
00143 std::vector< ref<RenderToken> > mListMP;
00144 int mSize;
00145 int mSizeMP;
00146 };
00147
00148 typedef std::map< float, ref<RenderQueue> > TRenderQueueMap;
00149
00150 }
00151
00152 #endif