Subversion Repositories gelsvn

Rev

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

Rev 349 Rev 350
1
#include <Geometry/BSPTree.h>
1
#include <Geometry/BSPTree.h>
2
 
2
 
3
#include "scene.hpp"
3
#include "scene.hpp"
4
#include "mesh.hpp"
4
#include "mesh.hpp"
5
 
5
 
6
using namespace Geometry;
6
using namespace Geometry;
7
using namespace CGLA;
7
using namespace CGLA;
8
 
8
 
9
scene::scene(void) : cam_(0)
9
scene::scene(void) : cam_(0)
10
{
10
{
11
    accel_ = new BSPTree;
11
    accel_ = new BSPTree;
12
}
12
}
13
 
13
 
14
scene::~scene(void)
14
scene::~scene(void)
15
{
15
{
16
    delete accel_;
16
    delete accel_;
17
}
17
}
18
 
18
 
19
void scene::insert(const luminaire* obj)
19
void scene::insert(const luminaire* obj)
20
{
20
{
21
    objs_.push_back(obj);
21
    objs_.push_back(obj);
22
}
22
}
23
 
23
 
24
size_t scene::luminaires(void) const
24
size_t scene::luminaires(void) const
25
{
25
{
26
    return objs_.size();
26
    return objs_.size();
27
}
27
}
28
 
28
 
29
const luminaire* scene::get_luminaire(size_t i) const
29
const luminaire* scene::get_luminaire(size_t i) const
30
{
30
{
31
    return objs_.at(i);
31
    return objs_.at(i);
32
}
32
}
33
 
33
 
34
bool scene::intersect(const ray& r)
34
bool scene::intersect(const ray& r)
35
{
35
{
36
    Ray s;
36
    Ray s;
37
    s.direction = r.direction;
37
    s.direction = r.direction;
38
    s.origin = r.origin;
38
    s.origin = r.origin;
39
    s.dist = r.distance;
39
    s.dist = r.distance;
40
    s.trace_depth = r.depth;
40
    s.trace_depth = r.depth;
41
 
41
 
42
    return accel_->intersect(s);
42
    return accel_->intersect(s);
43
}
43
}
44
 
44
 
45
bool scene::intersect(const ray& r, hit_info& hi)
45
bool scene::intersect(const ray& r, hit_info& hi)
46
{
46
{
47
    printf("%.2f, %.2f, %.2f\n", r.direction[0],
-
 
48
           r.direction[1], r.direction[2]);
-
 
49
    printf("%.2f, %.2f, %.2f\n", r.origin[0], r.origin[1], r.origin[2]);
-
 
50
 
-
 
51
    printf("%.2f, %i\n", r.distance, r.depth);
-
 
52
 
-
 
53
 
-
 
54
    Ray s;
47
    Ray s;
55
    s.direction = r.direction;
48
    s.direction = r.direction;
56
    s.origin = r.origin;
49
    s.origin = r.origin;
57
    s.trace_depth = r.depth;
50
    s.trace_depth = r.depth;
58
    s.dist = r.distance;
51
    s.dist = r.distance;
59
 
52
 
60
    bool hit = accel_->intersect(s);
53
    bool hit = accel_->intersect(s);
61
 
54
 
62
    if (hit)
55
    if (hit)
63
    {
56
    {
64
        //find the mesh which was hit
57
        //find the mesh which was hit
65
        const mesh& msh = dynamic_cast<const mesh&>(*objs_[s.id]);
58
        const mesh& msh = dynamic_cast<const mesh&>(*objs_[s.id]);
66
 
59
 
67
        //set hit position and normals
60
        //set hit position and normals
68
        hi.distance = s.dist;
61
        hi.distance = s.dist;
69
        hi.position = s.hit_pos;
62
        hi.position = s.hit_pos;
70
        hi.shading_normal = s.hit_normal;
63
        hi.shading_normal = s.hit_normal;
71
 
64
 
72
        const IndexedFaceSet& geometry = msh.get_trimesh().geometry;
65
        const IndexedFaceSet& geometry = msh.get_trimesh().geometry;
73
        const Vec3i& f  = geometry.face(s.hit_face_id);
66
        const Vec3i& f  = geometry.face(s.hit_face_id);
74
        const Vec3f p0 = geometry.vertex(f[0]);
67
        const Vec3f p0 = geometry.vertex(f[0]);
75
        const Vec3f a  = geometry.vertex(f[1]) - p0;
68
        const Vec3f a  = geometry.vertex(f[1]) - p0;
76
        const Vec3f b  = geometry.vertex(f[2]) - p0;
69
        const Vec3f b  = geometry.vertex(f[2]) - p0;
77
        Vec3f face_normal = cross(a,b);
70
        Vec3f face_normal = cross(a,b);
78
        float l = sqr_length(face_normal);
71
        float l = sqr_length(face_normal);
79
        if(l > 0.0f)
72
        if(l > 0.0f)
80
            face_normal /= sqrt(l);
73
            face_normal /= sqrt(l);
81
 
74
 
82
        hi.geometric_normal = msh.transform().mul_3D_vector(face_normal);
75
        hi.geometric_normal = msh.transform().mul_3D_vector(face_normal);
83
        //hi.geometric_normal = msh.triangle_normal(s.hit_face_id);
76
        //hi.geometric_normal = msh.triangle_normal(s.hit_face_id);
84
 
77
 
85
        hi.inside = dot(hi.geometric_normal, -s.direction) < 0.f;
78
        hi.inside = dot(hi.geometric_normal, -s.direction) < 0.f;
86
        if (hi.inside)
79
        if (hi.inside)
87
        {
80
        {
88
            hi.geometric_normal = -hi.geometric_normal;
81
            hi.geometric_normal = -hi.geometric_normal;
89
            hi.shading_normal = -hi.shading_normal;
82
            hi.shading_normal = -hi.shading_normal;
90
        }
83
        }
91
 
84
 
92
        bool has_texcoords = msh.get_trimesh().texcoords.no_faces() > 0;
85
        bool has_texcoords = msh.get_trimesh().texcoords.no_faces() > 0;
93
 
86
 
94
        if (has_texcoords)
87
        if (has_texcoords)
95
        {
88
        {
96
            //compute texture coords..
89
            //compute texture coords..
97
            const IndexedFaceSet& texcoords = msh.get_trimesh().texcoords;
90
            const IndexedFaceSet& texcoords = msh.get_trimesh().texcoords;
98
            const Vec3i& t = texcoords.face(s.hit_face_id);
91
            const Vec3i& t = texcoords.face(s.hit_face_id);
99
            Vec3f uv0 = texcoords.vertex(t[0]);
92
            Vec3f uv0 = texcoords.vertex(t[0]);
100
            Vec3f uv1 = texcoords.vertex(t[1]);
93
            Vec3f uv1 = texcoords.vertex(t[1]);
101
            Vec3f uv2 = texcoords.vertex(t[2]);
94
            Vec3f uv2 = texcoords.vertex(t[2]);
102
            hi.texcoords(0) = (1.f-s.u-s.v)*uv0(0) + s.u*uv1(0) + s.v*uv2(0);
95
            hi.texcoords(0) = (1.f-s.u-s.v)*uv0(0) + s.u*uv1(0) + s.v*uv2(0);
103
            hi.texcoords(1) = (1.f-s.u-s.v)*uv0(1) + s.u*uv1(1) + s.v*uv2(1);
96
            hi.texcoords(1) = (1.f-s.u-s.v)*uv0(1) + s.u*uv1(1) + s.v*uv2(1);
104
 
97
 
105
            //compute tangent vectors..
98
            //compute tangent vectors..
106
 
99
 
107
 
100
 
108
        }
101
        }
109
        else
102
        else
110
        {
103
        {
111
            //hmm.. no uvs. not good!
104
            //hmm.. no uvs. not good!
112
            hi.texcoords = Vec2f(0.f);
105
            hi.texcoords = Vec2f(0.f);
113
            //orthogonal(hi.shading_normal, hi.tangent, hi.bitangent);
106
            //orthogonal(hi.shading_normal, hi.tangent, hi.bitangent);
114
        }
107
        }
115
 
108
 
116
        //sample material to get bsdf
109
        //sample material to get bsdf
117
        const material* mat = msh.get_material();
110
        const material* mat = msh.get_material();
118
        if (mat)
111
        if (mat)
119
            mat->sample(r, hi);
112
            mat->sample(r, hi);
120
 
113
 
121
        //convert from radiant exitance to radiance
114
        //convert from radiant exitance to radiance
122
        if (!hi.inside)
115
        if (!hi.inside)
123
            hi.emitted = msh.exitance() / float(M_PI);
116
            hi.emitted = msh.exitance() / float(M_PI);
124
    }
117
    }
125
 
118
 
126
    return hit;
119
    return hit;
127
}
120
}
128
 
121
 
129
const camera* scene::get_camera(void) const
122
const camera* scene::get_camera(void) const
130
{
123
{
131
    return cam_;
124
    return cam_;
132
}
125
}
133
 
126
 
134
void scene::set_camera(const camera* c)
127
void scene::set_camera(const camera* c)
135
{
128
{
136
    cam_ = c;
129
    cam_ = c;
137
}
130
}
138
 
131
 
139
void scene::initialize(int mo, int md)
132
void scene::initialize(int mo, int md)
140
{
133
{
141
    assert(cam_);
134
    assert(cam_);
142
    assert(!objs_.empty());
135
    assert(!objs_.empty());
143
 
136
 
144
    std::vector<const TriMesh*> msh;
137
    std::vector<const TriMesh*> msh;
145
    std::vector<Mat4x4f> trs;
138
    std::vector<Mat4x4f> trs;
146
 
139
 
147
    std::vector<const luminaire*>::iterator it;
140
    std::vector<const luminaire*>::iterator it;
148
    for (it=objs_.begin(); it!=objs_.end(); ++it)
141
    for (it=objs_.begin(); it!=objs_.end(); ++it)
149
    {
142
    {
150
        const luminaire* obj = *it;
143
        const luminaire* obj = *it;
151
 
144
 
152
        const mesh* mxx = dynamic_cast<const mesh*>(obj);
145
        const mesh* mxx = dynamic_cast<const mesh*>(obj);
153
        if (!mxx)
146
        if (!mxx)
154
            continue;
147
            continue;
155
 
148
 
156
        msh.push_back(&mxx->get_trimesh());
149
        msh.push_back(&mxx->get_trimesh());
157
        trs.push_back(mxx->transform());
150
        trs.push_back(mxx->transform());
158
    }
151
    }
159
 
152
 
160
    accel_->init(msh, trs, mo, md);
153
    accel_->init(msh, trs, mo, md);
161
    accel_->build();
154
    accel_->build();
162
}
155
}
163
 
156
 
164
//02566 framework, Anders Wang Kristensen, awk@imm.dtu.dk, 2007
157
//02566 framework, Anders Wang Kristensen, awk@imm.dtu.dk, 2007
165
 
158
 
166
 
159
 
167

Generated by GNU Enscript 1.6.6.
160

Generated by GNU Enscript 1.6.6.
168
 
161
 
169
 
162
 
170
 
163