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_PARAMSET_H
00024 #define LUX_PARAMSET_H
00025
00026 #include "lux.h"
00027 #include "texture.h"
00028 #include "color.h"
00029
00030
00031
00032 #include <map>
00033 using std::map;
00034 #if (_MSC_VER >= 1400) // NOBOOK
00035 #include <stdio.h>
00036 #define snprintf _snprintf // NOBOOK
00037 #endif // NOBOOK
00038
00039 #define ADD_PARAM_TYPE(T, vec) \
00040 (vec).push_back(new ParamSetItem<T>(name, (T *)data, nItems))
00041 #define LOOKUP_PTR(vec) \
00042 for (u_int i = 0; i < (vec).size(); ++i) \
00043 if ((vec)[i]->name == name) { \
00044 *nItems = (vec)[i]->nItems; \
00045 (vec)[i]->lookedUp = true; \
00046 return (vec)[i]->data; \
00047 } \
00048 return NULL
00049 #define LOOKUP_ONE(vec) \
00050 for (u_int i = 0; i < (vec).size(); ++i) { \
00051 if ((vec)[i]->name == name && \
00052 (vec)[i]->nItems == 1) { \
00053 (vec)[i]->lookedUp = true; \
00054 return *((vec)[i]->data); \
00055 } } \
00056 return d
00057
00058 namespace lux
00059 {
00060
00061
00062 class ParamSet {
00063 friend class boost::serialization::access;
00064
00065 public:
00066
00067 ParamSet() { }
00068 ParamSet &operator=(const ParamSet &p2);
00069 ParamSet(const ParamSet &p2);
00070 ParamSet(int n, const char * pluginName,char* tokens[], char* params[]);
00071
00072 void Add(ParamSet& params);
00073 void AddFloat(const string &, const float *, int nItems = 1);
00074 void AddInt(const string &,
00075 const int *,
00076 int nItems = 1);
00077 void AddBool(const string &,
00078 const bool *,
00079 int nItems = 1);
00080 void AddPoint(const string &,
00081 const Point *,
00082 int nItems = 1);
00083 void AddVector(const string &,
00084 const Vector *,
00085 int nItems = 1);
00086 void AddNormal(const string &,
00087 const Normal *,
00088 int nItems = 1);
00089 void AddRGBColor(const string &,
00090 const RGBColor *,
00091 int nItems = 1);
00092 void AddString(const string &,
00093 const string *,
00094 int nItems = 1);
00095 void AddTexture(const string &,
00096 const string &);
00097 bool EraseInt(const string &);
00098 bool EraseBool(const string &);
00099 bool EraseFloat(const string &);
00100 bool ErasePoint(const string &);
00101 bool EraseVector(const string &);
00102 bool EraseNormal(const string &);
00103 bool EraseRGBColor(const string &);
00104 bool EraseString(const string &);
00105 bool EraseTexture(const string &);
00106 float FindOneFloat(const string &, float d) const;
00107 int FindOneInt(const string &, int d) const;
00108 bool FindOneBool(const string &, bool d) const;
00109 Point FindOnePoint(const string &, const Point &d) const;
00110 Vector FindOneVector(const string &, const Vector &d) const;
00111 Normal FindOneNormal(const string &, const Normal &d) const;
00112 RGBColor FindOneRGBColor(const string &,
00113 const RGBColor &d) const;
00114 string FindOneString(const string &, const string &d) const;
00115 string FindTexture(const string &) const;
00116 const float *FindFloat(const string &, int *nItems) const;
00117 const int *FindInt(const string &, int *nItems) const;
00118 const bool *FindBool(const string &, int *nItems) const;
00119 const Point *FindPoint(const string &, int *nItems) const;
00120 const Vector *FindVector(const string &, int *nItems) const;
00121 const Normal *FindNormal(const string &, int *nItems) const;
00122 const RGBColor *FindRGBColor(const string &,
00123 int *nItems) const;
00124 const string *FindString(const string &,
00125 int *nItems) const;
00126 void ReportUnused() const;
00127 ~ParamSet() {
00128 Clear();
00129 }
00130 void Clear();
00131 string ToString() const;
00132
00133
00134 private:
00135
00136 vector<ParamSetItem<int> *> ints;
00137 vector<ParamSetItem<bool> *> bools;
00138 vector<ParamSetItem<float> *> floats;
00139 vector<ParamSetItem<Point> *> points;
00140 vector<ParamSetItem<Vector> *> vectors;
00141 vector<ParamSetItem<Normal> *> normals;
00142 vector<ParamSetItem<RGBColor> *> spectra;
00143 vector<ParamSetItem<string> *> strings;
00144 vector<ParamSetItem<string> *> textures;
00145
00146 template<class Archive>
00147 void serialize(Archive & ar, const unsigned int version)
00148 {
00149 ar & ints;
00150 ar & bools;
00151 ar & floats;
00152 ar & points;
00153 ar & vectors;
00154 ar & normals;
00155 ar & spectra;
00156 ar & strings;
00157 ar & textures;
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 };
00183 template <class T> struct ParamSetItem {
00184
00185
00186 ParamSetItem<T> *Clone() const {
00187 return new ParamSetItem<T>(name, data, nItems);
00188 }
00189 ParamSetItem() { data=0; }
00190 ParamSetItem(const string &name, const T *val, int nItems = 1);
00191 ~ParamSetItem() {
00192 delete[] data;
00193 }
00194
00195 template<class Archive>
00196 void save(Archive & ar, const unsigned int version) const
00197 {
00198 ar & name;
00199 ar & nItems;
00200
00201 for(int i=0;i<nItems;i++)
00202 ar & data[i];
00203
00204 ar & lookedUp;
00205 }
00206
00207 template<class Archive>
00208 void load(Archive & ar, const unsigned int version)
00209 {
00210
00211 ar & name;
00212 ar & nItems;
00213 if(data!=0) delete[] data;
00214 data=new T[nItems];
00215 for(int i=0;i<nItems;i++)
00216 ar & data[i];
00217
00218 ar & lookedUp;
00219 }
00220 BOOST_SERIALIZATION_SPLIT_MEMBER()
00221
00222
00223 string name;
00224 int nItems;
00225 T *data;
00226 bool lookedUp;
00227
00228
00229 };
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 template <class T>
00243 inline ParamSetItem<T>::ParamSetItem(const string &n,
00244 const T *v,
00245 int ni) {
00246 name = n;
00247 nItems = ni;
00248 data = new T[nItems];
00249 for (int i = 0; i < nItems; ++i)
00250 data[i] = v[i];
00251 lookedUp = false;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276 class TextureParams {
00277 public:
00278
00279 TextureParams(const ParamSet &geomp, const ParamSet &matp,
00280 map<string, boost::shared_ptr<Texture<float> > > &ft,
00281 map<string, boost::shared_ptr<Texture<SWCSpectrum> > > &st)
00282 : geomParams(geomp),
00283 materialParams(matp),
00284 floatTextures(ft),
00285 SWCSpectrumTextures(st) {
00286 }
00287 boost::shared_ptr<Texture<SWCSpectrum> > GetSWCSpectrumTexture(const string &name,
00288 const RGBColor &def) const;
00289 boost::shared_ptr<Texture<float> > GetFloatTexture(const string &name) const;
00290 boost::shared_ptr<Texture<float> > GetFloatTexture(const string &name,
00291 float def) const;
00292 float FindFloat(const string &n, float d) const {
00293 return geomParams.FindOneFloat(n,
00294 materialParams.FindOneFloat(n, d));
00295 }
00296
00297 const float *FindFloats(const string &n, int *nItems) const {
00298 return geomParams.FindFloat(n, nItems);
00299 }
00300
00301 string FindString(const string &n) const {
00302 return geomParams.FindOneString(n, materialParams.FindOneString(n, ""));
00303 }
00304 int FindInt(const string &n, int d) const {
00305 return geomParams.FindOneInt(n, materialParams.FindOneInt(n, d));
00306 }
00307 bool FindBool(const string &n, bool d) const {
00308 return geomParams.FindOneBool(n, materialParams.FindOneBool(n, d));
00309 }
00310 Point FindPoint(const string &n, const Point &d) const {
00311 return geomParams.FindOnePoint(n, materialParams.FindOnePoint(n, d));
00312 }
00313 Vector FindVector(const string &n, const Vector &d) const {
00314 return geomParams.FindOneVector(n, materialParams.FindOneVector(n, d));
00315 }
00316 Normal FindNormal(const string &n, const Normal &d) const {
00317 return geomParams.FindOneNormal(n, materialParams.FindOneNormal(n, d));
00318 }
00319 RGBColor FindRGBColor(const string &n, const RGBColor &d) const {
00320 return geomParams.FindOneRGBColor(n, materialParams.FindOneRGBColor(n, d));
00321 }
00322 void ReportUnused() const {
00323
00324 materialParams.ReportUnused();
00325 }
00326 const ParamSet &GetGeomParams() const { return geomParams; }
00327 const ParamSet &GetMaterialParams() const { return materialParams; }
00328 private:
00329
00330 const ParamSet &geomParams, &materialParams;
00331 map<string, boost::shared_ptr<Texture<float> > > &floatTextures;
00332 map<string, boost::shared_ptr<Texture<SWCSpectrum> > > &SWCSpectrumTextures;
00333 };
00334
00335 }
00336
00337 #endif // LUX_PARAMSET_H