[692] | 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
|
---|