00001 #ifndef PRIMITIVE_H 00002 #define PRIMITIVE_H 00003 00004 #include "raytrace_defs.h" 00005 #include "material.h" 00006 #include "bumpmap.h" 00007 #include "ray.h" 00008 #include "xml_util.h" 00009 00011 class Renderable { 00012 public: 00013 virtual ~Renderable() {} 00014 00020 virtual bool collides_with(const Ray &ray, double &t) const = 0; 00021 00023 virtual Magick::Color get_color(const Point3D& intersection_point) const ; 00024 00026 virtual double get_diffuse(const Point3D& intersection_point) const; 00027 00029 virtual double get_reflection(const Point3D& intersection_point) const; 00030 00032 virtual double get_specular(const Point3D& intersection_point) const ; 00033 00035 virtual double get_reflectivity(const Point3D& intersection_point) const ; 00036 00038 virtual double get_opacity(const Point3D& intersection_point) const ; 00039 00041 virtual double get_refraction_index(const Point3D& intersection_point) const ; 00042 00044 virtual bool is_light(const Point3D& intersection_point) const ; 00045 00046 virtual bool set_is_light(bool ) ; 00047 00050 virtual Ray get_normal(const Point3D &p) const = 0; 00051 00054 bool initialize(xmlNode * node); 00055 00056 00071 virtual Magick::Color get_color_contribution(const Point3D &intersection_point, const Ray &ray, Vector &reflect, Vector &refract) ; 00072 00073 bool is_in_shadow(const Ray &ray_to_light, const Point3D intersection_point) { 00074 double dist = INF; 00075 Renderable * prim = NULL; 00076 Scene * scene = Scene::get_instance(); 00077 00078 prim = scene->find_collision(ray_to_light, dist); 00079 00080 if ( this == prim ) { 00081 return false; 00082 } 00083 00084 return (prim != NULL && !prim->is_light(intersection_point)); 00085 } 00086 00089 virtual const Point3D get_center() const 00090 { 00091 return m_center; 00092 } 00093 00094 protected: 00099 Material * m_material ; 00100 00106 Point3D m_center; 00107 00112 00113 BumpMap * m_bumpmap; 00114 00117 00118 bool m_center_material; 00119 private: 00122 Ray get_final_normal(const Point3D &p) ; 00123 }; 00124 00125 #endif