Subversion Repositories gelsvn

Rev

Rev 346 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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

Generated by GNU Enscript 1.6.6.
46

Generated by GNU Enscript 1.6.6.
47
 
47
 
48
 
48
 
49
 
49