"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/ShaderLanguage/LSGShaderBase.h

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