gpuray_glsl
annotate src/box.cc @ 0:f234630e38ff
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 09 Nov 2014 13:03:36 +0200 |
parents | |
children |
rev | line source |
---|---|
nuclear@0 | 1 #include "box.h" |
nuclear@0 | 2 |
nuclear@0 | 3 Box::Box() |
nuclear@0 | 4 : min(-0.5, -0.5, -0.5), max(0.5, 0.5, 0.5) |
nuclear@0 | 5 { |
nuclear@0 | 6 } |
nuclear@0 | 7 |
nuclear@0 | 8 Box::Box(const Vector3 &min_arg, const Vector3 &max_arg) |
nuclear@0 | 9 : min(min_arg), max(max_arg) |
nuclear@0 | 10 { |
nuclear@0 | 11 } |
nuclear@0 | 12 |
nuclear@0 | 13 bool Box::intersect(const Ray &inray, HitPoint *pt) const |
nuclear@0 | 14 { |
nuclear@0 | 15 Ray ray = inray.transformed(inv_xform); |
nuclear@0 | 16 |
nuclear@0 | 17 Vector3 param[2] = {min, max}; |
nuclear@0 | 18 Vector3 inv_dir(1.0 / ray.dir.x, 1.0 / ray.dir.y, 1.0 / ray.dir.z); |
nuclear@0 | 19 int sign[3] = {inv_dir.x < 0, inv_dir.y < 0, inv_dir.z < 0}; |
nuclear@0 | 20 |
nuclear@0 | 21 float tmin = (param[sign[0]].x - ray.origin.x) * inv_dir.x; |
nuclear@0 | 22 float tmax = (param[1 - sign[0]].x - ray.origin.x) * inv_dir.x; |
nuclear@0 | 23 float tymin = (param[sign[1]].y - ray.origin.y) * inv_dir.y; |
nuclear@0 | 24 float tymax = (param[1 - sign[1]].y - ray.origin.y) * inv_dir.y; |
nuclear@0 | 25 |
nuclear@0 | 26 pt->normal = Vector3(ray.origin.x > 0.0 ? 1 : -1, 0, 0); |
nuclear@0 | 27 |
nuclear@0 | 28 if(tmin > tymax || tymin > tmax) { |
nuclear@0 | 29 return false; |
nuclear@0 | 30 } |
nuclear@0 | 31 if(tymin > tmin) { |
nuclear@0 | 32 pt->normal = Vector3(0, ray.origin.y > 0.0 ? 1 : -1, 0); |
nuclear@0 | 33 tmin = tymin; |
nuclear@0 | 34 } |
nuclear@0 | 35 if(tymax < tmax) { |
nuclear@0 | 36 tmax = tymax; |
nuclear@0 | 37 } |
nuclear@0 | 38 |
nuclear@0 | 39 float tzmin = (param[sign[2]].z - ray.origin.z) * inv_dir.z; |
nuclear@0 | 40 float tzmax = (param[1 - sign[2]].z - ray.origin.z) * inv_dir.z; |
nuclear@0 | 41 |
nuclear@0 | 42 if(tmin > tzmax || tzmin > tmax) { |
nuclear@0 | 43 return false; |
nuclear@0 | 44 } |
nuclear@0 | 45 if(tzmin > tmin) { |
nuclear@0 | 46 pt->normal = Vector3(0, 0, ray.origin.z > 0.0 ? 1 : -1); |
nuclear@0 | 47 tmin = tzmin; |
nuclear@0 | 48 } |
nuclear@0 | 49 if(tzmax < tmax) { |
nuclear@0 | 50 tmax = tzmax; |
nuclear@0 | 51 } |
nuclear@0 | 52 |
nuclear@0 | 53 float t = tmin < 1e-4 ? tmax : tmin; |
nuclear@0 | 54 if(t >= 1e-4) { |
nuclear@0 | 55 pt->obj = this; |
nuclear@0 | 56 pt->dist = t; |
nuclear@0 | 57 pt->pos = ray.origin + ray.dir * t; |
nuclear@0 | 58 pt->pos.transform(xform); |
nuclear@0 | 59 pt->normal.transform(dir_xform); |
nuclear@0 | 60 return true; |
nuclear@0 | 61 } |
nuclear@0 | 62 return false; |
nuclear@0 | 63 } |