OgreShaderGenerator.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004 (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org
00006 
00007 Copyright (c) 2000-2009 Torus Knot Software Ltd
00008 Permission is hereby granted, free of charge, to any person obtaining a copy
00009 of this software and associated documentation files (the "Software"), to deal
00010 in the Software without restriction, including without limitation the rights
00011 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00012 copies of the Software, and to permit persons to whom the Software is
00013 furnished to do so, subject to the following conditions:
00014 
00015 The above copyright notice and this permission notice shall be included in
00016 all copies or substantial portions of the Software.
00017 
00018 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00019 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00021 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00022 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00023 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00024 THE SOFTWARE.
00025 -----------------------------------------------------------------------------
00026 */
00027 #ifndef _ShaderGenerator_
00028 #define _ShaderGenerator_
00029 
00030 #include "OgreShaderPrerequisites.h"
00031 #include "OgreSingleton.h"
00032 #include "OgreRenderObjectListener.h"
00033 #include "OgreSceneManager.h"
00034 #include "OgreShaderRenderState.h"
00035 #include "OgreScriptTranslator.h"
00036 #include "OgreShaderScriptTranslator.h"
00037 
00038 
00039 namespace Ogre {
00040 namespace RTShader {
00041 
00052 class _OgreRTSSExport ShaderGenerator : public Singleton<ShaderGenerator>, public RTShaderSystemAlloc
00053 {
00054 // Interface.
00055 public:
00056 
00062     static bool     initialize  ();
00063 
00067     static void     finalize    ();
00068 
00069 
00085     static ShaderGenerator&         getSingleton    (); 
00086 
00087 
00103     static ShaderGenerator*         getSingletonPtr ();
00104 
00109     void            addSceneManager             (SceneManager* sceneMgr);
00110 
00115     void            removeSceneManager          (SceneManager* sceneMgr);
00116 
00121     SceneManager*   getActiveSceneManager       ();
00122     
00128     void            setTargetLanguage           (const String& shaderLanguage);
00129 
00133     const String&   getTargetLanguage           () const { return mShaderLanguage; }
00134 
00139     void            setVertexShaderProfiles     (const String& vertexShaderProfiles);
00140 
00144     const String&   getVertexShaderProfiles     () const { return mVertexShaderProfiles; }
00145 
00149     const StringVector& getVertexShaderProfilesList     () const { return mVertexShaderProfilesList; }
00150 
00151 
00156     void            setFragmentShaderProfiles   (const String& fragmentShaderProfiles);
00157 
00161     const String&   getFragmentShaderProfiles   () const { return mFragmentShaderProfiles; }
00162 
00166     const StringVector& getFragmentShaderProfilesList   () const { return mFragmentShaderProfilesList; }
00167 
00174     void            setShaderCachePath          (const String& cachePath);
00175 
00179     const String&   getShaderCachePath          () const { return mShaderCachePath; }
00180 
00185     void            flushShaderCache            ();
00186 
00195     RenderState*    getRenderState              (const String& schemeName);
00196 
00204     RenderState*    getRenderState              (const String& schemeName, const String& materialName, unsigned short passIndex);
00205 
00212     void            addSubRenderStateFactory    (SubRenderStateFactory* factory);
00213 
00218     void            removeSubRenderStateFactory (SubRenderStateFactory* factory);
00219 
00224     SubRenderState* createSubRenderState        (const String& type);
00225 
00226     
00231     void            destroySubRenderState       (SubRenderState* subRenderState);
00232 
00233 
00242     bool            createShaderBasedTechnique  (const String& materialName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName);
00243 
00244 
00253     bool            removeShaderBasedTechnique  (const String& materialName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName);
00254 
00255 
00261     bool            removeAllShaderBasedTechniques  (const String& materialName);
00262 
00266     void            removeAllShaderBasedTechniques  ();
00267 
00272     void            createScheme                (const String& schemeName);
00273 
00279     void            invalidateScheme            (const String& schemeName);
00280 
00286     bool            validateScheme              (const String& schemeName);
00287     
00294     void            invalidateMaterial          (const String& schemeName, const String& materialName);
00295 
00302     bool            validateMaterial            (const String& schemeName, const String& materialName); 
00303 
00304 
00316     SGMaterialSerializerListener*   getMaterialSerializerListener();
00317 
00318 
00320     size_t                          getVertexShaderCount            () const;
00321 
00322 
00324     size_t                          getFragmentShaderCount          () const;
00325 
00326 
00327 
00332     void                            setVertexShaderOutputsCompactPolicy     (VSOutputCompactPolicy policy)  { mVSOutputCompactPolicy = policy; }
00333     
00337     VSOutputCompactPolicy           getVertexShaderOutputsCompactPolicy     () const { return mVSOutputCompactPolicy; }
00338 
00340     static String DEFAULT_SCHEME_NAME;
00341 
00342 // Protected types.
00343 protected:
00344     class SGPass;
00345     class SGTechnique;
00346     class SGMaterial;
00347     class SGScheme;
00348 
00349     typedef vector<SGPass*>::type                   SGPassList;
00350     typedef SGPassList::iterator                    SGPassIterator;
00351     typedef SGPassList::const_iterator              SGPassConstIterator;
00352 
00353     typedef vector<SGTechnique*>::type              SGTechniqueList;
00354     typedef SGTechniqueList::iterator               SGTechniqueIterator;
00355     typedef SGTechniqueList::const_iterator         SGTechniqueConstIterator;
00356 
00357     typedef map<SGTechnique*, SGTechnique*>::type   SGTechniqueMap;
00358     typedef SGTechniqueMap::iterator                SGTechniqueMapIterator;
00359     
00360     typedef map<String, SGMaterial*>::type          SGMaterialMap;
00361     typedef SGMaterialMap::iterator                 SGMaterialIterator;
00362     typedef SGMaterialMap::const_iterator           SGMaterialConstIterator;
00363 
00364     typedef map<String, SGScheme*>::type            SGSchemeMap;
00365     typedef SGSchemeMap::iterator                   SGSchemeIterator;
00366     typedef SGMaterialMap::const_iterator           SGSchemeConstIterator;
00367 
00368     typedef map<String, ScriptTranslator*>::type    SGScriptTranslatorMap;
00369     typedef SGScriptTranslatorMap::iterator         SGScriptTranslatorIterator;
00370     typedef SGScriptTranslatorMap::const_iterator   SGScriptTranslatorConstIterator;
00371 
00372 
00373     
00375     class _OgreRTSSExport SGPass : public RTShaderSystemAlloc
00376     {
00377     public:
00378         SGPass          (SGTechnique* parent, Pass* srcPass, Pass* dstPass);
00379         ~SGPass         ();
00380     
00382         void            buildTargetRenderState          ();
00383 
00385         void            acquirePrograms         ();
00386 
00388         void            releasePrograms         ();
00389 
00390 
00392         void            notifyRenderSingleObject    (Renderable* rend, const AutoParamDataSource* source, const LightList* pLightList, bool suppressRenderStateChanges);
00393 
00395         Pass*           getSrcPass                  () { return mSrcPass; }
00396 
00398         Pass*           getDstPass                  () { return mDstPass; }
00399 
00401         SubRenderState* getCustomFFPSubState        (int subStateOrder);
00402 
00404         RenderState*    getCustomRenderState        () { return mCustomRenderState; }
00405 
00407         void            setCustomRenderState        (RenderState* customRenderState) { mCustomRenderState = customRenderState; }
00408 
00409         static String   UserKey;                    // Key name for associating with a Pass instance.
00410     
00411     protected:
00412         SubRenderState* getCustomFFPSubState        (int subStateOrder, const RenderState* renderState);
00413 
00414     protected:
00415         SGTechnique*            mParent;                // Parent technique.
00416         Pass*                   mSrcPass;               // Source pass.
00417         Pass*                   mDstPass;               // Destination pass.
00418         RenderState*            mCustomRenderState;     // Custom render state.
00419         TargetRenderState*      mTargetRenderState; // The compiled render state.       
00420     };
00421 
00422     
00424     class _OgreRTSSExport SGTechnique : public RTShaderSystemAlloc
00425     {
00426     public:
00427         SGTechnique         (SGMaterial* parent, Technique* srcTechnique, const String& dstTechniqueSchemeName);        
00428         ~SGTechnique        ();
00429         
00431         const SGMaterial*   getParent                       () const { return mParent; }
00432         
00434         Technique*          getSourceTechnique              () { return mSrcTechnique; }
00435 
00437         Technique*          getDestinationTechnique         () { return mDstTechnique; }
00438 
00440         const String&       getDestinationTechniqueSchemeName() const { return mDstTechniqueSchemeName; }
00441         
00443         void                buildTargetRenderState              ();
00444 
00446         void                acquirePrograms             ();
00447 
00449         void                releasePrograms             ();
00450 
00452         void                setBuildDestinationTechnique    (bool buildTechnique)   { mBuildDstTechnique = buildTechnique; }        
00453 
00455         bool                getBuildDestinationTechnique    () const                { return mBuildDstTechnique; }
00456 
00460         RenderState*        getRenderState                  (unsigned short passIndex);
00461 
00462         static String   UserKey;                    // Key name for associating with a Technique instance.
00463 
00464     protected:
00465         
00467         void                createSGPasses          ();
00468 
00470         void                destroySGPasses         ();
00471 
00472         
00473     protected:
00474         SGMaterial*             mParent;                    // Parent material.     
00475         Technique*              mSrcTechnique;              // Source technique.
00476         Technique*              mDstTechnique;              // Destination technique.
00477         SGPassList              mPassEntries;               // All passes entries.
00478         RenderStateList         mCustomRenderStates;        // The custom render states of all passes.
00479         bool                    mBuildDstTechnique;         // Flag that tells if destination technique should be build.        
00480         String                  mDstTechniqueSchemeName;    // Scheme name of destination technique.
00481     };
00482 
00483     
00485     class _OgreRTSSExport SGMaterial : public RTShaderSystemAlloc
00486     {   
00487     
00488     public:
00490         SGMaterial(const String& materialName)                  { mName = materialName; }
00491 
00493         const String& getMaterialName               () const    { return mName; }
00494         
00496         const SGTechniqueList&  getTechniqueList    () const     { return mTechniqueEntires; }
00497 
00499         SGTechniqueList&    getTechniqueList        ()           { return mTechniqueEntires; }
00500     
00501     protected:
00502         String              mName;                  // The material name.
00503         SGTechniqueList     mTechniqueEntires;      // All passes entries.
00504     };
00505 
00506     
00508     class _OgreRTSSExport SGScheme : public RTShaderSystemAlloc
00509     {   
00510     public:
00511         SGScheme        (const String& schemeName);
00512         ~SGScheme       (); 
00513 
00514 
00517         bool                    empty               () const  { return mTechniqueEntires.empty(); }
00518         
00522         void                    invalidate              ();
00523 
00527         void                    validate                ();
00528 
00532         void                    invalidate              (const String& materialName);
00533 
00537         bool                    validate                (const String& materialName);
00538                 
00540         void                    addTechniqueEntry       (SGTechnique* techEntry);
00541 
00543         void                    removeTechniqueEntry    (SGTechnique* techEntry);
00544 
00545 
00549         RenderState*            getRenderState          ();
00550 
00554         RenderState*            getRenderState          (const String& materialName, unsigned short passIndex);
00555 
00556     protected:
00558         void                    synchronizeWithLightSettings    ();
00559 
00561         void                    synchronizeWithFogSettings      ();
00562 
00563 
00564     protected:
00565         String                  mName;                  // Scheme name.
00566         SGTechniqueList         mTechniqueEntires;      // Technique entries.
00567         bool                    mOutOfDate;             // Tells if this scheme is out of date.
00568         RenderState*            mRenderState;           // The global render state of this scheme.
00569         FogMode                 mFogMode;               // Current fog mode.
00570     };
00571 
00572 
00573 // Protected types.
00574 protected:
00575     
00577     class _OgreRTSSExport SGRenderObjectListener : public RenderObjectListener, public RTShaderSystemAlloc
00578     {
00579     public:
00580         SGRenderObjectListener(ShaderGenerator* owner)
00581         {
00582             mOwner = owner;
00583         }
00584 
00588         virtual void notifyRenderSingleObject(Renderable* rend, const Pass* pass,  
00589             const AutoParamDataSource* source, 
00590             const LightList* pLightList, bool suppressRenderStateChanges)
00591         {
00592             mOwner->notifyRenderSingleObject(rend, pass, source, pLightList, suppressRenderStateChanges);
00593         }
00594 
00595     protected:
00596         ShaderGenerator* mOwner;
00597     };
00598 
00600     class _OgreRTSSExport SGSceneManagerListener : public SceneManager::Listener, public RTShaderSystemAlloc
00601     {
00602     public:
00603         SGSceneManagerListener(ShaderGenerator* owner)
00604         {
00605             mOwner = owner;
00606         }
00607 
00611         virtual void preFindVisibleObjects(SceneManager* source, 
00612             SceneManager::IlluminationRenderStage irs, Viewport* v)
00613         {
00614             mOwner->preFindVisibleObjects(source, irs, v);
00615         }
00616 
00617         virtual void postFindVisibleObjects(SceneManager* source, 
00618             SceneManager::IlluminationRenderStage irs, Viewport* v)
00619         {
00620 
00621         }
00622 
00623         virtual void shadowTexturesUpdated(size_t numberOfShadowTextures) 
00624         {
00625 
00626         }
00627 
00628         virtual void shadowTextureCasterPreViewProj(Light* light, 
00629             Camera* camera, size_t iteration) 
00630         {
00631 
00632         }
00633 
00634         virtual void shadowTextureReceiverPreViewProj(Light* light, 
00635             Frustum* frustum)
00636         {
00637 
00638         }
00639 
00640     protected:
00641         ShaderGenerator* mOwner;            // The shader generator instance.
00642     };
00643 
00645     class _OgreRTSSExport SGScriptTranslatorManager : public ScriptTranslatorManager
00646     {
00647     public:
00648         SGScriptTranslatorManager(ShaderGenerator* owner)
00649         {
00650             mOwner = owner;
00651         }
00652 
00654         virtual size_t getNumTranslators() const
00655         {
00656             return mOwner->getNumTranslators();
00657         }
00658         
00660         virtual ScriptTranslator *getTranslator(const AbstractNodePtr& node)
00661         {
00662             return mOwner->getTranslator(node);
00663         }
00664 
00665     protected:
00666         ShaderGenerator* mOwner;        // The shader generator instance.
00667     };
00668 
00669     //-----------------------------------------------------------------------------
00670     typedef map<String, SubRenderStateFactory*>::type       SubRenderStateFactoryMap;
00671     typedef SubRenderStateFactoryMap::iterator              SubRenderStateFactoryIterator;
00672     typedef SubRenderStateFactoryMap::const_iterator        SubRenderStateFactoryConstIterator;
00673 
00674     //-----------------------------------------------------------------------------
00675     typedef map<String, SceneManager*>::type                SceneManagerMap;
00676     typedef SceneManagerMap::iterator                       SceneManagerIterator;
00677     typedef SceneManagerMap::const_iterator                 SceneManagerConstIterator;
00678 
00679 protected:
00681     ShaderGenerator     ();
00682 
00684     ~ShaderGenerator    ();
00685 
00687     bool                _initialize         ();
00688     
00690     void                _finalize           ();
00691 
00693     Technique*          findSourceTechnique             (const String& materialName, const String& srcTechniqueSchemeName);
00694 
00696     void                notifyRenderSingleObject        (Renderable* rend, const Pass* pass,  const AutoParamDataSource* source, const LightList* pLightList, bool suppressRenderStateChanges);
00697 
00699     void                preFindVisibleObjects           (SceneManager* source, SceneManager::IlluminationRenderStage irs, Viewport* v);
00700 
00702     void                createSubRenderStateExFactories         ();
00703 
00705     void                destroySubRenderStateExFactories        ();
00706 
00714     SubRenderState*     createSubRenderState                (ScriptCompiler* compiler, PropertyAbstractNode* prop, Pass* pass);
00715 
00722     bool                addCustomScriptTranslator           (const String& key, ScriptTranslator* translator);
00723 
00729     bool                removeCustomScriptTranslator        (const String& key);
00730 
00732     size_t              getNumTranslators                   () const;
00733 
00735     ScriptTranslator*   getTranslator                       (const AbstractNodePtr& node);
00736 
00737 
00743     void                serializePassAttributes             (MaterialSerializer* ser, SGPass* passEntry);
00744 
00745 
00746 
00747 protected:  
00748     OGRE_AUTO_MUTEX                                                 // Auto mutex.
00749     SceneManager*                   mActiveSceneMgr;                // The active scene manager.
00750     SceneManagerMap                 mSceneManagerMap;               // A map of all scene managers this generator is bound to.
00751     SGRenderObjectListener*         mRenderObjectListener;          // Render object listener.
00752     SGSceneManagerListener*         mSceneManagerListener;          // Scene manager listener.
00753     SGScriptTranslatorManager*      mScriptTranslatorManager;       // Script translator manager.
00754     SGMaterialSerializerListener*   mMaterialSerializerListener;    // Custom material Serializer listener - allows exporting material that contains shader generated techniques.
00755     SGScriptTranslatorMap           mScriptTranslatorsMap;          // A map of the registered custom script translators.
00756     SGScriptTranslator              mCoreScriptTranslator;          // The core translator of the RT Shader System.
00757     String                          mShaderLanguage;                // The target shader language (currently only cg supported).
00758     String                          mVertexShaderProfiles;          // The target vertex shader profile. Will be used as argument for program compilation.
00759     StringVector                    mVertexShaderProfilesList;      // List of target vertex shader profiles.
00760     String                          mFragmentShaderProfiles;        // The target fragment shader profile. Will be used as argument for program compilation.
00761     StringVector                    mFragmentShaderProfilesList;    // List of target fragment shader profiles..
00762     String                          mShaderCachePath;               // Path for caching the generated shaders.
00763     ProgramManager*                 mProgramManager;                // Shader program manager.
00764     ProgramWriterManager*           mProgramWriterManager;          // Shader program writer manager.
00765     FFPRenderStateBuilder*          mFFPRenderStateBuilder;         // Fixed Function Render state builder.
00766     SGMaterialMap                   mMaterialEntriesMap;            // Material entries map.
00767     SGSchemeMap                     mSchemeEntriesMap;              // Scheme entries map.
00768     SGTechniqueMap                  mTechniqueEntriesMap;           // All technique entries map.
00769     SubRenderStateFactoryMap        mSubRenderStateFactories;       // Sub render state registered factories.
00770     SubRenderStateFactoryMap        mSubRenderStateExFactories;     // Sub render state core extension factories.
00771     bool                            mActiveViewportValid;           // True if active view port use a valid SGScheme.
00772     int                             mLightCount[3];                 // Light count per light type.
00773     VSOutputCompactPolicy           mVSOutputCompactPolicy;         // Vertex shader outputs compact policy.
00774     
00775 private:
00776     friend class SGPass;
00777     friend class FFPRenderStateBuilder;
00778     friend class SGScriptTranslatorManager;
00779     friend class SGScriptTranslator;
00780     friend class SGMaterialSerializerListener;
00781     
00782 };
00783 
00787 }
00788 }
00789 
00790 #endif
00791 

Copyright © 2008 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Wed Nov 3 2010 19:24:52