Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages   Examples  

node/fields.cpp

Go to the documentation of this file.
00001 #include "fields.h"
00002 
00007 #include <math/vector3.h>
00008 #include <math/matrix4.h>
00009 #include <math/bbox.h>
00010 
00011 #include <glt/color.h>
00012 #include <glt/light.h>
00013 #include <glt/material.h>
00014 #include <glt/viewport.h>
00015 
00016 #include <misc/string.h>
00017 
00018 #include <glutm/glut.h>
00019 
00020 #include <iostream>
00021 #include <fstream>
00022 #include <cstdio>
00023 using namespace std;
00024 
00026 
00027 GltFields::GltFields(const string &name)
00028 : GltField(name)
00029 {
00030     _fields.reserve(5);     // Conserve memory
00031 }
00032 
00033 GltFields::GltFields(const GltFields &other)
00034 : GltField(other.name()), _fields(other._fields)
00035 {
00036 }
00037 
00038 GltFields::~GltFields()
00039 {
00040 }
00041 
00042 GltFields &
00043 GltFields::operator=(const GltFields &fields)
00044 {
00045     if (this!=&fields)
00046     {
00047         GltField::operator=(fields);
00048         _fields = fields._fields;
00049     }
00050     return *this;
00051 }
00052 
00053 void 
00054 GltFields::add(bool &val,const string &name)
00055 {
00056     _fields.push_back(GltFieldPtr(new GltFieldBool(val,name)));
00057 }
00058 
00059 void 
00060 GltFields::add(int &val,const string &name)
00061 {
00062     _fields.push_back(GltFieldPtr(new GltFieldInt(val,name)));
00063 }
00064 
00065 void 
00066 GltFields::add(float &val,const string &name)
00067 {
00068     _fields.push_back(GltFieldPtr(new GltFieldFloat(val,0.1,name)));
00069 }
00070 
00071 void 
00072 GltFields::add(float &val,const float step,const string &name)
00073 {
00074     _fields.push_back(GltFieldPtr(new GltFieldFloat(val,step,name)));
00075 }
00076 
00077 void 
00078 GltFields::add(double &val,const string &name)
00079 {
00080     _fields.push_back(GltFieldPtr(new GltFieldDouble(val,0.1,name)));
00081 }
00082 
00083 void 
00084 GltFields::add(double &val,const double step,const string &name)
00085 {
00086     _fields.push_back(GltFieldPtr(new GltFieldDouble(val,step,name)));
00087 }
00088 
00089 void 
00090 GltFields::add(string &val,const string &name)
00091 {
00092     _fields.push_back(GltFieldPtr(new GltFieldString(val,name)));
00093 }
00094 
00095 void 
00096 GltFields::add(Vector &val,const string &name)
00097 {
00098     GltFields *root = new GltFields(name);
00099     _fields.push_back(GltFieldPtr(root));
00100 
00101     root->add(val.x(),1.0,"x");
00102     root->add(val.y(),1.0,"y");
00103     root->add(val.z(),1.0,"z");
00104 }
00105 
00106 void 
00107 GltFields::add(Matrix &val,const string &name)
00108 {
00109     GltFields *root = new GltFields(name);
00110     _fields.push_back(GltFieldPtr(root));
00111 
00112     root->add(val[ 0],1.0,"00");
00113     root->add(val[ 1],1.0,"01");
00114     root->add(val[ 2],1.0,"02");
00115     root->add(val[ 3],1.0,"03");
00116     root->add(val[ 4],1.0,"04");
00117     root->add(val[ 5],1.0,"05");
00118     root->add(val[ 6],1.0,"06");
00119     root->add(val[ 7],1.0,"07");
00120     root->add(val[ 8],1.0,"08");
00121     root->add(val[ 9],1.0,"09");
00122     root->add(val[10],1.0,"10");
00123     root->add(val[11],1.0,"11");
00124     root->add(val[12],1.0,"12");
00125     root->add(val[13],1.0,"13");
00126     root->add(val[14],1.0,"14");
00127     root->add(val[15],1.0,"15");
00128 }
00129 
00130 void 
00131 GltFields::add(BoundingBox &val,const string &name)
00132 {
00133     GltFields *root = new GltFields(name);
00134     _fields.push_back(GltFieldPtr(root));
00135 
00136     root->add(val.defined(),"defined");
00137     root->add(val.min()    ,"min");
00138     root->add(val.max()    ,"max");
00139 }
00140 
00141 void 
00142 GltFields::add(GltColor &val,const string &name)
00143 {
00144     GltFields *root = new GltFields(name);
00145     _fields.push_back(GltFieldPtr(root));
00146 
00147     root->add(val.red()   ,0.05,"red"   );
00148     root->add(val.green() ,0.05,"green" );
00149     root->add(val.blue()  ,0.05,"blue"  );
00150     root->add(val.alpha() ,0.05,"alpha" );
00151 }
00152 
00153 void 
00154 GltFields::add(GltLight &val,const string &name)
00155 {
00156     GltFields *root = new GltFields(name);
00157     _fields.push_back(GltFieldPtr(root));
00158 
00159     root->add(val.enabled(),      "enabled");
00160     root->add(val.ambient(),      "ambient");
00161     root->add(val.diffuse(),      "diffuse");
00162     root->add(val.specular(),     "specular");
00163     root->add(val.position(),     "position");
00164     root->add(val.spotDirection(),"spotDirection");
00165     root->add(val.spotExponent(), "spotExponent");
00166     root->add(val.spotCutoff(),   "spotCutoff");
00167 
00168     GltFields *atten = new GltFields("attenuation");
00169     atten->add(val.attenutationConstant() ,"constant");
00170     atten->add(val.attenutationLinear()   ,"linear");
00171     atten->add(val.attenutationQuadratic(),"quadratic");
00172 
00173     root->add(atten);
00174 }
00175 
00176 void 
00177 GltFields::add(GltMaterial &val,const string &name)
00178 {
00179     GltFields *root = new GltFields(name);
00180     _fields.push_back(GltFieldPtr(root));
00181 
00182     root->add(val.ambient(),  "ambient");
00183     root->add(val.diffuse(),  "diffuse");
00184     root->add(val.specular(), "specular");
00185     root->add(val.emission(), "emission");
00186     root->add(val.shininess(),"shininess");
00187 }
00188 
00189 void 
00190 GltFields::add(GltViewport &val,const string &name)
00191 {
00192     GltFields *root = new GltFields(name);
00193     _fields.push_back(GltFieldPtr(root));
00194 
00195     root->add(val.x()     ,"x"     );
00196     root->add(val.y()     ,"y"     );
00197     root->add(val.width() ,"width" );
00198     root->add(val.height(),"height");
00199 }
00200 
00201 void
00202 GltFields::add(int &val,const int max,const string *labels,const string &name)
00203 {
00204     _fields.push_back(GltFieldPtr(new GltFieldEnum(val,max,labels,name)));  
00205 }
00206 
00207 void 
00208 GltFields::add(const GltFieldPtr &field)
00209 {
00210     _fields.push_back(field);
00211 }
00212 
00213 void 
00214 GltFields::add(const GltFieldPtr &field,const std::string &rename)
00215 {
00216     _fields.push_back(field);
00217     if (GltFields *f = dynamic_cast<GltFields *>(_fields.back().get()))
00218         f->name() = rename;
00219 }
00220 
00221 void 
00222 GltFields::add(GltField *field)
00223 {
00224     _fields.push_back(field);
00225 }
00226 
00227 bool
00228 GltFields::reset()
00229 {
00230     bool ok = true;
00231     for (uint32 i=0; i<_fields.size(); i++)
00232         ok &= _fields[i]->reset();
00233     return ok;
00234 }
00235 
00236 void 
00237 GltFields::merge(const GltFieldPtr &root)
00238 {
00239     const GltFields *fields = dynamic_cast<const GltFields *>(root.get());
00240 
00241     if (fields)
00242     {
00243         for (uint32 i=0; i<fields->_fields.size(); i++)
00244             add(fields->_fields[i]);
00245     }
00246     else
00247         add(root);
00248 }
00249 
00250 bool 
00251 GltFields::write(ostream &os,const string &prefix) const
00252 {
00253     bool ok = true;
00254 
00255     const string p = (prefix.size() ? prefix + "." + name() : name());
00256 
00257     for (uint32 i=0; i<_fields.size(); i++)
00258         ok &= _fields[i]->write(os,p);
00259 
00260     return ok;
00261 }
00262 
00264 
00265 GltFields::GltFieldBool::GltFieldBool(bool &val,const string &name)
00266 : GltField(name), _val(val), _default(val)
00267 {
00268 }
00269 
00270 GltFields::GltFieldBool::GltFieldBool(const GltFieldBool &field)
00271 : GltField(field), _val(field._val),  _default(field._val)
00272 {
00273 }
00274 
00275 GltFields::GltFieldBool::~GltFieldBool()
00276 {
00277 }
00278 
00279       bool &GltFields::GltFieldBool::val()       { return _val; }
00280 const bool &GltFields::GltFieldBool::val() const { return _val; }
00281 
00282 string 
00283 GltFields::GltFieldBool::get() const 
00284 { 
00285     return _val ? "true" : "false"; 
00286 }
00287 
00288 bool   
00289 GltFields::GltFieldBool::set(const std::string &value) 
00290 { 
00291     _val = !(value.length()==0 || value=="0" || value=="no" || value=="false");
00292     return true;
00293 }
00294 
00295 bool 
00296 GltFields::GltFieldBool::reset()
00297 {
00298     _val = _default;
00299     return true;
00300 }
00301 
00302 bool
00303 GltFields::GltFieldBool::isDefault() const
00304 { 
00305     return _val==_default;
00306 }
00307 
00309 
00310 GltFields::GltFieldDouble::GltFieldDouble(double &val,const double step,const string &name)
00311 : GltField(name), 
00312   _val(val), 
00313   _step(step),
00314   _default(val)
00315 {
00316 }
00317 
00318 GltFields::GltFieldDouble::GltFieldDouble(const GltFieldDouble &field)
00319 : GltField(field),
00320   _val(field._val), 
00321   _step(field._step),
00322   _default(field._val)
00323 {
00324 }
00325 
00326 GltFields::GltFieldDouble::~GltFieldDouble()
00327 {
00328 }
00329 
00330       double &GltFields::GltFieldDouble::val()       { return _val; }
00331 const double &GltFields::GltFieldDouble::val() const { return _val; }
00332 
00333 string 
00334 GltFields::GltFieldDouble::get() const 
00335 { 
00336     char buffer[1024];
00337     sprintf(buffer,"%8.6lf",_val);
00338     return buffer;
00339 }
00340 
00341 bool   
00342 GltFields::GltFieldDouble::set(const std::string &value) 
00343 { 
00344     _val = atof(value);
00345     return true;
00346 }
00347 
00348 bool 
00349 GltFields::GltFieldDouble::reset()
00350 {
00351     _val = _default;
00352     return true;
00353 }
00354 
00355 bool
00356 GltFields::GltFieldDouble::isDefault() const
00357 { 
00358     return _val==_default;
00359 }
00360 
00361 GltFields::GltFieldDouble &
00362 GltFields::GltFieldDouble::operator++()
00363 {
00364     _val += _step;
00365     return *this;
00366 }
00367 
00368 GltFields::GltFieldDouble &
00369 GltFields::GltFieldDouble::operator--()
00370 {
00371     _val -= _step;
00372     return *this;
00373 }
00374 
00376 
00377 GltFields::GltFieldFloat::GltFieldFloat(float &val,const float step,const string &name)
00378 : GltField(name), 
00379   _val(val), 
00380   _step(step),
00381   _default(val) 
00382 {
00383 }
00384 
00385 GltFields::GltFieldFloat::GltFieldFloat(const GltFieldFloat &field)
00386 : GltField(field), 
00387   _val(field._val),  
00388   _step(field._step),
00389   _default(field._val) 
00390 {
00391 }
00392 
00393 GltFields::GltFieldFloat::~GltFieldFloat()
00394 {
00395 }
00396 
00397       float &GltFields::GltFieldFloat::val()       { return _val; }
00398 const float &GltFields::GltFieldFloat::val() const { return _val; }
00399 
00400 string 
00401 GltFields::GltFieldFloat::get() const 
00402 { 
00403     char buffer[1024];
00404     sprintf(buffer,"%8.6f",_val);
00405     return buffer;
00406 }
00407 
00408 bool   
00409 GltFields::GltFieldFloat::set(const std::string &value) 
00410 { 
00411     _val = atof(value);
00412     return true;
00413 }
00414 
00415 bool 
00416 GltFields::GltFieldFloat::reset()
00417 {
00418     _val = _default;
00419     return true;
00420 }
00421 
00422 bool
00423 GltFields::GltFieldFloat::isDefault() const
00424 { 
00425     return _val==_default;
00426 }
00427 
00428 GltFields::GltFieldFloat &
00429 GltFields::GltFieldFloat::operator++()
00430 {
00431     _val += _step;
00432     return *this;
00433 }
00434 
00435 GltFields::GltFieldFloat &
00436 GltFields::GltFieldFloat::operator--()
00437 {
00438     _val -= _step;
00439     return *this;
00440 }
00441 
00443 
00444 GltFields::GltFieldInt::GltFieldInt(int &val,const string &name)
00445 : GltField(name), 
00446   _val(val), 
00447   _default(val)
00448 {
00449 }
00450 
00451 GltFields::GltFieldInt::GltFieldInt(const GltFieldInt &field)
00452 : GltField(field.name()), 
00453   _val(field._val),  
00454   _default(field._val)
00455 {
00456 }
00457 
00458 GltFields::GltFieldInt::~GltFieldInt()
00459 {
00460 }
00461 
00462       int &GltFields::GltFieldInt::val()       { return _val; }
00463 const int &GltFields::GltFieldInt::val() const { return _val; }
00464 
00465 string 
00466 GltFields::GltFieldInt::get() const
00467 {
00468     char buffer[100];
00469     sprintf(buffer,"%d",_val);
00470     return buffer;
00471 }
00472 
00473 bool   
00474 GltFields::GltFieldInt::set(const std::string &value) 
00475 { 
00476     _val = atoi(value);
00477     return true;
00478 }
00479 
00480 bool 
00481 GltFields::GltFieldInt::reset()
00482 {
00483     _val = _default;
00484     return true;
00485 }
00486 
00487 bool
00488 GltFields::GltFieldInt::isDefault() const
00489 { 
00490     return _val==_default;
00491 }
00492 
00493 //
00494 
00495 GltFields::GltFieldString::GltFieldString(string &val,const string &name)
00496 : GltField(name), _val(val), _default(val)
00497 {
00498 }
00499 
00500 GltFields::GltFieldString::GltFieldString(const GltFieldString &other)
00501 : GltField(other), _val(other._val),  _default(other._val)
00502 {
00503 }
00504 
00505 GltFields::GltFieldString::~GltFieldString()
00506 {
00507 }
00508 
00509       string &GltFields::GltFieldString::val()       { return _val; }
00510 const string &GltFields::GltFieldString::val() const { return _val; }
00511 
00512 string 
00513 GltFields::GltFieldString::get() const
00514 {
00515     return _val;
00516 }
00517 
00518 bool   
00519 GltFields::GltFieldString::set(const std::string &value) 
00520 { 
00521     _val = value;
00522     return true;
00523 }
00524 
00525 bool 
00526 GltFields::GltFieldString::reset()
00527 {
00528     _val = _default;
00529     return true;
00530 }
00531 
00532 bool
00533 GltFields::GltFieldString::isDefault() const
00534 { 
00535     return _val==_default;
00536 }
00537 
00539 
00540 GltFields::GltFieldEnum::GltFieldEnum(int &val,const int max,const string *labels,const string &name)
00541 : GltField(name), _val(val), _default(val), _max(max), _labels(labels)
00542 {
00543 }
00544 
00545 GltFields::GltFieldEnum::GltFieldEnum(const GltFieldEnum &field)
00546 : GltField(field.name()), _val(field._val),  _default(field._val), _max(field._max), _labels(field._labels)
00547 {
00548 }
00549 
00550 GltFields::GltFieldEnum::~GltFieldEnum()
00551 {
00552 }
00553 
00554       int &GltFields::GltFieldEnum::val()       { return _val; }
00555 const int &GltFields::GltFieldEnum::val() const { return _val; }
00556 
00557 string 
00558 GltFields::GltFieldEnum::get() const
00559 {
00560     assert(_val>=0 && _val<_max);
00561     return _labels[_val];
00562 }
00563 
00564 bool   
00565 GltFields::GltFieldEnum::set(const std::string &value) 
00566 { 
00567     for (int i=0; i<_max; i++)
00568         if (_labels[i]==value)
00569         {
00570             _val = i;
00571             return true;
00572         }
00573 
00574     return false;
00575 }
00576 
00577 bool 
00578 GltFields::GltFieldEnum::reset()
00579 {
00580     _val = _default;
00581     return true;
00582 }
00583 
00584 bool
00585 GltFields::GltFieldEnum::isDefault() const
00586 { 
00587     return _val==_default;
00588 }
00589 
00590 GltFields::GltFieldEnum &
00591 GltFields::GltFieldEnum::operator++()
00592 {
00593     if (_val+1<_max) 
00594         _val++;
00595     return *this;
00596 }
00597 
00598 GltFields::GltFieldEnum &
00599 GltFields::GltFieldEnum::operator--()
00600 {
00601     if (_val>0)
00602         _val--;
00603     return *this;
00604 }
00605 
00606 //
00607 // WINDOWS SPECIFIC
00608 //
00609 
00610 #ifdef GLT_WIN32
00611 
00612 #include <windows.h>
00613 
00614 bool 
00615 GltFields::writeRegistry(void *key) const
00616 {
00617     if (!_name.size())
00618         return false;
00619 
00620     HKEY subKey = NULL;
00621     LONG res = RegCreateKeyEx((HKEY)key,_name.c_str(),0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&subKey,NULL);
00622 
00623     if (res==ERROR_SUCCESS && subKey)
00624     {
00625         for (int i=0; i<_fields.size(); i++)
00626             _fields[i].get()->writeRegistry(subKey);
00627     }
00628 
00629     if (subKey)
00630         RegCloseKey(subKey);
00631 
00632     return res==ERROR_SUCCESS;
00633 }
00634 
00635 bool 
00636 GltFields::readRegistry(void *key)
00637 {
00638     if (!_name.size())
00639         return false;
00640 
00641     HKEY subKey = NULL;
00642     LONG res = RegOpenKeyEx((HKEY)key,_name.c_str(),0,KEY_READ,&subKey);
00643 
00644     if (res==ERROR_SUCCESS && subKey)
00645     {
00646         for (int i=0; i<_fields.size(); i++)
00647             _fields[i].get()->readRegistry(subKey);
00648     }
00649 
00650     if (subKey)
00651         RegCloseKey(subKey);
00652 
00653     return res==ERROR_SUCCESS;
00654 }
00655 
00656 #endif
00657 

Generated on Tue Nov 5 11:11:05 2002 for GLT by doxygen1.2.18