marblematerial.h

Go to the documentation of this file.
00001 #ifndef MARBLEMATERIAL_H
00002 #define MARBLEMATERIAL_H
00003 
00004 #include "raytrace_defs.h"
00005 #include "material.h"
00006 #include "pluginfactory.h"
00007 #include "noise.h"
00008 
00009 
00011 Material * make_marble_material(std::map<std::string, std::string> props);
00012 
00013 
00026 class MarbleMaterial : public Material{
00028     class StaticInit
00029     {
00030         public:
00032             StaticInit()
00033             {
00034                 log_info("Registering as \"marble\" ");
00035                 MaterialFactory::get_instance()->registerPlugin("marble", sigc::ptr_fun(make_marble_material));
00036             }
00037     };
00038 
00039     protected:
00040 
00041 
00043         Noise m_noise;
00044         
00046         static StaticInit m_init;
00047 
00049         Material * m_material_one_a;
00051         Material * m_material_one_b;
00052 
00054         Material * m_material_two_a;
00056         Material * m_material_two_b;
00057         
00060         double m_break_point;
00061         
00063         double m_material_one_scale; 
00064         
00066         double m_material_two_scale; 
00067 
00070         double m_noise_scale;
00071 
00072     public:
00074         MarbleMaterial(
00075             Material * one_a, 
00076             Material * one_b, 
00077             Material * two_a, 
00078             Material * two_b,
00079             double break_point,
00080             double noise_scale) :
00081                 m_material_one_a(one_a),
00082                 m_material_one_b(one_b),
00083                 m_material_two_a(two_a),
00084                 m_material_two_b(two_b),
00085                 m_break_point(break_point),
00086                 m_noise_scale(noise_scale)
00087         {
00088             m_material_one_scale = 1.0 / m_break_point ;
00089             m_material_two_scale = 1.0 / (1-m_break_point);
00090         }
00091 
00092         virtual ~MarbleMaterial() {
00093         }
00094 
00096         double interpolate_value(double noise_amount, double one, double two) const;
00097         
00099         void choose_materials(double noise_amount, Material ** one  , Material ** two) const;
00100         
00102         virtual Magick::Color get_color(const Point3D& intersesction_point) const ; 
00103 
00105         virtual bool is_light(const Point3D& intersesction_point) const ; 
00106 
00108         virtual void set_is_light(bool v); 
00109 
00111         virtual double get_diffuse(const Point3D& intersesction_point) const ; 
00112 
00114         virtual void set_diffuse(double diffuse); 
00115 
00117         virtual double get_reflection(const Point3D& intersesction_point) const; 
00118 
00120         virtual double get_reflectivity(const Point3D& intersesction_point) const ; 
00121 
00126         virtual double get_refraction_index(const Point3D& intersesction_point) const; 
00127 
00129         virtual double get_opacity(const Point3D& intersesction_point) const ; 
00130 
00132         virtual void set_opacity(double opacity) ; 
00133 
00134 };
00135 
00136 Material * make_marble_material(std::map<std::string, std::string> props) {
00137     Scene * scene = Scene::get_instance();
00138     Material * one = scene->get_material(props["material1a"]);
00139     Material * two = scene->get_material(props["material1b"]);
00140     Material * three = scene->get_material(props["material2a"]);
00141     Material * four = scene->get_material(props["material2b"]);
00142     double break_point = (double)strtod(props["break_point"].c_str(), NULL);
00143     double noise_scale = (double)strtod(props["noise_scale"].c_str(), NULL);
00144     return new MarbleMaterial(one, two, three, four, break_point, noise_scale);
00145 }
00146 
00147 #endif

Generated on Tue Oct 30 22:12:15 2007 for mbrt by  doxygen 1.5.2