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 |
---|