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);
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
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