update README
update Doxygen docs
scons option 'msvc' changed to 'mingw' as msvc is default
  and mingw must be turned on explicitly
--- a/DEVNOTES	Tue May 06 09:39:58 2008 +0200
+++ b/DEVNOTES	Thu May 08 09:21:25 2008 +0200
@@ -24,3 +24,23 @@
 -------------
 Sampler - generate points in screen plane
 Camera - transform point from sampler to a ray
+
+New Classes?
+------------
+
+scene.h   -- Scene, ...
+reader.h  -- Reader, WavefrontReader
+
+wf = new WavefrontReader()
+wf.setContainer(top)
+wf.setTransform(monkey_pos_matrix)
+wf.read("monkey.obj")
+// more transform&reads
+destroy wf
+
+Scene scene -- container with shapes, a camera and lights
+scene = new Scene()
+scene.setCamera(new Camera(eye, u, v, p))
+scene.addLight(new PointLight(pos, color))
+rt.setScene(scene)
+rt.render(w,h)
--- a/Doxyfile	Tue May 06 09:39:58 2008 +0200
+++ b/Doxyfile	Thu May 08 09:21:25 2008 +0200
@@ -25,7 +25,7 @@
 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
 # by quotes) that should identify the project.
 
-PROJECT_NAME           = Pyrit Ray Tracer
+PROJECT_NAME           = Pyrit
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number. 
 # This could be handy for archiving the generated documentation or 
@@ -239,7 +239,7 @@
 # member in the group (if any) for the other members of the group. By default 
 # all members of a group must be documented explicitly.
 
-DISTRIBUTE_GROUP_DOC   = NO
+DISTRIBUTE_GROUP_DOC   = YES
 
 # Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
 # the same type (for instance a group of public functions) to be put as a 
@@ -542,7 +542,7 @@
 # excluded from the INPUT source files. This way you can easily exclude a 
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
 
-EXCLUDE                = 
+EXCLUDE                = include/config.h src/raytracermodule.cc
 
 # The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
 # directories that are symbolic links (a Unix filesystem feature) are excluded 
--- a/README	Tue May 06 09:39:58 2008 +0200
+++ b/README	Thu May 08 09:21:25 2008 +0200
@@ -5,39 +5,52 @@
 
 File Organization
 -----------------
-/bin      -- output directory for binary objects
+/build    -- output directory for binaries and other generated files
 /ccdemos  -- ray tracer demos in C++
 /demos    -- ray tracer demos in Python
 /include  -- header files
 /models   -- common models for use by demos
 /src      -- ray tracing library source code
 /tests    -- test programs for classes
+/tools    -- auxiliary programs
 
 Classes organization throughout header files is explained in DEVNOTES.
 
 
 Building
 --------
-Type 'scons all' to build everything and 'scons -h' for list of targets.
+Type 'scons pyrit' to build and 'scons -h' for list of targets.
 
 Requirements:
     SCons
     pthreads (see bellow)
+    libpng, zlib
     Python 2.4 or newer for Python module and demos
-    PIL (Python Imaging Library) for Python demos
     SDL for interactive C++ demos
-    libpng and zlib for rendering to PNG file from C++ demos
+
+It should build with these compilers: GCC, IntelC, MSVC
+GCC is default in Linux, MSVC is default in Windows.
+
+
+Downloading model files
+-----------------------
+Not all models are included in distribution. To download the large
+Stanford models, type 'scons download-models', which will download
+end extract the archives to appropriate location.
+
+The download script uses 'tar' and 'wget' utilities.
+
+For Windows, these are available here:
+http://gnuwin32.sourceforge.net/packages/wget.htm
+http://gnuwin32.sourceforge.net/packages/libarchive.htm
 
 
 Pthreads
 --------
-Threads can be used to render rows of picture paralelly. Arbitrary number
-of threads can be used, even numbers like 17 are acceptable.
+Threads can be used to render rays paralelly. Arbitrary number
+of threads can be used.
 
-To completely disable this feature just remove "-DPTHREADS -pthreads"
-from flags in makefile.
-
-For Windows + Mingw32, get pthreads library here:
+For Windows, get pthreads library here:
 http://sources.redhat.com/pthreads-win32/
 
 
--- a/SConstruct	Tue May 06 09:39:58 2008 +0200
+++ b/SConstruct	Thu May 08 09:21:25 2008 +0200
@@ -54,13 +54,13 @@
 )
 if env['PLATFORM'] == 'win32':
 	opt.AddOptions(
-		BoolOption('msvc', 'use Microsoft Visual C++ Compiler, if available', True),
+		BoolOption('mingw', 'use Mingw and GCC compiler, if available', False),
 		('pythonpath', 'path to Python installation',
 			'C:\\Python%c%c' % (sys.version[0], sys.version[2])),
 	)
 else:
 	opt.AddOptions(
-		BoolOption('intelc', 'use Intel C++ Compiler, if available', True),
+		BoolOption('intelc', 'use Intel C++ Compiler, if available', False),
 	)
 
 
@@ -155,7 +155,7 @@
 if intelc and (not gcc or conf.env['intelc']):
 	Tool('intelc').generate(conf.env)
 	cc = 'intelc'
-elif msvc and (not gcc or conf.env['msvc']):
+elif msvc and (not gcc or not conf.env['mingw']):
 	Tool('default').generate(conf.env)
 	conf.Define("MSVC")
 	cc = 'msvc'
--- a/TODO	Tue May 06 09:39:58 2008 +0200
+++ b/TODO	Thu May 08 09:21:25 2008 +0200
@@ -1,6 +1,6 @@
 Bugs
 ====
- * (none known)
+ * Mingw + SSE does not work
 
 Future Plans
 ============
@@ -11,24 +11,3 @@
  * put everything into a namespace
  * stochastic oversampling
  * absorbtion of refracted rays in dense materials (can be computed using shape distance and some 'absorbance' constant)
- * implement efficient AABB-ray intersection using Plucker coordinates
-
-New Classes?
-============
-
-scene.h   -- Scene, ...
-reader.h  -- Reader, WavefrontReader
-
-wf = new WavefrontReader()
-wf.setContainer(top)
-wf.setTransform(monkey_pos_matrix)
-wf.read("monkey.obj")
-// more transform&reads
-destroy wf
-
-Scene scene -- container with shapes, a camera and lights
-scene = new Scene()
-scene.setCamera(new Camera(eye, u, v, p))
-scene.addLight(new PointLight(pos, color))
-rt.setScene(scene)
-rt.render(w,h)
--- a/include/common.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/common.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * common.h: common functions and definitions
+/**
+ * @file  common.h
+ * @brief Common functions and definitions
  *
  * This file is part of Pyrit Ray Tracer.
  *
--- a/include/container.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/container.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * container.h: Container class
+/**
+ * @file  container.h
+ * @brief Spatial container for shapes
  *
  * This file is part of Pyrit Ray Tracer.
  *
--- a/include/kdtree.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/kdtree.h	Thu May 08 09:21:25 2008 +0200
@@ -1,9 +1,10 @@
-/*
- * kdtree.h: KdTree class
+/**
+ * @file  kdtree.h
+ * @brief KdTree class
  *
  * This file is part of Pyrit Ray Tracer.
  *
- * Copyright 2006, 2007  Radek Brich
+ * Copyright 2006, 2007, 2008  Radek Brich
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
--- a/include/material.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/material.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * material.h: material and texture classes
+/**
+ * @file  material.h
+ * @brief Material and Texture classes
  *
  * This file is part of Pyrit Ray Tracer.
  *
--- a/include/matrix.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/matrix.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * matrix.h: Matrix class, currently not used
+/**
+ * @file  matrix.h
+ * @brief Matrix class, currently not used
  *
  * This file is part of Pyrit Ray Tracer.
  *
--- a/include/mempool.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/mempool.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * mempool.h: memory pool
+/**
+ * @file  mempool.h
+ * @brief Memory pool for aligned allocation
  *
  * This file is part of Pyrit Ray Tracer.
  *
@@ -29,6 +30,9 @@
 
 #include "common.h"
 
+/**
+ * Memory pool template
+ */
 template <typename Type>
 class MemoryPool
 {
@@ -45,8 +49,18 @@
 #endif
 	};
 public:
+	/**
+	 * Construct memory pool with default alignment (16)
+	 * @see MemoryPool(size_t, size_t)
+	 */
 	MemoryPool(const size_t inisize):
 		cur(0), size(inisize), align(16) { init(); };
+
+	/**
+	 * Construct memory pool
+	 * @param[in] inisize  Initial capacity in Type count
+	 * @param[in] inialign Set memory alignement of items
+	 */
 	MemoryPool(const size_t inisize, const size_t inialign):
 		cur(0), size(inisize), align(inialign) { init(); };
 	~MemoryPool()
@@ -58,6 +72,10 @@
 #endif
 	};
 
+	/**
+	 * Allocate memory for one item of type Type
+	 * @return Pointer to allocated memory
+	 */
 	void *alloc()
 	{
 		if (cur == size)
--- a/include/octree.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/octree.h	Thu May 08 09:21:25 2008 +0200
@@ -1,9 +1,10 @@
-/*
- * octree.h: Octree class
+/**
+ * @file  octree.h
+ * @brief Octree class
  *
  * This file is part of Pyrit Ray Tracer.
  *
- * Copyright 2007  Radek Brich
+ * Copyright 2007, 2008  Radek Brich
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
--- a/include/pixmap.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/pixmap.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * pixmap.h: 2D image class
+/**
+ * @file pixmap.h
+ * @brief Pixmap class with PNG file format writer
  *
  * This file is part of Pyrit Ray Tracer.
  *
--- a/include/quaternion.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/quaternion.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * quaternion.h: Quaternion class
+/**
+ * @file  quaternion.h
+ * @brief Quaternion class
  *
  * This file is part of Pyrit Ray Tracer.
  *
@@ -28,7 +29,7 @@
 #define QUATER_H
 
 /**
- * helper quaternion class
+ * quaternion class
  */
 class Quaternion
 {
--- a/include/raytracer.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/raytracer.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * raytracer.h: Raytracer class
+/**
+ * @file  raytracer.h
+ * @brief The base class of the ray tracer
  *
  * This file is part of Pyrit Ray Tracer.
  *
@@ -71,7 +72,7 @@
 	static void *raytrace_worker(void *d);
 public:
 	Raytracer(): top(NULL), camera(NULL), lights(), bg_colour(0., 0., 0.),
-		ao_samples(0), num_threads(2), max_depth(3), use_packets(true)
+		ao_samples(0), num_threads(4), max_depth(3), use_packets(true)
 	{
 		pthread_mutex_init(&sample_queue_mutex, NULL);
 		pthread_mutex_init(&sampler_mutex, NULL);
--- a/include/sampler.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/sampler.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * sampler.h: screen sample generation and image reconstruction
+/**
+ * @file  sampler.h
+ * @brief Screen sample generation and image reconstruction
  *
  * This file is part of Pyrit Ray Tracer.
  *
@@ -34,70 +35,151 @@
 using namespace std;
 
 /**
- * sample
+ * A structure containing sample's coordinates.
  */
 class Sample
 {
-	friend class Sampler;
 public:
+	//@{
+	/**
+	 * Generated coordinates.
+	 *
+	 * These are coordinates for use by Camera.
+	 * Middle of the screen plane has [0,0],
+	 * top of the screen has y=-0.5, left pixels has x<0
+	 * and the rest of samples are aligned to regular grid,
+	 * so the vertical size is always one and horizontal size
+	 * can be wider depending on aspect ratio.
+	 */
 	Float x,y;
+	//@}
+
+	//@{
+	/**
+	 * Auxiliary coordinates used internally by sampler.
+	 *
+	 * Screen coordinates sx, sy are integer coordinates of screen pixels,
+	 * osa_samp is used by oversampling to remember current sample.
+	 */
 	int sx,sy,osa_samp;
+	//@}
 };
 
 /**
  * A abstract sampler.
- * It generates screen samples in coordinates between [-1..1] for height
- * and [-w/h..w/h] for width. It works in phases: initSampleSet returns
+ *
+ * It generates screen samples in coordinates between [-0.5..0.5] for height
+ * and [-w/h/2..w/h/2] for width. It works in phases: initSampleSet returns
  * number of samples for each phase, then samples can be generated using
  * nextSample method. The resulting colour of each sample should be returned
  * via saveSample method. The sampler should save the results to given buffer
- * and decide if other phase is needed. When the picture is complete,
+ * and decide if another phase is needed. When the picture is complete,
  * initSampleSet returns zero and picture can be read from buffer.
  */
 class Sampler
 {
 protected:
-	Pixmap pixmap;
-	bool packetable;
+	Pixmap pixmap;    ///< A pixmap for resulting image.
+	bool packetable;  ///< True if the generated samples are usable with ray packets.
 public:
+	/** Constructor with user provided image buffer. */
 	Sampler(Float *buffer, const int &w, const int &h):
 		pixmap(buffer, w, h), packetable(false) {};
+
+	/** With this constructor, image buffer is allocated as specified by w,h. */
 	Sampler(const int &w, const int &h):
 		pixmap(w, h), packetable(false) {};
+
 	virtual ~Sampler() {};
+
+	/** Switch to new user provided buffer. */
 	void resetBuffer(Float *buffer, int &w, int &h)
 		{ pixmap.setData(buffer, w, h); };
+
+	/**
+	 * Initialize the sampler.
+	 *
+	 * This must be called first when starting new image.
+	 */
 	virtual void init() = 0;
+
+	/**
+	 * Prepare for next phase.
+	 *
+	 * Must be called before reading samples.
+	 * @retval N approximate number of samples to be generated in the phase
+	 * @retval 0 last phase, image is complete
+	 */
 	virtual int initSampleSet() = 0;
+
+	/**
+	 * Generate next sample.
+	 *
+	 * @param[out] s  The sample.
+	 * @retval false  No more samples in this phase.
+	 */
 	virtual bool nextSample(Sample *s) = 0;
-	virtual void saveSample(Sample &samp, Colour &col) = 0;
+
+	/**
+	 * Save the color of the sample.
+	 *
+	 * @param[in] samp  A sample.
+	 * @param[in] col   Color resulted from ray tracing the sample.
+	 */
+	virtual void saveSample(const Sample &samp, const Colour &col) = 0;
+
+	/** True if generated samples are usable with ray packets. */
 	bool packetableSamples() { return packetable; };
+
+	/** Get the pixmap. */
 	const Pixmap &getPixmap() const { return pixmap; };
 };
 
 /**
  * Default sampler.
+ *
  * Implements basic adaptive subsampling and oversampling.
  */
 class DefaultSampler: public Sampler
 {
-	int phase;
-	int subsample;  // 0,1 = no, 1+ = size of sampling grid
-	int oversample; // 0 = no, 1 = 4x, 2 = 9x, 3 = 16x
-	int sx,sy,osa_samp; // current sample properties
+	int phase;      ///< Current phase
+	int subsample;  ///< Subsampling mode
+	int oversample; ///< Oversampling mode
+	//@{
+	/** Properties of last generated sample. */
+	int sx,sy,osa_samp;
+	//@}
 public:
+	/** Constructor with user provided image buffer. */
 	DefaultSampler(Float *buffer, const int &w, const int &h):
 		Sampler(buffer, w, h), phase(-1), subsample(0), oversample(0) {};
+
+	/** With this constructor, image buffer is allocated as specified by w,h. */
 	DefaultSampler(const int &w, const int &h):
 		Sampler(w, h), phase(-1), subsample(0), oversample(0) {};
+
+	/* Implement virtuals from Sampler. */
 	void init();
 	int initSampleSet();
 	bool nextSample(Sample *s);
-	void saveSample(Sample &samp, Colour &col);
+	void saveSample(const Sample &samp, const Colour &col);
 
+	/**
+	  * Set subsampling mode.
+	  *
+	  * @param[in] sub  0,1 = no, 1+ = size of sampling grid
+	  */
 	void setSubsample(int sub) { subsample = sub; };
+	/** Get subsampling mode. @see setSubsample */
 	int getSubsample() { return subsample; };
+
+	/**
+	  * Set oversampling mode.
+	  *
+	  * @param[in] osa  0 = no, 1 = 4x, 2 = 9x, 3 = 16x
+	  */
 	void setOversample(int osa) { oversample = osa; };
+	/** Get oversampling mode. @see setOversample */
 	int getOversample() { return oversample; };
 };
 
--- a/include/scene.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/scene.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * scene.h: classes for objects in scene
+/**
+ * @file  scene.h
+ * @brief Classes for objects in scene (other than shapes).
  *
  * This file is part of Pyrit Ray Tracer.
  *
@@ -36,12 +37,13 @@
 #include "quaternion.h"
 
 /**
- * ray
+ * A ray
  */
 class Ray
 {
 public:
-	Vector o, dir;
+	Vector o;   ///< Origin
+	Vector dir; ///< Normalized direction
 
 	Ray(): o(), dir() {};
 	Ray(const Vector &ao, const Vector &adir):
@@ -50,18 +52,20 @@
 
 #ifndef NO_SIMD
 /**
- * packet of 4 rays
+ * Packet of four rays for SIMD accelerated packet tracing.
  */
 class RayPacket
 {
 public:
-	VectorPacket o, dir, invdir;
+	VectorPacket o;      ///< Packet of four origins
+	VectorPacket dir;    ///< Directions
+	VectorPacket invdir; ///< Inverted directions (1/dir)
 
 	RayPacket(): o(), dir() {};
 	RayPacket(const VectorPacket &ao, const VectorPacket &adir):
 		o(ao), dir(adir), invdir(mOne/adir) {};
 
-	// index operator - get a ray
+	/** Index operator: get ray 'i' */
 	Ray operator[](int i) const
 	{
 		return Ray(
@@ -72,7 +76,7 @@
 #endif
 
 /**
- * a camera
+ * General camera
  */
 class Camera
 {
--- a/include/serialize.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/serialize.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * serialize.h: object serialization functions
+/**
+ * @file  serialize.h
+ * @brief Object serialization functions
  *
  * This file is part of Pyrit Ray Tracer.
  *
@@ -33,6 +34,12 @@
 #include "container.h"
 #include "kdtree.h"
 
+/**
+ * Maps pointers to indices
+ *
+ * This helps when we are saving objects from random memory places
+ * to file stream
+ */
 class Indexer
 {
 	map <void *, int> indexmap;
@@ -40,7 +47,16 @@
 public:
 	Indexer(): indexmap(), index(0) {};
 	void reset() { indexmap.clear(); index = 0; };
+
+	/**
+	 * Make new index or return number of already indexed object
+	 * @param[in] o        object for indexation
+	 * @param[out] retidx  returned index
+	 * @retval true        if object was found
+	 * @retval false       if new index was made for the object
+	 */
 	bool get(void *o, int &retidx);
+
 	const int &operator[](void *o) { return indexmap[o]; };
 };
 
--- a/include/shapes.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/shapes.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * shapes.h: shape classes
+/**
+ * @file  shapes.h
+ * @brief Shape classes: Box, Sphere, Triangle and helpers
  *
  * This file is part of Pyrit Ray Tracer.
  *
--- a/include/simd.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/simd.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * simd.h: abstraction of Intel SSE instruction set
+/**
+ * @file  simd.h
+ * @brief Abstraction of Intel SSE instruction set
  *
  * This file is part of Pyrit Ray Tracer.
  *
--- a/include/vector.h	Tue May 06 09:39:58 2008 +0200
+++ b/include/vector.h	Thu May 08 09:21:25 2008 +0200
@@ -1,5 +1,6 @@
-/*
- * vector.h: Vector class with Colour alias
+/**
+ * @file  vector.h
+ * @brief Vector class with Colour alias
  *
  * This file is part of Pyrit Ray Tracer.
  *
@@ -64,7 +65,7 @@
 
 	bool operator==(const Vector &v) const { return x==v.x && y==v.y && z==v.z; };
 
-	// normalize
+	/** Normalize the vector */
 	Vector normalize()
 	{
 		const Float f = 1.0f / mag();
@@ -72,21 +73,23 @@
 		return *this;
 	};
 
-	// get normalized copy
+	/** Get normalized copy of vector */
 	friend Vector normalize(const Vector &v)
 	{
 		const Float f = 1.0f / v.mag();
 		return v * f;
 	};
 
-	// square magnitude, magnitude
+	/** Square magnitude */
 	Float mag2() const	{ return dot(*this, *this); };
+
+	/** Vector magnitude */
 	Float mag() const	{ return sqrtf(mag2()); };
 
-	// negative
+	/** Get negative vector */
 	Vector operator-() const { return Vector(-x, -y, -z); };
 
-	// accumulate
+	/** Accumulate. Useful for colors. */
 	Vector operator+=(const Vector &v)
 	{
 #ifdef NO_SIMD
@@ -99,7 +102,7 @@
 		return *this;
 	};
 
-	// multiply
+	/** Multiply by scalar */
 	Vector operator*=(const Float &f)
 	{
 		x *= f;
@@ -108,8 +111,7 @@
 		return *this;
 	};
 
-
-	// cut
+	/** Cut with scalar */
 	Vector operator/=(const Float &f)
 	{
 		Float finv = 1.0f / f;
@@ -119,7 +121,7 @@
 		return *this;
 	};
 
-	// sum
+	/** Sum of two vectors */
 	friend Vector operator+(const Vector &a, const Vector &b)
 	{
 #ifdef NO_SIMD
@@ -129,7 +131,7 @@
 #endif
 	};
 
-	// difference
+	/** Difference of two vectors */
 	friend Vector operator-(const Vector &a, const Vector &b)
 	{
 #if defined(NO_SIMD) || defined(MSVC)
@@ -140,13 +142,13 @@
 #endif
 	};
 
-	// dot product
+	/** Dot product */
 	friend Float dot(const Vector &a, const Vector &b)
 	{
 		return a.x * b.x + a.y * b.y + a.z * b.z;
 	};
 
-	// cross product
+	/** Cross product */
 	friend Vector cross(const Vector &a, const Vector &b)
 	{
 		return Vector(a.y * b.z - a.z * b.y,
@@ -154,24 +156,26 @@
 			a.x * b.y - a.y * b.x);
 	};
 
-	// product of vector and scalar
+	/** Get vector multiplied by scalar */
 	friend Vector operator*(const Vector &v, const Float &f)
 	{
 		return Vector(f * v.x, f * v.y, f * v.z);
 	};
 
+	/** Get vector multiplied by scalar */
 	friend Vector operator*(const Float &f, const Vector &v)
 	{
 		return v * f;
 	};
 
-	// scalar division
+	/** Get vector divided by scalar */
 	friend Vector operator/(const Vector &v, const Float &f)
 	{
 		const Float finv = 1.0f / f;
 		return Vector(v.x * finv, v.y * finv, v.z * finv);
 	};
 
+	/** Get f/v, i.e. inverted vector multiplied by scalar */
 	friend Vector operator/(const Float &f, const Vector &v)
 	{
 #ifdef NO_SIMD
@@ -181,20 +185,20 @@
 #endif
 	};
 
-	// vector plus scalar
+	/** Add scalar to the vector */
 	friend Vector operator+(const Vector &v, const Float &f)
 	{
 		return Vector(v.x + f, v.y + f, v.z + f);
 	};
 
-	// vector minus scalar
+	/** Subtract scalar from the vector */
 	friend Vector operator-(const Vector &v, const Float &f)
 	{
 		return Vector(v.x - f, v.y - f, v.z - f);
 	};
 
-	// cell by cell product (only usable for colours)
-	friend Vector operator*(const Vector &a,  const Vector &b)
+	/** Cell by cell product (only useful for colors) */
+	friend Vector operator*(const Vector &a, const Vector &b)
 	{
 #ifdef NO_SIMD
 		return Vector(a.x * b.x, a.y * b.y, a.z * b.z);
@@ -203,13 +207,13 @@
 #endif
 	};
 
-	// write
+	/** Write textual representation of the vector to stream */
 	friend ostream & operator<<(ostream &st, const Vector &v)
 	{
 		return st << "(" << v.x << "," << v.y  << "," << v.z << ")";
 	};
 
-	// read
+	/** Read the vector from stream */
 	friend istream & operator>>(istream &st, Vector &v)
 	{
 		char s[10];
@@ -224,9 +228,13 @@
 	};
 };
 
+/** Colour is a alias name of Vector. */
 typedef Vector Colour;
 
 #ifndef NO_SIMD
+/**
+  * Packet of four Vectors
+  */
 class VectorPacket
 {
 public:
--- a/src/sampler.cc	Tue May 06 09:39:58 2008 +0200
+++ b/src/sampler.cc	Thu May 08 09:21:25 2008 +0200
@@ -303,7 +303,7 @@
 	return true;
 }
 
-void DefaultSampler::saveSample(Sample &samp, Colour &col)
+void DefaultSampler::saveSample(const Sample &samp, const Colour &col)
 {
 	Float *buf = pixmap.getFloatData()
 		+ 3*(samp.sy * pixmap.getWidth() + samp.sx);