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_TEXTURES_IMAGEMAP_H
00029 #define PBRT_TEXTURES_IMAGEMAP_H
00030
00031
00032 #include "pbrt.h"
00033 #include "texture.h"
00034 #include "mipmap.h"
00035 #include "paramset.h"
00036 #include <map>
00037
00038
00039 struct TexInfo {
00040 TexInfo(const string &f, bool dt, float ma, ImageWrap wm, float sc, float ga)
00041 : filename(f), doTrilinear(dt), maxAniso(ma), wrapMode(wm), scale(sc), gamma(ga) { }
00042 string filename;
00043 bool doTrilinear;
00044 float maxAniso;
00045 ImageWrap wrapMode;
00046 float scale, gamma;
00047 bool operator<(const TexInfo &t2) const {
00048 if (filename != t2.filename) return filename < t2.filename;
00049 if (doTrilinear != t2.doTrilinear) return doTrilinear < t2.doTrilinear;
00050 if (maxAniso != t2.maxAniso) return maxAniso < t2.maxAniso;
00051 if (scale != t2.scale) return scale < t2.scale;
00052 if (gamma != t2.gamma) return gamma < t2.gamma;
00053 return wrapMode < t2.wrapMode;
00054 }
00055 };
00056
00057
00058
00059
00060 template <typename Tmemory, typename Treturn>
00061 class ImageTexture : public Texture<Treturn> {
00062 public:
00063
00064 ImageTexture(TextureMapping2D *m, const string &filename, bool doTri,
00065 float maxAniso, ImageWrap wm, float scale, float gamma);
00066 Treturn Evaluate(const DifferentialGeometry &) const;
00067 ~ImageTexture();
00068 static void ClearCache() {
00069 typename std::map<TexInfo, MIPMap<Tmemory> *>::iterator iter;
00070 iter = textures.begin();
00071 while (iter != textures.end()) {
00072 delete iter->second;
00073 ++iter;
00074 }
00075 textures.erase(textures.begin(), textures.end());
00076 }
00077 private:
00078
00079 static MIPMap<Tmemory> *GetTexture(const string &filename,
00080 bool doTrilinear, float maxAniso, ImageWrap wm, float scale, float gamma);
00081 static void convertIn(const RGBSpectrum &from, RGBSpectrum *to,
00082 float scale, float gamma) {
00083 *to = Pow(scale * from, gamma);
00084 }
00085 static void convertIn(const RGBSpectrum &from, float *to,
00086 float scale, float gamma) {
00087 *to = powf(scale * from.y(), gamma);
00088 }
00089 static void convertOut(const RGBSpectrum &from, Spectrum *to) {
00090 float rgb[3];
00091 from.ToRGB(rgb);
00092 *to = Spectrum::FromRGB(rgb);
00093 }
00094 static void convertOut(float from, float *to) {
00095 *to = from;
00096 }
00097
00098
00099 MIPMap<Tmemory> *mipmap;
00100 TextureMapping2D *mapping;
00101 static std::map<TexInfo, MIPMap<Tmemory> *> textures;
00102 };
00103
00104
00105 ImageTexture<float, float> *CreateImageFloatTexture(const Transform &tex2world,
00106 const TextureParams &tp);
00107 ImageTexture<RGBSpectrum, Spectrum> *CreateImageSpectrumTexture(const Transform &tex2world,
00108 const TextureParams &tp);
00109
00110 #endif // PBRT_TEXTURES_IMAGEMAP_H