00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_TEXTURE_H
00024 #define LUX_TEXTURE_H
00025
00026 #include "lux.h"
00027 #include "geometry/transform.h"
00028 #include "spectrum.h"
00029
00030 namespace lux
00031 {
00032
00033
00034 class TextureMapping2D {
00035 public:
00036
00037 virtual ~TextureMapping2D() { }
00038 virtual void Map(const DifferentialGeometry &dg,
00039 float *s, float *t, float *dsdx, float *dtdx,
00040 float *dsdy, float *dtdy) const = 0;
00041 };
00042 class UVMapping2D : public TextureMapping2D {
00043 public:
00044
00045 UVMapping2D(float su = 1, float sv = 1,
00046 float du = 0, float dv = 0);
00047 virtual ~UVMapping2D() { }
00048 virtual void Map(const DifferentialGeometry &dg, float *s, float *t,
00049 float *dsdx, float *dtdx,
00050 float *dsdy, float *dtdy) const;
00051 private:
00052 float su, sv, du, dv;
00053 };
00054 class SphericalMapping2D : public TextureMapping2D {
00055 public:
00056
00057 SphericalMapping2D(const Transform &toSph)
00058 : WorldToTexture(toSph) {
00059 }
00060 virtual ~SphericalMapping2D() { }
00061 virtual void Map(const DifferentialGeometry &dg, float *s, float *t,
00062 float *dsdx, float *dtdx,
00063 float *dsdy, float *dtdy) const;
00064 private:
00065 void sphere(const Point &P, float *s, float *t) const;
00066 Transform WorldToTexture;
00067 };
00068 class
00069 CylindricalMapping2D : public TextureMapping2D {
00070 public:
00071
00072 CylindricalMapping2D(const Transform &toCyl)
00073 : WorldToTexture(toCyl) {
00074 }
00075 virtual ~CylindricalMapping2D() { }
00076 virtual void Map(const DifferentialGeometry &dg, float *s, float *t,
00077 float *dsdx, float *dtdx,
00078 float *dsdy, float *dtdy) const;
00079 private:
00080 void cylinder(const Point &P, float *s, float *t) const;
00081 Transform WorldToTexture;
00082 };
00083 class PlanarMapping2D : public TextureMapping2D {
00084 public:
00085
00086 PlanarMapping2D(const Vector &v1, const Vector &v2,
00087 float du = 0, float dv = 0);
00088 virtual ~PlanarMapping2D() { }
00089 virtual void Map(const DifferentialGeometry &dg, float *s, float *t,
00090 float *dsdx, float *dtdx,
00091 float *dsdy, float *dtdy) const;
00092 private:
00093 Vector vs, vt;
00094 float ds, dt;
00095 };
00096 class TextureMapping3D {
00097 public:
00098
00099 virtual ~TextureMapping3D() { }
00100 virtual Point Map(const DifferentialGeometry &dg,
00101 Vector *dpdx, Vector *dpdy) const = 0;
00102 };
00103 class IdentityMapping3D : public TextureMapping3D {
00104 public:
00105 IdentityMapping3D(const Transform &x)
00106 : WorldToTexture(x) { }
00107 virtual ~IdentityMapping3D() { }
00108 virtual Point Map(const DifferentialGeometry &dg, Vector *dpdx,
00109 Vector *dpdy) const;
00110 void Apply3DTextureMappingOptions(const TextureParams &tp);
00111
00112 Transform WorldToTexture;
00113 };
00114 class EnvironmentMapping {
00115 public:
00116
00117 virtual ~EnvironmentMapping() { }
00118 virtual void Map(const Vector &wh, float *s, float *t) const = 0;
00119 };
00120 class LatLongMapping : public EnvironmentMapping {
00121 public:
00122
00123 LatLongMapping() {}
00124 virtual ~LatLongMapping() { }
00125 virtual void Map(const Vector &wh, float *s, float *t) const;
00126 };
00127 class AngularMapping : public EnvironmentMapping {
00128 public:
00129
00130 AngularMapping() {}
00131 virtual ~AngularMapping() { }
00132 virtual void Map(const Vector &wh, float *s, float *t) const;
00133 };
00134 class VerticalCrossMapping : public EnvironmentMapping {
00135 public:
00136
00137 VerticalCrossMapping() {}
00138 virtual ~VerticalCrossMapping() { }
00139 virtual void Map(const Vector &wh, float *s, float *t) const;
00140 };
00141
00142 template <class T> class Texture {
00143 public:
00144
00145
00146 virtual T Evaluate(const TsPack *tspack, const DifferentialGeometry &) const = 0;
00147 virtual void SetPower(float power, float area) { }
00148 virtual void SetIlluminant() { }
00149 virtual ~Texture() { }
00150 };
00151
00152 float Noise(float x, float y = .5f, float z = .5f);
00153 float Noise(const Point &P);
00154 float FBm(const Point &P, const Vector &dpdx, const Vector &dpdy,
00155 float omega, int octaves);
00156 float Turbulence(const Point &P, const Vector &dpdx, const Vector &dpdy,
00157 float omega, int octaves);
00158 float Lanczos(float, float tau=2);
00159
00160 }
00161
00162 #endif // LUX_TEXTURE_H