erebus

annotate liberebus/src/geomobj.cc @ 4:93894c232d65

more changes across the board
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 29 Apr 2014 07:38:40 +0300
parents
children e2d9bf168a41
rev   line source
nuclear@4 1 #include <float.h>
nuclear@4 2 #include "geomobj.h"
nuclear@4 3
nuclear@4 4 static LambertRefl lambert;
nuclear@4 5
nuclear@4 6 GeomObject::GeomObject()
nuclear@4 7 {
nuclear@4 8 brdf = &lambert;
nuclear@4 9 }
nuclear@4 10
nuclear@4 11 ObjType GeomObject::get_type() const
nuclear@4 12 {
nuclear@4 13 return ObjType::geom;
nuclear@4 14 }
nuclear@4 15
nuclear@4 16 bool GeomObject::intersect(const Ray &ray, RayHit *hit) const
nuclear@4 17 {
nuclear@4 18 return false;
nuclear@4 19 }
nuclear@4 20
nuclear@4 21 // --- class Sphere ---
nuclear@4 22
nuclear@4 23 bool Sphere::intersect(const Ray &ray, RayHit *hit) const
nuclear@4 24 {
nuclear@4 25 // assumes center is the origin and radius is 1
nuclear@4 26 float a = dot_product(ray.dir, ray.dir);
nuclear@4 27 float b = 2.0 * dot_product(ray.dir, ray.origin);
nuclear@4 28 float c = dot_product(ray.origin, ray.origin) - 1.0;
nuclear@4 29
nuclear@4 30 float d = b * b - 4.0 * a * c;
nuclear@4 31 if(d < 1e-4) return false;
nuclear@4 32
nuclear@4 33 float sqrt_d = sqrt(d);
nuclear@4 34 float t0 = (-b + sqrt_d) / (2.0 * a);
nuclear@4 35 float t1 = (-b - sqrt_d) / (2.0 * a);
nuclear@4 36
nuclear@4 37 if(t0 < 1e-4) t0 = t1;
nuclear@4 38 if(t1 < 1e-4) t1 = t0;
nuclear@4 39 float t = t0 < t1 ? t0 : t1;
nuclear@4 40 if(t < 1e-4) return false;
nuclear@4 41
nuclear@4 42 if(hit) {
nuclear@4 43 hit->dist = t;
nuclear@4 44 hit->obj = this;
nuclear@4 45 hit->subobj = 0;
nuclear@4 46 }
nuclear@4 47 return true;
nuclear@4 48 }
nuclear@4 49
nuclear@4 50 // --- class Box ---
nuclear@4 51
nuclear@4 52 bool Box::intersect(const Ray &ray, RayHit *hit) const
nuclear@4 53 {
nuclear@4 54 return false;
nuclear@4 55 }
nuclear@4 56
nuclear@4 57 // --- class Triangle ---
nuclear@4 58
nuclear@4 59 bool Triangle::intersect(const Ray &ray, RayHit *hit) const
nuclear@4 60 {
nuclear@4 61 return false;
nuclear@4 62 }
nuclear@4 63
nuclear@4 64 // --- class Mesh ---
nuclear@4 65
nuclear@4 66 bool Mesh::intersect(const Ray &ray, RayHit *hit) const
nuclear@4 67 {
nuclear@4 68 RayHit nearest;
nuclear@4 69 nearest.dist = FLT_MAX;
nuclear@4 70
nuclear@4 71 for(size_t i=0; i<faces.size(); i++) {
nuclear@4 72 if(faces[i].intersect(ray, hit)) {
nuclear@4 73 if(!hit) return true;
nuclear@4 74 if(hit->dist < nearest.dist) {
nuclear@4 75 nearest = *hit;
nuclear@4 76 }
nuclear@4 77 }
nuclear@4 78 }
nuclear@4 79
nuclear@4 80 if(nearest.dist < FLT_MAX) {
nuclear@4 81 *hit = nearest;
nuclear@4 82 hit->subobj = hit->obj;
nuclear@4 83 hit->obj = this;
nuclear@4 84 return true;
nuclear@4 85 }
nuclear@4 86 return false;
nuclear@4 87 }