00001 #ifndef Y_SHINYDIFFMAT_H
00002 #define Y_SHINYDIFFMAT_H
00003
00004 #include <yafray_config.h>
00005 #include <yafraycore/nodematerial.h>
00006 #include <core_api/shader.h>
00007 #include <core_api/environment.h>
00008
00009 __BEGIN_YAFRAY
00010
00025 class shinyDiffuseMat_t: public nodeMaterial_t
00026 {
00027 public:
00028 shinyDiffuseMat_t(const color_t &col, const color_t &srcol, float diffuse, float transp=0.0, float transl=0.0, float sp_refl=0.0, float emit=0.0);
00029 virtual ~shinyDiffuseMat_t();
00030 virtual void initBSDF(const renderState_t &state, const surfacePoint_t &sp, BSDF_t &bsdfTypes)const;
00031 virtual color_t eval(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo, const vector3d_t &wl, BSDF_t bsdfs)const;
00032 virtual color_t sample(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo, vector3d_t &wi, sample_t &s)const;
00033 virtual float pdf(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo, const vector3d_t &wi, BSDF_t bsdfs)const;
00034 virtual bool isTransparent() const { return isTranspar; }
00035 virtual color_t getTransparency(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo)const;
00036 virtual color_t emit(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo)const;
00037 virtual void getSpecular(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo,
00038 bool &reflect, bool &refract, vector3d_t *const dir, color_t *const col)const;
00039 virtual CFLOAT getAlpha(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo)const;
00040 virtual bool scatterPhoton(const renderState_t &state, const surfacePoint_t &sp, const vector3d_t &wo, vector3d_t &wi, pSample_t &s) const;
00041
00042 static material_t* factory(paraMap_t ¶ms, std::list<paraMap_t> &eparams, renderEnvironment_t &render);
00043 struct SDDat_t
00044 {
00045 float component[4];
00046 void *nodeStack;
00047 };
00048 protected:
00049 void config(shaderNode_t *diff, shaderNode_t *refl, shaderNode_t *transp, shaderNode_t *transl, shaderNode_t *bump);
00050 int getComponents(const bool *useNode, nodeStack_t &stack, float *component) const;
00051 void getFresnel(const vector3d_t &wo, const vector3d_t &N, float &Kr) const;
00052 CFLOAT OrenNayar(const vector3d_t &wi, const vector3d_t &wo, const vector3d_t &N) const;
00053 void initOrenNayar(double sigma);
00054
00055 bool isTranspar;
00056 bool isTransluc;
00057 bool isReflective;
00058 bool isDiffuse;
00059 bool fresnelEffect;
00060 bool viNodes[4], vdNodes[4];
00061 shaderNode_t *diffuseS;
00062 shaderNode_t *bumpS;
00063 shaderNode_t *transpS;
00064 shaderNode_t *translS;
00065 shaderNode_t *specReflS;
00066 shaderNode_t *mirColS;
00067
00068 color_t color, emitCol, specRefCol;
00069 float mSpecRefl, mTransp, mTransl, mDiffuse;
00070 float filter;
00071 float A, B;
00072 bool orenNayar;
00073 float IOR;
00074 int nBSDF;
00075 BSDF_t cFlags[4];
00076 int cIndex[4];
00077 float emitVal;
00078 };
00079
00080
00081 __END_YAFRAY
00082
00083 #endif // Y_SHINYDIFFMAT_H