PBRT
|
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