checkermaterial.cpp

Go to the documentation of this file.
00001 #include <Magick++.h>
00002 #include "checkermaterial.h"
00003 #include <iostream>
00004 
00005 using Magick::Color;
00006 
00007 CheckeredMaterial::StaticInit CheckeredMaterial::m_init;
00008 
00009 int CheckeredMaterial::choose_material(const Point3D& intersection_point) const
00010 {
00011     int x = (int)((floorl(intersection_point.x)) * m_scale);
00012     int y = (int)((floorl(intersection_point.y)) * m_scale);
00013     int z = (int)((floorl(intersection_point.z)) * m_scale);
00014 
00015     // -3 -2 -1  0  1  2  3
00016 
00017     int bit =  (x % 2  == 0) ? 1 : -1; 
00018     bit *=     (y % 2  == 0) ? 1 : -1; 
00019     bit *=     (z % 2  == 0) ? 1 : -1; 
00020 
00021     /*
00022     if(x < 0)
00023         bit *= -1;
00024     if(y < 0)
00025         bit *= -1;
00026     if(z < 0)
00027         bit *= -1;
00028         */
00029 
00030     return bit;
00031 }
00032 
00033 Color CheckeredMaterial::get_color(const Point3D& intersection_point) const 
00034 { 
00035     if(choose_material(intersection_point) > 0)
00036         return m_material_one->get_color(intersection_point); 
00037     else
00038         return m_material_two->get_color(intersection_point); 
00039 }
00040 
00041 bool CheckeredMaterial::is_light(const Point3D& intersection_point) const 
00042 { 
00043     return false; 
00044 }
00045 void CheckeredMaterial::set_is_light(bool v) 
00046 { 
00047     return;
00048     //m_is_light_source = v; 
00049 }
00050 
00051 double CheckeredMaterial::get_diffuse(const Point3D& intersection_point) const 
00052 { 
00053     if(choose_material(intersection_point) > 0)
00054         return m_material_one->get_diffuse(intersection_point); 
00055     else
00056         return m_material_two->get_diffuse(intersection_point); 
00057 }
00058 
00059 void CheckeredMaterial::set_diffuse(double diffuse) 
00060 { 
00061     m_material_one->set_diffuse(diffuse);
00062     m_material_two->set_diffuse(diffuse);
00063 
00064 }
00065 
00066 double CheckeredMaterial::get_reflection(const Point3D& intersection_point) const 
00067 { 
00068     if(choose_material(intersection_point) > 0)
00069         return m_material_one->get_reflection(intersection_point); 
00070     else
00071         return m_material_two->get_reflection(intersection_point); 
00072 }
00073 
00074 double CheckeredMaterial::get_reflectivity(const Point3D& intersection_point) const 
00075 { 
00076     if(choose_material(intersection_point) > 0)
00077         return m_material_one->get_reflectivity(intersection_point); 
00078     else
00079         return m_material_two->get_reflectivity(intersection_point); 
00080 }
00081 
00082 double CheckeredMaterial::get_refraction_index(const Point3D& intersection_point) const 
00083 { 
00084     if(choose_material(intersection_point) > 0)
00085         return m_material_one->get_refraction_index(intersection_point); 
00086     else
00087         return m_material_two->get_refraction_index(intersection_point); 
00088 }
00089 
00090 double CheckeredMaterial::get_opacity(const Point3D& intersection_point) const 
00091 { 
00092     if(choose_material(intersection_point) > 0)
00093         return m_material_one->get_opacity(intersection_point); 
00094     else
00095         return m_material_two->get_opacity(intersection_point); 
00096 }
00097 
00098 void CheckeredMaterial::set_opacity(double opacity) 
00099 {
00100     m_material_one->set_opacity(opacity);
00101     m_material_two->set_opacity(opacity);
00102 }
00103 
00104 
00105 Material * CheckeredMaterial::createCheckeredMaterial(std::map<std::string, std::string> props)
00106 {
00107     Scene * scene = Scene::get_instance();
00108     Material * one = scene->get_material(props["material1"]);
00109     Material * two = scene->get_material(props["material2"]);
00110 
00111     // TODO: this is done so many times it really needs a helper function
00112     double scale = props.count("scale") > 0 ?
00113         (double)strtod(props["scale"].c_str(), NULL)       :  1.0;
00114 
00115     return new CheckeredMaterial(one, two, scale);
00116 
00117 }
00118 

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