nuclear@0: #ifndef BRDF_H_ nuclear@0: #define BRDF_H_ nuclear@0: nuclear@0: #include nuclear@0: #include nuclear@0: #include "color.h" nuclear@0: #include "texture.h" nuclear@0: nuclear@0: class ReflAttrib { nuclear@0: private: nuclear@0: float value; nuclear@0: Color color; nuclear@0: Texture *map; nuclear@0: nuclear@0: public: nuclear@0: nuclear@0: ReflAttrib(); nuclear@0: explicit ReflAttrib(const Color &color, Texture *tex = 0); nuclear@0: nuclear@0: void set_value(float val); nuclear@0: void set_color(const Color &col); nuclear@0: nuclear@0: void set_map(Texture *tex); nuclear@0: Texture *get_map() const; nuclear@0: nuclear@0: float get_value() const; nuclear@0: float get_value(float u, float v) const; nuclear@0: const Color &get_color() const; nuclear@0: Color get_color(float u, float v) const; nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: class Reflectance { nuclear@0: private: nuclear@0: static ReflAttrib def_attrib; nuclear@0: std::map attrib; nuclear@0: nuclear@0: virtual void set_default_attribs(); nuclear@0: nuclear@0: public: nuclear@0: Reflectance(); nuclear@0: virtual ~Reflectance() = default; nuclear@0: nuclear@0: virtual void set_attrib(const char *name, const Color &color, Texture *tex = 0); nuclear@0: virtual ReflAttrib &get_attrib(const char *name); nuclear@0: virtual const ReflAttrib &get_attrib(const char *name) const; nuclear@0: nuclear@0: virtual float get_attrib_value(const char *name) const; nuclear@0: virtual float get_attrib_value(const char *name, float u, float v) const; nuclear@0: virtual Color get_attrib_color(const char *name) const; nuclear@0: virtual Color get_attrib_color(const char *name, float u, float v) const; nuclear@0: nuclear@0: virtual Vector3 sample_dir(const Vector3 &norm, const Vector3 &outdir) const = 0; nuclear@0: virtual float sample(const Vector3 &norm, const Vector3 &outdir, Vector3 *indir) const; nuclear@0: virtual float eval(const Vector3 &norm, const Vector3 &outdir, const Vector3 &indir) const = 0; nuclear@0: }; nuclear@0: nuclear@0: class LambertRefl : public Reflectance { nuclear@0: private: nuclear@0: void set_default_attribs() override; nuclear@0: nuclear@0: public: nuclear@0: Vector3 sample_dir(const Vector3 &norm, const Vector3 &outdir) const override; nuclear@0: float eval(const Vector3 &norm, const Vector3 &outdir, const Vector3 &indir) const override; nuclear@0: }; nuclear@0: nuclear@0: #endif // BRDF_H_