Subversion Repositories gelsvn

Rev

Rev 349 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
353 awk 1
#include "glass.h"
346 awk 2
 
3
using namespace CGLA;
4
 
5
glass::glass(const CGLA::Vec3f& c, float ior)
6
: material(ior, 0.f), color_(c)
7
{
8
}
9
 
10
void glass::sample(const ray& r, hit_info& hi) const
11
{
349 awk 12
    hi.ior = hi.inside ? 1.f / ior_ : ior_;
346 awk 13
 
349 awk 14
    //compute fresnel
15
    float f;
16
    float cosi = dot(-r.direction, hi.shading_normal);
17
    cosi = clamp(cosi, -1.f, 1.f);
18
    float sint = 1.f / hi.ior * std::sqrt(std::max(0.f, 1.f - cosi*cosi));
346 awk 19
 
349 awk 20
    if (sint > 1.f)
21
    {
22
        //total internal reflection
23
        f = 1.f;
24
    }
25
    else if (cosi < 0.)
26
    {
27
        f = 0.f;
28
    }
29
    else
30
    {
31
        float cost = std::sqrt(std::max(0.f, 1.f - sint * sint));
32
        cost = clamp(cost, -1.f, 1.f);
33
        f = fresnel_dielectric(cosi, cost, hi.ior);
346 awk 34
 
349 awk 35
        if (f < 0.f || f > 1.f)
36
            assert(false);
37
    }
38
 
39
    hi.reflection = f * color_;
40
    hi.refraction = (1.f - f) * color_;
346 awk 41
}
42
 
43
//02566 framework, Anders Wang Kristensen, awk@imm.dtu.dk, 2007