00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#ifndef MEDIA3D_H
00022
#define MEDIA3D_H
00023
00024
#include<vector>
00025
00026
#include "transparenttransformatable.h"
00027
#include "vector.h"
00028
#include "ray.h"
00029
#include "colour.h"
00030
#include "cameraray.h"
00031
#include "lightsource.h"
00032
#include "statistics.h"
00033
#include "pigment3d.h"
00034
00038 class Media3D:
public TransparentTransformatable {
00039
00040
public:
00041
static HitStatistics evaluations;
00042
00043
public:
00044
enum scattertype {
00045 NONE,
00046 ISOTROPIC,
00047 RAYLEIGH,
00048 MIE_HAZY,
00049 MIE_MURKY,
00050 HENYEY_GREENSTEIN
00051 };
00052
00053
enum samplingmethod {
00054 LINEAR,
00055 RECURSIVE
00056 };
00057
00058
public:
00059
Media3D(DBL jitteramouth, CLR tol, FLT variancekeepfactor, samplingmethod m):
00060 jitter(jitteramouth), coltolerance(tol), varkeep(variancekeepfactor),
00061 method(m) {}
00062
00063
virtual ~
Media3D() {}
00064
00065
private:
00066
Media3D& operator=(
const Media3D&);
00067
00068
public:
00071
virtual Media3D*
copy()
const = 0;
00072
00075
Colour sample(DBL start, DBL end,
const CameraRay& r,
Colour& absorb);
00076
00079
void sample(DBL start, DBL end,
const LightRay& r,
Colour& absorb);
00080
00081
public:
00084
virtual Colour evaluateEmit(
const Vector3& p,
const CameraRay& r, CLR allowederror, FLT& ilength)
const = 0;
00085
00088
virtual Colour evaluateAbsorb(
const Vector3& p)
const = 0;
00089
00090
protected:
00091 DBL jitter;
00092 CLR coltolerance;
00093 FLT varkeep;
00094 samplingmethod method;
00095
00096
private:
00097
Colour sampleRecursive(
00098
const CameraRay& ray, DBL l, DBL m, DBL r,
00099
const Colour&,
const Colour&,
const Colour&,
00100
Colour&,
const DBL il);
00101
00102
void sampleRecursive(
const LightRay& ray, DBL l, DBL m, DBL r,
00103
const Colour&,
const Colour&,
const Colour&,
Colour& end_absorb);
00104
00105
Colour simps(
const Colour& c1,
const Colour& c2,
const Colour& c3);
00106
Colour simpsExp(
const Colour& c1,
const Colour& c2,
const Colour& c3,
00107
const Colour& a1,
const Colour& a2,
const Colour& a3,
00108 DBL h);
00109
00110 };
00111
00115 class Media3DSingle :
public Media3D {
00116
00117
public:
00118
Media3DSingle(
const Colour& emitting,
const Colour& absorbing,
00119
const Colour& scattering, scattertype t,
const Scene* s,
00120 DBL jitter, CLR tol, FLT variancekeep, samplingmethod m);
00121
00122 ~
Media3DSingle();
00123
00124
private:
00125
Media3DSingle(
const Media3DSingle&);
00126
00127
public:
00128
00129
void setDensity(
Pigment3D* map) {
delete(density); density = map;}
00130
00131 Media3D*
copy()
const {
return new Media3DSingle(*
this);}
00132
Colour evaluateEmit(
const Vector3& p,
const CameraRay& r, CLR maxerror, FLT& ilength)
const;
00133
Colour evaluateAbsorb(
const Vector3& p)
const;
00134
00135
private:
00136
Colour emit, absorb, scatter;
00137
Pigment3D* density;
00138
const Scene* scene;
00139 scattertype stype;
00140 };
00141
00142
00146 class Media3DMultiple:
public Media3D {
00147
00148
public:
00149
Media3DMultiple(DBL jitteramouth, CLR tol, FLT variancekeep, samplingmethod m);
00150
00151
Media3DMultiple(
const Media3D* m);
00152
00153 ~
Media3DMultiple();
00154
00155
private:
00156
Media3DMultiple(
const Media3DMultiple& m);
00157
00158
public:
00159
00160
void addMedia(
const Media3D* m) {
00161 list.push_back(m);
00162 }
00163
00164
00165 Media3D*
copy()
const {
return new Media3DMultiple(*
this);}
00166
Colour evaluateEmit(
const Vector3& p,
const CameraRay& r, CLR maxerror, FLT& ilength)
const;
00167
Colour evaluateAbsorb(
const Vector3& p)
const;
00168
00169
00170
private:
00171 std::vector<const Media3D*> list;
00172
00173 };
00174
00175
#endif