| author | Radek Brich <radek.brich@devl.cz> | 
| Tue, 26 Jul 2016 18:19:37 +0200 | |
| branch | pyrit | 
| changeset 104 | 2274a07510c1 | 
| parent 100 | c005054bf4c1 | 
| permissions | -rw-r--r-- | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
1  | 
/*  | 
| 44 | 2  | 
* raytracer.cc: Raytracer class  | 
3  | 
*  | 
|
4  | 
* This file is part of Pyrit Ray Tracer.  | 
|
5  | 
*  | 
|
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents: 
46 
diff
changeset
 | 
6  | 
* Copyright 2006, 2007, 2008 Radek Brich  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
7  | 
*  | 
| 44 | 8  | 
* Permission is hereby granted, free of charge, to any person obtaining a copy  | 
9  | 
* of this software and associated documentation files (the "Software"), to deal  | 
|
10  | 
* in the Software without restriction, including without limitation the rights  | 
|
11  | 
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  | 
|
12  | 
* copies of the Software, and to permit persons to whom the Software is  | 
|
13  | 
* furnished to do so, subject to the following conditions:  | 
|
14  | 
*  | 
|
15  | 
* The above copyright notice and this permission notice shall be included in  | 
|
16  | 
* all copies or substantial portions of the Software.  | 
|
17  | 
*  | 
|
18  | 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  | 
|
19  | 
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  | 
|
20  | 
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  | 
|
21  | 
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  | 
|
22  | 
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  | 
|
23  | 
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  | 
|
24  | 
* THE SOFTWARE.  | 
|
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
25  | 
*/  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
26  | 
|
| 
4
 
c73bc405ee7a
multi-threaded rendering via pthreads
 
Radek Brich <radek.brich@devl.cz> 
parents: 
0 
diff
changeset
 | 
27  | 
#include <pthread.h>  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
28  | 
#include <stdio.h>  | 
| 
67
 
249553e1d4fe
new option to choose single or double precision floats
 
Radek Brich <radek.brich@devl.cz> 
parents: 
56 
diff
changeset
 | 
29  | 
#include <stdlib.h>  | 
| 
100
 
c005054bf4c1
new build target 'vcproj' - generate Visual C++ Studio project files; fix GCC warnings in intersect_packet()
 
Radek Brich <radek.brich@devl.cz> 
parents: 
95 
diff
changeset
 | 
30  | 
#include <string.h>  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
31  | 
#include <assert.h>  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
32  | 
#include "raytracer.h"  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
33  | 
|
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
34  | 
// Hammersley spherical point distribution  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
35  | 
// http://www.cse.cuhk.edu.hk/~ttwong/papers/udpoint/udpoints.html  | 
| 91 | 36  | 
Vector Raytracer::SphereDistribute(int i, int n, Float extent, const Vector &normal)  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
37  | 
{
 | 
| 22 | 38  | 
Float p, t, st, phi, phirad;  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
39  | 
int kk;  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
40  | 
|
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
41  | 
t = 0;  | 
| 93 | 42  | 
for (p=0.5f, kk=i; kk; p*=0.5f, kk>>=1)  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
43  | 
if (kk & 1)  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
44  | 
t += p;  | 
| 93 | 45  | 
t = 1.0f + (t - 1.0f)*extent;  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
46  | 
|
| 93 | 47  | 
phi = (i + 0.5f) / n;  | 
48  | 
phirad = phi * 2.0f * PI;  | 
|
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
49  | 
|
| 93 | 50  | 
st = sqrt(1.0f - t*t);  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
51  | 
|
| 22 | 52  | 
Float x, y, z, xx, yy, zz, q;  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
53  | 
x = st * cos(phirad);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
54  | 
y = st * sin(phirad);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
55  | 
z = t;  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
56  | 
|
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
57  | 
// rotate against Y axis  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
58  | 
q = acos(normal.z);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
59  | 
zz = z*cos(q) - x*sin(q);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
60  | 
xx = z*sin(q) + x*cos(q);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
61  | 
yy = y;  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
62  | 
|
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
63  | 
// rotate against Z axis  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
64  | 
q = atan2f(normal.y, normal.x);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
65  | 
x = xx*cos(q) - yy*sin(q);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
66  | 
y = xx*sin(q) + yy*cos(q);  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
67  | 
z = zz;  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
68  | 
|
| 91 | 69  | 
return Vector(x, y, z);  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
70  | 
}  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
71  | 
|
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
72  | 
/*  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
73  | 
P is point of intersection,  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
74  | 
N normal in this point,  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
75  | 
R direction of reflected ray,  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
76  | 
V direction to the viewer  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
77  | 
*/  | 
| 91 | 78  | 
Colour Raytracer::PhongShader(const Shape *shape,  | 
79  | 
const Vector &P, const Vector &N, const Vector &V)  | 
|
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
80  | 
{
 | 
| 91 | 81  | 
Colour col, acc;  | 
82  | 
Material * const &mat = shape->material;  | 
|
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
83  | 
|
| 91 | 84  | 
if (mat->texture)  | 
85  | 
col = mat->texture->evaluate(P);  | 
|
86  | 
else  | 
|
87  | 
col = mat->colour;  | 
|
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
88  | 
|
| 91 | 89  | 
// ambient  | 
90  | 
acc = mat->ambient * col;  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
91  | 
|
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
92  | 
vector<Light*>::iterator light;  | 
| 91 | 93  | 
for (light = lights.begin(); light != lights.end(); light++)  | 
94  | 
	{
 | 
|
95  | 
const Vector L = normalize((*light)->pos - P); // direction vector to light  | 
|
96  | 
const Float L_dot_N = dot(L, N);  | 
|
97  | 
if (L_dot_N > 0)  | 
|
98  | 
		{
 | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
99  | 
// test if this light is occluded (sharp shadows)  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
100  | 
			if ((*light)->cast_shadows) {
 | 
| 91 | 101  | 
const Ray shadow_ray = Ray(P, L);  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
102  | 
Float dist = FLT_MAX;  | 
| 91 | 103  | 
if (top->nearest_intersection(shape, shadow_ray, dist))  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
104  | 
continue;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
105  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
106  | 
|
| 93 | 107  | 
const Vector R = L - 2.0f * L_dot_N * N;  | 
| 91 | 108  | 
const Float R_dot_V = dot(R, V);  | 
109  | 
||
110  | 
// diffuse  | 
|
111  | 
acc += mat->diffuse * col * (*light)->colour * L_dot_N;  | 
|
112  | 
||
113  | 
// specular  | 
|
114  | 
if (R_dot_V > 0)  | 
|
115  | 
acc += mat->specular * (*light)->colour * powf(R_dot_V, mat->shininess);  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
116  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
117  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
118  | 
|
| 91 | 119  | 
return acc;  | 
120  | 
}  | 
|
121  | 
||
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
122  | 
#ifndef NO_SIMD  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
123  | 
VectorPacket Raytracer::PhongShader_packet(const Shape* const* shapes,  | 
| 91 | 124  | 
const VectorPacket &P, const VectorPacket &N, const VectorPacket &V)  | 
125  | 
{
 | 
|
126  | 
VectorPacket acc, colour;  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
127  | 
	union { mfloat4 ambient; float ambient_f[4]; };
 | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
128  | 
	union { mfloat4 diffuse; float diffuse_f[4]; };
 | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
129  | 
	union { mfloat4 specular; float specular_f[4]; };
 | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
130  | 
	union { mfloat4 shininess; float shininess_f[4]; };
 | 
| 91 | 131  | 
|
132  | 
for (int i = 0; i < 4; i++)  | 
|
133  | 
if (shapes[i] == NULL)  | 
|
134  | 
		{
 | 
|
135  | 
ambient_f[i] = 0;  | 
|
136  | 
diffuse_f[i] = 0;  | 
|
137  | 
specular_f[i] = 0;  | 
|
138  | 
shininess_f[i] = 0;  | 
|
139  | 
}  | 
|
140  | 
else  | 
|
141  | 
		{
 | 
|
142  | 
Material * const &mat = shapes[i]->material;  | 
|
143  | 
if (mat->texture)  | 
|
144  | 
colour.setVector(i, mat->texture->evaluate(P.getVector(i)));  | 
|
145  | 
else  | 
|
146  | 
colour.setVector(i, mat->colour);  | 
|
147  | 
ambient_f[i] = mat->ambient;  | 
|
148  | 
diffuse_f[i] = mat->diffuse;  | 
|
149  | 
specular_f[i] = mat->specular;  | 
|
150  | 
shininess_f[i] = mat->shininess;  | 
|
151  | 
}  | 
|
152  | 
||
153  | 
// ambient  | 
|
154  | 
acc = colour * ambient;  | 
|
155  | 
||
| 
95
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
156  | 
const Shape *shadow_shapes[4];  | 
| 91 | 157  | 
vector<Light*>::iterator light;  | 
158  | 
for (light = lights.begin(); light != lights.end(); light++)  | 
|
159  | 
	{
 | 
|
160  | 
// direction vector to light  | 
|
161  | 
VectorPacket L = VectorPacket((*light)->pos) - P;  | 
|
162  | 
L.normalize();  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
163  | 
const mfloat4 L_dot_N = dot(L, N);  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
164  | 
mfloat4 valid = mcmpgt(L_dot_N, mZero);  | 
| 91 | 165  | 
|
166  | 
// test if this light is occluded (sharp shadows)  | 
|
167  | 
if ((*light)->cast_shadows)  | 
|
168  | 
		{
 | 
|
169  | 
const RayPacket shadow_rays = RayPacket(P, L);  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
170  | 
			union { mfloat4 dists; float dists_f[4]; };
 | 
| 91 | 171  | 
dists = mInf;  | 
172  | 
top->packet_intersection(shapes, shadow_rays,  | 
|
173  | 
dists_f, shadow_shapes);  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
174  | 
valid = mand(valid, mcmpeq(dists, mInf));  | 
| 91 | 175  | 
}  | 
176  | 
||
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
177  | 
const VectorPacket R = L - N * mmul(mTwo, L_dot_N);  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
178  | 
const mfloat4 R_dot_V = dot(R, V);  | 
| 91 | 179  | 
|
180  | 
// diffuse  | 
|
181  | 
acc.selectiveAdd(valid,  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
182  | 
colour * VectorPacket((*light)->colour) * mmul(diffuse, L_dot_N));  | 
| 91 | 183  | 
|
184  | 
// specular  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
185  | 
valid = mand(valid, mcmpgt(R_dot_V, mZero));  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
186  | 
mfloat4 spec = mmul(mmul(specular, mset1((*light)->colour.r)),  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
187  | 
mfastpow(R_dot_V, shininess));  | 
| 91 | 188  | 
acc.selectiveAdd(valid, spec);  | 
189  | 
}  | 
|
190  | 
return acc;  | 
|
191  | 
}  | 
|
192  | 
#endif  | 
|
193  | 
||
194  | 
void Raytracer::lightScatter(const Ray &ray, const Shape *shape, int depth,  | 
|
195  | 
const Vector &P, const Vector &normal, bool from_inside, Colour &col)  | 
|
196  | 
{
 | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
197  | 
if (depth < max_depth)  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
198  | 
	{
 | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
199  | 
Colour trans_col, refl_col;  | 
| 91 | 200  | 
Float trans = shape->material->transmissivity;  | 
201  | 
Float refl = shape->material->reflectivity;  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
202  | 
const Float cos_i = - dot(normal, ray.dir);  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
203  | 
|
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
204  | 
// refraction  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
205  | 
if (trans > 0.01)  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
206  | 
		{
 | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
207  | 
Float n, n1, n2;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
208  | 
if (from_inside)  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
209  | 
			{
 | 
| 91 | 210  | 
n1 = shape->material->refract_index;  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
211  | 
n2 = 1.0;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
212  | 
n = n1;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
213  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
214  | 
else  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
215  | 
			{
 | 
| 93 | 216  | 
n1 = 1.0f;  | 
| 91 | 217  | 
n2 = shape->material->refract_index;  | 
| 93 | 218  | 
n = 1.0f / n2;  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
219  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
220  | 
const Float sin2_t = n*n * (1 - cos_i*cos_i);  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
221  | 
if (sin2_t >= 1.0)  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
222  | 
			{
 | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
223  | 
// totally reflected  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
224  | 
refl += trans;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
225  | 
trans = 0;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
226  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
227  | 
else  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
228  | 
			{
 | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
229  | 
const Float cos_t = sqrtf(1 - sin2_t);  | 
| 93 | 230  | 
const Float Rdiv = 1.0f / (n1*cos_i + n2*cos_t);  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
231  | 
const Float Rper = (n1*cos_i - n2*cos_t)*Rdiv;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
232  | 
const Float Rpar = (n2*cos_i - n1*cos_t)*Rdiv;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
233  | 
const Float R = (Rper*Rper + Rpar*Rpar)/2;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
234  | 
refl += R*trans;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
235  | 
trans = (1-R)*trans;  | 
| 91 | 236  | 
Vector newdir = n * ray.dir + (n*cos_i - cos_t) * normal;  | 
| 93 | 237  | 
Ray newray = Ray(P + 0.001f*newdir, newdir);  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
238  | 
trans_col = raytrace(newray, depth + 1, NULL);  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
239  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
240  | 
}  | 
| 
95
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
241  | 
|
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
242  | 
// reflection  | 
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
243  | 
if (refl > 0.01)  | 
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
244  | 
		{
 | 
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
245  | 
Vector newdir = ray.dir + 2.0f * cos_i * normal;  | 
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
246  | 
Ray newray = Ray(P, newdir);  | 
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
247  | 
refl_col = raytrace(newray, depth + 1, shape);  | 
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
248  | 
}  | 
| 
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
249  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
250  | 
col = (1-refl-trans)*col + refl*refl_col + trans*trans_col;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
251  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
252  | 
|
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
253  | 
// ambient occlusion  | 
| 91 | 254  | 
if (ao_samples && !from_inside)  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
255  | 
	{
 | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
256  | 
Float miss = 0;  | 
| 91 | 257  | 
for (int i = 0; i < ao_samples; i++)  | 
258  | 
		{
 | 
|
259  | 
Vector dir = SphereDistribute(i, ao_samples, ao_angle, normal);  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
260  | 
Ray ao_ray = Ray(P, dir);  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
261  | 
Float dist = ao_distance;  | 
| 
95
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
262  | 
const Shape *shape_in_way = top->nearest_intersection(shape, ao_ray, dist);  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
263  | 
if (shape_in_way == NULL)  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
264  | 
miss += 1.0;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
265  | 
else  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
266  | 
miss += dist / ao_distance;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
267  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
268  | 
Float ao_intensity = miss / ao_samples;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
269  | 
col = col * ao_intensity;  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
270  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
271  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
272  | 
|
| 91 | 273  | 
Colour Raytracer::raytrace(Ray &ray, int depth, const Shape *origin_shape)  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
274  | 
{
 | 
| 22 | 275  | 
Float nearest_distance = Inf;  | 
| 
95
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
276  | 
const Shape *nearest_shape = top->nearest_intersection(origin_shape, ray, nearest_distance);  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
277  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
278  | 
if (nearest_shape == NULL)  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
279  | 
return bg_colour;  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
280  | 
else  | 
| 91 | 281  | 
	{
 | 
282  | 
const Vector P = ray.o + ray.dir * nearest_distance; // point of intersection  | 
|
283  | 
Vector normal = nearest_shape->normal(P);  | 
|
284  | 
bool from_inside = false;  | 
|
285  | 
||
286  | 
// make shapes double sided  | 
|
287  | 
if (dot(normal, ray.dir) > 0.0)  | 
|
288  | 
		{
 | 
|
289  | 
normal = - normal;  | 
|
290  | 
from_inside = true;  | 
|
291  | 
}  | 
|
292  | 
||
293  | 
// shading function  | 
|
294  | 
Colour col = PhongShader(nearest_shape, P, normal, ray.dir);  | 
|
295  | 
lightScatter(ray, nearest_shape, depth, P, normal, from_inside, col);  | 
|
296  | 
return col;  | 
|
297  | 
}  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
298  | 
}  | 
| 31 | 299  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
300  | 
#ifndef NO_SIMD  | 
| 
84
 
6f7fe14782c2
prepare kd-tree traversal for packet tracing (4 rays at once)
 
Radek Brich <radek.brich@devl.cz> 
parents: 
83 
diff
changeset
 | 
301  | 
void Raytracer::raytracePacket(RayPacket &rays, Colour *results)  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
302  | 
{
 | 
| 91 | 303  | 
	union {
 | 
304  | 
float nearest_distances[4];  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
305  | 
mfloat4 m_nearest_distances;  | 
| 91 | 306  | 
};  | 
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
307  | 
mfloat4 mask;  | 
| 
95
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
308  | 
const Shape *nearest_shapes[4];  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
309  | 
	static const Shape *origin_shapes[4] = {NULL, NULL, NULL, NULL};
 | 
| 91 | 310  | 
m_nearest_distances = mInf;  | 
311  | 
||
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
312  | 
top->packet_intersection(origin_shapes, rays, nearest_distances, nearest_shapes);  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
313  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
314  | 
mask = mcmpneq(m_nearest_distances, mInf);  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
315  | 
if (!mmovemask(mask))  | 
| 91 | 316  | 
	{
 | 
317  | 
for (int i = 0; i < 4; i++)  | 
|
318  | 
results[i] = bg_colour;  | 
|
319  | 
return;  | 
|
320  | 
}  | 
|
321  | 
||
322  | 
const VectorPacket P = rays.o + rays.dir * m_nearest_distances; // point of intersection  | 
|
323  | 
VectorPacket normal;  | 
|
324  | 
for (int i = 0; i < 4; i++)  | 
|
325  | 
if (nearest_shapes[i] != NULL)  | 
|
| 93 | 326  | 
		{
 | 
327  | 
const Vector Pvecti = P.getVector(i);  | 
|
328  | 
normal.setVector(i, nearest_shapes[i]->normal(Pvecti));  | 
|
329  | 
}  | 
|
| 91 | 330  | 
|
331  | 
// make shapes double sided  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
332  | 
mfloat4 from_inside = mcmpgt(dot(normal, rays.dir), mZero);  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
333  | 
normal.mx = mselect(from_inside, msub(mZero, normal.mx), normal.mx);  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
334  | 
normal.my = mselect(from_inside, msub(mZero, normal.my), normal.my);  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
335  | 
normal.mz = mselect(from_inside, msub(mZero, normal.mz), normal.mz);  | 
| 91 | 336  | 
|
337  | 
// shading function  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
338  | 
VectorPacket pres = PhongShader_packet(nearest_shapes, P, normal, rays.dir);  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
339  | 
//pres.mx = mselect(mask, pres.mx, mset1(bg_colour.r));  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
340  | 
//pres.my = mselect(mask, pres.my, mset1(bg_colour.g));  | 
| 
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
341  | 
//pres.mz = mselect(mask, pres.mz, mset1(bg_colour.b));  | 
| 91 | 342  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
343  | 
for (int i = 0; i < 4; i++)  | 
| 91 | 344  | 
if (nearest_shapes[i] != NULL)  | 
345  | 
		{
 | 
|
346  | 
results[i] = pres.getVector(i);  | 
|
347  | 
lightScatter(rays[i], nearest_shapes[i], 0,  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
348  | 
P.getVector(i), normal.getVector(i), (mmovemask(from_inside)>>i)&1,  | 
| 91 | 349  | 
results[i]);  | 
350  | 
}  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
351  | 
else  | 
| 91 | 352  | 
results[i] = bg_colour;  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
353  | 
}  | 
| 91 | 354  | 
#endif  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
355  | 
|
| 
95
 
ca7d4c665531
build script fixes, add ldflags build option
 
Radek Brich <radek.brich@devl.cz> 
parents: 
93 
diff
changeset
 | 
356  | 
NORETURN void *Raytracer::raytrace_worker(void *d)  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
357  | 
{
 | 
| 55 | 358  | 
static const int my_queue_size = 256;  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
359  | 
Raytracer *rt = (Raytracer*)d;  | 
| 
54
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
360  | 
Sample my_queue[my_queue_size];  | 
| 
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
361  | 
Colour my_colours[my_queue_size];  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
362  | 
int my_count;  | 
| 
84
 
6f7fe14782c2
prepare kd-tree traversal for packet tracing (4 rays at once)
 
Radek Brich <radek.brich@devl.cz> 
parents: 
83 
diff
changeset
 | 
363  | 
Ray ray;  | 
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
364  | 
#ifndef NO_SIMD  | 
| 
84
 
6f7fe14782c2
prepare kd-tree traversal for packet tracing (4 rays at once)
 
Radek Brich <radek.brich@devl.cz> 
parents: 
83 
diff
changeset
 | 
365  | 
RayPacket rays;  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
366  | 
const bool can_use_packets = (rt->use_packets && rt->sampler->packetableSamples());  | 
| 91 | 367  | 
#endif  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
368  | 
for (;;)  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
369  | 
	{
 | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
370  | 
pthread_mutex_lock(&rt->sample_queue_mutex);  | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
371  | 
while (rt->sample_queue_count == 0)  | 
| 
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
372  | 
		{
 | 
| 
54
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
373  | 
if (rt->end_of_samples)  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
374  | 
			{
 | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
375  | 
dbgmsg(4, "T thread [%d] exiting\n", pthread_self());  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
376  | 
pthread_mutex_unlock(&rt->sample_queue_mutex);  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
377  | 
pthread_exit(NULL);  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
378  | 
}  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
379  | 
pthread_cond_wait(&rt->sample_queue_cond, &rt->sample_queue_mutex);  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
380  | 
}  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
381  | 
|
| 
54
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
382  | 
if (rt->sample_queue_count >= my_queue_size)  | 
| 
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
383  | 
my_count = my_queue_size;  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
384  | 
else  | 
| 
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
385  | 
my_count = rt->sample_queue_count;  | 
| 
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
386  | 
rt->sample_queue_count -= my_count;  | 
| 
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
387  | 
|
| 
54
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
388  | 
// copy samples to local queue  | 
| 55 | 389  | 
if (rt->sample_queue_pos + my_count >= rt->sample_queue_size)  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
390  | 
		{
 | 
| 55 | 391  | 
register int c = rt->sample_queue_size - rt->sample_queue_pos;  | 
392  | 
memcpy(my_queue, rt->sample_queue + rt->sample_queue_pos, c*sizeof(Sample));  | 
|
393  | 
memcpy(my_queue + c, rt->sample_queue, (my_count - c)*sizeof(Sample));  | 
|
394  | 
rt->sample_queue_pos = my_count - c;  | 
|
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
395  | 
}  | 
| 55 | 396  | 
else  | 
397  | 
		{
 | 
|
398  | 
memcpy(my_queue, rt->sample_queue + rt->sample_queue_pos,  | 
|
399  | 
my_count*sizeof(Sample));  | 
|
400  | 
rt->sample_queue_pos += my_count;  | 
|
401  | 
}  | 
|
402  | 
if (rt->sample_queue_count <= my_queue_size*2)  | 
|
403  | 
pthread_cond_signal(&rt->worker_ready_cond);  | 
|
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
404  | 
pthread_mutex_unlock(&rt->sample_queue_mutex);  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
405  | 
|
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
406  | 
// do the work  | 
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
407  | 
#ifndef NO_SIMD  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
408  | 
if (can_use_packets)  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
409  | 
		{
 | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
410  | 
// packet ray tracing  | 
| 93 | 411  | 
assert((my_count & 3) == 0);  | 
412  | 
for (int i = 0; i < (my_count >> 2); i++)  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
413  | 
			{
 | 
| 93 | 414  | 
rt->camera->makeRayPacket(my_queue + (i<<2), rays);  | 
415  | 
rt->raytracePacket(rays, my_colours + (i<<2));  | 
|
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
416  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
417  | 
}  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
418  | 
else  | 
| 91 | 419  | 
#endif  | 
| 
82
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
420  | 
		{
 | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
421  | 
// single ray tracing  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
422  | 
for (int i = 0; i < my_count; i++)  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
423  | 
			{
 | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
424  | 
ray = rt->camera->makeRay(my_queue[i]);  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
425  | 
my_colours[i] = rt->raytrace(ray, 0, NULL);  | 
| 
 
930a2d3ecaed
prepare structures for packet tracing
 
Radek Brich <radek.brich@devl.cz> 
parents: 
77 
diff
changeset
 | 
426  | 
}  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
427  | 
}  | 
| 
51
 
89fec8668768
remove debug messages - algorithm seems stable, but it's slow
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
428  | 
|
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
429  | 
// save the results  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
430  | 
pthread_mutex_lock(&rt->sampler_mutex);  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
431  | 
for (int i = 0; i < my_count; i++)  | 
| 
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
432  | 
rt->sampler->saveSample(my_queue[i], my_colours[i]);  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
433  | 
pthread_mutex_unlock(&rt->sampler_mutex);  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
434  | 
}  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
435  | 
}  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
436  | 
|
| 46 | 437  | 
void Raytracer::render()  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
438  | 
{
 | 
| 46 | 439  | 
if (!sampler || !camera || !top)  | 
| 
20
 
f22952603f29
new C++ demo: realtime.cc (real-time scene viewer using SDL)
 
Radek Brich <radek.brich@devl.cz> 
parents: 
19 
diff
changeset
 | 
440  | 
return;  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
441  | 
|
| 55 | 442  | 
static const int my_count_max = 256;  | 
443  | 
sample_queue_size = my_count_max*2*num_threads;  | 
|
444  | 
sample_queue = new Sample [sample_queue_size];  | 
|
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
445  | 
sample_queue_count = 0;  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
446  | 
int my_count, my_pos;  | 
| 
54
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
447  | 
int sampnum = 0, sampdone;  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
448  | 
int phase = 1;  | 
| 
54
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
449  | 
bool more_samples;  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
450  | 
|
| 55 | 451  | 
sampler->init();  | 
452  | 
||
| 46 | 453  | 
// create workers  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
454  | 
dbgmsg(1, "* using %d threads\n", num_threads);  | 
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
455  | 
pthread_t *threads = new pthread_t[num_threads];  | 
| 46 | 456  | 
|
| 
51
 
89fec8668768
remove debug messages - algorithm seems stable, but it's slow
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
457  | 
dbgmsg(1, "* raytracing...\n");  | 
| 
 
89fec8668768
remove debug messages - algorithm seems stable, but it's slow
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
458  | 
|
| 46 | 459  | 
while ( (sampnum = sampler->initSampleSet()) > 0 )  | 
460  | 
	{
 | 
|
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
461  | 
my_pos = 0;  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
462  | 
sample_queue_pos = 0;  | 
| 
51
 
89fec8668768
remove debug messages - algorithm seems stable, but it's slow
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
463  | 
sampdone = 0;  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
464  | 
end_of_samples = false;  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
465  | 
|
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
466  | 
for (int t = 0; t < num_threads; t++)  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
467  | 
		{
 | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
468  | 
int rc = pthread_create(&threads[t], NULL, raytrace_worker, (void*)this);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
469  | 
			if (rc) {
 | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
470  | 
dbgmsg(0, "\nE pthread_create unsuccessful, return code was %d\n", rc);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
471  | 
exit(1);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
472  | 
}  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
473  | 
}  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
474  | 
|
| 
90
 
f6a72eb99631
rename Python module from 'raytracer' to 'pyrit'
 
Radek Brich <radek.brich@devl.cz> 
parents: 
86 
diff
changeset
 | 
475  | 
dbgmsg(2, "- phase %d: 0%% done", phase);  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
476  | 
|
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
477  | 
pthread_mutex_lock(&sampler_mutex);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
478  | 
|
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
479  | 
for (;;)  | 
| 46 | 480  | 
		{
 | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
481  | 
my_count = 0;  | 
| 
100
 
c005054bf4c1
new build target 'vcproj' - generate Visual C++ Studio project files; fix GCC warnings in intersect_packet()
 
Radek Brich <radek.brich@devl.cz> 
parents: 
95 
diff
changeset
 | 
482  | 
while ( (more_samples = sampler->nextSample(&sample_queue[my_pos++])) != 0 )  | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
483  | 
			{
 | 
| 
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
484  | 
my_count++;  | 
| 55 | 485  | 
if (my_pos >= sample_queue_size)  | 
486  | 
my_pos = 0;  | 
|
| 
54
 
dbe3c7a4e0f0
more raytrace_worker optimization and cleaning
 
Radek Brich <radek.brich@devl.cz> 
parents: 
53 
diff
changeset
 | 
487  | 
if (my_count >= my_count_max)  | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
488  | 
break;  | 
| 
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
489  | 
}  | 
| 55 | 490  | 
if (!more_samples && !my_count)  | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
491  | 
break;  | 
| 
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
492  | 
|
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
493  | 
pthread_mutex_unlock(&sampler_mutex);  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
494  | 
pthread_mutex_lock(&sample_queue_mutex);  | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
495  | 
sample_queue_count += my_count;  | 
| 46 | 496  | 
|
| 
51
 
89fec8668768
remove debug messages - algorithm seems stable, but it's slow
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
497  | 
// wait for workers if there is enough samples ready on queue  | 
| 55 | 498  | 
while (sample_queue_count > (2*num_threads-1)*my_count_max)  | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
499  | 
pthread_cond_wait(&worker_ready_cond, &sample_queue_mutex);  | 
| 55 | 500  | 
|
501  | 
pthread_cond_signal(&sample_queue_cond);  | 
|
502  | 
pthread_mutex_unlock(&sample_queue_mutex);  | 
|
| 46 | 503  | 
|
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
504  | 
sampdone += my_count;  | 
| 
83
 
e3a2a5b26abb
vectorize makeRayPacket() using SSE intrinsics
 
Radek Brich <radek.brich@devl.cz> 
parents: 
82 
diff
changeset
 | 
505  | 
dbgmsg(2, "\b\b\b\b\b\b\b\b%2d%% done", ((long)sampdone - sample_queue_count)*100/sampnum);  | 
| 
51
 
89fec8668768
remove debug messages - algorithm seems stable, but it's slow
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
506  | 
|
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
507  | 
pthread_mutex_lock(&sampler_mutex);  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
508  | 
|
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
509  | 
if (!more_samples)  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
510  | 
break;  | 
| 46 | 511  | 
}  | 
| 
51
 
89fec8668768
remove debug messages - algorithm seems stable, but it's slow
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
512  | 
dbgmsg(2, "\b\b\b\b\b\b\b\b100%% done\n");  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
513  | 
|
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
514  | 
pthread_mutex_unlock(&sampler_mutex);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
515  | 
|
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
516  | 
// wait for workers  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
517  | 
dbgmsg(2, "- waiting for threads to finish\n");  | 
| 46 | 518  | 
|
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
519  | 
pthread_mutex_lock(&sample_queue_mutex);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
520  | 
end_of_samples = true;  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
521  | 
while (sample_queue_count)  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
522  | 
		{
 | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
523  | 
pthread_cond_broadcast(&sample_queue_cond);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
524  | 
pthread_mutex_unlock(&sample_queue_mutex);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
525  | 
pthread_mutex_lock(&sample_queue_mutex);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
526  | 
}  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
527  | 
pthread_cond_broadcast(&sample_queue_cond);  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
528  | 
pthread_mutex_unlock(&sample_queue_mutex);  | 
| 
77
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
529  | 
|
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
530  | 
for (int t = 0; t < num_threads; t++)  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
531  | 
pthread_join(threads[t], NULL);  | 
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
532  | 
|
| 
 
dbe8438d5dca
rewrite subsampling from old code to DefaultSampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
75 
diff
changeset
 | 
533  | 
phase ++;  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
534  | 
}  | 
| 
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
535  | 
|
| 
92
 
9af5c039b678
add MSVC compiler support, make it default for Windows
 
Radek Brich <radek.brich@devl.cz> 
parents: 
91 
diff
changeset
 | 
536  | 
delete[] threads;  | 
| 
52
 
a6413a3d741d
new implementation of sample_queue
 
Radek Brich <radek.brich@devl.cz> 
parents: 
51 
diff
changeset
 | 
537  | 
delete[] sample_queue;  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
538  | 
}  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
539  | 
|
| 
75
 
20dee9819b17
unify capitalization of method names in C++ and Python
 
Radek Brich <radek.brich@devl.cz> 
parents: 
72 
diff
changeset
 | 
540  | 
void Raytracer::ambientOcclusion(int samples, Float distance, Float angle)  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
541  | 
{
 | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
542  | 
ao_samples = samples;  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
543  | 
ao_distance = distance;  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
544  | 
ao_angle = angle;  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
545  | 
if (ao_distance == 0)  | 
| 
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
546  | 
/* 0 ==> Inf */  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
52 
diff
changeset
 | 
547  | 
ao_distance = Inf;  | 
| 
0
 
3547b885df7e
initial commit, raytracer source as written year ago and unchanged since 2007-03-25
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
548  | 
}  |