erebus

view liberebus/src/rt.cc @ 27:0ced900e15a7

added missing <algorithms> header in erebus.cc
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 02 Jun 2014 00:53:01 +0300
parents 56d504cc555a
children 4a0a288ffb27
line source
1 #include <assert.h>
2 #include "rt.h"
3 #include "erebus_impl.h"
5 #define MAX_ITER 8
7 Color ray_trace(struct erebus *ctx, const Ray &ray, int iter)
8 {
9 const Scene *scn = ctx->scn;
10 if(!scn) {
11 return Color(1, 0, 0);
12 }
14 RayHit hit;
15 if(!(scn->intersect(ray, &hit))) {
16 return scn->get_env_color(ray);
17 }
19 return shade(ctx, hit, iter);
20 }
22 Color shade(struct erebus *ctx, const RayHit &hit, int iter)
23 {
24 assert(hit.obj->get_type() == ObjType::geom);
25 int max_iter = erb_getopti(ctx, ERB_OPT_MAX_ITER);
26 const Scene *scn = ctx->scn;
27 const GeomObject *obj = (const GeomObject*)hit.obj;
28 const Material *mtl = &obj->mtl;
29 const Reflectance *brdf = obj->brdf;
30 const Ray &ray = hit.world_ray;
31 //bool entering = true;
33 Vector3 norm = hit.calc_normal();
34 if(dot_product(ray.dir, norm) > 0.0) {
35 //entering = false;
36 norm = -norm;
37 }
39 //return norm * 0.5 + Vector3(0.5, 0.5, 0.5);
40 Vector2 texcoords = hit.calc_texcoords();
42 Color color = mtl->get_attrib_color("diffuse", texcoords.x, texcoords.y);
43 Color res = mtl->get_attrib_color("emissive") + color * scn->get_env().ambient;
45 Vector3 sample_dir;
46 float prob = brdf->sample(norm, -hit.world_ray.dir, &sample_dir);
47 if(iter < max_iter && randf() <= prob) {
48 Ray sample_ray;
49 sample_ray.origin = ray.origin + ray.dir * hit.dist;
50 sample_ray.dir = sample_dir;
52 res += ray_trace(ctx, sample_ray, iter + 1) * color;
53 }
54 return res;
55 }