erebus

annotate liberebus/src/rt.cc @ 8:e2d9bf168a41

semi-works ...
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 24 May 2014 06:12:57 +0300
parents bb006fb96f1b
children e9da2916bc79
rev   line source
nuclear@8 1 #include <assert.h>
nuclear@6 2 #include "rt.h"
nuclear@8 3 #include "erebus_impl.h"
nuclear@8 4
nuclear@8 5 #define MAX_ITER 8
nuclear@6 6
nuclear@6 7 Color ray_trace(const Ray &ray, const Scene *scn, int iter)
nuclear@6 8 {
nuclear@6 9 RayHit hit;
nuclear@6 10 if(!(scn->intersect(ray, &hit))) {
nuclear@8 11 return scn->get_env_color(ray);
nuclear@6 12 }
nuclear@6 13
nuclear@8 14 return shade(hit, scn, iter);
nuclear@6 15 }
nuclear@6 16
nuclear@8 17 Color shade(const RayHit &hit, const Scene *scn, int iter)
nuclear@6 18 {
nuclear@8 19 assert(hit.obj->get_type() == ObjType::geom);
nuclear@8 20 const GeomObject *obj = (const GeomObject*)hit.obj;
nuclear@8 21 const Material *mtl = &obj->mtl;
nuclear@8 22 const Reflectance *brdf = obj->brdf;
nuclear@8 23 const Ray &ray = hit.world_ray;
nuclear@8 24
nuclear@8 25 Vector3 norm = obj->calc_normal(hit);
nuclear@8 26 Vector2 texcoords = obj->calc_texcoords(hit);
nuclear@8 27
nuclear@8 28 Color color = mtl->get_attrib_color("albedo", texcoords.x, texcoords.y);
nuclear@8 29 Color res = mtl->get_attrib_color("emissive") + color * scn->get_env().ambient;
nuclear@8 30
nuclear@8 31 Vector3 sample_dir;
nuclear@8 32 float prob = brdf->sample(norm, -hit.world_ray.dir, &sample_dir);
nuclear@8 33 if(iter < MAX_ITER && randf() <= prob) {
nuclear@8 34 Ray sample_ray;
nuclear@8 35 sample_ray.origin = ray.origin + ray.dir * hit.dist;
nuclear@8 36 sample_ray.dir = sample_dir;
nuclear@8 37
nuclear@8 38 res += ray_trace(sample_ray, scn, iter + 1) * color;
nuclear@8 39 }
nuclear@8 40 return res;
nuclear@6 41 }