00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "paramset.h"
00025 #include "error.h"
00026 #include <sstream>
00027 #include <string>
00028
00029 using namespace lux;
00030
00031
00032 ParamSet::ParamSet(const ParamSet &p2) {
00033 *this = p2;
00034 }
00035
00036
00037
00038 ParamSet::ParamSet(int n, const char * pluginName, char* tokens[], char* params[])
00039 {
00040
00041 std::string p(pluginName);
00042
00043 for(int i=0;i<n;i++)
00044 {
00045 std::string s(tokens[i]);
00046
00047 if(s=="xwidth") { std::cout<<*(float*)params[i]<<std::endl; AddFloat(s,(float*)(params[i])); }
00048 if(s=="ywidth") AddFloat(s,(float*)(params[i]));
00049 if(s=="aplha") AddFloat(s,(float*)(params[i]));
00050 if(s=="B") AddFloat(s,(float*)(params[i]));
00051 if(s=="C") AddFloat(s,(float*)(params[i]));
00052 if(s=="tau") AddFloat(s,(float*)(params[i]));
00053 if(s=="hither") AddFloat(s,(float*)(params[i]));
00054 if(s=="yon") AddFloat(s,(float*)(params[i]));
00055 if(s=="shutteropen") AddFloat(s,(float*)(params[i]));
00056 if(s=="shutterclose") AddFloat(s,(float*)(params[i]));
00057 if(s=="lensradius") AddFloat(s,(float*)(params[i]));
00058 if(s=="focaldistance") AddFloat(s,(float*)(params[i]));
00059 if(s=="frameaspectratio") AddFloat(s,(float*)(params[i]));
00060 if(s=="screenwindow") AddFloat(s,(float*)(params[i]),4);
00061 if(s=="fov") AddFloat(s,(float*)(params[i]));
00062 if(s=="cropwindow") AddFloat(s,(float*)(params[i]),4);
00063 if(s=="radius") AddFloat(s,(float*)(params[i]));
00064 if(s=="height") AddFloat(s,(float*)(params[i]));
00065 if(s=="phimax") AddFloat(s,(float*)(params[i]));
00066 if(s=="zmin") AddFloat(s,(float*)(params[i]));
00067 if(s=="zmax") AddFloat(s,(float*)(params[i]));
00068 if(s=="innerradius") AddFloat(s,(float*)(params[i]));
00069 if(s=="uknots") AddFloat(s,(float*)(params[i]),FindOneInt("nu", i)+FindOneInt("uorder", i));
00070 if(s=="vknots") AddFloat(s,(float*)(params[i]),FindOneInt("nv", i)+FindOneInt("vorder", i));
00071 if(s=="u0") AddFloat(s,(float*)(params[i]));
00072 if(s=="v0") AddFloat(s,(float*)(params[i]));
00073 if(s=="u1") AddFloat(s,(float*)(params[i]));
00074 if(s=="v1") AddFloat(s,(float*)(params[i]));
00075 if(s=="Pw") AddFloat(s,(float*)(params[i]),4*FindOneInt("nu", i)*FindOneInt("nv", i));
00076 if(s=="st") AddFloat(s,(float*)(params[i]),2*FindOneInt("nvertices", i));
00077 if(s=="uv") AddFloat(s,(float*)(params[i]),2*FindOneInt("nvertices", i));
00078 if(s=="emptybonus") AddInt(s,(int*)(params[i]));
00079 if(s=="uscale") AddFloat(s,(float*)(params[i]));
00080 if(s=="vscale") AddFloat(s,(float*)(params[i]));
00081 if(s=="udelta") AddFloat(s,(float*)(params[i]));
00082 if(s=="vdelta") AddFloat(s,(float*)(params[i]));
00083 if(s=="v00") AddFloat(s,(float*)(params[i]));
00084 if(s=="v01") AddFloat(s,(float*)(params[i]));
00085 if(s=="v10") AddFloat(s,(float*)(params[i]));
00086 if(s=="v11") AddFloat(s,(float*)(params[i]));
00087 if(s=="maxanisotropy") AddFloat(s,(float*)(params[i]));
00088 if(s=="roughness" && p=="fbm") AddTexture(s,std::string(params[i]));
00089 if(s=="roughness" && p=="wrinkled") AddTexture(s,std::string(params[i]));
00090 if(s=="roughness" && p=="marble") AddTexture(s,std::string(params[i]));
00091 if(s=="variation") AddFloat(s,(float*)(params[i]));
00092 if(s=="g") AddFloat(s,(float*)(params[i]));
00093 if(s=="a") AddFloat(s,(float*)(params[i]));
00094 if(s=="b") AddFloat(s,(float*)(params[i]));
00095 if(s=="density") AddFloat(s,(float*)(params[i]),FindOneInt("nx", i)*FindOneInt("ny", i)*FindOneInt("ny", i));
00096 if(s=="coneangle") AddFloat(s,(float*)(params[i]));
00097 if(s=="conedeltaangle") AddFloat(s,(float*)(params[i]));
00098 if(s=="maxdist") AddFloat(s,(float*)(params[i]));
00099 if(s=="maxerror") AddFloat(s,(float*)(params[i]));
00100 if(s=="stepsize") AddFloat(s,(float*)(params[i]));
00101
00102
00103 if(s=="pixelsamples") AddInt(s,(int*)(params[i]));
00104 if(s=="xsamples") AddInt(s,(int*)(params[i]));
00105 if(s=="ysamples") AddInt(s,(int*)(params[i]));
00106 if(s=="xresolution") AddInt(s,(int*)(params[i]));
00107 if(s=="yresolution") AddInt(s,(int*)(params[i]));
00108 if(s=="writefrequency") AddInt(s,(int*)(params[i]));
00109 if(s=="premultiplyalpha") AddInt(s,(int*)(params[i]));
00110 if(s=="nu") AddInt(s,(int*)(params[i]));
00111 if(s=="nv") AddInt(s,(int*)(params[i]));
00112 if(s=="uorder") AddInt(s,(int*)(params[i]));
00113 if(s=="vorder") AddInt(s,(int*)(params[i]));
00114 if(s=="nlevels") AddInt(s,(int*)(params[i]));
00115 if(s=="indices") AddInt(s,(int*)(params[i]),FindOneInt("nvertices", i));
00116 if(s=="intersectcost") AddInt(s,(int*)(params[i]));
00117 if(s=="traversalcost") AddInt(s,(int*)(params[i]));
00118 if(s=="maxprims") AddInt(s,(int*)(params[i]));
00119 if(s=="maxdepth") AddInt(s,(int*)(params[i]));
00120 if(s=="dimension") AddInt(s,(int*)(params[i]));
00121 if(s=="octaves") AddInt(s,(int*)(params[i]));
00122 if(s=="nx") AddInt(s,(int*)(params[i]));
00123 if(s=="ny") AddInt(s,(int*)(params[i]));
00124 if(s=="nz") AddInt(s,(int*)(params[i]));
00125 if(s=="nsamples") AddInt(s,(int*)(params[i]));
00126 if(s=="causticphotons") AddInt(s,(int*)(params[i]));
00127 if(s=="indirectphotons") AddInt(s,(int*)(params[i]));
00128 if(s=="directphotons") AddInt(s,(int*)(params[i]));
00129 if(s=="nused") AddInt(s,(int*)(params[i]));
00130 if(s=="finalgathersamples") AddInt(s,(int*)(params[i]));
00131 if(s=="maxspeculardepth") AddInt(s,(int*)(params[i]));
00132 if(s=="maxindirectdepth") AddInt(s,(int*)(params[i]));
00133
00134
00135
00136 if(s=="jitter") AddBool(s,(bool*)(params[i]));
00137 if(s=="refineimmediately") AddBool(s,(bool*)(params[i]));
00138 if(s=="trilinear") AddBool(s,(bool*)(params[i]));
00139 if(s=="finalgather") AddBool(s,(bool*)(params[i]));
00140 if(s=="directwithphotons") AddBool(s,(bool*)(params[i]));
00141
00142
00143 if(s=="filename") { string *str=new string(params[i]); std::cout<<*str<<std::endl; AddString(s,str); delete str; }
00144 if(s=="mapping") AddString(s,(string*)(params[i]));
00145 if(s=="wrap") AddString(s,(string*)(params[i]));
00146 if(s=="aamode") AddString(s,(string*)(params[i]));
00147 if(s=="mapname") AddString(s,(string*)(params[i]));
00148 if(s=="strategy") AddString(s,(string*)(params[i]));
00149
00150
00151 if(s=="p1") AddPoint(s,(Point*)(params[i]));
00152 if(s=="p2") AddPoint(s,(Point*)(params[i]));
00153 if(s=="P" && p=="nurbs") AddPoint(s,(Point*)(params[i]),FindOneInt("nu", i)*FindOneInt("nv", i));
00154 if(s=="P" && p=="trianglemesh") AddPoint(s,(Point*)(params[i]),FindOneInt("nvertices", i));
00155 if(s=="p0") AddPoint(s,(Point*)(params[i]));
00156
00157
00158 if(s=="from") { Point *p=new Point((float*)params[i]); AddPoint(s,p); delete p; }
00159 if(s=="to") { Point *p=new Point((float*)params[i]); AddPoint(s,p); delete p; }
00160
00161
00162
00163 if(s=="N") AddNormal(s,(Normal*)(params[i]),FindOneInt("nvertices", i));
00164
00165
00166 if(s=="S") AddVector(s,(Vector*)(params[i]),FindOneInt("nvertices", i));
00167 if(s=="v1") AddVector(s,(Vector*)(params[i]));
00168 if(s=="v2") AddVector(s,(Vector*)(params[i]));
00169 if(s=="updir") AddVector(s,(Vector*)(params[i]));
00170
00171
00172 if(s=="bumpmap") AddTexture(s,std::string(params[i]));
00173 if(s=="Kd") AddTexture(s,std::string(params[i]));
00174 if(s=="sigma") AddTexture(s,std::string(params[i]));
00175 if(s=="Ks") AddTexture(s,std::string(params[i]));
00176 if(s=="roughness" && p=="plastic") AddTexture(s,std::string(params[i]));
00177 if(s=="roughness" && p=="translucent") AddTexture(s,std::string(params[i]));
00178 if(s=="roughness" && p=="shinymetal") AddTexture(s,std::string(params[i]));
00179 if(s=="roughness" && p=="substrate") AddTexture(s,std::string(params[i]));
00180 if(s=="roughness" && p=="uber") AddTexture(s,std::string(params[i]));
00181 if(s=="reflect") AddTexture(s,std::string(params[i]));
00182 if(s=="transmit") AddTexture(s,std::string(params[i]));
00183 if(s=="Kr") AddTexture(s,std::string(params[i]));
00184 if(s=="Kt") AddTexture(s,std::string(params[i]));
00185 if(s=="index") AddTexture(s,std::string(params[i]));
00186 if(s=="uroughness") AddTexture(s,std::string(params[i]));
00187 if(s=="vroughness") AddTexture(s,std::string(params[i]));
00188 if(s=="opacity") AddTexture(s,std::string(params[i]));
00189 if(s=="value") AddTexture(s,std::string(params[i]));
00190 if(s=="tex1") AddTexture(s,std::string(params[i]));
00191 if(s=="tex2") AddTexture(s,std::string(params[i]));
00192 if(s=="amount") AddTexture(s,std::string(params[i]));
00193 if(s=="inside") AddTexture(s,std::string(params[i]));
00194 if(s=="outside") AddTexture(s,std::string(params[i]));
00195
00196
00197 if(s=="sigma_a") AddSpectrum(s, new Spectrum((float*)params[i]));
00198 if(s=="sigma_s") AddSpectrum(s, new Spectrum((float*)params[i]));
00199 if(s=="Le") AddSpectrum(s, new Spectrum((float*)params[i]));
00200 if(s=="L") AddSpectrum(s, new Spectrum((float*)params[i]));
00201 if(s=="I") AddSpectrum(s, new Spectrum((float*)params[i]));
00202 if(s=="tex1") AddSpectrum(s, new Spectrum((float*)params[i]));
00203 if(s=="tex2") AddSpectrum(s, new Spectrum((float*)params[i]));
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213 }
00214 }
00215
00216 ParamSet &ParamSet::operator=(const ParamSet &p2) {
00217 if (&p2 != this) {
00218 Clear();
00219 u_int i;
00220 for (i = 0; i < p2.ints.size(); ++i)
00221 ints.push_back(p2.ints[i]->Clone());
00222 for (i = 0; i < p2.bools.size(); ++i)
00223 bools.push_back(p2.bools[i]->Clone());
00224 for (i = 0; i < p2.floats.size(); ++i)
00225 floats.push_back(p2.floats[i]->Clone());
00226 for (i = 0; i < p2.points.size(); ++i)
00227 points.push_back(p2.points[i]->Clone());
00228 for (i = 0; i < p2.vectors.size(); ++i)
00229 vectors.push_back(p2.vectors[i]->Clone());
00230 for (i = 0; i < p2.normals.size(); ++i)
00231 normals.push_back(p2.normals[i]->Clone());
00232 for (i = 0; i < p2.spectra.size(); ++i)
00233 spectra.push_back(p2.spectra[i]->Clone());
00234 for (i = 0; i < p2.strings.size(); ++i)
00235 strings.push_back(p2.strings[i]->Clone());
00236 for (i = 0; i < p2.textures.size(); ++i)
00237 textures.push_back(p2.textures[i]->Clone());
00238 }
00239 return *this;
00240 }
00241 void ParamSet::AddFloat(const string &name,
00242 const float *data,
00243 int nItems) {
00244 EraseFloat(name);
00245 floats.push_back(new ParamSetItem<float>(name,
00246 data,
00247 nItems));
00248 }
00249 void ParamSet::AddInt(const string &name, const int *data, int nItems) {
00250 EraseInt(name);
00251 ADD_PARAM_TYPE(int, ints);
00252 }
00253 void ParamSet::AddBool(const string &name, const bool *data, int nItems) {
00254 EraseInt(name);
00255 ADD_PARAM_TYPE(bool, bools);
00256 }
00257 void ParamSet::AddPoint(const string &name, const Point *data, int nItems) {
00258 ErasePoint(name);
00259 ADD_PARAM_TYPE(Point, points);
00260 }
00261 void ParamSet::AddVector(const string &name, const Vector *data, int nItems) {
00262 EraseVector(name);
00263 ADD_PARAM_TYPE(Vector, vectors);
00264 }
00265 void ParamSet::AddNormal(const string &name, const Normal *data, int nItems) {
00266 EraseNormal(name);
00267 ADD_PARAM_TYPE(Normal, normals);
00268 }
00269 void ParamSet::AddSpectrum(const string &name, const Spectrum *data, int nItems) {
00270 EraseSpectrum(name);
00271 ADD_PARAM_TYPE(Spectrum, spectra);
00272 }
00273 void ParamSet::AddString(const string &name, const string *data, int nItems) {
00274 EraseString(name);
00275 ADD_PARAM_TYPE(string, strings);
00276 }
00277 void ParamSet::AddTexture(const string &name, const string &value) {
00278 EraseTexture(name);
00279 textures.push_back(new ParamSetItem<string>(name, (string *)&value, 1));
00280 }
00281 bool ParamSet::EraseInt(const string &n) {
00282 for (u_int i = 0; i < ints.size(); ++i)
00283 if (ints[i]->name == n) {
00284 delete ints[i];
00285 ints.erase(ints.begin() + i);
00286 return true;
00287 }
00288 return false;
00289 }
00290 bool ParamSet::EraseBool(const string &n) {
00291 for (u_int i = 0; i < bools.size(); ++i)
00292 if (bools[i]->name == n) {
00293 delete bools[i];
00294 bools.erase(bools.begin() + i);
00295 return true;
00296 }
00297 return false;
00298 }
00299 bool ParamSet::EraseFloat(const string &n) {
00300 for (u_int i = 0; i < floats.size(); ++i)
00301 if (floats[i]->name == n) {
00302 delete floats[i];
00303 floats.erase(floats.begin() + i);
00304 return true;
00305 }
00306 return false;
00307 }
00308 bool ParamSet::ErasePoint(const string &n) {
00309 for (u_int i = 0; i < points.size(); ++i)
00310 if (points[i]->name == n) {
00311 delete points[i];
00312 points.erase(points.begin() + i);
00313 return true;
00314 }
00315 return false;
00316 }
00317 bool ParamSet::EraseVector(const string &n) {
00318 for (u_int i = 0; i < vectors.size(); ++i)
00319 if (vectors[i]->name == n) {
00320 delete vectors[i];
00321 vectors.erase(vectors.begin() + i);
00322 return true;
00323 }
00324 return false;
00325 }
00326 bool ParamSet::EraseNormal(const string &n) {
00327 for (u_int i = 0; i < normals.size(); ++i)
00328 if (normals[i]->name == n) {
00329 delete normals[i];
00330 normals.erase(normals.begin() + i);
00331 return true;
00332 }
00333 return false;
00334 }
00335 bool ParamSet::EraseSpectrum(const string &n) {
00336 for (u_int i = 0; i < spectra.size(); ++i)
00337 if (spectra[i]->name == n) {
00338 delete spectra[i];
00339 spectra.erase(spectra.begin() + i);
00340 return true;
00341 }
00342 return false;
00343 }
00344 bool ParamSet::EraseString(const string &n) {
00345 for (u_int i = 0; i < strings.size(); ++i)
00346 if (strings[i]->name == n) {
00347 delete strings[i];
00348 strings.erase(strings.begin() + i);
00349 return true;
00350 }
00351 return false;
00352 }
00353 bool ParamSet::EraseTexture(const string &n) {
00354 for (u_int i = 0; i < textures.size(); ++i)
00355 if (textures[i]->name == n) {
00356 delete textures[i];
00357 textures.erase(textures.begin() + i);
00358 return true;
00359 }
00360 return false;
00361 }
00362 float ParamSet::FindOneFloat(const string &name,
00363 float d) const {
00364 for (u_int i = 0; i < floats.size(); ++i)
00365 if (floats[i]->name == name &&
00366 floats[i]->nItems == 1) {
00367 floats[i]->lookedUp = true;
00368 return *(floats[i]->data);
00369 }
00370 return d;
00371 }
00372 const float *ParamSet::FindFloat(const string &name,
00373 int *nItems) const {
00374 for (u_int i = 0; i < floats.size(); ++i)
00375 if (floats[i]->name == name) {
00376 *nItems = floats[i]->nItems;
00377 floats[i]->lookedUp = true;
00378 return floats[i]->data;
00379 }
00380 return NULL;
00381 }
00382 const int *ParamSet::FindInt(const string &name, int *nItems) const {
00383 LOOKUP_PTR(ints);
00384 }
00385 const bool *ParamSet::FindBool(const string &name, int *nItems) const {
00386 LOOKUP_PTR(bools);
00387 }
00388 int ParamSet::FindOneInt(const string &name, int d) const {
00389 LOOKUP_ONE(ints);
00390 }
00391 bool ParamSet::FindOneBool(const string &name, bool d) const {
00392 LOOKUP_ONE(bools);
00393 }
00394 const Point *ParamSet::FindPoint(const string &name, int *nItems) const {
00395 LOOKUP_PTR(points);
00396 }
00397 Point ParamSet::FindOnePoint(const string &name, const Point &d) const {
00398 LOOKUP_ONE(points);
00399 }
00400 const Vector *ParamSet::FindVector(const string &name, int *nItems) const {
00401 LOOKUP_PTR(vectors);
00402 }
00403 Vector ParamSet::FindOneVector(const string &name, const Vector &d) const {
00404 LOOKUP_ONE(vectors);
00405 }
00406 const Normal *ParamSet::FindNormal(const string &name, int *nItems) const {
00407 LOOKUP_PTR(normals);
00408 }
00409 Normal ParamSet::FindOneNormal(const string &name, const Normal &d) const {
00410 LOOKUP_ONE(normals);
00411 }
00412 const Spectrum *ParamSet::FindSpectrum(const string &name, int *nItems) const {
00413 LOOKUP_PTR(spectra);
00414 }
00415 Spectrum ParamSet::FindOneSpectrum(const string &name, const Spectrum &d) const {
00416 LOOKUP_ONE(spectra);
00417 }
00418 const string *ParamSet::FindString(const string &name, int *nItems) const {
00419 LOOKUP_PTR(strings);
00420 }
00421 string ParamSet::FindOneString(const string &name, const string &d) const {
00422 LOOKUP_ONE(strings);
00423 }
00424 string ParamSet::FindTexture(const string &name) const {
00425 string d = "";
00426 LOOKUP_ONE(textures);
00427 }
00428 void ParamSet::ReportUnused() const {
00429 #define CHECK_UNUSED(v) \
00430 for (i = 0; i < (v).size(); ++i) \
00431 if (!(v)[i]->lookedUp) \
00432 { \
00433 std::stringstream ss; \
00434 ss<<"Parameter '"<<(v)[i]->name<<"' not used"; \
00435 luxError(LUX_NOERROR,LUX_WARNING,ss.str().c_str()); \
00436 }
00437 u_int i;
00438 CHECK_UNUSED(ints); CHECK_UNUSED(bools);
00439 CHECK_UNUSED(floats); CHECK_UNUSED(points);
00440 CHECK_UNUSED(vectors); CHECK_UNUSED(normals);
00441 CHECK_UNUSED(spectra); CHECK_UNUSED(strings);
00442 CHECK_UNUSED(textures);
00443 }
00444 void ParamSet::Clear() {
00445 #define DEL_PARAMS(name) \
00446 for (u_int i = 0; i < (name).size(); ++i) \
00447 delete (name)[i]; \
00448 (name).erase((name).begin(), (name).end())
00449 DEL_PARAMS(ints); DEL_PARAMS(bools);
00450 DEL_PARAMS(floats); DEL_PARAMS(points);
00451 DEL_PARAMS(vectors); DEL_PARAMS(normals);
00452 DEL_PARAMS(spectra); DEL_PARAMS(strings);
00453 DEL_PARAMS(textures);
00454 #undef DEL_PARAMS
00455 }
00456 string ParamSet::ToString() const {
00457 string ret;
00458 u_int i;
00459 int j;
00460 string typeString;
00461 const int bufLen = 48*1024*1024;
00462 static char *buf = new char[bufLen];
00463 char *bufEnd = buf + bufLen;
00464 for (i = 0; i < ints.size(); ++i) {
00465 char *bufp = buf;
00466 *bufp = '\0';
00467 ParamSetItem<int> *item = ints[i];
00468 typeString = "integer ";
00469
00470 int nPrint = item->nItems;
00471 ret += string("\"");
00472 ret += typeString;
00473 ret += item->name;
00474 ret += string("\"");
00475 ret += string(" [");
00476 for (j = 0; j < nPrint; ++j)
00477 bufp += snprintf(bufp, bufEnd - bufp, "%d ", item->data[j]);
00478 ret += buf;
00479 ret += string("] ");
00480 }
00481 for (i = 0; i < bools.size(); ++i) {
00482 char *bufp = buf;
00483 *bufp = '\0';
00484 ParamSetItem<bool> *item = bools[i];
00485 typeString = "bool ";
00486
00487 int nPrint = item->nItems;
00488 ret += string("\"");
00489 ret += typeString;
00490 ret += item->name;
00491 ret += string("\"");
00492 ret += string(" [");
00493 for (j = 0; j < nPrint; ++j)
00494 bufp += snprintf(bufp, bufEnd - bufp, "\"%s\" ", item->data[j] ? "true" : "false");
00495 ret += buf;
00496 ret += string("] ");
00497 }
00498 for (i = 0; i < floats.size(); ++i) {
00499 char *bufp = buf;
00500 *bufp = '\0';
00501 ParamSetItem<float> *item = floats[i];
00502 typeString = "float ";
00503
00504 int nPrint = item->nItems;
00505 ret += string("\"");
00506 ret += typeString;
00507 ret += item->name;
00508 ret += string("\"");
00509 ret += string(" [");
00510 for (j = 0; j < nPrint; ++j)
00511 bufp += snprintf(bufp, bufEnd - bufp, "%.8g ", item->data[j]);
00512 ret += buf;
00513 ret += string("] ");
00514 }
00515 for (i = 0; i < points.size(); ++i) {
00516 char *bufp = buf;
00517 *bufp = '\0';
00518 ParamSetItem<Point> *item = points[i];
00519 typeString = "point ";
00520
00521 int nPrint = item->nItems;
00522 ret += string("\"");
00523 ret += typeString;
00524 ret += item->name;
00525 ret += string("\"");
00526 ret += string(" [");
00527 for (j = 0; j < nPrint; ++j)
00528 bufp += snprintf(bufp, bufEnd - bufp, "%.8g %.8g %.8g ", item->data[j].x,
00529 item->data[j].y, item->data[j].z);
00530 ret += buf;
00531 ret += string("] ");
00532 }
00533 for (i = 0; i < vectors.size(); ++i) {
00534 char *bufp = buf;
00535 *bufp = '\0';
00536 ParamSetItem<Vector> *item = vectors[i];
00537 typeString = "vector ";
00538
00539 int nPrint = item->nItems;
00540 ret += string("\"");
00541 ret += typeString;
00542 ret += item->name;
00543 ret += string("\"");
00544 ret += string(" [");
00545 for (j = 0; j < nPrint; ++j)
00546 bufp += snprintf(bufp, bufEnd - bufp, "%.8g %.8g %.8g ", item->data[j].x,
00547 item->data[j].y, item->data[j].z);
00548 ret += buf;
00549 ret += string("] ");
00550 }
00551 for (i = 0; i < normals.size(); ++i) {
00552 char *bufp = buf;
00553 *bufp = '\0';
00554 ParamSetItem<Normal> *item = normals[i];
00555 typeString = "normal ";
00556
00557 int nPrint = item->nItems;
00558 ret += string("\"");
00559 ret += typeString;
00560 ret += item->name;
00561 ret += string("\"");
00562 ret += string(" [");
00563 for (j = 0; j < nPrint; ++j)
00564 bufp += snprintf(bufp, bufEnd - bufp, "%.8g %.8g %.8g ", item->data[j].x,
00565 item->data[j].y, item->data[j].z);
00566 ret += buf;
00567 ret += string("] ");
00568 }
00569 for (i = 0; i < strings.size(); ++i) {
00570 char *bufp = buf;
00571 *bufp = '\0';
00572 ParamSetItem<string> *item = strings[i];
00573 typeString = "string ";
00574
00575 int nPrint = item->nItems;
00576 ret += string("\"");
00577 ret += typeString;
00578 ret += item->name;
00579 ret += string("\"");
00580 ret += string(" [");
00581 for (j = 0; j < nPrint; ++j)
00582 bufp += snprintf(bufp, bufEnd - bufp, "\"%s\" ", item->data[j].c_str());
00583 ret += buf;
00584 ret += string("] ");
00585 }
00586 for (i = 0; i < textures.size(); ++i) {
00587 char *bufp = buf;
00588 *bufp = '\0';
00589 ParamSetItem<string> *item = textures[i];
00590 typeString = "texture ";
00591
00592 int nPrint = item->nItems;
00593 ret += string("\"");
00594 ret += typeString;
00595 ret += item->name;
00596 ret += string("\"");
00597 ret += string(" [");
00598 for (j = 0; j < nPrint; ++j)
00599 bufp += snprintf(bufp, bufEnd - bufp, "\"%s\" ", item->data[j].c_str());
00600 ret += buf;
00601 ret += string("] ");
00602 }
00603 for (i = 0; i < spectra.size(); ++i) {
00604 char *bufp = buf;
00605 *bufp = '\0';
00606 ParamSetItem<Spectrum> *item = spectra[i];
00607 typeString = "color ";
00608
00609 int nPrint = item->nItems;
00610 ret += string("\"");
00611 ret += typeString;
00612 ret += item->name;
00613 ret += string("\"");
00614 ret += string(" [");
00615 for (j = 0; j < nPrint; ++j)
00616 bufp += snprintf(bufp, bufEnd - bufp, "%.8g %.8g %.8g ", item->data[j].c[0],
00617 item->data[j].c[1], item->data[j].c[2]);
00618 ret += buf;
00619 ret += string("] ");
00620 }
00621 return ret;
00622 }
00623
00624 boost::shared_ptr<Texture<Spectrum> >
00625 TextureParams::GetSpectrumTexture(const string &n,
00626 const Spectrum &def) const {
00627 string name = geomParams.FindTexture(n);
00628 if (name == "") name = materialParams.FindTexture(n);
00629 if (name != "") {
00630 if (spectrumTextures.find(name) !=
00631 spectrumTextures.end())
00632 return spectrumTextures[name];
00633 else
00634 {
00635
00636
00637 std::stringstream ss;
00638 ss<<"Couldn't find spectrum texture named '"<<n<<"'";
00639 luxError(LUX_BADTOKEN,LUX_ERROR,ss.str().c_str());
00640 }
00641 }
00642 Spectrum val = geomParams.FindOneSpectrum(n,
00643 materialParams.FindOneSpectrum(n, def));
00644 boost::shared_ptr<Texture<Spectrum> > o (new ConstantTexture<Spectrum>(val));
00645 return o;
00646 }
00647 boost::shared_ptr<Texture<float> > TextureParams::GetFloatTexture(const string &n,
00648 float def) const {
00649 string name = geomParams.FindTexture(n);
00650 if (name == "") name = materialParams.FindTexture(n);
00651 if (name != "") {
00652 if (floatTextures.find(name) != floatTextures.end())
00653 return floatTextures[name];
00654 else
00655 {
00656
00657 std::stringstream ss;
00658 ss<<"Couldn't find float texture named '"<<n<<"'";
00659 luxError(LUX_BADTOKEN,LUX_ERROR,ss.str().c_str());
00660 }
00661 }
00662 float val = geomParams.FindOneFloat(n,
00663 materialParams.FindOneFloat(n, def));
00664 boost::shared_ptr<Texture<float> > o (new ConstantTexture<float>(val));
00665 return o;
00666 }