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 ShaderPasses: public Collection<Shader>
00052 {
00053 VL_INSTRUMENT_CLASS(vl::ShaderPasses, Collection<Shader>)
00054
00055 public:
00062 ShaderPasses(Shader* pass1=NULL, Shader* pass2=NULL, Shader* pass3=NULL, Shader* pass4=NULL )
00063 {
00064 VL_DEBUG_SET_OBJECT_NAME()
00065 if (pass1)
00066 push_back(pass1);
00067 if (pass2)
00068 push_back(pass2);
00069 if (pass3)
00070 push_back(pass3);
00071 if (pass4)
00072 push_back(pass4);
00073 }
00074 };
00075
00076
00077
00091 class VLGRAPHICS_EXPORT Effect: public Object
00092 {
00093 VL_INSTRUMENT_CLASS(vl::Effect, Object)
00094
00095
00096 Effect(const Effect&): Object() {}
00097 Effect& operator=(const Effect&) { return *this; }
00098
00099 public:
00101 Effect()
00102 {
00103 VL_DEBUG_SET_OBJECT_NAME()
00104 mEnableMask = 0xFFFFFFFF;
00105 mRenderRank = 0;
00106 mActiveLod = 0;
00107 mLODShaders[0] = new ShaderPasses(new Shader);
00108 }
00109
00110 ref<Effect> shallowCopy(EShaderCopyMode shader_copy) const
00111 {
00112 ref<Effect> fx = new Effect;
00113 fx->shallowCopyFrom(*this, shader_copy);
00114 return fx;
00115 }
00116
00117 Effect& shallowCopyFrom(const Effect& other, EShaderCopyMode shader_copy)
00118 {
00119 for(int i=0; i<VL_MAX_EFFECT_LOD; ++i)
00120 mLODShaders[i] = other.mLODShaders[i];
00121
00122 if (shader_copy == SCM_OwnShaders)
00123 {
00124
00125 for(int lod=0; lod<VL_MAX_EFFECT_LOD; ++lod)
00126 for(int pass=0; mLODShaders[lod] && pass<mLODShaders[lod]->size(); ++pass)
00127 (*mLODShaders[lod])[pass] = (*mLODShaders[lod])[pass]->shallowCopy();
00128 }
00129
00130 mLODEvaluator = other.mLODEvaluator;
00131
00132 mActiveLod = other.mActiveLod;
00133 mRenderRank = other.mRenderRank;
00134 mEnableMask = other.mEnableMask;
00135
00136 return *this;
00137 }
00138
00139 ref<Effect> deepCopy() const
00140 {
00141 ref<Effect> fx = new Effect;
00142 fx->deepCopyFrom(*this);
00143 return fx;
00144 }
00145
00146 Effect& deepCopyFrom(const Effect& other)
00147 {
00148 shallowCopyFrom(other, SCM_ShareShaders);
00149
00150
00151 for(int lod=0; lod<VL_MAX_EFFECT_LOD; ++lod)
00152 for(int pass=0; mLODShaders[lod] && pass<mLODShaders[lod]->size(); ++pass)
00153 (*mLODShaders[lod])[pass] = (*mLODShaders[lod])[pass]->deepCopy();
00154
00155 return *this;
00156 }
00157
00164 void setRenderRank(int rank) { mRenderRank = rank; }
00165
00167 int renderRank() const { return mRenderRank; }
00168
00171 const ref<ShaderPasses>& lod(int lod_level) const { return mLODShaders[lod_level]; }
00172
00175 ref<ShaderPasses>& lod(int lod_level) { return mLODShaders[lod_level]; }
00176
00178 Shader* shader(int lodi=0, int pass=0) { return lod(lodi)->at(pass); }
00179
00181 const Shader* shader(int lodi=0, int pass=0) const { return lod(lodi)->at(pass); }
00182
00184 void setLOD(int lodi, Shader* shader1, Shader* shader2=NULL, Shader* shader3=NULL, Shader* shader4=NULL)
00185 {
00186 VL_CHECK(lodi<VL_MAX_EFFECT_LOD)
00187 lod(lodi) = new ShaderPasses(shader1,shader2,shader3,shader4);
00188 }
00189
00191 void setLODEvaluator(LODEvaluator* lod_evaluator) { mLODEvaluator = lod_evaluator; }
00192
00194 LODEvaluator* lodEvaluator() { return mLODEvaluator.get(); }
00195
00197 const LODEvaluator* lodEvaluator() const { return mLODEvaluator.get(); }
00198
00200 void setEnableMask(unsigned int mask) { mEnableMask = mask; }
00201
00203 unsigned int enableMask() const { return mEnableMask; }
00204
00206 int evaluateLOD(Actor* actor, Camera* camera);
00207
00209 void setActiveLod(int lod)
00210 {
00211 VL_CHECK( lod < VL_MAX_EFFECT_LOD )
00212 VL_CHECK( lod >= 0 )
00213 mActiveLod = lod;
00214 }
00215
00217 int activeLod() const { return mActiveLod; }
00218
00219 protected:
00220 ref<ShaderPasses> mLODShaders[VL_MAX_EFFECT_LOD];
00221 ref<LODEvaluator> mLODEvaluator;
00222 int mActiveLod;
00223 int mRenderRank;
00224 unsigned int mEnableMask;
00225 };
00226
00227 }
00228
00229 #endif