PBRT
/home/felix/UBC/projects/AdaptiveLightfieldSampling/pbrt_v2/src/core/paramset.h
00001 
00002 /*
00003     pbrt source code Copyright(c) 1998-2012 Matt Pharr and Greg Humphreys.
00004 
00005     This file is part of pbrt.
00006 
00007     Redistribution and use in source and binary forms, with or without
00008     modification, are permitted provided that the following conditions are
00009     met:
00010 
00011     - Redistributions of source code must retain the above copyright
00012       notice, this list of conditions and the following disclaimer.
00013 
00014     - Redistributions in binary form must reproduce the above copyright
00015       notice, this list of conditions and the following disclaimer in the
00016       documentation and/or other materials provided with the distribution.
00017 
00018     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00019     IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00020     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00021     PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00022     HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00023     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00024     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00025     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00026     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00027     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00028     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 
00030  */
00031 
00032 #if defined(_MSC_VER)
00033 #pragma once
00034 #endif
00035 
00036 #ifndef PBRT_CORE_PARAMSET_H
00037 #define PBRT_CORE_PARAMSET_H
00038 
00039 // core/paramset.h*
00040 #include "pbrt.h"
00041 #include "fileutil.h"
00042 #include "geometry.h"
00043 #include "texture.h"
00044 #include "spectrum.h"
00045  #if (_MSC_VER >= 1400)
00046  #include <stdio.h>
00047  #define snprintf _snprintf
00048  #endif
00049 #include <map>
00050 using std::map;
00051 
00052 // ParamSet Declarations
00053 class ParamSet {
00054 public:
00055     // ParamSet Public Methods
00056     ParamSet() { }
00057     void AddFloat(const string &, const float *, int nItems = 1);
00058     void AddInt(const string &, const int *, int nItems);
00059     void AddBool(const string &, const bool *, int nItems);
00060     void AddPoint(const string &, const Point *, int nItems);
00061     void AddVector(const string &, const Vector *, int nItems);
00062     void AddNormal(const string &, const Normal *, int nItems);
00063     void AddString(const string &, const string *, int nItems);
00064     void AddTexture(const string &, const string &);
00065     void AddRGBSpectrum(const string &, const float *, int nItems);
00066     void AddXYZSpectrum(const string &, const float *, int nItems);
00067     void AddBlackbodySpectrum(const string &, const float *, int nItems);
00068     void AddSampledSpectrumFiles(const string &, const char **, int nItems);
00069     void AddSampledSpectrum(const string &, const float *, int nItems);
00070     bool EraseInt(const string &);
00071     bool EraseBool(const string &);
00072     bool EraseFloat(const string &);
00073     bool ErasePoint(const string &);
00074     bool EraseVector(const string &);
00075     bool EraseNormal(const string &);
00076     bool EraseSpectrum(const string &);
00077     bool EraseString(const string &);
00078     bool EraseTexture(const string &);
00079     float FindOneFloat(const string &, float d) const;
00080     int FindOneInt(const string &, int d) const;
00081     bool FindOneBool(const string &, bool d) const;
00082     Point FindOnePoint(const string &, const Point &d) const;
00083     Vector FindOneVector(const string &, const Vector &d) const;
00084     Normal FindOneNormal(const string &, const Normal &d) const;
00085     Spectrum FindOneSpectrum(const string &,
00086                              const Spectrum &d) const;
00087     string FindOneString(const string &, const string &d) const;
00088     string FindOneFilename(const string &, const string &d) const;
00089     string FindTexture(const string &) const;
00090     const float *FindFloat(const string &, int *nItems) const;
00091     const int *FindInt(const string &, int *nItems) const;
00092     const bool *FindBool(const string &, int *nItems) const;
00093     const Point *FindPoint(const string &, int *nItems) const;
00094     const Vector *FindVector(const string &, int *nItems) const;
00095     const Normal *FindNormal(const string &, int *nItems) const;
00096     const Spectrum *FindSpectrum(const string &, int *nItems) const;
00097     const string *FindString(const string &, int *nItems) const;
00098     void ReportUnused() const;
00099     void Clear();
00100     string ToString() const;
00101     
00102 private:
00103     // ParamSet Private Data
00104     vector<Reference<ParamSetItem<bool> > > bools;
00105     vector<Reference<ParamSetItem<int> > > ints;
00106     vector<Reference<ParamSetItem<float> > > floats;
00107     vector<Reference<ParamSetItem<Point> > > points;
00108     vector<Reference<ParamSetItem<Vector> > > vectors;
00109     vector<Reference<ParamSetItem<Normal> > > normals;
00110     vector<Reference<ParamSetItem<Spectrum> > > spectra;
00111     vector<Reference<ParamSetItem<string> > > strings;
00112     vector<Reference<ParamSetItem<string> > > textures;
00113     static map<string, Spectrum> cachedSpectra;
00114 };
00115 
00116 
00117 template <typename T> struct ParamSetItem : public ReferenceCounted {
00118     // ParamSetItem Public Methods
00119     ParamSetItem(const string &name, const T *val, int nItems = 1);
00120     ~ParamSetItem() {
00121         delete[] data;
00122     }
00123 
00124     // ParamSetItem Data
00125     string name;
00126     int nItems;
00127     T *data;
00128     mutable bool lookedUp;
00129 };
00130 
00131 
00132 
00133 // ParamSetItem Methods
00134 template <typename T>
00135 ParamSetItem<T>::ParamSetItem(const string &n, const T *v, int ni) {
00136     name = n;
00137     nItems = ni;
00138     data = new T[nItems];
00139     for (int i = 0; i < nItems; ++i) data[i] = v[i];
00140     lookedUp = false;
00141 }
00142 
00143 
00144 
00145 // TextureParams Declarations
00146 class TextureParams {
00147 public:
00148     // TextureParams Public Methods
00149     TextureParams(const ParamSet &geomp, const ParamSet &matp,
00150                   map<string, Reference<Texture<float> > > &ft,
00151                   map<string, Reference<Texture<Spectrum> > > &st)
00152         : floatTextures(ft), spectrumTextures(st),
00153           geomParams(geomp), materialParams(matp) {
00154     }
00155     Reference<Texture<Spectrum> > GetSpectrumTexture(const string &name,
00156             const Spectrum &def) const;
00157     Reference<Texture<float> > GetFloatTexture(const string &name,
00158             float def) const;
00159     float FindFloat(const string &n, float d) const {
00160         return geomParams.FindOneFloat(n, materialParams.FindOneFloat(n, d));
00161     }
00162     string FindString(const string &n, const string &d = "") const {
00163            return geomParams.FindOneString(n, materialParams.FindOneString(n, d));
00164     }
00165     string FindFilename(const string &n, const string &d = "") const {
00166            return geomParams.FindOneFilename(n, materialParams.FindOneFilename(n, d));
00167     }
00168     int FindInt(const string &n, int d) const {
00169            return geomParams.FindOneInt(n, materialParams.FindOneInt(n, d));
00170     }
00171     bool FindBool(const string &n, bool d) const {
00172            return geomParams.FindOneBool(n, materialParams.FindOneBool(n, d));
00173     }
00174     Point FindPoint(const string &n, const Point &d) const {
00175            return geomParams.FindOnePoint(n, materialParams.FindOnePoint(n, d));
00176     }
00177     Vector FindVector(const string &n, const Vector &d) const {
00178            return geomParams.FindOneVector(n, materialParams.FindOneVector(n, d));
00179     }
00180     Normal FindNormal(const string &n, const Normal &d) const {
00181            return geomParams.FindOneNormal(n, materialParams.FindOneNormal(n, d));
00182     }
00183     Spectrum FindSpectrum(const string &n, const Spectrum &d) const {
00184            return geomParams.FindOneSpectrum(n, materialParams.FindOneSpectrum(n, d));
00185     }
00186     void ReportUnused() const {
00187         geomParams.ReportUnused();
00188         materialParams.ReportUnused();
00189     }
00190     const ParamSet &GetGeomParams() const { return geomParams; }
00191     const ParamSet &GetMaterialParams() const { return materialParams; }
00192 private:
00193     // TextureParams Private Data
00194     map<string, Reference<Texture<float> > > &floatTextures;
00195     map<string, Reference<Texture<Spectrum> > > &spectrumTextures;
00196     const ParamSet &geomParams, &materialParams;
00197 };
00198 
00199 
00200 
00201 #endif // PBRT_CORE_PARAMSET_H