| author | Radek Brich <radek.brich@devl.cz> | 
| Sat, 29 Mar 2008 18:01:45 +0100 | |
| branch | pyrit | 
| changeset 57 | 1e92c21b9a61 | 
| parent 53 | 228cb8bfdd54 | 
| child 78 | 9569e9f35374 | 
| permissions | -rw-r--r-- | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
1  | 
/*  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
2  | 
* sampler.h: screen sample generation and image reconstruction  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
3  | 
*  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
4  | 
* This file is part of Pyrit Ray Tracer.  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
5  | 
*  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
6  | 
* Copyright 2008 Radek Brich  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
7  | 
*  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
8  | 
* Permission is hereby granted, free of charge, to any person obtaining a copy  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
9  | 
* of this software and associated documentation files (the "Software"), to deal  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
10  | 
* in the Software without restriction, including without limitation the rights  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
11  | 
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
12  | 
* copies of the Software, and to permit persons to whom the Software is  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
13  | 
* furnished to do so, subject to the following conditions:  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
14  | 
*  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
15  | 
* The above copyright notice and this permission notice shall be included in  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
16  | 
* all copies or substantial portions of the Software.  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
17  | 
*  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
18  | 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
19  | 
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
20  | 
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
21  | 
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
22  | 
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
23  | 
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
24  | 
* THE SOFTWARE.  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
25  | 
*/  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
26  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
27  | 
#ifndef SAMPLER_H  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
28  | 
#define SAMPLER_H  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
29  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
30  | 
#include "common.h"  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
31  | 
#include "vector.h"  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
32  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
33  | 
using namespace std;  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
34  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
35  | 
/**  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
36  | 
* sample  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
37  | 
*/  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
38  | 
class Sample  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
39  | 
{
 | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
40  | 
friend class Sampler;  | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
41  | 
public:  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
42  | 
Float x,y;  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
43  | 
int sx,sy,osa_samp;  | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
44  | 
};  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
45  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
46  | 
/**  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
47  | 
* A abstract sampler.  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
48  | 
* It generates screen samples in coordinates between [-1..1] for height  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
49  | 
* and [-w/h..w/h] for width. It works in phases: initSampleSet returns  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
50  | 
* number of samples for each phase, then samples can be generated using  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
51  | 
* nextSample method. The resulting colour of each sample should be returned  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
52  | 
* via saveSample method. The sampler should save the results to given buffer  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
53  | 
* and decide if other phase is needed. When the picture is complete,  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
54  | 
* initSampleSet returns zero and picture can be read from buffer.  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
55  | 
*/  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
56  | 
class Sampler  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
57  | 
{
 | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
58  | 
public:  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
59  | 
Float *buffer;  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
60  | 
int w,h;  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
61  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
62  | 
	Sampler(Float *abuffer, int &aw, int &ah): buffer(abuffer), w(aw), h(ah) {};
 | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
63  | 
	virtual ~Sampler() {};
 | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
64  | 
	void resetBuffer(Float *abuffer, int &aw, int &ah) { buffer = abuffer; w = aw; h = ah; };
 | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
65  | 
virtual void init() = 0;  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
66  | 
virtual int initSampleSet() = 0;  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
67  | 
virtual bool nextSample(Sample *s) = 0;  | 
| 
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
68  | 
virtual void saveSample(Sample &samp, Colour &col) = 0;  | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
69  | 
};  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
70  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
71  | 
/**  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
72  | 
* Default sampler.  | 
| 
48
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
73  | 
* Implements basic adaptive subsampling and oversampling.  | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
74  | 
*/  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
75  | 
class DefaultSampler: public Sampler  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
76  | 
{
 | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
77  | 
int phase;  | 
| 
48
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
78  | 
int subsample;  | 
| 
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
79  | 
int oversample; // 0 = no, 1 = 5x, 2 = 9x, 3 = 16x  | 
| 
50
 
14a727b70d07
rewritten threads with heavy debug information
 
Radek Brich <radek.brich@devl.cz> 
parents: 
49 
diff
changeset
 | 
80  | 
int sx,sy,osa_samp; // current sample properties  | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
81  | 
public:  | 
| 
48
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
82  | 
DefaultSampler(Float *abuffer, int &aw, int &ah):  | 
| 
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
83  | 
		Sampler(abuffer, aw, ah), phase(-1), subsample(8), oversample(0) {};
 | 
| 
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
84  | 
void init();  | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
85  | 
int initSampleSet();  | 
| 
53
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
86  | 
bool nextSample(Sample *s);  | 
| 
 
228cb8bfdd54
slighly optimized raytrace_worker
 
Radek Brich <radek.brich@devl.cz> 
parents: 
50 
diff
changeset
 | 
87  | 
void saveSample(Sample &samp, Colour &col);  | 
| 
48
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
88  | 
|
| 
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
89  | 
	void setSubsample(int sub) { subsample = sub; };
 | 
| 
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
90  | 
	int getSubsample() { return subsample; };
 | 
| 
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
91  | 
	void setOversample(int osa) { oversample = osa; };
 | 
| 
 
a4913301c626
begin moving subsampling and oversampling to Sampler
 
Radek Brich <radek.brich@devl.cz> 
parents: 
47 
diff
changeset
 | 
92  | 
	int getOversample() { return oversample; };
 | 
| 
47
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
93  | 
};  | 
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
94  | 
|
| 
 
320d5d466864
move Sampler classes to sampler.cc
 
Radek Brich <radek.brich@devl.cz> 
parents:  
diff
changeset
 | 
95  | 
#endif  |