Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef Effect_INCLUDE_ONCE
00033 #define Effect_INCLUDE_ONCE
00034
00035 #include <vlGraphics/Renderable.hpp>
00036 #include <vlGraphics/LODEvaluator.hpp>
00037 #include <vlGraphics/Shader.hpp>
00038 #include <vlCore/Collection.hpp>
00039 #include <vector>
00040
00041 namespace vl
00042 {
00043 class Actor;
00044
00045
00046
00051 class ShaderSequence: public Collection<Shader>
00052 {
00053 public:
00054 virtual const char* className() { return "vl::ShaderSequence"; }
00061 ShaderSequence(Shader* pass1=NULL, Shader* pass2=NULL, Shader* pass3=NULL, Shader* pass4=NULL )
00062 {
00063 VL_DEBUG_SET_OBJECT_NAME()
00064 if (pass1)
00065 push_back(pass1);
00066 if (pass2)
00067 push_back(pass2);
00068 if (pass3)
00069 push_back(pass3);
00070 if (pass4)
00071 push_back(pass4);
00072 }
00073 };
00074
00075
00076
00090 class VLGRAPHICS_EXPORT Effect: public Object
00091 {
00092
00093 Effect(const Effect&): Object() {}
00094 Effect& operator=(const Effect&) { return *this; }
00095
00096 public:
00097 virtual const char* className() { return "vl::Effect"; }
00098
00100 Effect()
00101 {
00102 VL_DEBUG_SET_OBJECT_NAME()
00103 mEnableMask = 0xFFFFFFFF;
00104 mRenderRank = 0;
00105 mActiveLod = 0;
00106 mLODShaders[0] = new ShaderSequence(new Shader);
00107 }
00108
00115 void setRenderRank(int rank) { mRenderRank = rank; }
00116
00118 int renderRank() const { return mRenderRank; }
00119
00122 const ref<ShaderSequence>& lod(int lod_level) const { return mLODShaders[lod_level]; }
00123
00126 ref<ShaderSequence>& lod(int lod_level) { return mLODShaders[lod_level]; }
00127
00129 Shader* shader(int lodi=0, int pass=0) { return lod(lodi)->at(pass); }
00130
00132 const Shader* shader(int lodi=0, int pass=0) const { return lod(lodi)->at(pass); }
00133
00135 void setLOD(int lodi, Shader* shader1, Shader* shader2=NULL, Shader* shader3=NULL, Shader* shader4=NULL)
00136 {
00137 VL_CHECK(lodi<VL_MAX_EFFECT_LOD)
00138 lod(lodi) = new ShaderSequence(shader1,shader2,shader3,shader4);
00139 }
00140
00142 void setLODEvaluator(LODEvaluator* lod_evaluator) { mLODEvaluator = lod_evaluator; }
00143
00145 LODEvaluator* lodEvaluator() { return mLODEvaluator.get(); }
00146
00148 const LODEvaluator* lodEvaluator() const { return mLODEvaluator.get(); }
00149
00151 void setEnableMask(unsigned int mask) { mEnableMask = mask; }
00152
00154 unsigned int enableMask() const { return mEnableMask; }
00155
00157 int evaluateLOD(Actor* actor, Camera* camera);
00158
00160 void setActiveLod(int lod)
00161 {
00162 VL_CHECK( lod < VL_MAX_EFFECT_LOD )
00163 VL_CHECK( lod >= 0 )
00164 mActiveLod = lod;
00165 }
00166
00168 int activeLod() const { return mActiveLod; }
00169
00170 protected:
00171 ref<ShaderSequence> mLODShaders[VL_MAX_EFFECT_LOD];
00172 ref<LODEvaluator> mLODEvaluator;
00173 int mActiveLod;
00174 int mRenderRank;
00175 unsigned int mEnableMask;
00176 };
00177
00178 }
00179
00180 #endif