"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/OpenGLRenderQueue/LSGOpenGlRenderQueue.h

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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator