"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/DirectXRenderQueue/LSGDirectX11RenderQueue.h

00001 
00016 #ifndef __LSG_DIRECTX11RENDERQUEUE_H__
00017 #define __LSG_DIRECTX11RENDERQUEUE_H__
00018 
00019 #include "../LSGGraphicsLib.h"
00020 #include "../RenderQueue/LSGRenderQueueBase.h"
00021 #include "Search/LSSTDIndexSorter.h"
00022 
00023 #ifdef LSG_DX11
00024 
00025 namespace lsg {
00026 
00033         class CDirectX11RenderQueue : public CRenderQueueBase {
00034         public :
00035                 // == Functions.
00039                 LSVOID LSE_CALL                                                 Sort();
00040 
00041 
00042         protected :
00043                 // == Various constructors.
00044                 LSE_CALLCTOR                                                    CDirectX11RenderQueue();
00045 
00046 
00047                 // == Types.
00051                 typedef struct LSG_RENDER_QUEUE_ENTRY_EX : public LSG_RENDER_QUEUE_ENTRY {
00052                         // == Operators.
00060                         LSBOOL LSE_CALL                                         operator < ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const;
00061 
00069                         LSBOOL LSE_CALL                                         operator == ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const;
00070                 } * LPLSG_RENDER_QUEUE_ENTRY_EX, * const LPCLSG_RENDER_QUEUE_ENTRY_EX;
00071 
00072 
00073                 // == Members.
00077                 CIndexSorter<LSG_RENDER_QUEUE_ENTRY_EX> m_isSorter;
00078         };
00079 
00080 
00081         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00082         // DEFINITIONS
00083         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00084         // == Operators.
00092         LSE_INLINE LSBOOL LSE_CALL CDirectX11RenderQueue::LSG_RENDER_QUEUE_ENTRY_EX::operator < ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const {
00093                 if ( bAlpha ) {
00094                         // Larger distance wins.
00095                         if ( fDist > _rqieOther.fDist ) { return true; }
00096                         // If distances are equal, use the other data to check for an order.
00097                         if ( fDist < _rqieOther.fDist ) { return false; }
00098                 }
00099                 // For opaque or same-distance alpha objects, shader ID is first.
00100                 if ( prqiItem->ui64ShaderId < _rqieOther.prqiItem->ui64ShaderId ) { return true; }
00101                 // Then texture slots.
00102                 for ( LSUINT32 I = 0UL; I < LSG_MAX_TEXTURE_UNITS; ++I ) {
00103                         if ( prqiItem->ui32Textures[I] < _rqieOther.prqiItem->ui32Textures[I] ) { return true; }
00104                 }
00105                 // Distance last.
00106                 if ( fDist < _rqieOther.fDist ) { return true; }
00107                 return false;
00108         }
00109 
00117         LSE_INLINE LSBOOL LSE_CALL CDirectX11RenderQueue::LSG_RENDER_QUEUE_ENTRY_EX::operator == ( const LSG_RENDER_QUEUE_ENTRY_EX &_rqieOther ) const {
00118                 if ( fDist != _rqieOther.fDist ) { return false; }
00119                 if ( prqiItem->ui64ShaderId != _rqieOther.prqiItem->ui64ShaderId ) { return false; }
00120                 for ( LSUINT32 I = 0UL; I < LSG_MAX_TEXTURE_UNITS; ++I ) {
00121                         if ( prqiItem->ui32Textures[I] != _rqieOther.prqiItem->ui32Textures[I] ) { return false; }
00122                 }
00123                 return true;
00124         }
00125 
00126 }       // namespace lsg
00127 
00128 #endif  // #ifdef LSG_DX11
00129 
00130 #endif  // __LSG_DIRECTX11RENDERQUEUE_H__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator