3dphotoshoot

annotate libs/vmath/ray.cc @ 10:c71c477521ca

converting to GLES2 and C++
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 31 May 2015 00:40:26 +0300
parents
children
rev   line source
nuclear@10 1 /*
nuclear@10 2 libvmath - a vector math library
nuclear@10 3 Copyright (C) 2004-2015 John Tsiombikas <nuclear@member.fsf.org>
nuclear@10 4
nuclear@10 5 This program is free software: you can redistribute it and/or modify
nuclear@10 6 it under the terms of the GNU Lesser General Public License as published
nuclear@10 7 by the Free Software Foundation, either version 3 of the License, or
nuclear@10 8 (at your option) any later version.
nuclear@10 9
nuclear@10 10 This program is distributed in the hope that it will be useful,
nuclear@10 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@10 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@10 13 GNU Lesser General Public License for more details.
nuclear@10 14
nuclear@10 15 You should have received a copy of the GNU Lesser General Public License
nuclear@10 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@10 17 */
nuclear@10 18 #include "ray.h"
nuclear@10 19 #include "vector.h"
nuclear@10 20
nuclear@10 21 scalar_t Ray::env_ior = 1.0;
nuclear@10 22
nuclear@10 23 Ray::Ray()
nuclear@10 24 {
nuclear@10 25 ior = env_ior;
nuclear@10 26 energy = 1.0;
nuclear@10 27 time = 0;
nuclear@10 28 iter = 0;
nuclear@10 29 }
nuclear@10 30
nuclear@10 31 Ray::Ray(const Vector3 &origin, const Vector3 &dir)
nuclear@10 32 {
nuclear@10 33 this->origin = origin;
nuclear@10 34 this->dir = dir;
nuclear@10 35 ior = env_ior;
nuclear@10 36 energy = 1.0;
nuclear@10 37 time = 0;
nuclear@10 38 iter = 0;
nuclear@10 39 }
nuclear@10 40
nuclear@10 41 void Ray::transform(const Matrix4x4 &xform)
nuclear@10 42 {
nuclear@10 43 Matrix4x4 upper = xform;
nuclear@10 44 upper[0][3] = upper[1][3] = upper[2][3] = upper[3][0] = upper[3][1] = upper[3][2] = 0.0;
nuclear@10 45 upper[3][3] = 1.0;
nuclear@10 46
nuclear@10 47 dir.transform(upper);
nuclear@10 48 origin.transform(xform);
nuclear@10 49 }
nuclear@10 50
nuclear@10 51 Ray Ray::transformed(const Matrix4x4 &xform) const
nuclear@10 52 {
nuclear@10 53 Ray foo = *this;
nuclear@10 54 foo.transform(xform);
nuclear@10 55 return foo;
nuclear@10 56 }
nuclear@10 57
nuclear@10 58 void Ray::enter(scalar_t new_ior)
nuclear@10 59 {
nuclear@10 60 ior = new_ior;
nuclear@10 61 }
nuclear@10 62
nuclear@10 63 void Ray::leave()
nuclear@10 64 {
nuclear@10 65 }
nuclear@10 66
nuclear@10 67 scalar_t Ray::calc_ior(bool entering, scalar_t mat_ior) const
nuclear@10 68 {
nuclear@10 69 scalar_t from_ior = this->ior;
nuclear@10 70
nuclear@10 71 if(entering) {
nuclear@10 72 return from_ior / mat_ior;
nuclear@10 73 }
nuclear@10 74
nuclear@10 75 Ray tmp = *this;
nuclear@10 76 tmp.leave();
nuclear@10 77 return from_ior / tmp.ior;
nuclear@10 78 }