"L. Spiro Engine"
|
00001 00016 #ifndef __LSG_OPENGLRENDERQUEUE_H__ 00017 #define __LSG_OPENGLRENDERQUEUE_H__ 00018 00019 #include "../LSGGraphicsLib.h" 00020 #include "../RenderQueue/LSGRenderQueueBase.h" 00021 #include "Search/LSSTDIndexSorter.h" 00022 00023 #ifdef LSG_OGL 00024 00025 namespace lsg { 00026 00033 class COpenGlRenderQueue : public CRenderQueueBase { 00034 public : 00035 // == Functions. 00039 LSVOID LSE_CALL Sort(); 00040 00041 00042 00043 // == Functions. 00044 00045 00046 protected : 00047 // == Various constructors. 00048 LSE_CALLCTOR COpenGlRenderQueue(); 00049 00050 00051 // == Types. 00055 typedef struct LSG_RENDER_QUEUE_ENTRY_EX : public LSG_RENDER_QUEUE_ENTRY { 00056 // == Operators. 00064 LSBOOL LSE_CALL operator < ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const; 00065 00073 LSBOOL LSE_CALL operator == ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const; 00074 } * LPLSG_RENDER_QUEUE_ENTRY_EX, * const LPCLSG_RENDER_QUEUE_ENTRY_EX; 00075 00076 00077 // == Members. 00081 CIndexSorter<LSG_RENDER_QUEUE_ENTRY_EX> m_isSorter; 00082 }; 00083 00084 00085 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00086 // DEFINITIONS 00087 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00088 // == Operators. 00096 LSE_INLINE LSBOOL LSE_CALL COpenGlRenderQueue::LSG_RENDER_QUEUE_ENTRY_EX::operator < ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const { 00097 if ( bAlpha ) { 00098 // Larger distance wins. 00099 if ( fDist > _rqieOther.fDist ) { return true; } 00100 // If distances are equal, use the other data to check for an order. 00101 if ( fDist < _rqieOther.fDist ) { return false; } 00102 } 00103 00104 // For opaque or same-distance alpha objects, texture slots first. 00105 for ( LSUINT32 I = 0UL; I < LSG_MAX_TEXTURE_UNITS; ++I ) { 00106 if ( prqiItem->ui32Textures[I] < _rqieOther.prqiItem->ui32Textures[I] ) { return true; } 00107 } 00108 // Then shader ID. 00109 if ( prqiItem->ui64ShaderId < _rqieOther.prqiItem->ui64ShaderId ) { return true; } 00110 // Distance last. 00111 if ( fDist < _rqieOther.fDist ) { return true; } 00112 return false; 00113 } 00114 00122 LSE_INLINE LSBOOL LSE_CALL COpenGlRenderQueue::LSG_RENDER_QUEUE_ENTRY_EX::operator == ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const { 00123 if ( fDist != _rqieOther.fDist ) { return false; } 00124 if ( prqiItem->ui64ShaderId != _rqieOther.prqiItem->ui64ShaderId ) { return false; } 00125 for ( LSUINT32 I = 0UL; I < LSG_MAX_TEXTURE_UNITS; ++I ) { 00126 if ( prqiItem->ui32Textures[I] != _rqieOther.prqiItem->ui32Textures[I] ) { return false; } 00127 } 00128 return true; 00129 } 00130 00131 } // namespace lsg 00132 00133 #endif // #ifdef LSG_OGL 00134 00135 #endif // __LSG_OPENGLRENDERQUEUE_H__