"L. Spiro Engine"
|
00001 00016 #ifndef __LSG_SHADERBASE_H__ 00017 #define __LSG_SHADERBASE_H__ 00018 00019 #include "../LSGGraphicsLib.h" 00020 #include "../PreProc/LSGPreProc.h" 00021 #include "Algorithm/LSTLAlgorithm.h" 00022 #include "HighLevel/LSFFilesEx.h" 00023 #include "LSGShaderLanguageParser.h" 00024 #include "LSGShaderLexer.h" 00025 #include "LSGShaderParserWrapper.h" 00026 #include "LSGShaderTranslationProcessorBase.h" 00027 #include "Map/LSTLMap.h" 00028 #include "Matrix/LSMMatrix2x2.h" 00029 #include "Matrix/LSMMatrix3x3.h" 00030 #include "Matrix/LSMMatrix4x4.h" 00031 #include "Set/LSTLSet.h" 00032 #include "String/LSTLString.h" 00033 #include "String/LSTLStringList.h" 00034 #include "Vector/LSMVector2.h" 00035 #include "Vector/LSMVector3.h" 00036 #include "Vector/LSMVector4.h" 00037 00038 namespace lsg { 00039 00046 class CShaderBase { 00047 public : 00048 // == Various constructors. 00049 LSE_CALLCTOR CShaderBase(); 00050 virtual LSE_CALLCTOR ~CShaderBase(); 00051 00052 00053 // == Enumerations. 00057 enum LSG_SHADER_ERRORS { 00058 LSG_SE_SUCCESS, // No error. 00059 LSG_SE_INVALIDINPUT, // Input shader string is NULL. 00060 LSG_SE_STREAMERROR, // Error creating the input stream. 00061 LSG_SE_PARSERERROR, // Error during parsing. 00062 LSG_SE_TRANSLATIONRERROR, // Error during translation. 00063 LSG_SE_FILENOTFOUND, // File does not exist. 00064 LSG_SE_OUTOFMEMORY, // Out of memory. 00065 LSG_SE_SYNTAX, // Syntax error. 00066 LSG_SE_INCLUDERECURSE, // Too many recursive includes. 00067 LSG_SE_INVALIDSHADERTYPE, // Invalid shader type. 00068 LSG_SE_GFXAPIERROR, // Error related to the graphics API. 00069 LSG_SE_NOENDIF, // #endif not found. 00070 LSG_SE_PREPROC, // Preprocessor error. 00071 }; 00072 00073 00074 // == Types. 00078 typedef LSUINT32 LSG_HANDLE; 00079 00083 typedef struct LSG_DEFINE { 00087 const LSCHAR * pcMacro; 00088 00092 const LSCHAR * pcDefinition; 00093 } * LPLSG_DEFINE, * const LPCLSG_DEFINE; 00094 00095 00096 // == Functions. 00100 LSVOID LSE_CALL Reset(); 00101 00112 virtual LSUINT64 LSE_CALL GetId() const; 00113 00127 LSG_SHADER_ERRORS LSE_CALL Compile( CString &_sError ); 00128 00137 LSG_SHADER_ERRORS LSE_CALL CompileFromFiles( const LSCHAR * _pcVertexFile, const LSCHAR * _pcPixelFile, 00138 CString * _psError = NULL ); 00139 00151 LSBOOL LSE_CALL SetVertexShader( const LSCHAR * _pcShader, LSUINT32 _ui32Length = 0 ); 00152 00164 LSBOOL LSE_CALL SetPixelShader( const LSCHAR * _pcShader, LSUINT32 _ui32Length = 0 ); 00165 00175 LSG_SHADER_ERRORS LSE_CALL SetShaderFromFile( const LSCHAR * _pcPath, CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType, 00176 CString &_sError ); 00177 00189 LSG_SHADER_ERRORS LSE_CALL SetShaderFromMemory( const LSUINT8 * _pui8Src, LSUINT32 _ui32Length, 00190 const LSCHAR * _pcPath, CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType, 00191 CString &_sError ); 00192 00201 LSBOOL LSE_CALL SetMacros( const LSG_DEFINE * _pdDefines, LSUINT32 _ui32Total, CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType ); 00202 00210 virtual LSBOOL LSE_CALL Activate( LSVOID * _pvSysValue ) = 0; 00211 00215 virtual LSVOID LSE_CALL Deactivate() = 0; 00216 00220 virtual LSVOID LSE_CALL PreRender(); 00221 00228 virtual LSG_HANDLE LSE_CALL GetConstantByName( const LSCHAR * _pcName ) = 0; 00229 00237 virtual LSBOOL LSE_CALL SetFloat( LSG_HANDLE _hHandle, LSFLOAT _fValue ) = 0; 00238 00247 virtual LSBOOL LSE_CALL SetFloatArray( LSG_HANDLE _hHandle, const LSFLOAT * _pfValues, LSUINT32 _ui32Total ) = 0; 00248 00256 virtual LSBOOL LSE_CALL SetInt( LSG_HANDLE _hHandle, LSINT32 _iValue ) = 0; 00257 00266 virtual LSBOOL LSE_CALL SetIntArray( LSG_HANDLE _hHandle, const LSINT32 * _piValues, LSUINT32 _ui32Total ) = 0; 00267 00275 virtual LSBOOL LSE_CALL SetBool( LSG_HANDLE _hHandle, LSBOOL _bValue ) = 0; 00276 00285 virtual LSBOOL LSE_CALL SetBoolArray( LSG_HANDLE _hHandle, const LSBOOL * _pbValues, LSUINT32 _ui32Total ) = 0; 00286 00294 virtual LSBOOL LSE_CALL SetVector2( LSG_HANDLE _hHandle, const CVector2 &_vValue ) = 0; 00295 00304 virtual LSBOOL LSE_CALL SetVector2Array( LSG_HANDLE _hHandle, const CVector2 * _pvValues, LSUINT32 _ui32Total ) = 0; 00305 00313 virtual LSBOOL LSE_CALL SetVector3( LSG_HANDLE _hHandle, const CVector3 &_vValue ) = 0; 00314 00323 virtual LSBOOL LSE_CALL SetVector3Array( LSG_HANDLE _hHandle, const CVector3 * _pvValues, LSUINT32 _ui32Total ) = 0; 00324 00332 virtual LSBOOL LSE_CALL SetVector4( LSG_HANDLE _hHandle, const CVector4 &_vValue ) = 0; 00333 00342 virtual LSBOOL LSE_CALL SetVector4Array( LSG_HANDLE _hHandle, const CVector4 * _pvValues, LSUINT32 _ui32Total ) = 0; 00343 00351 virtual LSBOOL LSE_CALL SetMatrix2x2( LSG_HANDLE _hHandle, const CMatrix2x2 &_mValue ) = 0; 00352 00360 virtual LSBOOL LSE_CALL SetMatrix3x3( LSG_HANDLE _hHandle, const CMatrix3x3 &_mValue ) = 0; 00361 00369 virtual LSBOOL LSE_CALL SetMatrix4x4( LSG_HANDLE _hHandle, const CMatrix4x4 &_mValue ) = 0; 00370 00379 virtual LSBOOL LSE_CALL SetMatrix4x4Array( LSG_HANDLE _hHandle, const CMatrix4x4 * _pmValues, LSUINT32 _ui32Total ) = 0; 00380 00387 static LSBOOL LSE_CALL AddSearchPath( const LSCHAR * _pcPath ); 00388 00395 static LSVOID LSE_CALL RemoveSearchPath( const LSCHAR * _pcPath ); 00396 00402 static LSUINT32 LSE_CALL TotalSearchPaths(); 00403 00410 static const CString & LSE_CALL GetSearchPath( LSUINT32 _ui32Index ); 00411 00412 protected : 00413 // == Enumerations. 00417 enum LSG_CLEAR_STATE { 00418 LSG_CS_NONE, 00419 LSG_CS_CLEAR, 00420 LSG_CS_SEEKING_ENDIF, 00421 }; 00422 00423 // == Types. 00427 typedef struct LSG_INCLUDES { 00431 CString sPath; 00432 00436 LSUINT32 ui32RefCount; 00437 00438 // == Various constructors. 00439 LSE_CALLCTOR LSG_INCLUDES(); 00440 00441 // == Operators. 00448 LSBOOL LSE_CALL operator < ( const LSG_INCLUDES &_iOther ) const; 00449 00456 LSBOOL LSE_CALL operator == ( const LSG_INCLUDES &_iOther ) const; 00457 } * LPLSG_INCLUDES, * const LPCLSG_INCLUDES; 00458 00462 typedef struct LSG_PREPROC_DEFINE { 00466 CString sName; 00467 00471 CString sDef; 00472 00473 00474 // == Operators. 00481 LSG_PREPROC_DEFINE & LSE_CALL operator = ( const LSG_PREPROC_DEFINE &_pdOther ); 00482 } * LPLSG_PREPROC_DEFINE, * const LPCLSG_PREPROC_DEFINE; 00483 00487 typedef CMap<CString, LSUINT32> CIncludeSet; 00488 00489 00490 // == Members. 00494 CShaderParserWrapper * m_pspwParser; 00495 00499 CShaderLexer * m_pslLexer; 00500 00504 CVector<LSG_PREPROC_DEFINE> m_vDefs[CShaderLanguageParser::LSG_ST_TOTAL]; 00505 00509 CString m_sVertexShader; 00510 00514 CString m_sPixelShader; 00515 00519 CString m_sFinalVertex; 00520 00524 CString m_sFinalPixel; 00525 00529 CShaderTranslationProcessorBase::LSG_ERROR_CODES 00530 m_ecTranslationResult; 00531 00535 CShaderTranslationProcessorBase * m_pstpbTranslator; 00536 00540 CShaderTranslationProcessorBase::LSG_UNIFORM_SEMANTIC_LIST 00541 m_uslSemantics[CShaderLanguageParser::LSG_ST_TOTAL]; 00542 00546 CShaderTranslationProcessorBase::LSG_UNIFORM_LIST 00547 m_ulUniforms[CShaderLanguageParser::LSG_ST_TOTAL]; 00548 00552 CShaderTranslationProcessorBase::LSG_ATTRIBUTE_LIST 00553 m_ulAttributes[CShaderLanguageParser::LSG_ST_TOTAL]; 00554 00558 static CStringList m_slHeaderPaths; 00559 00560 00561 // == Functions. 00565 LSVOID LSE_CALL ResetParsers(); 00566 00587 LSG_SHADER_ERRORS LSE_CALL Compile( const LSCHAR * _pcShader, LSUINT32 _ui32Length, 00588 CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType, 00589 CString &_sError ); 00590 00600 LSG_SHADER_ERRORS LSE_CALL CompileFromFile( const LSCHAR * _pcPath, CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType, 00601 CString &_sError ); 00602 00616 LSG_SHADER_ERRORS LSE_CALL CompileFromFile( const LSCHAR * _pcPath, CStringList &_slData, LSUINT32 _ui32Line, 00617 CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType, 00618 CIncludeSet &_isIncludes, 00619 CPreProc::LSG_MACROS &_mMacros, 00620 CString &_sError ); 00621 00636 LSG_SHADER_ERRORS LSE_CALL CompileFromMemory( const LSUINT8 * _pui8Src, LSUINT32 _ui32Length, 00637 const LSCHAR * _pcPath, CStringList &_slData, LSUINT32 _ui32Line, 00638 CShaderLanguageParser::LSG_SHADER_TYPES _stShaderType, 00639 CIncludeSet &_isIncludes, 00640 CPreProc::LSG_MACROS &_mMacros, 00641 CString &_sError ); 00642 00650 virtual LSG_SHADER_ERRORS LSE_CALL PostCompile( CString &_sError ); 00651 00655 virtual LSVOID LSE_CALL CreateTranslator() = 0; 00656 00660 virtual LSVOID LSE_CALL DestroyTranslator() = 0; 00661 00668 static CString LSE_CALL GetFilePart( const CString &_sDirective ); 00669 00678 static CString LSE_CALL FindHeader( const LSCHAR * _pcIncluder, const CString &_sFileToInclude ); 00679 00687 static LSBOOL LSE_CALL ParseDefine( const CString &_sLine, CPreProc::LSG_MACROS &_mMacros ); 00688 00694 static LSVOID LSE_CALL RemoveComments( CStringList &_slText ); 00695 00703 static LSVOID LSE_CALL SkipString( const CString &_sLine, LSUINT32 &_ui32Pos ); 00704 00713 static LSBOOL LSE_CALL ExpandMacros( CString &_sString, const CPreProc::LSG_MACROS &_mMacros, CString &_sError ); 00714 00724 static LSBOOL LSE_CALL ExpandMacros( CString &_sString, const CPreProc::LSG_MACROS &_mMacros, const CSet<CString> &_sUsedValues, CString &_sError ); 00725 00735 static LSBOOL LSE_CALL GetMacroParms( const CString &_sString, LSUINT32 _ui32Pos, LSUINT32 &_ui32NewPos, CVector<CString> &_vRet ); 00736 00748 static LSBOOL LSE_CALL GetMacroReplacementString( LSUINT32 _ui32MacroIndex, CVector<CString> &_vParms, 00749 const CPreProc::LSG_MACROS &_mMacros, const CSet<CString> &_sUsedValues, 00750 CString &_sRet, 00751 CString &_sError ); 00752 00753 }; 00754 00755 } // namespace lsg 00756 00757 #endif // __LSG_SHADERBASE_H__