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-2012 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 
00197 
00198     typedef std::pair<RenderState*, bool> RenderStateCreateOrRetrieveResult;
00203     RenderStateCreateOrRetrieveResult createOrRetrieveRenderState(const String& schemeName);
00204 
00205 
00210     bool hasRenderState(const String& schemeName) const;
00211     
00212 
00221     RenderState* getRenderState(const String& schemeName, const String& materialName, unsigned short passIndex);
00222     RenderState* getRenderState(const String& schemeName, const String& materialName, const String& groupName, unsigned short passIndex);
00223 
00230     void addSubRenderStateFactory(SubRenderStateFactory* factory);
00231 
00235     size_t getNumSubRenderStateFactories() const;
00236 
00241     SubRenderStateFactory* getSubRenderStateFactory(size_t index);
00242 
00246     SubRenderStateFactory* getSubRenderStateFactory(const String& type);
00247 
00252     void removeSubRenderStateFactory(SubRenderStateFactory* factory);
00253 
00258     SubRenderState* createSubRenderState(const String& type);
00259 
00260     
00265     void destroySubRenderState(SubRenderState* subRenderState);
00266 
00267 
00276     bool hasShaderBasedTechnique(const String& materialName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName) const;
00277     bool hasShaderBasedTechnique(const String& materialName, const String& groupName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName) const;
00278 
00289     bool createShaderBasedTechnique(const String& materialName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName, bool overProgrammable = false);
00290     bool createShaderBasedTechnique(const String& materialName, const String& groupName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName, bool overProgrammable = false);
00291 
00292 
00302     bool removeShaderBasedTechnique(const String& materialName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName);
00303     bool removeShaderBasedTechnique(const String& materialName, const String& groupName, const String& srcTechniqueSchemeName, const String& dstTechniqueSchemeName);
00304 
00305 
00312     bool removeAllShaderBasedTechniques(const String& materialName, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
00313 
00324     bool cloneShaderBasedTechniques(const String& srcMaterialName, 
00325         const String& srcGroupName, const String& dstMaterialName, const String& dstGroupName);
00326 
00330     void removeAllShaderBasedTechniques();
00331 
00336     void createScheme(const String& schemeName);
00337 
00343     void invalidateScheme(const String& schemeName);
00344 
00350     bool validateScheme(const String& schemeName);
00351     
00359     void invalidateMaterial(const String& schemeName, const String& materialName, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
00360 
00368     bool validateMaterial(const String& schemeName, const String& materialName, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);    
00369 
00370 
00382     SGMaterialSerializerListener* getMaterialSerializerListener();
00383 
00384 
00386     size_t getVertexShaderCount() const;
00387 
00388 
00390     size_t getFragmentShaderCount() const;
00391 
00392 
00393 
00398     void setVertexShaderOutputsCompactPolicy(VSOutputCompactPolicy policy)  { mVSOutputCompactPolicy = policy; }
00399     
00403     VSOutputCompactPolicy getVertexShaderOutputsCompactPolicy() const { return mVSOutputCompactPolicy; }
00404 
00405 
00411     void setCreateShaderOverProgrammablePass(bool value) { mCreateShaderOverProgrammablePass = value; }
00412 
00416     bool getCreateShaderOverProgrammablePass() const { return mCreateShaderOverProgrammablePass; }
00417 
00418 
00421     size_t getRTShaderSchemeCount() const;
00422 
00425     const String& getRTShaderScheme(size_t index) const;
00426 
00428     static String DEFAULT_SCHEME_NAME;
00429 
00430 // Protected types.
00431 protected:
00432     class SGPass;
00433     class SGTechnique;
00434     class SGMaterial;
00435     class SGScheme;
00436 
00437     typedef std::pair<String,String>                MatGroupPair;
00438     struct MatGroupPair_less
00439     {
00440         // ensure we arrange the list first by material name then by group name
00441         bool operator()(const MatGroupPair& p1, const MatGroupPair& p2) const
00442         {
00443             int cmpVal = strcmp(p1.first.c_str(),p2.first.c_str());
00444             return (cmpVal < 0) || ((cmpVal == 0) && (strcmp(p1.second.c_str(),p2.second.c_str()) < 0));
00445         }
00446     };
00447 
00448     typedef vector<SGPass*>::type                   SGPassList;
00449     typedef SGPassList::iterator                    SGPassIterator;
00450     typedef SGPassList::const_iterator              SGPassConstIterator;
00451 
00452     typedef vector<SGTechnique*>::type              SGTechniqueList;
00453     typedef SGTechniqueList::iterator               SGTechniqueIterator;
00454     typedef SGTechniqueList::const_iterator         SGTechniqueConstIterator;
00455 
00456     typedef map<SGTechnique*, SGTechnique*>::type   SGTechniqueMap;
00457     typedef SGTechniqueMap::iterator                SGTechniqueMapIterator;
00458     
00459     typedef map<MatGroupPair, SGMaterial*, MatGroupPair_less>::type SGMaterialMap;
00460     typedef SGMaterialMap::iterator                 SGMaterialIterator;
00461     typedef SGMaterialMap::const_iterator           SGMaterialConstIterator;
00462 
00463     typedef map<String, SGScheme*>::type            SGSchemeMap;
00464     typedef SGSchemeMap::iterator                   SGSchemeIterator;
00465     typedef SGSchemeMap::const_iterator             SGSchemeConstIterator;
00466 
00467     typedef map<String, ScriptTranslator*>::type    SGScriptTranslatorMap;
00468     typedef SGScriptTranslatorMap::iterator         SGScriptTranslatorIterator;
00469     typedef SGScriptTranslatorMap::const_iterator   SGScriptTranslatorConstIterator;
00470 
00471 
00472     
00474     class _OgreRTSSExport SGPass : public RTShaderSystemAlloc
00475     {
00476     public:
00477         SGPass(SGTechnique* parent, Pass* srcPass, Pass* dstPass);
00478         ~SGPass();
00479     
00481         void buildTargetRenderState();
00482 
00484         void acquirePrograms();
00485 
00487         void releasePrograms();
00488 
00489 
00491         void notifyRenderSingleObject(Renderable* rend, const AutoParamDataSource* source, const LightList* pLightList, bool suppressRenderStateChanges);
00492 
00494         Pass* getSrcPass() { return mSrcPass; }
00495 
00497         Pass* getDstPass() { return mDstPass; }
00498 
00500         SubRenderState* getCustomFFPSubState(int subStateOrder);
00501 
00503         RenderState* getCustomRenderState() { return mCustomRenderState; }
00504 
00506         void setCustomRenderState(RenderState* customRenderState) { mCustomRenderState = customRenderState; }
00507 
00508         // Key name for associating with a Pass instance.
00509         static String UserKey;
00510     
00511     protected:
00512         SubRenderState* getCustomFFPSubState(int subStateOrder, const RenderState* renderState);
00513 
00514     protected:
00515         // Parent technique.
00516         SGTechnique* mParent;
00517         // Source pass.
00518         Pass* mSrcPass;
00519         // Destination pass.
00520         Pass* mDstPass;
00521         // Custom render state.
00522         RenderState* mCustomRenderState;
00523         // The compiled render state.       
00524         TargetRenderState* mTargetRenderState;
00525     };
00526 
00527     
00529     class _OgreRTSSExport SGTechnique : public RTShaderSystemAlloc
00530     {
00531     public:
00532         SGTechnique(SGMaterial* parent, Technique* srcTechnique, const String& dstTechniqueSchemeName);     
00533         ~SGTechnique();
00534         
00536         const SGMaterial* getParent() const { return mParent; }
00537         
00539         Technique* getSourceTechnique() { return mSrcTechnique; }
00540 
00542         Technique* getDestinationTechnique() { return mDstTechnique; }
00543 
00545         const String& getDestinationTechniqueSchemeName() const { return mDstTechniqueSchemeName; }
00546         
00548         void buildTargetRenderState();
00549 
00551         void acquirePrograms();
00552 
00554         void releasePrograms();
00555 
00557         void setBuildDestinationTechnique(bool buildTechnique)  { mBuildDstTechnique = buildTechnique; }        
00558 
00560         bool getBuildDestinationTechnique() const               { return mBuildDstTechnique; }
00561 
00565         RenderState* getRenderState(unsigned short passIndex);
00567         bool hasRenderState(unsigned short passIndex);
00568 
00569         // Key name for associating with a Technique instance.
00570         static String UserKey;
00571 
00572     protected:
00573         
00575         void createSGPasses();
00576 
00578         void destroySGPasses();
00579         
00580     protected:
00581         // Parent material.     
00582         SGMaterial* mParent;
00583         // Source technique.
00584         Technique* mSrcTechnique;
00585         // Destination technique.
00586         Technique* mDstTechnique;
00587         // All passes entries.
00588         SGPassList mPassEntries;
00589         // The custom render states of all passes.
00590         RenderStateList mCustomRenderStates;
00591         // Flag that tells if destination technique should be build.        
00592         bool mBuildDstTechnique;
00593         // Scheme name of destination technique.
00594         String mDstTechniqueSchemeName;
00595     };
00596 
00597     
00599     class _OgreRTSSExport SGMaterial : public RTShaderSystemAlloc
00600     {   
00601     
00602     public:
00604         SGMaterial(const String& materialName, const String& groupName) : mName(materialName), mGroup(groupName) 
00605         {
00606 
00607         }
00608 
00610         const String& getMaterialName() const   { return mName; }
00611         
00613         const String& getGroupName() const  { return mGroup; }
00614 
00616         const SGTechniqueList& getTechniqueList() const  { return mTechniqueEntries; }
00617 
00619         SGTechniqueList& getTechniqueList()              { return mTechniqueEntries; }
00620     
00621     protected:
00622         // The material name.
00623         String mName;
00624         // The group name.
00625         String mGroup;
00626         // All passes entries.
00627         SGTechniqueList mTechniqueEntries;
00628     };
00629 
00630     
00632     class _OgreRTSSExport SGScheme : public RTShaderSystemAlloc
00633     {   
00634     public:
00635         SGScheme(const String& schemeName);
00636         ~SGScheme();    
00637 
00638 
00641         bool empty() const  { return mTechniqueEntries.empty(); }
00642         
00646         void invalidate();
00647 
00651         void validate();
00652 
00656         void invalidate(const String& materialName, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
00657 
00661         bool validate(const String& materialName, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
00662                 
00664         void addTechniqueEntry(SGTechnique* techEntry);
00665 
00667         void removeTechniqueEntry(SGTechnique* techEntry);
00668 
00669 
00673         RenderState* getRenderState();
00674 
00678         RenderState* getRenderState(const String& materialName, const String& groupName, unsigned short passIndex);
00679 
00680     protected:
00682         void synchronizeWithLightSettings();
00683 
00685         void synchronizeWithFogSettings();
00686 
00687 
00688     protected:
00689         // Scheme name.
00690         String mName;
00691         // Technique entries.
00692         SGTechniqueList mTechniqueEntries;
00693         // Tells if this scheme is out of date.
00694         bool mOutOfDate;
00695         // The global render state of this scheme.
00696         RenderState* mRenderState;
00697         // Current fog mode.
00698         FogMode mFogMode;
00699     };
00700 
00701 
00702 // Protected types.
00703 protected:
00704     
00706     class _OgreRTSSExport SGRenderObjectListener : public RenderObjectListener, public RTShaderSystemAlloc
00707     {
00708     public:
00709         SGRenderObjectListener(ShaderGenerator* owner)
00710         {
00711             mOwner = owner;
00712         }
00713 
00717         virtual void notifyRenderSingleObject(Renderable* rend, const Pass* pass,  
00718             const AutoParamDataSource* source, 
00719             const LightList* pLightList, bool suppressRenderStateChanges)
00720         {
00721             mOwner->notifyRenderSingleObject(rend, pass, source, pLightList, suppressRenderStateChanges);
00722         }
00723 
00724     protected:
00725         ShaderGenerator* mOwner;
00726     };
00727 
00729     class _OgreRTSSExport SGSceneManagerListener : public SceneManager::Listener, public RTShaderSystemAlloc
00730     {
00731     public:
00732         SGSceneManagerListener(ShaderGenerator* owner)
00733         {
00734             mOwner = owner;
00735         }
00736 
00740         virtual void preFindVisibleObjects(SceneManager* source, 
00741             SceneManager::IlluminationRenderStage irs, Viewport* v)
00742         {
00743             mOwner->preFindVisibleObjects(source, irs, v);
00744         }
00745 
00746         virtual void postFindVisibleObjects(SceneManager* source, 
00747             SceneManager::IlluminationRenderStage irs, Viewport* v)
00748         {
00749 
00750         }
00751 
00752         virtual void shadowTexturesUpdated(size_t numberOfShadowTextures) 
00753         {
00754 
00755         }
00756 
00757         virtual void shadowTextureCasterPreViewProj(Light* light, 
00758             Camera* camera, size_t iteration) 
00759         {
00760 
00761         }
00762 
00763         virtual void shadowTextureReceiverPreViewProj(Light* light, 
00764             Frustum* frustum)
00765         {
00766 
00767         }
00768 
00769     protected:
00770         // The shader generator instance.
00771         ShaderGenerator* mOwner;
00772     };
00773 
00775     class _OgreRTSSExport SGScriptTranslatorManager : public ScriptTranslatorManager
00776     {
00777     public:
00778         SGScriptTranslatorManager(ShaderGenerator* owner)
00779         {
00780             mOwner = owner;
00781         }
00782 
00784         virtual size_t getNumTranslators() const
00785         {
00786             return mOwner->getNumTranslators();
00787         }
00788         
00790         virtual ScriptTranslator *getTranslator(const AbstractNodePtr& node)
00791         {
00792             return mOwner->getTranslator(node);
00793         }
00794 
00795     protected:
00796         // The shader generator instance.
00797         ShaderGenerator* mOwner;
00798     };
00799 
00800     //-----------------------------------------------------------------------------
00801     typedef map<String, SubRenderStateFactory*>::type       SubRenderStateFactoryMap;
00802     typedef SubRenderStateFactoryMap::iterator              SubRenderStateFactoryIterator;
00803     typedef SubRenderStateFactoryMap::const_iterator        SubRenderStateFactoryConstIterator;
00804 
00805     //-----------------------------------------------------------------------------
00806     typedef map<String, SceneManager*>::type                SceneManagerMap;
00807     typedef SceneManagerMap::iterator                       SceneManagerIterator;
00808     typedef SceneManagerMap::const_iterator                 SceneManagerConstIterator;
00809 
00810 protected:
00812     ShaderGenerator();
00813 
00815     ~ShaderGenerator();
00816 
00818     bool _initialize();
00819     
00821     void _finalize();
00822 
00824     Technique* findSourceTechnique(const String& materialName, const String& groupName, const String& srcTechniqueSchemeName);
00825 
00827     bool isProgrammable(Technique* tech) const;
00828  
00830     void notifyRenderSingleObject(Renderable* rend, const Pass* pass,  const AutoParamDataSource* source, const LightList* pLightList, bool suppressRenderStateChanges);
00831 
00833     void preFindVisibleObjects(SceneManager* source, SceneManager::IlluminationRenderStage irs, Viewport* v);
00834 
00836     void createSubRenderStateExFactories();
00837 
00839     void destroySubRenderStateExFactories();
00840 
00849     SubRenderState* createSubRenderState(ScriptCompiler* compiler, PropertyAbstractNode* prop, Pass* pass, SGScriptTranslator* translator);
00850     
00859     SubRenderState* createSubRenderState(ScriptCompiler* compiler, PropertyAbstractNode* prop, TextureUnitState* texState, SGScriptTranslator* translator);
00860 
00867     bool addCustomScriptTranslator(const String& key, ScriptTranslator* translator);
00868 
00874     bool removeCustomScriptTranslator(const String& key);
00875 
00877     size_t getNumTranslators() const;
00878 
00880     ScriptTranslator* getTranslator(const AbstractNodePtr& node);
00881 
00882 
00888     void serializePassAttributes(MaterialSerializer* ser, SGPass* passEntry);
00889 
00896     void serializeTextureUnitStateAttributes(MaterialSerializer* ser, SGPass* passEntry, const TextureUnitState* srcTextureUnit);
00897 
00902     SGMaterialIterator findMaterialEntryIt(const String& materialName, const String& groupName);
00903     SGMaterialConstIterator findMaterialEntryIt(const String& materialName, const String& groupName) const;
00904 
00905 
00906     typedef std::pair<SGScheme*, bool> SchemeCreateOrRetrieveResult;
00911     SchemeCreateOrRetrieveResult createOrRetrieveScheme(const String& schemeName);
00912 
00914     bool getIsFinalizing() const;
00915 protected:  
00916     OGRE_AUTO_MUTEX                                                 // Auto mutex.
00917     // The active scene manager.
00918     SceneManager* mActiveSceneMgr;
00919     // A map of all scene managers this generator is bound to.
00920     SceneManagerMap mSceneManagerMap;
00921     // Render object listener.
00922     SGRenderObjectListener* mRenderObjectListener;
00923     // Scene manager listener.
00924     SGSceneManagerListener* mSceneManagerListener;
00925     // Script translator manager.
00926     SGScriptTranslatorManager* mScriptTranslatorManager;
00927     // Custom material Serializer listener - allows exporting material that contains shader generated techniques.
00928     SGMaterialSerializerListener* mMaterialSerializerListener;
00929     // A map of the registered custom script translators.
00930     SGScriptTranslatorMap mScriptTranslatorsMap;
00931     // The core translator of the RT Shader System.
00932     SGScriptTranslator mCoreScriptTranslator;
00933     // The target shader language (currently only cg supported).
00934     String mShaderLanguage;
00935     // The target vertex shader profile. Will be used as argument for program compilation.
00936     String mVertexShaderProfiles;
00937     // List of target vertex shader profiles.
00938     StringVector mVertexShaderProfilesList;
00939     // The target fragment shader profile. Will be used as argument for program compilation.
00940     String mFragmentShaderProfiles;
00941     // List of target fragment shader profiles..
00942     StringVector mFragmentShaderProfilesList;
00943     // Path for caching the generated shaders.
00944     String mShaderCachePath;
00945     // Shader program manager.
00946     ProgramManager* mProgramManager;
00947     // Shader program writer manager.
00948     ProgramWriterManager* mProgramWriterManager;
00949     // Fixed Function Render state builder.
00950     FFPRenderStateBuilder* mFFPRenderStateBuilder;
00951     // Material entries map.
00952     SGMaterialMap mMaterialEntriesMap;
00953     // Scheme entries map.
00954     SGSchemeMap mSchemeEntriesMap;
00955     // All technique entries map.
00956     SGTechniqueMap mTechniqueEntriesMap;
00957     // Sub render state registered factories.
00958     SubRenderStateFactoryMap mSubRenderStateFactories;
00959     // Sub render state core extension factories.
00960     SubRenderStateFactoryMap mSubRenderStateExFactories;
00961     // True if active view port use a valid SGScheme.
00962     bool mActiveViewportValid;
00963     // Light count per light type.
00964     int mLightCount[3];
00965     // Vertex shader outputs compact policy.
00966     VSOutputCompactPolicy mVSOutputCompactPolicy;
00967     // Tells whether shaders are created for passes with shaders
00968     bool mCreateShaderOverProgrammablePass;
00969     // a flag to indicate finalizing
00970     bool mIsFinalizing;
00971 private:
00972     friend class SGPass;
00973     friend class FFPRenderStateBuilder;
00974     friend class SGScriptTranslatorManager;
00975     friend class SGScriptTranslator;
00976     friend class SGMaterialSerializerListener;
00977     
00978 };
00979 
00983 }
00984 }
00985 
00986 #endif
00987 

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sun Sep 2 2012 07:27:23