00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _LUXRAYS_RAY_H
00024 #define _LUXRAYS_RAY_H
00025
00026 #include "luxrays/core/geometry/vector.h"
00027 #include "luxrays/core/geometry/point.h"
00028
00029 namespace luxrays {
00030
00031 extern float RAY_EPSILON;
00032
00033 class Ray {
00034 public:
00035
00036 Ray() : maxt(std::numeric_limits<float>::infinity()) {
00037 mint = RAY_EPSILON;
00038 }
00039
00040 Ray(const Point &origin, const Vector &direction)
00041 : o(origin), d(direction), maxt(std::numeric_limits<float>::infinity()) {
00042 mint = RAY_EPSILON;
00043 }
00044
00045 Ray(const Point &origin, const Vector &direction,
00046 float start, float end = std::numeric_limits<float>::infinity())
00047 : o(origin), d(direction), mint(start), maxt(end) { }
00048
00049 Point operator()(float t) const { return o + d * t; }
00050 void GetDirectionSigns(int signs[3]) const {
00051 signs[0] = d.x < 0.f;
00052 signs[1] = d.y < 0.f;
00053 signs[2] = d.z < 0.f;
00054 }
00055
00056
00057 Point o;
00058 Vector d;
00059 mutable float mint, maxt;
00060 };
00061
00062 inline std::ostream &operator<<(std::ostream &os, const Ray &r) {
00063 os << "Ray[" << r.o << ", " << r.d << ", " << r.mint << "," << r.maxt << "]";
00064 return os;
00065 }
00066
00067 class RayHit {
00068 public:
00069 float t;
00070 float b1, b2;
00071 unsigned int index;
00072
00073 void SetMiss() { index = 0xffffffffu; };
00074 bool Miss() const { return (index == 0xffffffffu); };
00075 };
00076
00077 }
00078
00079 #endif