"L. Spiro Engine"
|
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__