/* ray.cc * by Will Wagner * last updated 20 Sep 1997, 17:36:35 wwagner * * This file contains the Intersection and Ray definitions for POVRay. * * Changes * 11 Aug 1997 * - Added this commment block. * * 20 Sep 1997 * - CONTAINING_OBJECTS_STEP was renamed to CONTAINING_OBJECTS_FACTOR. * * Things to do * */ #include #include "ray.h" int Ray::ray_struct_compare(ray_struct& r, Texture *t) { return (r.texture == t); } Ray::Ray() : initial(3, 0.0), direction(3, 0.0), containing() { containing.reserve(INITIAL_CONTAINING_OBJECTS); } Ray::Ray(const pov_vector& in, const pov_vector& di) : initial(in), direction(di), containing() { containing.reserve(INITIAL_CONTAINING_OBJECTS); } Ray::Ray(const Ray& r) : initial(r.initial), direction(r.direction), containing(), { containing.reserve(r.containing.capacity()); copy(r.containing.begin(), r.containing.end(), containing.begin()); } Ray::~Ray() { } void Ray::Enter(Object *obj, Texture *tex) { ray_struct rs; if ((containing.size() + 1) >= containing.capacity()) /* If the containing vector is about to overflow, extend it by * a factor of CONTAINING_OBJECTS_FACTOR instead of wasting * lots of time doing small-increment reallocations. */ containing.reserve(containing.capacity() * CONTAINING_OBJECTS_FACTOR); rs.texture = tex; rs.object = obj; if ((texture->Type == PLAIN_PATTERN) && (texture->Finish != NULL)) rs.ior = texture->Finish->Index_Of_Refraction; else rs.ior = Frame.Atmosphere_IOR; containing.push_back(rs); } void Ray::Exit(int nr) { if (containing.size()) { copy(containing.begin() + nr + 1, containing.end(), containing.begin() + nr); containing.pop_back(); } } int Ray::TextureInRay(Texture *tex) { int found = -1; vector::iterator i; i = find_if(containing.begin(), containing.end(), bind2nd(Ray::ray_struct_compare(), tex)); if (i != containing.end()) found = i - containing.begin(); return found; }