25
18
*****************************************************************************/
27
20
bool Attribute::initChannel(int elemSize) {
28
if(!mIsChannel) return true;
29
if(mChannelInited==elemSize) {
30
// already inited... ok
34
if(mChannelInited>0) {
35
errMsg("Attribute::initChannel","Duplicate channel init!? ("<<mChannelInited<<" vs "<<elemSize<<")...");
40
if((mValue.size() % (elemSize+1)) != 0) {
41
errMsg("Attribute::initChannel","Invalid # elements in Attribute...");
45
int numElems = mValue.size()/(elemSize+1);
46
vector<string> newvalue;
47
for(int i=0; i<numElems; i++) {
48
//errMsg("ATTR"," i"<<i<<" "<<mName); // debug
50
vector<string> elem(elemSize);
51
for(int j=0; j<elemSize; j++) {
52
//errMsg("ATTR"," j"<<j<<" "<<mValue[i*(elemSize+1)+j] ); // debug
53
elem[j] = mValue[i*(elemSize+1)+j];
55
mChannel.push_back(elem);
56
// use first value as default
57
if(i==0) newvalue = elem;
59
double t = 0.0; // similar to getAsFloat
60
const char *str = mValue[i*(elemSize+1)+elemSize].c_str();
62
t = strtod(str, &endptr);
63
if((str!=endptr) && (*endptr != '\0')) return false;
65
//errMsg("ATTR"," t"<<t<<" "); // debug
67
for(int i=0; i<numElems-1; i++) {
68
if(mTimes[i]>mTimes[i+1]) {
69
errMsg("Attribute::initChannel","Invalid time at entry "<<i<<" setting to "<<mTimes[i]);
70
mTimes[i+1] = mTimes[i];
74
// dont change until done with parsing, and everythings ok
77
mChannelInited = elemSize;
78
if(DEBUG_CHANNELS) print();
82
// get value as string
83
string Attribute::getAsString(bool debug)
85
if(mIsChannel && (!debug)) {
86
errMsg("Attribute::getAsString", "Attribute \"" << mName << "\" used as string is a channel! Not allowed...");
90
if(mValue.size()!=1) {
91
// for directories etc. , this might be valid! cutoff "..." first
92
string comp = getCompleteString();
93
if(comp.size()<2) return string("");
94
return comp.substr(1, comp.size()-2);
99
// get value as integer value
100
int Attribute::getAsInt()
105
if(!initChannel(1)) success=false;
107
if(mValue.size()!=1) success = false;
109
const char *str = mValue[0].c_str();
111
ret = strtol(str, &endptr, 10);
113
((str!=endptr) && (*endptr != '\0')) )success = false;
118
errMsg("Attribute::getAsInt", "Attribute \"" << mName << "\" used as int has invalid value '"<< getCompleteString() <<"' ");
119
errMsg("Attribute::getAsInt", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
120
errMsg("Attribute::getAsInt", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
122
setElbeemState( -4 ); // parse error
130
// get value as integer value
131
bool Attribute::getAsBool()
133
int val = getAsInt();
134
if(val==0) return false;
139
// get value as double value
140
double Attribute::getAsFloat()
145
if(!initChannel(1)) success=false;
147
if(mValue.size()!=1) success = false;
149
const char *str = mValue[0].c_str();
151
ret = strtod(str, &endptr);
152
if((str!=endptr) && (*endptr != '\0')) success = false;
158
errMsg("Attribute::getAsFloat", "Attribute \"" << mName << "\" used as double has invalid value '"<< getCompleteString() <<"' ");
159
errMsg("Attribute::getAsFloat", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
160
errMsg("Attribute::getAsFloat", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
162
setElbeemState( -4 ); // parse error
169
// get value as 3d vector
170
ntlVec3d Attribute::getAsVec3d()
175
if(!initChannel(3)) success=false;
177
if(mValue.size()==1) {
178
const char *str = mValue[0].c_str();
180
double rval = strtod(str, &endptr);
182
((str!=endptr) && (*endptr != '\0')) )success = false;
183
if(success) ret = ntlVec3d( rval );
184
} else if(mValue.size()==3) {
186
const char *str = NULL;
188
str = mValue[0].c_str();
189
double rval1 = strtod(str, &endptr);
191
((str!=endptr) && (*endptr != '\0')) )success = false;
193
str = mValue[1].c_str();
194
double rval2 = strtod(str, &endptr);
196
((str!=endptr) && (*endptr != '\0')) )success = false;
198
str = mValue[2].c_str();
199
double rval3 = strtod(str, &endptr);
201
((str!=endptr) && (*endptr != '\0')) )success = false;
203
if(success) ret = ntlVec3d( rval1, rval2, rval3 );
210
errMsg("Attribute::getAsVec3d", "Attribute \"" << mName << "\" used as Vec3d has invalid value '"<< getCompleteString() <<"' ");
211
errMsg("Attribute::getAsVec3d", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
212
errMsg("Attribute::getAsVec3d", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
214
setElbeemState( -4 ); // parse error
216
return ntlVec3d(0.0);
221
// get value as 4x4 matrix
222
void Attribute::getAsMat4Gfx(ntlMat4Gfx *mat)
228
if(mValue.size()==1) {
229
const char *str = mValue[0].c_str();
230
double rval = strtod(str, &endptr);
232
((str!=endptr) && (*endptr != '\0')) )success = false;
234
ret = ntlMat4Gfx( 0.0 );
235
ret.value[0][0] = rval;
236
ret.value[1][1] = rval;
237
ret.value[2][2] = rval;
238
ret.value[3][3] = 1.0;
240
} else if(mValue.size()==9) {
242
for(int i=0; i<3;i++) {
243
for(int j=0; j<3;j++) {
244
const char *str = mValue[i*3+j].c_str();
245
ret.value[i][j] = strtod(str, &endptr);
247
((str!=endptr) && (*endptr != '\0')) ) success = false;
250
} else if(mValue.size()==16) {
252
for(int i=0; i<4;i++) {
253
for(int j=0; j<4;j++) {
254
const char *str = mValue[i*4+j].c_str();
255
ret.value[i][j] = strtod(str, &endptr);
257
((str!=endptr) && (*endptr != '\0')) ) success = false;
266
errMsg("Attribute::getAsMat4Gfx", "Attribute \"" << mName << "\" used as Mat4x4 has invalid value '"<< getCompleteString() <<"' ");
267
errMsg("Attribute::getAsMat4Gfx", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
268
errMsg("Attribute::getAsMat4Gfx", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
270
setElbeemState( -4 ); // parse error
272
*mat = ntlMat4Gfx(0.0);
279
// get the concatenated string of all value string
280
string Attribute::getCompleteString()
283
for(size_t i=0;i<mValue.size();i++) {
285
if(i<mValue.size()-1) ret += " ";
21
elemSize=0; // remove warning
24
string Attribute::getAsString(bool debug) {
25
debug=false; // remove warning
28
int Attribute::getAsInt() {
31
bool Attribute::getAsBool() {
34
double Attribute::getAsFloat() {
37
ntlVec3d Attribute::getAsVec3d() {
40
void Attribute::getAsMat4Gfx(ntlMat4Gfx *mat) {
41
mat=NULL; // remove warning
43
string Attribute::getCompleteString() {
293
50
*****************************************************************************/
295
//! get channel as double value
296
52
AnimChannel<double> Attribute::getChannelFloat() {
297
vector<double> timeVec;
298
vector<double> valVec;
300
if((!initChannel(1)) || (!mIsChannel)) {
301
timeVec.push_back( 0.0 );
302
valVec.push_back( getAsFloat() );
304
for(size_t i=0; i<mChannel.size(); i++) {
305
mValue = mChannel[i];
306
double val = getAsFloat();
307
timeVec.push_back( mTimes[i] );
308
valVec.push_back( val );
311
return AnimChannel<double>(valVec,timeVec);
53
return AnimChannel<double>();
314
//! get channel as integer value
315
55
AnimChannel<int> Attribute::getChannelInt() {
316
vector<double> timeVec;
319
if((!initChannel(1)) || (!mIsChannel)) {
320
timeVec.push_back( 0.0 );
321
valVec.push_back( getAsInt() );
323
for(size_t i=0; i<mChannel.size(); i++) {
324
mValue = mChannel[i];
325
int val = getAsInt();
326
timeVec.push_back( mTimes[i] );
327
valVec.push_back( val );
330
return AnimChannel<int>(valVec,timeVec);
56
return AnimChannel<int>();
333
//! get channel as integer value
334
58
AnimChannel<ntlVec3d> Attribute::getChannelVec3d() {
335
vector<double> timeVec;
336
vector<ntlVec3d> valVec;
338
if((!initChannel(3)) || (!mIsChannel)) {
339
timeVec.push_back( 0.0 );
340
valVec.push_back( getAsVec3d() );
342
for(size_t i=0; i<mChannel.size(); i++) {
343
mValue = mChannel[i];
344
ntlVec3d val = getAsVec3d();
345
timeVec.push_back( mTimes[i] );
346
valVec.push_back( val );
349
return AnimChannel<ntlVec3d>(valVec,timeVec);
59
return AnimChannel<ntlVec3d>();
352
//! get channel as float vector set
353
61
AnimChannel<ntlSetVec3f>
354
62
Attribute::getChannelSetVec3f() {
355
vector<double> timeVec;
357
vector< ntlSetVec3f > valVec;
359
if((!initChannel(3)) || (!mIsChannel)) {
360
timeVec.push_back( 0.0 );
361
setv.mVerts.push_back( vec2F( getAsVec3d() ) );
362
valVec.push_back( setv );
364
for(size_t i=0; i<mChannel.size(); i++) {
365
mValue = mChannel[i];
366
ntlVec3f val = vec2F( getAsVec3d() );
367
timeVec.push_back( mTimes[i] );
368
setv.mVerts.push_back( val );
370
valVec.push_back( setv );
371
valVec.push_back( setv );
374
return AnimChannel<ntlSetVec3f>(valVec,timeVec);
63
return AnimChannel<ntlSetVec3f>();
377
66
/******************************************************************************
378
67
* check if there were unknown params
379
68
*****************************************************************************/
380
bool AttributeList::checkUnusedParams()
383
for(map<string, Attribute*>::iterator i=mAttrs.begin();
384
i != mAttrs.end(); i++) {
386
if(!(*i).second->getUsed()) {
387
errMsg("AttributeList::checkUnusedParams", "List "<<mName<<" has unknown parameter '"<<(*i).first<<"' = '"<< mAttrs[(*i).first]->getAsString(true) <<"' ");
69
bool AttributeList::checkUnusedParams() {
394
//! set all params to used, for invisible objects
395
72
void AttributeList::setAllUsed() {
396
for(map<string, Attribute*>::iterator i=mAttrs.begin();
397
i != mAttrs.end(); i++) {
399
(*i).second->setUsed(true);
404
75
/******************************************************************************
405
76
* Attribute list read functions
406
77
*****************************************************************************/
407
78
int AttributeList::readInt(string name, int defaultValue, string source,string target, bool needed) {
409
if(needed) { errFatal("AttributeList::readInt","Required attribute '"<<name<<"' for "<< source <<" not set! ", SIMWORLD_INITERROR); }
412
if(DEBUG_ATTRIBUTES==1) { debugOut( source << " Var '"<< target <<"' set to '"<< find(name)->getCompleteString() <<"' as type int " , 3); }
413
find(name)->setUsed(true);
414
return find(name)->getAsInt();
79
name=source=target=string(""); needed=false; // remove warning
416
82
bool AttributeList::readBool(string name, bool defaultValue, string source,string target, bool needed) {
418
if(needed) { errFatal("AttributeList::readBool","Required attribute '"<<name<<"' for "<< source <<" not set! ", SIMWORLD_INITERROR); }
421
if(DEBUG_ATTRIBUTES==1) { debugOut( source << " Var '"<< target <<"' set to '"<< find(name)->getCompleteString() <<"' as type int " , 3); }
422
find(name)->setUsed(true);
423
return find(name)->getAsBool();
83
name=source=target=string(""); needed=false; // remove warning
425
86
double AttributeList::readFloat(string name, double defaultValue, string source,string target, bool needed) {
427
if(needed) { errFatal("AttributeList::readFloat","Required attribute '"<<name<<"' for "<< source <<" not set! ", SIMWORLD_INITERROR); }
430
if(DEBUG_ATTRIBUTES==1) { debugOut( source << " Var '"<< target <<"' set to '"<< find(name)->getCompleteString() <<"' as type int " , 3); }
431
find(name)->setUsed(true);
432
return find(name)->getAsFloat();
87
name=source=target=string(""); needed=false; // remove warning
434
90
string AttributeList::readString(string name, string defaultValue, string source,string target, bool needed) {
436
if(needed) { errFatal("AttributeList::readInt","Required attribute '"<<name<<"' for "<< source <<" not set! ", SIMWORLD_INITERROR); }
439
if(DEBUG_ATTRIBUTES==1) { debugOut( source << " Var '"<< target <<"' set to '"<< find(name)->getCompleteString() <<"' as type int " , 3); }
440
find(name)->setUsed(true);
441
return find(name)->getAsString(false);
91
name=source=target=string(""); needed=false; // remove warning
443
94
ntlVec3d AttributeList::readVec3d(string name, ntlVec3d defaultValue, string source,string target, bool needed) {
445
if(needed) { errFatal("AttributeList::readInt","Required attribute '"<<name<<"' for "<< source <<" not set! ", SIMWORLD_INITERROR); }
448
if(DEBUG_ATTRIBUTES==1) { debugOut( source << " Var '"<< target <<"' set to '"<< find(name)->getCompleteString() <<"' as type int " , 3); }
449
find(name)->setUsed(true);
450
return find(name)->getAsVec3d();
95
name=source=target=string(""); needed=false; // remove warning
453
99
void AttributeList::readMat4Gfx(string name, ntlMat4Gfx defaultValue, string source,string target, bool needed, ntlMat4Gfx *mat) {
455
if(needed) { errFatal("AttributeList::readInt","Required attribute '"<<name<<"' for "<< source <<" not set! ", SIMWORLD_INITERROR); }
459
if(DEBUG_ATTRIBUTES==1) { debugOut( source << " Var '"<< target <<"' set to '"<< find(name)->getCompleteString() <<"' as type int " , 3); }
460
find(name)->setUsed(true);
461
find(name)->getAsMat4Gfx( mat );
101
name=source=target=string(""); needed=false; mat=NULL; // remove warning
465
104
// set that a parameter can be given, and will be ignored...
466
105
bool AttributeList::ignoreParameter(string name, string source) {
467
if(!exists(name)) return false;
468
find(name)->setUsed(true);
469
if(DEBUG_ATTRIBUTES==1) { debugOut( source << " Param '"<< name <<"' set but ignored... " , 3); }
106
name = source = ("");
474
111
AnimChannel<int> AttributeList::readChannelInt(string name, int defaultValue, string source, string target, bool needed) {
476
if(needed) { errFatal("AttributeList::readChannelInt","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
477
return AnimChannel<int>(defaultValue); }
478
AnimChannel<int> ret = find(name)->getChannelInt();
479
find(name)->setUsed(true);
480
channelSimplifyi(ret);
112
name=source=target=string(""); needed=false; // remove warning
113
return AnimChannel<int>(defaultValue);
483
115
AnimChannel<double> AttributeList::readChannelFloat(string name, double defaultValue, string source, string target, bool needed ) {
485
if(needed) { errFatal("AttributeList::readChannelFloat","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
486
return AnimChannel<double>(defaultValue); }
487
AnimChannel<double> ret = find(name)->getChannelFloat();
488
find(name)->setUsed(true);
489
channelSimplifyd(ret);
116
name=source=target=string(""); needed=false; // remove warning
117
return AnimChannel<double>(defaultValue);
492
119
AnimChannel<ntlVec3d> AttributeList::readChannelVec3d(string name, ntlVec3d defaultValue, string source, string target, bool needed ) {
494
if(needed) { errFatal("AttributeList::readChannelVec3d","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
495
return AnimChannel<ntlVec3d>(defaultValue); }
496
AnimChannel<ntlVec3d> ret = find(name)->getChannelVec3d();
497
find(name)->setUsed(true);
498
channelSimplifyVd(ret);
120
name=source=target=string(""); needed=false; // remove warning
121
return AnimChannel<ntlVec3d>(defaultValue);
501
123
AnimChannel<ntlSetVec3f> AttributeList::readChannelSetVec3f(string name, ntlSetVec3f defaultValue, string source, string target, bool needed) {
503
if(needed) { errFatal("AttributeList::readChannelSetVec3f","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
504
return AnimChannel<ntlSetVec3f>(defaultValue); }
505
AnimChannel<ntlSetVec3f> ret = find(name)->getChannelSetVec3f();
506
find(name)->setUsed(true);
507
//channelSimplifyVf(ret);
124
name=source=target=string(""); needed=false; // remove warning
125
return AnimChannel<ntlSetVec3f>(defaultValue);
510
127
AnimChannel<float> AttributeList::readChannelSinglePrecFloat(string name, float defaultValue, string source, string target, bool needed ) {
512
if(needed) { errFatal("AttributeList::readChannelSinglePrecFloat","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
513
return AnimChannel<float>(defaultValue); }
514
AnimChannel<double> convert = find(name)->getChannelFloat();
515
find(name)->setUsed(true);
516
channelSimplifyd(convert);
517
// convert to float vals
519
for(size_t i=0; i<convert.accessValues().size(); i++) {
520
vals.push_back( (float)(convert.accessValues()[i]) );
522
vector<double> times = convert.accessTimes();
523
AnimChannel<float> ret(vals, times);
128
name=source=target=string(""); needed=false; // remove warning
129
return AnimChannel<float>(defaultValue);
526
131
AnimChannel<ntlVec3f> AttributeList::readChannelVec3f(string name, ntlVec3f defaultValue, string source, string target, bool needed) {
528
if(needed) { errFatal("AttributeList::readChannelVec3f","Required channel '"<<name<<"' for "<<target<<" from "<< source <<" not set! ", SIMWORLD_INITERROR); }
529
return AnimChannel<ntlVec3f>(defaultValue); }
531
AnimChannel<ntlVec3d> convert = find(name)->getChannelVec3d();
533
vector<ntlVec3f> vals;
534
for(size_t i=0; i<convert.accessValues().size(); i++) {
535
vals.push_back( vec2F(convert.accessValues()[i]) );
537
vector<double> times = convert.accessTimes();
538
AnimChannel<ntlVec3f> ret(vals, times);
539
find(name)->setUsed(true);
540
channelSimplifyVf(ret);
132
name=source=target=string(""); needed=false; // remove warning
133
return AnimChannel<ntlVec3f>(defaultValue);
544
136
/******************************************************************************
546
138
*****************************************************************************/
547
139
AttributeList::~AttributeList() {
548
for(map<string, Attribute*>::iterator i=mAttrs.begin();
549
i != mAttrs.end(); i++) {