nuclear@10: /* nuclear@10: libvmath - a vector math library nuclear@10: Copyright (C) 2004-2015 John Tsiombikas nuclear@10: nuclear@10: This program is free software: you can redistribute it and/or modify nuclear@10: it under the terms of the GNU Lesser General Public License as published nuclear@10: by the Free Software Foundation, either version 3 of the License, or nuclear@10: (at your option) any later version. nuclear@10: nuclear@10: This program is distributed in the hope that it will be useful, nuclear@10: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@10: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@10: GNU Lesser General Public License for more details. nuclear@10: nuclear@10: You should have received a copy of the GNU Lesser General Public License nuclear@10: along with this program. If not, see . nuclear@10: */ nuclear@10: #include "ray.h" nuclear@10: #include "vector.h" nuclear@10: nuclear@10: scalar_t Ray::env_ior = 1.0; nuclear@10: nuclear@10: Ray::Ray() nuclear@10: { nuclear@10: ior = env_ior; nuclear@10: energy = 1.0; nuclear@10: time = 0; nuclear@10: iter = 0; nuclear@10: } nuclear@10: nuclear@10: Ray::Ray(const Vector3 &origin, const Vector3 &dir) nuclear@10: { nuclear@10: this->origin = origin; nuclear@10: this->dir = dir; nuclear@10: ior = env_ior; nuclear@10: energy = 1.0; nuclear@10: time = 0; nuclear@10: iter = 0; nuclear@10: } nuclear@10: nuclear@10: void Ray::transform(const Matrix4x4 &xform) nuclear@10: { nuclear@10: Matrix4x4 upper = xform; nuclear@10: upper[0][3] = upper[1][3] = upper[2][3] = upper[3][0] = upper[3][1] = upper[3][2] = 0.0; nuclear@10: upper[3][3] = 1.0; nuclear@10: nuclear@10: dir.transform(upper); nuclear@10: origin.transform(xform); nuclear@10: } nuclear@10: nuclear@10: Ray Ray::transformed(const Matrix4x4 &xform) const nuclear@10: { nuclear@10: Ray foo = *this; nuclear@10: foo.transform(xform); nuclear@10: return foo; nuclear@10: } nuclear@10: nuclear@10: void Ray::enter(scalar_t new_ior) nuclear@10: { nuclear@10: ior = new_ior; nuclear@10: } nuclear@10: nuclear@10: void Ray::leave() nuclear@10: { nuclear@10: } nuclear@10: nuclear@10: scalar_t Ray::calc_ior(bool entering, scalar_t mat_ior) const nuclear@10: { nuclear@10: scalar_t from_ior = this->ior; nuclear@10: nuclear@10: if(entering) { nuclear@10: return from_ior / mat_ior; nuclear@10: } nuclear@10: nuclear@10: Ray tmp = *this; nuclear@10: tmp.leave(); nuclear@10: return from_ior / tmp.ior; nuclear@10: }