"L. Spiro Engine"
|
00001 00016 #ifndef __LSD_MODELSHADERMANAGER_H__ 00017 #define __LSD_MODELSHADERMANAGER_H__ 00018 00019 #include "../LSDModelLib.h" 00020 #include "CriticalSection/LSHCriticalSection.h" 00021 #include "Map/LSTLMap.h" 00022 #include "ShaderLanguage/LSGShader.h" 00023 00024 namespace lsd { 00025 00026 // == Macros. 00030 #define LSD_SF_NORMALS (1UL << 0ULL) 00031 #define LSD_SF_VERTCOLORS (1UL << 1ULL) 00032 #define LSD_SF_TEX2D0 (1UL << 2ULL) 00033 #define LSD_SF_TEX2D1 (1UL << 3ULL) 00034 #define LSD_SF_TEX2D2 (1UL << 4ULL) 00035 #define LSD_SF_TEX2D3 (1UL << 5ULL) 00036 #define LSD_SF_TEX2D4 (1UL << 6ULL) 00037 #define LSD_SF_TEX2D5 (1UL << 7ULL) 00038 #define LSD_SF_TEX2D6 (1UL << 8ULL) 00039 #define LSD_SF_TEX2D7 (1UL << 9ULL) 00040 #define LSD_SF_DIFFUSETEX (1UL << 10ULL) 00041 #define LSD_SF_TRANSTEX (1UL << 11ULL) 00042 #define LSD_SF_NORMALTEX (1UL << 12ULL) 00043 #define LSD_SF_SPECULARTEX (1UL << 13ULL) 00044 #define LSD_SF_EMISSIVE (1UL << 15ULL) 00045 #define LSD_SF_ALPHA (1UL << 16ULL) 00046 #define LSD_SF_HEMISLIGHTING (1UL << 17ULL) 00047 #define LSD_SF_LIGHTING (1UL << 18ULL) 00048 #define LSD_SF_SHADOWMAP (1UL << 19ULL) 00049 #define LSD_SF_MAKE_DEPTH_COPY (1UL << 20ULL) 00050 #define LSD_SF_MAKE_NORMAL_COPY (1UL << 21ULL) 00051 #define LSD_SF_MAKE_COLORED_SHADOW (1UL << 22ULL) 00052 #define LSD_SF_CELL_LIGHTING (1UL << 23ULL) 00053 #define LSD_SF_BRDF_LIGHTING (1UL << 24ULL) 00058 enum LSD_TEXTURE_TYPES { 00059 LSD_TT_DIFFUSE_TEXTURE, 00060 LSD_TT_TRANS_TEXTURE, 00061 LSD_TT_NORMAL_TEXTURE, 00062 LSD_TT_SPECULAR_TEXTURE, 00063 LSD_TT_TOTAL, 00064 }; 00065 00072 class CModelShaderManager { 00073 public : 00074 // == Types. 00078 typedef struct LSD_SHADER_FLAGS { 00082 LSUINT64 ui64Flags; 00083 00087 LSUINT8 ui8TexSlots[LSD_TT_TOTAL]; 00088 00092 LSUINT8 ui8TexCoords[LSD_TT_TOTAL]; 00093 00094 00095 // == Various constructors. 00096 LSE_CALLCTOR LSD_SHADER_FLAGS(); 00097 00098 00099 // == Operators. 00106 LSBOOL LSE_CALL operator < ( const LSD_SHADER_FLAGS &_sfOther ) const; 00107 00114 LSBOOL LSE_CALL operator == ( const LSD_SHADER_FLAGS &_sfOther ) const; 00115 00122 LSBOOL LSE_CALL operator != ( const LSD_SHADER_FLAGS &_sfOther ) const; 00123 } * LPLSD_SHADER_FLAGS, * const LPCLSD_SHADER_FLAGS; 00124 00125 00126 // == Functions. 00133 static CSharedShaderPtr LSE_CALL GetForwardRenderShader( const LSD_SHADER_FLAGS &_sfFlags ); 00134 00141 static CSharedShaderPtr LSE_CALL GetForwardRenderShaderVL( const LSD_SHADER_FLAGS &_sfFlags ); 00142 00149 static CSharedShaderPtr LSE_CALL GetShadowMapShader( const LSD_SHADER_FLAGS &_sfFlags ); 00150 00154 static LSVOID LSE_CALL DeleteUnrefedShaders(); 00155 00156 protected : 00157 // == Members. 00161 static CMap<LSD_SHADER_FLAGS, CSharedShaderPtr> 00162 m_mForwardShaders; 00163 00167 static CMap<LSD_SHADER_FLAGS, CSharedShaderPtr> 00168 m_mForwardShadowMapShaders; 00169 00173 static CMap<CString, CVector<LSUINT8, LSUINT32> > 00174 m_mFileMap; 00175 00179 static CCriticalSection m_csCrit; 00180 00181 00182 // == Functions. 00191 static CSharedShaderPtr LSE_CALL NewShader( const LSD_SHADER_FLAGS &_sfFlags, const LSCHAR *_pcVertexFile, const LSCHAR *_pcPixelFile ); 00192 00200 static LSBOOL LSE_CALL GenerateMacros( CShader &_sShader, const LSD_SHADER_FLAGS &_sfFlags ); 00201 }; 00202 00203 } // namespace lsd 00204 00205 #endif // __LSD_MODELSHADERMANAGER_H__