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_PARAMSET_H
00029 #define PBRT_CORE_PARAMSET_H
00030
00031
00032 #include "pbrt.h"
00033 #include "geometry.h"
00034 #include "texture.h"
00035 #include "spectrum.h"
00036 #if (_MSC_VER >= 1400)
00037 #include <stdio.h>
00038 #define snprintf _snprintf
00039 #endif
00040 #include <map>
00041 using std::map;
00042
00043
00044 class ParamSet {
00045 public:
00046
00047 ParamSet() { }
00048 void AddFloat(const string &, const float *, int nItems = 1);
00049 void AddInt(const string &, const int *, int nItems);
00050 void AddBool(const string &, const bool *, int nItems);
00051 void AddPoint(const string &, const Point *, int nItems);
00052 void AddVector(const string &, const Vector *, int nItems);
00053 void AddNormal(const string &, const Normal *, int nItems);
00054 void AddString(const string &, const string *, int nItems);
00055 void AddTexture(const string &, const string &);
00056 void AddRGBSpectrum(const string &, const float *, int nItems);
00057 void AddXYZSpectrum(const string &, const float *, int nItems);
00058 void AddBlackbodySpectrum(const string &, const float *, int nItems);
00059 void AddSampledSpectrumFiles(const string &, const char **, int nItems);
00060 void AddSampledSpectrum(const string &, const float *, int nItems);
00061 bool EraseInt(const string &);
00062 bool EraseBool(const string &);
00063 bool EraseFloat(const string &);
00064 bool ErasePoint(const string &);
00065 bool EraseVector(const string &);
00066 bool EraseNormal(const string &);
00067 bool EraseSpectrum(const string &);
00068 bool EraseString(const string &);
00069 bool EraseTexture(const string &);
00070 float FindOneFloat(const string &, float d) const;
00071 int FindOneInt(const string &, int d) const;
00072 bool FindOneBool(const string &, bool d) const;
00073 Point FindOnePoint(const string &, const Point &d) const;
00074 Vector FindOneVector(const string &, const Vector &d) const;
00075 Normal FindOneNormal(const string &, const Normal &d) const;
00076 Spectrum FindOneSpectrum(const string &,
00077 const Spectrum &d) const;
00078 string FindOneString(const string &, const string &d) const;
00079 string FindTexture(const string &) const;
00080 const float *FindFloat(const string &, int *nItems) const;
00081 const int *FindInt(const string &, int *nItems) const;
00082 const bool *FindBool(const string &, int *nItems) const;
00083 const Point *FindPoint(const string &, int *nItems) const;
00084 const Vector *FindVector(const string &, int *nItems) const;
00085 const Normal *FindNormal(const string &, int *nItems) const;
00086 const Spectrum *FindSpectrum(const string &, int *nItems) const;
00087 const string *FindString(const string &, int *nItems) const;
00088 void ReportUnused() const;
00089 void Clear();
00090 string ToString() const;
00091 private:
00092
00093 vector<Reference<ParamSetItem<bool> > > bools;
00094 vector<Reference<ParamSetItem<int> > > ints;
00095 vector<Reference<ParamSetItem<float> > > floats;
00096 vector<Reference<ParamSetItem<Point> > > points;
00097 vector<Reference<ParamSetItem<Vector> > > vectors;
00098 vector<Reference<ParamSetItem<Normal> > > normals;
00099 vector<Reference<ParamSetItem<Spectrum> > > spectra;
00100 vector<Reference<ParamSetItem<string> > > strings;
00101 vector<Reference<ParamSetItem<string> > > textures;
00102 static map<string, Spectrum> cachedSpectra;
00103 };
00104
00105
00106 template <typename T> struct ParamSetItem : public ReferenceCounted {
00107
00108 ParamSetItem(const string &name, const T *val, int nItems = 1);
00109 ~ParamSetItem() {
00110 delete[] data;
00111 }
00112
00113
00114 string name;
00115 int nItems;
00116 T *data;
00117 mutable bool lookedUp;
00118 };
00119
00120
00121
00122
00123 template <typename T>
00124 ParamSetItem<T>::ParamSetItem(const string &n, const T *v, int ni) {
00125 name = n;
00126 nItems = ni;
00127 data = new T[nItems];
00128 for (int i = 0; i < nItems; ++i) data[i] = v[i];
00129 lookedUp = false;
00130 }
00131
00132
00133
00134
00135 class TextureParams {
00136 public:
00137
00138 TextureParams(const ParamSet &geomp, const ParamSet &matp,
00139 map<string, Reference<Texture<float> > > &ft,
00140 map<string, Reference<Texture<Spectrum> > > &st)
00141 : floatTextures(ft), spectrumTextures(st),
00142 geomParams(geomp), materialParams(matp) {
00143 }
00144 Reference<Texture<Spectrum> > GetSpectrumTexture(const string &name,
00145 const Spectrum &def) const;
00146 Reference<Texture<float> > GetFloatTexture(const string &name,
00147 float def) const;
00148 float FindFloat(const string &n, float d) const {
00149 return geomParams.FindOneFloat(n, materialParams.FindOneFloat(n, d));
00150 }
00151 string FindString(const string &n, const string &d = "") const {
00152 return geomParams.FindOneString(n, materialParams.FindOneString(n, d));
00153 }
00154 int FindInt(const string &n, int d) const {
00155 return geomParams.FindOneInt(n, materialParams.FindOneInt(n, d));
00156 }
00157 bool FindBool(const string &n, bool d) const {
00158 return geomParams.FindOneBool(n, materialParams.FindOneBool(n, d));
00159 }
00160 Point FindPoint(const string &n, const Point &d) const {
00161 return geomParams.FindOnePoint(n, materialParams.FindOnePoint(n, d));
00162 }
00163 Vector FindVector(const string &n, const Vector &d) const {
00164 return geomParams.FindOneVector(n, materialParams.FindOneVector(n, d));
00165 }
00166 Normal FindNormal(const string &n, const Normal &d) const {
00167 return geomParams.FindOneNormal(n, materialParams.FindOneNormal(n, d));
00168 }
00169 Spectrum FindSpectrum(const string &n, const Spectrum &d) const {
00170 return geomParams.FindOneSpectrum(n, materialParams.FindOneSpectrum(n, d));
00171 }
00172 void ReportUnused() const {
00173 geomParams.ReportUnused();
00174 materialParams.ReportUnused();
00175 }
00176 const ParamSet &GetGeomParams() const { return geomParams; }
00177 const ParamSet &GetMaterialParams() const { return materialParams; }
00178 private:
00179
00180 map<string, Reference<Texture<float> > > &floatTextures;
00181 map<string, Reference<Texture<Spectrum> > > &spectrumTextures;
00182 const ParamSet &geomParams, &materialParams;
00183 };
00184
00185
00186
00187 #endif // PBRT_CORE_PARAMSET_H