src/raytracer.cc
author Radek Brich <radek.brich@devl.cz>
Fri, 28 Mar 2008 00:53:20 +0100
branchpyrit
changeset 49 558fde7da82a
parent 48 a4913301c626
child 50 14a727b70d07
permissions -rw-r--r--
workaround for divide by zero bug in octree enable oversampling for DefaultSampler sampler and camera performance enhancements
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
     2
 * raytracer.cc: Raytracer class
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
     3
 *
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
     4
 * This file is part of Pyrit Ray Tracer.
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
     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
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
     8
 * Permission is hereby granted, free of charge, to any person obtaining a copy
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
     9
 * of this software and associated documentation files (the "Software"), to deal
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    10
 * in the Software without restriction, including without limitation the rights
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    11
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    12
 * copies of the Software, and to permit persons to whom the Software is
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    13
 * furnished to do so, subject to the following conditions:
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    14
 *
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    15
 * The above copyright notice and this permission notice shall be included in
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    16
 * all copies or substantial portions of the Software.
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    17
 *
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    18
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    19
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    20
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    21
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    22
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    23
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
3763b26244f0 MIT license for sources
Radek Brich <radek.brich@devl.cz>
parents: 42
diff changeset
    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
#ifdef PTHREADS
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    28
#include <pthread.h>
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    29
#endif
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
    30
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
    31
#include <stdio.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
    32
#include <malloc.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
#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
    34
30
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
    35
int pyrit_verbosity = 2;
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
    36
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
// 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
    38
// http://www.cse.cuhk.edu.hk/~ttwong/papers/udpoint/udpoints.html
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
    39
Vector3 Raytracer::SphereDistribute(int i, int n, Float extent, Vector3 &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
    40
{
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
    41
	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
    42
	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
    43
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 = 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
    45
	for (p=0.5, kk=i; kk; p*=0.5, 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
    46
	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
    47
		t += p;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    48
	t = 1.0 + (t - 1.0)*extent;
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
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    50
	phi = (i + 0.5) / n;
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
	phirad =  phi * 2.0 * M_PI;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    52
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
	st = sqrt(1.0 - t*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
    54
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
    55
	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
    56
	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
    57
	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
    58
	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
    59
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
	// 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
    61
	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
    62
	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
    63
	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
    64
	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
    65
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
	// 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
    67
	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
    68
	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
    69
	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
    70
	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
    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
	return Vector3(x, y, 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
    73
}
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
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
// ---- tyto dve funkce budou v budouci verzi metody objektu PhongShader
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
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
// calculate shader function
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    78
// P is point of intersection, 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
    79
Colour PhongShader_ambient(Material &mat, Vector3 &P)
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
{
42
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    81
	Colour col;
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    82
	if (mat.texture)
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    83
		col = mat.texture->evaluate(P);
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    84
	else
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    85
		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
    86
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    87
	// ambient
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
	return mat.ambient * col;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    89
}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    90
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    91
/*
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    92
 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
    93
 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
    94
 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
    95
 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
    96
*/
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    97
Colour PhongShader_calculate(Material &mat, Vector3 &P, Vector3 &N, Vector3 &R, Vector3 &V,
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    98
	Light &light)
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    99
{
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   100
	Colour I = Colour();
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   101
	Vector3 L = light.pos - P;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   102
	L.normalize();
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   103
	Float L_dot_N = dot(L, N);
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   104
	Float R_dot_V = dot(R, 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
   105
42
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
   106
	Colour col;
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
   107
	if (mat.texture)
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
   108
		col = mat.texture->evaluate(P);
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
   109
	else
fbdeb3e04543 cleaned Texture interface
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
   110
		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
   111
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   112
	// diffuse
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   113
	I = mat.diffuse * col * light.colour * L_dot_N;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   114
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   115
	// specular
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   116
	if (R_dot_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
   117
		I += mat.specular * light.colour * powf(R_dot_V, mat.shininess);
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   118
	return I;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   119
}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   120
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   121
Colour Raytracer::raytrace(Ray &ray, int depth, Shape *origin_shape)
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   122
{
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   123
	Float nearest_distance = Inf;
11
4d192e13ee84 move nearest_intersection() to Container, add dummy KdTree.load(), plus small fixes
Radek Brich <radek.brich@devl.cz>
parents: 10
diff changeset
   124
	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
   125
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   126
	if (nearest_shape == NULL) {
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   127
		return bg_colour;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   128
	} else {
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   129
		Colour col = Colour();
15
a0a3e334744f C++ demos: prepare infrastructure, add spheres_shadow.cc
Radek Brich <radek.brich@devl.cz>
parents: 14
diff changeset
   130
		Vector3 P = ray.o + ray.dir * nearest_distance; // point of intersection
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
   131
		Vector3 normal = nearest_shape->normal(P);
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   132
		bool from_inside = false;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   133
25
b8232edee786 tuned ray-triangle intersection, now there are three algorithms to choose from:
Radek Brich <radek.brich@devl.cz>
parents: 22
diff changeset
   134
		// make shapes double sided
b8232edee786 tuned ray-triangle intersection, now there are three algorithms to choose from:
Radek Brich <radek.brich@devl.cz>
parents: 22
diff changeset
   135
		if (dot(normal, ray.dir) > 0.0)
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   136
		{
25
b8232edee786 tuned ray-triangle intersection, now there are three algorithms to choose from:
Radek Brich <radek.brich@devl.cz>
parents: 22
diff changeset
   137
			normal = - normal;
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   138
			from_inside = true;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   139
		}
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   140
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   141
		col = PhongShader_ambient(*nearest_shape->material, P);
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
   142
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   143
		vector<Light*>::iterator light;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   144
		for (light = lights.begin(); light != lights.end(); light++) {
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   145
			Vector3 jo, L = (*light)->pos - P; // direction vector to light
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   146
			L.normalize();
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   147
			Float L_dot_N = dot(L, 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
   148
			if (L_dot_N > 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
   149
				// test if this light is occluded (sharp shadows)
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   150
				if ((*light)->cast_shadows) {
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
   151
					Ray shadow_ray = Ray(P, L);
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   152
					Float dist = FLT_MAX;
11
4d192e13ee84 move nearest_intersection() to Container, add dummy KdTree.load(), plus small fixes
Radek Brich <radek.brich@devl.cz>
parents: 10
diff changeset
   153
					if (top->nearest_intersection(nearest_shape, shadow_ray, dist))
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
   154
						continue;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   155
				}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   156
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   157
				// shading function
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   158
				Vector3 R = L - 2.0 * L_dot_N * normal;
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   159
				col += PhongShader_calculate(*nearest_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
   160
					P, normal, R, ray.dir, **light);
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   161
			}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   162
		}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   163
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   164
		if (depth < max_depth)
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   165
		{
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   166
			Colour trans_col, refl_col;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   167
			Float trans = nearest_shape->material->transmissivity;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   168
			Float refl = nearest_shape->material->reflectivity;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   169
			const Float cos_i = - dot(normal, ray.dir);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   170
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   171
			// reflection
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   172
			if (refl > 0.01)
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   173
			{
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   174
				Vector3 newdir = ray.dir + 2.0 * cos_i * normal;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   175
				Ray newray = Ray(P, newdir);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   176
				refl_col = raytrace(newray, depth + 1, nearest_shape);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   177
			}
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   178
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   179
			// refraction
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   180
		 	if (trans > 0.01)
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   181
			{
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   182
				Float n, n1, n2;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   183
				if (from_inside)
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   184
				{
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   185
					n1 = nearest_shape->material->refract_index;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   186
					n2 = 1.0;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   187
					n = n1;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   188
				}
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   189
				else
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   190
				{
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   191
					n1 = 1.0;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   192
					n2 = nearest_shape->material->refract_index;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   193
					n = 1.0 / n2;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   194
				}
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   195
				const Float sin2_t = n*n * (1 - cos_i*cos_i);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   196
				if (sin2_t >= 1.0)
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   197
				{
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   198
					 // totally reflected
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   199
					 refl += trans;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   200
					 trans = 0;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   201
				}
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   202
				else
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   203
				{
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   204
					const Float cos_t = sqrtf(1 - sin2_t);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   205
					const Float Rdiv = 1.0/(n1*cos_i + n2*cos_t);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   206
					const Float Rper = (n1*cos_i - n2*cos_t)*Rdiv;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   207
					const Float Rpar = (n2*cos_i - n1*cos_t)*Rdiv;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   208
					const Float R = (Rper*Rper + Rpar*Rpar)/2;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   209
					refl += R*trans;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   210
					trans = (1-R)*trans;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   211
					Vector3 newdir = n * ray.dir + (n*cos_i - cos_t) * normal;
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   212
					Ray newray = Ray(P, newdir);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   213
					trans_col = raytrace(newray, depth + 1, nearest_shape);
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   214
				}
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   215
			}
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   216
			col = (1-refl-trans)*col + refl*refl_col + trans*trans_col;
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
   217
		}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   218
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   219
		// ambient occlusion
40
929aad02c5f2 Makefile: added help and distclean target, plus small fixes
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
   220
		if (!from_inside && ao_samples)
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
   221
		{
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   222
			Float miss = 0;
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
   223
			for (int i = 0; i < ao_samples; i++) {
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   224
				Vector3 dir = SphereDistribute(i, ao_samples, ao_angle, normal);
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   225
				Ray ao_ray = Ray(P, dir);
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   226
				Float dist = ao_distance;
11
4d192e13ee84 move nearest_intersection() to Container, add dummy KdTree.load(), plus small fixes
Radek Brich <radek.brich@devl.cz>
parents: 10
diff changeset
   227
				Shape *shape_in_way = top->nearest_intersection(nearest_shape, ao_ray, dist);
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
   228
				if (shape_in_way == NULL)
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   229
					miss += 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
   230
				else
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   231
					miss += dist / ao_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
   232
			}
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   233
			Float ao_intensity = miss / ao_samples;
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   234
			col = col * ao_intensity;
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
   235
		}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   236
31
b4e09433934a refraction
Radek Brich <radek.brich@devl.cz>
parents: 30
diff changeset
   237
		return col;
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
   238
	}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   239
}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   240
48
a4913301c626 begin moving subsampling and oversampling to Sampler
Radek Brich <radek.brich@devl.cz>
parents: 47
diff changeset
   241
#if 0
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   242
static void *renderrow(void *data)
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   243
{
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   244
	RenderrowData *d = (RenderrowData*) data;
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   245
	const int subsample = d->rt->getSubsample();
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   246
	const Float subsample2 = 1.0/(subsample*subsample);
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   247
	const int oversample = d->rt->getOversample();
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   248
	const int ww = d->w*3;
19
4e0955fca797 added Camera, currently w/o Python binding
Radek Brich <radek.brich@devl.cz>
parents: 16
diff changeset
   249
	Vector3 dir = d->dfix;
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   250
	for (int x = 0; x < d->w; x += subsample) {
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   251
		// generate a ray from eye passing through this pixel
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   252
		if (subsample > 1)
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   253
		{
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   254
			Colour ic;
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   255
			// top-left
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   256
			dir.normalize();
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   257
			Ray ray(d->eye, dir);
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   258
			Colour c1 = d->rt->raytrace(ray, 0, NULL);
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   259
			// top-right
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   260
			Vector3 tmpdir = dir + (subsample-1)*d->dx;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   261
			tmpdir.normalize();
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   262
			ray.dir = tmpdir;
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   263
			Colour c2 = d->rt->raytrace(ray, 0, NULL);
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   264
			// bottom right
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   265
			tmpdir += (subsample-1)*d->dy;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   266
			tmpdir.normalize();
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   267
			ray.dir = tmpdir;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   268
			Colour c4 = d->rt->raytrace(ray, 0, NULL);
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   269
			// bottom left
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   270
			tmpdir = dir + (subsample-1)*d->dy;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   271
			tmpdir.normalize();
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   272
			ray.dir = tmpdir;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   273
			Colour c3 = d->rt->raytrace(ray, 0, NULL);
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   274
			// are the colors similar?
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   275
			Float m = (c1-c2).mag2();
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   276
			m = max(m, (c2-c3).mag2());
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   277
			m = max(m, (c3-c4).mag2());
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   278
			m = max(m, (c4-c1).mag2());
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   279
			if (m < 0.001)
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   280
			{
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   281
				// interpolate
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   282
				Float *i = d->iter;
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   283
				for (int x = 0; x < subsample; x++)
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   284
				{
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   285
					for (int y = 0; y < subsample; y++)
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   286
					{
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   287
						ic = c1*(subsample-x)*(subsample-y)*subsample2
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   288
							+ c2*(x)*(subsample-y)*subsample2
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   289
							+ c3*(subsample-x)*(y)*subsample2
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   290
							+ c4*(x)*(y)*subsample2;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   291
						*(i + ww*y) = ic.r;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   292
						*(i + ww*y + 1) = ic.g;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   293
						*(i + ww*y + 2) = ic.b;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   294
					}
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   295
					i += 3;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   296
				}
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   297
				d->iter = i;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   298
			}
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   299
			else
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   300
			{
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   301
				// render all pixels
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   302
				Vector3 tmpdir = dir;
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   303
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   304
				if (oversample)
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   305
				{
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   306
					for (int x = 0; x < subsample; x++)
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   307
					{
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   308
						for (int y = 0; y < subsample; y++)
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   309
						{
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   310
							Vector3 tmp2dir = tmpdir + y*d->dy;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   311
							samplepixel(ic, tmp2dir, d, oversample);
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   312
							*(d->iter + ww*y) = ic.r;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   313
							*(d->iter + ww*y + 1) = ic.g;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   314
							*(d->iter + ww*y + 2) = ic.b;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   315
						}
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   316
						d->iter += 3;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   317
						tmpdir += d->dx;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   318
					}
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   319
				}
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   320
				else
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   321
				{
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   322
					/* this is so complex because it tries to reuse
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   323
					   already computed corner pixels
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   324
					   though, above code will also work for non-oversampling... */
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   325
					// first column
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   326
					*(d->iter) = c1.r;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   327
					*(d->iter + 1) = c1.g;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   328
					*(d->iter + 2) = c1.b;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   329
					for (int y = 1; y < subsample-1; y++)
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   330
					{
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   331
						Vector3 tmp2dir = tmpdir + y*d->dy;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   332
						tmp2dir.normalize();
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   333
						ray.dir = tmp2dir;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   334
						ic = d->rt->raytrace(ray, 0, NULL);
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   335
						*(d->iter + ww*y) = ic.r;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   336
						*(d->iter + ww*y + 1) = ic.g;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   337
						*(d->iter + ww*y + 2) = ic.b;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   338
					}
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   339
					*(d->iter + ww*(subsample-1)) = c3.r;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   340
					*(d->iter + ww*(subsample-1) + 1) = c3.g;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   341
					*(d->iter + ww*(subsample-1) + 2) = c3.b;
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   342
					d->iter += 3;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   343
					tmpdir += d->dx;
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   344
					// middle
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   345
					for (int x = 1; x < subsample-1; x++)
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   346
					{
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   347
						for (int y = 0; y < subsample; y++)
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   348
						{
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   349
							Vector3 tmp2dir = tmpdir + y*d->dy;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   350
							tmp2dir.normalize();
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   351
							ray.dir = tmp2dir;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   352
							ic = d->rt->raytrace(ray, 0, NULL);
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   353
							*(d->iter + ww*y) = ic.r;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   354
							*(d->iter + ww*y + 1) = ic.g;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   355
							*(d->iter + ww*y + 2) = ic.b;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   356
						}
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   357
						d->iter += 3;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   358
						tmpdir += d->dx;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   359
					}
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   360
					// last column
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   361
					*(d->iter) = c2.r;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   362
					*(d->iter + 1) = c2.g;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   363
					*(d->iter + 2) = c2.b;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   364
					for (int y = 1; y < subsample-1; y++)
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   365
					{
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   366
						Vector3 tmp2dir = tmpdir + y*d->dy;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   367
						tmp2dir.normalize();
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   368
						ray.dir = tmp2dir;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   369
						ic = d->rt->raytrace(ray, 0, NULL);
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   370
						*(d->iter + ww*y) = ic.r;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   371
						*(d->iter + ww*y + 1) = ic.g;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   372
						*(d->iter + ww*y + 2) = ic.b;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   373
					}
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   374
					*(d->iter + ww*(subsample-1)) = c4.r;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   375
					*(d->iter + ww*(subsample-1) + 1) = c4.g;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   376
					*(d->iter + ww*(subsample-1) + 2) = c4.b;
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   377
					d->iter += 3;
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   378
				}
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   379
			}
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   380
		}
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   381
		else // subsample <= 1
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   382
		{
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   383
			Colour c;
33
83d0200d4c09 make over-sampling work together with sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   384
			samplepixel(c, dir, d, oversample);
32
8af5c17d368b new Raytracer option: oversampling
Radek Brich <radek.brich@devl.cz>
parents: 31
diff changeset
   385
			// write color to buffer
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   386
			*d->iter++ = c.r;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   387
			*d->iter++ = c.g;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   388
			*d->iter++ = c.b;
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   389
		}
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   390
		dir += d->dx*subsample;
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   391
	}
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   392
#ifdef PTHREADS
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   393
	pthread_exit((void *)d);
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   394
#endif
6
d8d596d26f25 pthreads and other fixes for Windows
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
   395
	return (void *)d;
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   396
}
48
a4913301c626 begin moving subsampling and oversampling to Sampler
Radek Brich <radek.brich@devl.cz>
parents: 47
diff changeset
   397
#endif
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   398
46
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   399
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
   400
{
46
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   401
	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
   402
		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
   403
46
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   404
	// create workers
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   405
	// ...
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   406
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   407
	sampler->init();
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   408
	int sampnum = 0;
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   409
	while ( (sampnum = sampler->initSampleSet()) > 0 )
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   410
	{
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   411
		Sample *sample, *prev = NULL;
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   412
		while ( (sample = sampler->nextSample(prev)) != NULL )
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   413
		{
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   414
			Ray ray = camera->makeRay(sample);
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   415
			//raystack->push(ray);
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   416
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   417
			// in worker:
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   418
			Colour col = raytrace(ray, 0, NULL);
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   419
			sampler->saveSample(sample, col);
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   420
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   421
			delete prev;
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   422
			prev = sample;
49
558fde7da82a workaround for divide by zero bug in octree
Radek Brich <radek.brich@devl.cz>
parents: 48
diff changeset
   423
			sampnum--;
558fde7da82a workaround for divide by zero bug in octree
Radek Brich <radek.brich@devl.cz>
parents: 48
diff changeset
   424
			if ((sampnum % 1000) == 0)
558fde7da82a workaround for divide by zero bug in octree
Radek Brich <radek.brich@devl.cz>
parents: 48
diff changeset
   425
				dbgmsg(2, "\b\b\b\b\b\b\b\b%8d", sampnum);
46
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   426
		}
49
558fde7da82a workaround for divide by zero bug in octree
Radek Brich <radek.brich@devl.cz>
parents: 48
diff changeset
   427
		dbgmsg(2, "\n");
46
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   428
	}
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   429
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   430
	// wait for workers
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   431
	// ...
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   432
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   433
#if 0
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   434
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   435
	RenderrowData *d;
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
   436
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   437
	Float S = 0.5/w;
19
4e0955fca797 added Camera, currently w/o Python binding
Radek Brich <radek.brich@devl.cz>
parents: 16
diff changeset
   438
	Vector3 dfix = camera->u*(-w/2.0*S/camera->f)
4e0955fca797 added Camera, currently w/o Python binding
Radek Brich <radek.brich@devl.cz>
parents: 16
diff changeset
   439
		+ camera->v*(h/2.0*S/camera->f) + camera->p;
4e0955fca797 added Camera, currently w/o Python binding
Radek Brich <radek.brich@devl.cz>
parents: 16
diff changeset
   440
	Vector3 dx = camera->u * (S/camera->f);
4e0955fca797 added Camera, currently w/o Python binding
Radek Brich <radek.brich@devl.cz>
parents: 16
diff changeset
   441
	Vector3 dy = camera->v * (-S/camera->f);
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   442
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   443
#ifdef PTHREADS
30
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
   444
	dbgmsg(1, "* pthreads enabled, using %d threads\n", num_threads);
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   445
	pthread_t threads[num_threads];
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   446
	for (int t = 0; t < num_threads; t++)
6
d8d596d26f25 pthreads and other fixes for Windows
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
   447
		threads[t] = pthread_self();
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   448
	int t = 0;
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   449
#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
   450
15
a0a3e334744f C++ demos: prepare infrastructure, add spheres_shadow.cc
Radek Brich <radek.brich@devl.cz>
parents: 14
diff changeset
   451
	/* for each pixel... */
30
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
   452
	dbgmsg(1, "* raytracing...\n");
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
   453
	dbgmsg(2, "- row   0 (  0%% done)");
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   454
	for (int y = 0; y < h; y += subsample)
20
f22952603f29 new C++ demo: realtime.cc (real-time scene viewer using SDL)
Radek Brich <radek.brich@devl.cz>
parents: 19
diff changeset
   455
	{
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   456
		d = (RenderrowData*) malloc(sizeof(RenderrowData));
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   457
		d->rt = this;
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   458
		d->w = w;
19
4e0955fca797 added Camera, currently w/o Python binding
Radek Brich <radek.brich@devl.cz>
parents: 16
diff changeset
   459
		d->eye = camera->eye;
4e0955fca797 added Camera, currently w/o Python binding
Radek Brich <radek.brich@devl.cz>
parents: 16
diff changeset
   460
		d->dfix = dfix;
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   461
		d->dx = dx;
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   462
		d->dy = dy;
20
f22952603f29 new C++ demo: realtime.cc (real-time scene viewer using SDL)
Radek Brich <radek.brich@devl.cz>
parents: 19
diff changeset
   463
		d->iter = buffer + y*3*w;
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   464
#ifdef PTHREADS
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   465
		/* create new thread and increase 't' */
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   466
		int rc = pthread_create(&threads[t++], NULL, renderrow, (void *)d);
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   467
		if (rc) {
30
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
   468
			dbgmsg(0, "\nE pthread_create unsuccessful, return code was %d\n", rc);
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   469
			exit(1);
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   470
		}
46
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   471
		/* when 't' overflows, reset it */
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   472
		if (t >= num_threads)
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   473
			t = 0;
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   474
		/* wait for next thread in fifo queue, so the descriptor can be reused;
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   475
		   this also limits number of running threads */
6
d8d596d26f25 pthreads and other fixes for Windows
Radek Brich <radek.brich@devl.cz>
parents: 5
diff changeset
   476
		if (!pthread_equal(threads[t], pthread_self()))
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   477
			if (pthread_join(threads[t], (void**)&d) == 0)
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   478
				free(d);
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   479
#else
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   480
		renderrow((void *)d);
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   481
		free(d);
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
   482
#endif
21
79b516a3803d naive color driven sub-sampling
Radek Brich <radek.brich@devl.cz>
parents: 20
diff changeset
   483
		dfix += dy*subsample;
30
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
   484
		dbgmsg(2, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%4d (%2d%% done)", y, y*100/(h-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
   485
	}
30
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
   486
	dbgmsg(2, "\n");
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   487
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   488
#ifdef PTHREADS
30
33f95441790e pyrit_verbosity: new variable for controlling amount of output, see common.h
Radek Brich <radek.brich@devl.cz>
parents: 25
diff changeset
   489
	dbgmsg(2, "- waiting for threads to finish\n");
4
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   490
	for (t = 0; t < num_threads; t++)
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   491
		if (pthread_join(threads[t], (void**)&d) == 0)
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   492
			free(d);
c73bc405ee7a multi-threaded rendering via pthreads
Radek Brich <radek.brich@devl.cz>
parents: 0
diff changeset
   493
#endif
46
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   494
6493fb65f0b1 Doxygen
Radek Brich <radek.brich@devl.cz>
parents: 44
diff changeset
   495
#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
   496
}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   497
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   498
void Raytracer::addlight(Light *light)
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   499
{
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   500
	lights.push_back(light);
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   501
}
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   502
22
76b7bd51d64a new make infrastructure
Radek Brich <radek.brich@devl.cz>
parents: 21
diff changeset
   503
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
   504
{
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   505
	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
   506
	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
   507
	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
   508
	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
   509
		/* 0 ==> Inf */
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   510
		ao_distance = FLT_MAX;
3547b885df7e initial commit, raytracer source as written year ago and unchanged since 2007-03-25
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   511
}