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