nuclear@0: #include "ray.h" nuclear@0: #include "vector.h" nuclear@0: nuclear@0: scalar_t Ray::env_ior = 1.0; nuclear@0: nuclear@0: Ray::Ray() nuclear@0: { nuclear@0: ior = env_ior; nuclear@0: energy = 1.0; nuclear@0: time = 0; nuclear@0: iter = 0; nuclear@0: } nuclear@0: nuclear@0: Ray::Ray(const Vector3 &origin, const Vector3 &dir) nuclear@0: { nuclear@0: this->origin = origin; nuclear@0: this->dir = dir; nuclear@0: ior = env_ior; nuclear@0: energy = 1.0; nuclear@0: time = 0; nuclear@0: iter = 0; nuclear@0: } nuclear@0: nuclear@0: void Ray::transform(const Matrix4x4 &xform) nuclear@0: { nuclear@0: Matrix4x4 upper = xform; nuclear@0: upper[0][3] = upper[1][3] = upper[2][3] = upper[3][0] = upper[3][1] = upper[3][2] = 0.0; nuclear@0: upper[3][3] = 1.0; nuclear@0: nuclear@0: dir.transform(upper); nuclear@0: origin.transform(xform); nuclear@0: } nuclear@0: nuclear@0: Ray Ray::transformed(const Matrix4x4 &xform) const nuclear@0: { nuclear@0: Ray foo = *this; nuclear@0: foo.transform(xform); nuclear@0: return foo; nuclear@0: } nuclear@0: nuclear@0: void Ray::enter(scalar_t new_ior) nuclear@0: { nuclear@0: ior = new_ior; nuclear@0: } nuclear@0: nuclear@0: void Ray::leave() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: scalar_t Ray::calc_ior(bool entering, scalar_t mat_ior) const nuclear@0: { nuclear@0: scalar_t from_ior = this->ior; nuclear@0: nuclear@0: if(entering) { nuclear@0: return from_ior / mat_ior; nuclear@0: } nuclear@0: nuclear@0: Ray tmp = *this; nuclear@0: tmp.leave(); nuclear@0: return from_ior / tmp.ior; nuclear@0: }