00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if defined(_MSC_VER)
00025 #pragma once
00026 #endif
00027
00028 #ifndef PBRT_CORE_TEXTURE_H
00029 #define PBRT_CORE_TEXTURE_H
00030
00031
00032 #include "pbrt.h"
00033 #include "spectrum.h"
00034 #include "geometry.h"
00035 #include "transform.h"
00036 #include "memory.h"
00037
00038
00039 class TextureMapping2D {
00040 public:
00041
00042 virtual ~TextureMapping2D() { }
00043 virtual void Map(const DifferentialGeometry &dg,
00044 float *s, float *t, float *dsdx, float *dtdx,
00045 float *dsdy, float *dtdy) const = 0;
00046 };
00047
00048
00049 class UVMapping2D : public TextureMapping2D {
00050 public:
00051
00052 UVMapping2D(float su = 1, float sv = 1, float du = 0, float dv = 0);
00053 void Map(const DifferentialGeometry &dg, float *s, float *t,
00054 float *dsdx, float *dtdx, float *dsdy, float *dtdy) const;
00055 private:
00056 float su, sv, du, dv;
00057 };
00058
00059
00060 class SphericalMapping2D : public TextureMapping2D {
00061 public:
00062
00063 SphericalMapping2D(const Transform &toSph)
00064 : WorldToTexture(toSph) {
00065 }
00066 void Map(const DifferentialGeometry &dg, float *s, float *t,
00067 float *dsdx, float *dtdx,
00068 float *dsdy, float *dtdy) const;
00069 private:
00070 void sphere(const Point &P, float *s, float *t) const;
00071 Transform WorldToTexture;
00072 };
00073
00074
00075 class CylindricalMapping2D : public TextureMapping2D {
00076 public:
00077
00078 CylindricalMapping2D(const Transform &toCyl)
00079 : WorldToTexture(toCyl) {
00080 }
00081 void Map(const DifferentialGeometry &dg, float *s, float *t,
00082 float *dsdx, float *dtdx, float *dsdy, float *dtdy) const;
00083 private:
00084
00085 void cylinder(const Point &p, float *s, float *t) const {
00086 Vector vec = Normalize(WorldToTexture(p) - Point(0,0,0));
00087 *s = (M_PI + atan2f(vec.y, vec.x)) / (2.f * M_PI);
00088 *t = vec.z;
00089 }
00090 Transform WorldToTexture;
00091 };
00092
00093
00094 class PlanarMapping2D : public TextureMapping2D {
00095 public:
00096
00097 void Map(const DifferentialGeometry &dg, float *s, float *t,
00098 float *dsdx, float *dtdx, float *dsdy, float *dtdy) const;
00099 PlanarMapping2D(const Vector &vv1, const Vector &vv2,
00100 float dds = 0, float ddt = 0)
00101 : vs(vv1), vt(vv2), ds(dds), dt(ddt) { }
00102 private:
00103 const Vector vs, vt;
00104 const float ds, dt;
00105 };
00106
00107
00108 class TextureMapping3D {
00109 public:
00110
00111 virtual ~TextureMapping3D() { }
00112 virtual Point Map(const DifferentialGeometry &dg,
00113 Vector *dpdx, Vector *dpdy) const = 0;
00114 };
00115
00116
00117 class IdentityMapping3D : public TextureMapping3D {
00118 public:
00119 IdentityMapping3D(const Transform &x)
00120 : WorldToTexture(x) { }
00121 Point Map(const DifferentialGeometry &dg, Vector *dpdx,
00122 Vector *dpdy) const;
00123 private:
00124 Transform WorldToTexture;
00125 };
00126
00127
00128 template <typename T> class Texture : public ReferenceCounted {
00129 public:
00130
00131 virtual T Evaluate(const DifferentialGeometry &) const = 0;
00132 virtual ~Texture() { }
00133 };
00134
00135
00136 float Lanczos(float, float tau=2);
00137 float Noise(float x, float y = .5f, float z = .5f);
00138 float Noise(const Point &P);
00139 float FBm(const Point &P, const Vector &dpdx, const Vector &dpdy,
00140 float omega, int octaves);
00141 float Turbulence(const Point &P, const Vector &dpdx, const Vector &dpdy,
00142 float omega, int octaves);
00143
00144 #endif // PBRT_CORE_TEXTURE_H