[5] | 1 | /** |
---|
| 2 | ******************************************************************************* |
---|
| 3 | Copyright (c) W.J. van der Laan |
---|
| 4 | |
---|
| 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of |
---|
| 6 | this software and associated documentation files (the "Software"), to deal in |
---|
| 7 | the Software without restriction, including without limitation the rights to use, |
---|
| 8 | copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the |
---|
| 9 | Software, and to permit persons to whom the Software is furnished to do so, subject |
---|
| 10 | to the following conditions: |
---|
| 11 | |
---|
| 12 | The above copyright notice and this permission notice shall be included in all copies |
---|
| 13 | or substantial portions of the Software. |
---|
| 14 | |
---|
| 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
---|
| 16 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
---|
| 17 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
---|
| 18 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
---|
| 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE |
---|
| 20 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
---|
| 21 | ******************************************************************************* |
---|
| 22 | */ |
---|
| 23 | #ifndef H_WJ_MaterialGenerator |
---|
| 24 | #define H_WJ_MaterialGenerator |
---|
| 25 | |
---|
| 26 | #include "OgreMaterial.h" |
---|
| 27 | #include "OgreStringVector.h" |
---|
| 28 | |
---|
| 29 | /** Caching, on-the-fly material generator. This is a class that automatically |
---|
| 30 | generates and stores different permutations of a material, and its shaders. |
---|
| 31 | It can be used if you have a material that has lots of slightly different |
---|
| 32 | variations, like whether to use a specular light, skinning, normal mapping |
---|
| 33 | and other options. Writing all these out is a tedioius job. Of course it is |
---|
| 34 | possible to always use the material with all features, but that might result |
---|
| 35 | in large, slow shader programs. This class provides an efficient solution |
---|
| 36 | to that. |
---|
| 37 | */ |
---|
| 38 | class MaterialGenerator |
---|
| 39 | { |
---|
| 40 | public: |
---|
| 41 | /** Bitfield used to signify a material permutations */ |
---|
| 42 | typedef Ogre::uint32 Perm; |
---|
| 43 | ~MaterialGenerator(); |
---|
| 44 | |
---|
| 45 | const Ogre::MaterialPtr &getMaterial(Perm permutation); |
---|
| 46 | |
---|
| 47 | /** Implementation class that takes care of actual generation or lookup |
---|
| 48 | of the various constituent parts (template material, fragment shader |
---|
| 49 | and vertex shader). These methods are only called once for every permutation, |
---|
| 50 | after which the result is stored and re-used. |
---|
| 51 | */ |
---|
| 52 | class Impl |
---|
| 53 | { |
---|
| 54 | public: |
---|
| 55 | virtual ~Impl(); |
---|
| 56 | virtual Ogre::GpuProgramPtr generateVertexShader(Perm permutation) = 0; |
---|
| 57 | virtual Ogre::GpuProgramPtr generateFragmentShader(Perm permutation) = 0; |
---|
| 58 | virtual Ogre::MaterialPtr generateTemplateMaterial(Perm permutation) = 0; |
---|
| 59 | }; |
---|
| 60 | protected: |
---|
| 61 | /** The constructor is protected as this base class should never be constructed |
---|
| 62 | as-is. It is meant to be subclassed so that values can be assigned to |
---|
| 63 | the various fields controlling material generator, and most importantly, the |
---|
| 64 | mImpl field. |
---|
| 65 | */ |
---|
| 66 | MaterialGenerator(); |
---|
| 67 | |
---|
| 68 | const Ogre::GpuProgramPtr &getVertexShader(Perm permutation); |
---|
| 69 | const Ogre::GpuProgramPtr &getFragmentShader(Perm permutation); |
---|
| 70 | const Ogre::MaterialPtr &getTemplateMaterial(Perm permutation); |
---|
| 71 | |
---|
| 72 | /// Base name of materials generated by this |
---|
| 73 | Ogre::String materialBaseName; |
---|
| 74 | /// Name of every bit |
---|
| 75 | Ogre::StringVector bitNames; |
---|
| 76 | /// Mask of permutation bits that influence vertex shader choice |
---|
| 77 | Perm vsMask; |
---|
| 78 | /// Mask of permutation bits that influence fragment shader choice |
---|
| 79 | Perm fsMask; |
---|
| 80 | /// Mask of permutation bits that influence template material choice |
---|
| 81 | Perm matMask; |
---|
| 82 | /// Generator |
---|
| 83 | Impl *mImpl; |
---|
| 84 | |
---|
| 85 | typedef std::map<Perm, Ogre::GpuProgramPtr> ProgramMap; |
---|
| 86 | typedef std::map<Perm, Ogre::MaterialPtr> MaterialMap; |
---|
| 87 | |
---|
| 88 | ProgramMap mVs, mFs; |
---|
| 89 | MaterialMap mTemplateMat, mMaterials; |
---|
| 90 | }; |
---|
| 91 | |
---|
| 92 | #endif |
---|