gpuray_glsl
diff 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 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/box.cc Sun Nov 09 13:03:36 2014 +0200 1.3 @@ -0,0 +1,63 @@ 1.4 +#include "box.h" 1.5 + 1.6 +Box::Box() 1.7 + : min(-0.5, -0.5, -0.5), max(0.5, 0.5, 0.5) 1.8 +{ 1.9 +} 1.10 + 1.11 +Box::Box(const Vector3 &min_arg, const Vector3 &max_arg) 1.12 + : min(min_arg), max(max_arg) 1.13 +{ 1.14 +} 1.15 + 1.16 +bool Box::intersect(const Ray &inray, HitPoint *pt) const 1.17 +{ 1.18 + Ray ray = inray.transformed(inv_xform); 1.19 + 1.20 + Vector3 param[2] = {min, max}; 1.21 + Vector3 inv_dir(1.0 / ray.dir.x, 1.0 / ray.dir.y, 1.0 / ray.dir.z); 1.22 + int sign[3] = {inv_dir.x < 0, inv_dir.y < 0, inv_dir.z < 0}; 1.23 + 1.24 + float tmin = (param[sign[0]].x - ray.origin.x) * inv_dir.x; 1.25 + float tmax = (param[1 - sign[0]].x - ray.origin.x) * inv_dir.x; 1.26 + float tymin = (param[sign[1]].y - ray.origin.y) * inv_dir.y; 1.27 + float tymax = (param[1 - sign[1]].y - ray.origin.y) * inv_dir.y; 1.28 + 1.29 + pt->normal = Vector3(ray.origin.x > 0.0 ? 1 : -1, 0, 0); 1.30 + 1.31 + if(tmin > tymax || tymin > tmax) { 1.32 + return false; 1.33 + } 1.34 + if(tymin > tmin) { 1.35 + pt->normal = Vector3(0, ray.origin.y > 0.0 ? 1 : -1, 0); 1.36 + tmin = tymin; 1.37 + } 1.38 + if(tymax < tmax) { 1.39 + tmax = tymax; 1.40 + } 1.41 + 1.42 + float tzmin = (param[sign[2]].z - ray.origin.z) * inv_dir.z; 1.43 + float tzmax = (param[1 - sign[2]].z - ray.origin.z) * inv_dir.z; 1.44 + 1.45 + if(tmin > tzmax || tzmin > tmax) { 1.46 + return false; 1.47 + } 1.48 + if(tzmin > tmin) { 1.49 + pt->normal = Vector3(0, 0, ray.origin.z > 0.0 ? 1 : -1); 1.50 + tmin = tzmin; 1.51 + } 1.52 + if(tzmax < tmax) { 1.53 + tmax = tzmax; 1.54 + } 1.55 + 1.56 + float t = tmin < 1e-4 ? tmax : tmin; 1.57 + if(t >= 1e-4) { 1.58 + pt->obj = this; 1.59 + pt->dist = t; 1.60 + pt->pos = ray.origin + ray.dir * t; 1.61 + pt->pos.transform(xform); 1.62 + pt->normal.transform(dir_xform); 1.63 + return true; 1.64 + } 1.65 + return false; 1.66 +}