00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef PBRT_PARAMSET_H
00025 #define PBRT_PARAMSET_H
00026
00027 #include "pbrt.h"
00028 #include "geometry.h"
00029 #include "texture.h"
00030 #include "color.h"
00031 #include <map>
00032 using std::map;
00033 #if (_MSC_VER >= 1400) // NOBOOK
00034 #include <stdio.h>
00035 #define snprintf _snprintf // NOBOOK
00036 #endif // NOBOOK
00037
00038 #define ADD_PARAM_TYPE(T, vec) \
00039 (vec).push_back(new ParamSetItem<T>(name, (T *)data, nItems))
00040 #define LOOKUP_PTR(vec) \
00041 for (u_int i = 0; i < (vec).size(); ++i) \
00042 if ((vec)[i]->name == name) { \
00043 *nItems = (vec)[i]->nItems; \
00044 (vec)[i]->lookedUp = true; \
00045 return (vec)[i]->data; \
00046 } \
00047 return NULL
00048 #define LOOKUP_ONE(vec) \
00049 for (u_int i = 0; i < (vec).size(); ++i) { \
00050 if ((vec)[i]->name == name && \
00051 (vec)[i]->nItems == 1) { \
00052 (vec)[i]->lookedUp = true; \
00053 return *((vec)[i]->data); \
00054 } } \
00055 return d
00056
00057 class COREDLL ParamSet {
00058 public:
00059
00060 ParamSet() { }
00061 ParamSet &operator=(const ParamSet &p2);
00062 ParamSet(const ParamSet &p2);
00063 void AddFloat(const string &, const float *, int nItems = 1);
00064 void AddInt(const string &,
00065 const int *,
00066 int nItems = 1);
00067 void AddBool(const string &,
00068 const bool *,
00069 int nItems = 1);
00070 void AddPoint(const string &,
00071 const Point *,
00072 int nItems = 1);
00073 void AddVector(const string &,
00074 const Vector *,
00075 int nItems = 1);
00076 void AddNormal(const string &,
00077 const Normal *,
00078 int nItems = 1);
00079 void AddSpectrum(const string &,
00080 const Spectrum *,
00081 int nItems = 1);
00082 void AddString(const string &,
00083 const string *,
00084 int nItems = 1);
00085 void AddTexture(const string &,
00086 const string &);
00087 bool EraseInt(const string &);
00088 bool EraseBool(const string &);
00089 bool EraseFloat(const string &);
00090 bool ErasePoint(const string &);
00091 bool EraseVector(const string &);
00092 bool EraseNormal(const string &);
00093 bool EraseSpectrum(const string &);
00094 bool EraseString(const string &);
00095 bool EraseTexture(const string &);
00096 float FindOneFloat(const string &, float d) const;
00097 int FindOneInt(const string &, int d) const;
00098 bool FindOneBool(const string &, bool d) const;
00099 Point FindOnePoint(const string &, const Point &d) const;
00100 Vector FindOneVector(const string &, const Vector &d) const;
00101 Normal FindOneNormal(const string &, const Normal &d) const;
00102 Spectrum FindOneSpectrum(const string &,
00103 const Spectrum &d) const;
00104 string FindOneString(const string &, const string &d) const;
00105 string FindTexture(const string &) const;
00106 const float *FindFloat(const string &, int *nItems) const;
00107 const int *FindInt(const string &, int *nItems) const;
00108 const bool *FindBool(const string &, int *nItems) const;
00109 const Point *FindPoint(const string &, int *nItems) const;
00110 const Vector *FindVector(const string &, int *nItems) const;
00111 const Normal *FindNormal(const string &, int *nItems) const;
00112 const Spectrum *FindSpectrum(const string &,
00113 int *nItems) const;
00114 const string *FindString(const string &,
00115 int *nItems) const;
00116 void ReportUnused() const;
00117 ~ParamSet() {
00118 Clear();
00119 }
00120 void Clear();
00121 string ToString() const;
00122 private:
00123
00124 vector<ParamSetItem<int> *> ints;
00125 vector<ParamSetItem<bool> *> bools;
00126 vector<ParamSetItem<float> *> floats;
00127 vector<ParamSetItem<Point> *> points;
00128 vector<ParamSetItem<Vector> *> vectors;
00129 vector<ParamSetItem<Normal> *> normals;
00130 vector<ParamSetItem<Spectrum> *> spectra;
00131 vector<ParamSetItem<string> *> strings;
00132 vector<ParamSetItem<string> *> textures;
00133 };
00134 template <class T> struct ParamSetItem {
00135
00136 ParamSetItem<T> *Clone() const {
00137 return new ParamSetItem<T>(name, data, nItems);
00138 }
00139 ParamSetItem(const string &name, const T *val, int nItems = 1);
00140 ~ParamSetItem() {
00141 delete[] data;
00142 }
00143
00144 string name;
00145 int nItems;
00146 T *data;
00147 bool lookedUp;
00148 };
00149
00150 template <class T>
00151 ParamSetItem<T>::ParamSetItem(const string &n,
00152 const T *v,
00153 int ni) {
00154 name = n;
00155 nItems = ni;
00156 data = new T[nItems];
00157 for (int i = 0; i < nItems; ++i)
00158 data[i] = v[i];
00159 lookedUp = false;
00160 }
00161
00162 class COREDLL TextureParams {
00163 public:
00164
00165 TextureParams(const ParamSet &geomp, const ParamSet &matp,
00166 map<string, Reference<Texture<float> > > &ft,
00167 map<string, Reference<Texture<Spectrum> > > &st)
00168 : geomParams(geomp),
00169 materialParams(matp),
00170 floatTextures(ft),
00171 spectrumTextures(st) {
00172 }
00173 Reference<Texture<Spectrum> > GetSpectrumTexture(const string &name,
00174 const Spectrum &def) const;
00175 Reference<Texture<float> > GetFloatTexture(const string &name,
00176 float def) const;
00177 float FindFloat(const string &n, float d) const {
00178 return geomParams.FindOneFloat(n,
00179 materialParams.FindOneFloat(n, d));
00180 }
00181 string FindString(const string &n) const {
00182 return geomParams.FindOneString(n, materialParams.FindOneString(n, ""));
00183 }
00184 int FindInt(const string &n, int d) const {
00185 return geomParams.FindOneInt(n, materialParams.FindOneInt(n, d));
00186 }
00187 bool FindBool(const string &n, bool d) const {
00188 return geomParams.FindOneBool(n, materialParams.FindOneBool(n, d));
00189 }
00190 Point FindPoint(const string &n, const Point &d) const {
00191 return geomParams.FindOnePoint(n, materialParams.FindOnePoint(n, d));
00192 }
00193 Vector FindVector(const string &n, const Vector &d) const {
00194 return geomParams.FindOneVector(n, materialParams.FindOneVector(n, d));
00195 }
00196 Normal FindNormal(const string &n, const Normal &d) const {
00197 return geomParams.FindOneNormal(n, materialParams.FindOneNormal(n, d));
00198 }
00199 Spectrum FindSpectrum(const string &n, const Spectrum &d) const {
00200 return geomParams.FindOneSpectrum(n, materialParams.FindOneSpectrum(n, d));
00201 }
00202 void ReportUnused() const {
00203 geomParams.ReportUnused();
00204 materialParams.ReportUnused();
00205 }
00206 const ParamSet &GetGeomParams() const { return geomParams; }
00207 const ParamSet &GetMaterialParams() const { return materialParams; }
00208 private:
00209
00210 const ParamSet &geomParams, &materialParams;
00211 map<string,
00212 Reference<Texture<float> > > &floatTextures;
00213 map<string,
00214 Reference<Texture<Spectrum> > > &spectrumTextures;
00215 };
00216 #endif // PBRT_PARAMSET_H