#include <animation_optimizer.h>
Nevrax France
Definition at line 54 of file animation_optimizer.h.
Public Member Functions | |
| void | addLowPrecisionTrack (const std::string &name) |
| CAnimationOptimizer () | |
| Constructor. | |
| void | clearLowPrecisionTracks () |
| see addLowPrecisionTrack. This clear the array. | |
| void | optimize (const CAnimation &animIn, CAnimation &animOut) |
| void | setQuaternionThreshold (double lowPrecThre, double highPrecThre) |
| void | setSampleFrameRate (float frameRate) |
| void | setVectorThreshold (double lowPrecThre, double highPrecThre) |
Private Member Functions | |
| ITrack * | cloneTrack (const ITrack *trackIn) |
| bool | isLowPrecisionTrack (const std::string &trackName) |
| bool | isTrackOptimisable (const ITrack *trackIn) |
| ITrack * | optimizeTrack (const ITrack *trackIn) |
| bool | nearlySameQuaternion (const CQuatD &quat0, const CQuatD &quat1) |
| void | optimizeQuatTrack () |
| void | sampleQuatTrack (const ITrack *trackIn, float beginTime, float endTime, uint numSamples) |
| bool | testConstantQuatTrack () |
| bool | nearlySameVector (const CVectorD &v0, const CVectorD &v1) |
| void | optimizeVectorTrack () |
| void | sampleVectorTrack (const ITrack *trackIn, float beginTime, float endTime, uint numSamples) |
| bool | testConstantVectorTrack () |
Private Attributes | |
| std::vector< std::string > | _LowPrecTrackKeyName |
| double | _QuaternionThreshold |
| double | _QuaternionThresholdHighPrec |
| double | _QuaternionThresholdLowPrec |
| std::vector< CQuat > | _QuatKeyList |
| float | _SampleFrameRate |
| std::vector< uint16 > | _TimeList |
| std::vector< CVector > | _VectorKeyList |
| double | _VectorThreshold |
| double | _VectorThresholdHighPrec |
| double | _VectorThresholdLowPrec |
|
|
Constructor.
Definition at line 47 of file animation_optimizer.cpp. References _QuaternionThresholdHighPrec, _QuaternionThresholdLowPrec, _SampleFrameRate, _VectorThresholdHighPrec, and _VectorThresholdLowPrec.
00048 {
00049 _SampleFrameRate= 30;
00050 _QuaternionThresholdLowPrec= 1.0 - 0.0001;
00051 _QuaternionThresholdHighPrec= 1.0 - 0.000001;
00052 _VectorThresholdLowPrec= 0.001;
00053 _VectorThresholdHighPrec= 0.0001;
00054 }
|
|
|
see setQuaternionThreshold(). Any track which contains this name will be considered as a Low precision track. Default setup is empty, so all track are "high precision" track. A good setup is for example addLowPrecisionTrack("Finger") and addLowPrecisionTrack("Ponytail") Warning: case sensitive Definition at line 599 of file animation_optimizer.cpp. References _LowPrecTrackKeyName.
00600 {
00601 _LowPrecTrackKeyName.push_back(name);
00602 }
|
|
|
see addLowPrecisionTrack. This clear the array.
Definition at line 605 of file animation_optimizer.cpp. References _LowPrecTrackKeyName.
00606 {
00607 _LowPrecTrackKeyName.clear();
00608 }
|
|
|
Definition at line 138 of file animation_optimizer.cpp. References NLMISC::CMemStream::invert(), and NLMISC::IStream::serialPolyPtr(). Referenced by optimize(), and optimizeTrack().
00139 {
00140 CMemStream memStream;
00141
00142 // write to the stream.
00143 ITrack *trackInSerial= const_cast<ITrack*>(trackIn);
00144 memStream.serialPolyPtr(trackInSerial);
00145
00146 // read from the stream.
00147 memStream.invert();
00148 ITrack *ret= NULL;
00149 memStream.serialPolyPtr(ret);
00150
00151 return ret;
00152 }
|
|
|
Definition at line 611 of file animation_optimizer.cpp. References _LowPrecTrackKeyName, and uint. Referenced by optimize().
00612 {
00613 for(uint i=0; i<_LowPrecTrackKeyName.size(); i++)
00614 {
00615 // if find a substr of the key, it is a low prec track
00616 if( trackName.find(_LowPrecTrackKeyName[i]) != string::npos )
00617 return true;
00618 }
00619
00620 // no key found
00621 return false;
00622 }
|
|
|
Definition at line 156 of file animation_optimizer.cpp. References nlassert. Referenced by optimize().
00157 {
00158 nlassert(trackIn);
00159
00160 // If the track is a Linear, Bezier or a TCB track, suppose we can optimize it. Constant may not be interressant....
00161 if( dynamic_cast<const CTrackKeyFramerTCBQuat*>(trackIn) ||
00162 dynamic_cast<const CTrackKeyFramerBezierQuat*>(trackIn) ||
00163 dynamic_cast<const CTrackKeyFramerLinearQuat*>(trackIn) )
00164 return true;
00165
00166 // If the track is a Linear, Bezier or a TCB track, suppose we can optimize it. Constant may not be interressant....
00167 if( dynamic_cast<const CTrackKeyFramerTCBVector*>(trackIn) ||
00168 dynamic_cast<const CTrackKeyFramerBezierVector*>(trackIn) ||
00169 dynamic_cast<const CTrackKeyFramerLinearVector*>(trackIn) )
00170 return true;
00171
00172 return false;
00173 }
|
|
||||||||||||
|
return true if suppose same quaternion. NB: quaternion must be normalized. NB: test if quat1==quat0 or quat1==-quat0 of course. Definition at line 423 of file animation_optimizer.cpp. References _QuaternionThreshold, NLMISC::CQuatT< double >::conjugate(), and NLMISC::CQuatT< double >::w. Referenced by optimizeQuatTrack(), and testConstantQuatTrack().
00424 {
00425 // true if exactly same, or exactly inverse
00426 if(quat0==quat1 || quat0==-quat1)
00427 return true;
00428
00429 // Else compute the rotation to go from qRef to q. Use double for better presion.
00430 CQuatD quatDif;
00431 quatDif= quat1 * quat0.conjugate();
00432 // inverse the quaternion if necessary. ie make closest to the identity quaternion.
00433 if(quatDif.w<0)
00434 quatDif= -quatDif;
00435
00436 // compare "angle threshold"
00437 return (quatDif.w >= _QuaternionThreshold);
00438 }
|
|
||||||||||||
|
return true if suppose same vector. Definition at line 576 of file animation_optimizer.cpp. References _VectorThreshold, and NLMISC::CVectorD::norm(). Referenced by optimizeVectorTrack(), and testConstantVectorTrack().
00577 {
00578 // true if exactly same
00579 if(v0==v1)
00580 return true;
00581
00582 // Else compute the dif, use double for better precision
00583 CVectorD vDif;
00584 vDif= v1-v0;
00585
00586 // compare norm
00587 return (vDif.norm() <= _VectorThreshold);
00588 }
|
|
||||||||||||
|
optimize an animation animOut is the same as animIn, but optimized. If a track can't be optimized, it is just duplicated in animOut. Definition at line 86 of file animation_optimizer.cpp. References _QuaternionThreshold, _QuaternionThresholdHighPrec, _QuaternionThresholdLowPrec, _VectorThreshold, _VectorThresholdHighPrec, _VectorThresholdLowPrec, NL3D::CAnimation::addTrack(), cloneTrack(), NL3D::CAnimation::getEndTime(), NL3D::CAnimation::getIdTrackByName(), NL3D::CAnimation::getTrack(), NL3D::CAnimation::getTrackNames(), isLowPrecisionTrack(), isTrackOptimisable(), nlassert, optimizeTrack(), NL3D::CAnimation::setMinEndTime(), and uint.
00087 {
00088 // reset animOut
00089 contReset(animOut);
00090
00091 // Parse all tracks of the animation.
00092 set<string> setString;
00093 animIn.getTrackNames (setString);
00094 set<string>::iterator it;
00095
00096 for(it=setString.begin();it!=setString.end();it++)
00097 {
00098 const string &trackName= *it;
00099 uint trackId= animIn.getIdTrackByName(trackName);
00100 nlassert(trackId!=CAnimation::NotFound);
00101 const ITrack *track= animIn.getTrack(trackId);
00102
00103 // If the track is optimisable.
00104 ITrack *newTrack;
00105 if(isTrackOptimisable(track))
00106 {
00107 // choose the threshold according to precision wanted
00108 if( isLowPrecisionTrack(trackName) )
00109 {
00110 _QuaternionThreshold= _QuaternionThresholdLowPrec;
00111 _VectorThreshold= _VectorThresholdLowPrec;
00112 }
00113 else
00114 {
00115 _QuaternionThreshold= _QuaternionThresholdHighPrec;
00116 _VectorThreshold= _VectorThresholdHighPrec;
00117 }
00118
00119 // optimize it.
00120 newTrack= optimizeTrack(track);
00121 }
00122 else
00123 {
00124 // just clone it.
00125 newTrack= cloneTrack(track);
00126 }
00127
00128 // Add it to the animation
00129 animOut.addTrack(trackName, newTrack);
00130 }
00131
00132 // Set min animation length
00133 animOut.setMinEndTime (animIn.getEndTime ());
00134 nlassert (animOut.getEndTime() == animIn.getEndTime());
00135 }
|
|
|
optimze the current track Definition at line 341 of file animation_optimizer.cpp. References _QuatKeyList, _TimeList, nearlySameQuaternion(), nlassert, t, and uint. Referenced by optimizeTrack().
00342 {
00343 uint numSamples= _QuatKeyList.size();
00344 nlassert(numSamples>0);
00345
00346 // <=2 key? => no opt possible..
00347 if(numSamples<=2)
00348 return;
00349
00350 // prepare dest opt
00351 std::vector<uint16> optTimeList;
00352 std::vector<CQuat> optKeyList;
00353 optTimeList.reserve(numSamples);
00354 optKeyList.reserve(numSamples);
00355
00356 // Add the first key.
00357 optTimeList.push_back(_TimeList[0]);
00358 optKeyList.push_back(_QuatKeyList[0]);
00359 double timeRef= _TimeList[0];
00360 CQuatD quatRef= _QuatKeyList[0];
00361
00362 // For all keys, but the first and the last, test if can remove them.
00363 for(uint i=1; i<numSamples-1; i++)
00364 {
00365 CQuatD quatCur= _QuatKeyList[i];
00366 CQuatD quatNext= _QuatKeyList[i+1];
00367 double timeCur= _TimeList[i];
00368 double timeNext= _TimeList[i+1];
00369
00370 // must add the key?
00371 bool mustAdd= false;
00372
00373 // If the Delta time are too big, abort (CTrackSampledQuat limitation)
00374 if(timeNext-timeRef>255)
00375 {
00376 mustAdd= true;
00377 }
00378 // If the next quaternion or the current quaternion are not on same hemisphere than ref, abort.
00379 else if( CQuatD::dotProduct(quatCur, quatRef)<0 || CQuatD::dotProduct(quatNext, quatRef)<0 )
00380 {
00381 mustAdd= true;
00382 }
00383 // else, test interpolation
00384 else
00385 {
00386 // If the 3 quats are nearly equals, it is ok (avoid interpolation)
00387 if( nearlySameQuaternion(quatRef, quatCur) && nearlySameQuaternion(quatRef, quatNext) )
00388 mustAdd= false;
00389 else
00390 {
00391 // interpolate.
00392 CQuatD quatInterpolated;
00393 double t= (timeCur-timeRef)/(timeNext/timeRef);
00394 quatInterpolated= CQuatD::slerp(quatRef, quatNext, (float)t);
00395
00396 // test if cur and interpolate are equal.
00397 if( !nearlySameQuaternion(quatCur, quatInterpolated) )
00398 mustAdd= true;
00399 }
00400 }
00401
00402 // If must add the key to the optimized track.
00403 if(mustAdd)
00404 {
00405 optTimeList.push_back(_TimeList[i]);
00406 optKeyList.push_back(_QuatKeyList[i]);
00407 timeRef= _TimeList[i];
00408 quatRef= _QuatKeyList[i];
00409 }
00410 }
00411
00412 // Add the last key.
00413 optTimeList.push_back(_TimeList[numSamples-1]);
00414 optKeyList.push_back(_QuatKeyList[numSamples-1]);
00415
00416 // copy the optimized track to the main one.
00417 _TimeList= optTimeList;
00418 _QuatKeyList= optKeyList;
00419 }
|
|
|
Definition at line 177 of file animation_optimizer.cpp. References _QuatKeyList, _SampleFrameRate, _TimeList, _VectorKeyList, NL3D::CTrackSampledVector::build(), NL3D::CTrackSampledQuat::build(), cloneTrack(), NL3D::UTrack::getBeginTime(), NL3D::UTrack::getEndTime(), NL3D::ITrack::getLoopMode(), NL3D::ITrack::getValue(), nlassert, nlstop, optimizeQuatTrack(), optimizeVectorTrack(), sampleQuatTrack(), sampleVectorTrack(), NL3D::CTrackSampledCommon::setLoopMode(), NL3D::CTrackDefaultBlendable< CVector >::setValue(), NL3D::CTrackDefaultBlendable< CQuat >::setValue(), testConstantQuatTrack(), testConstantVectorTrack(), and uint. Referenced by optimize().
00178 {
00179 // Get track param.
00180 float beginTime= trackIn->getBeginTime();
00181 float endTime= trackIn->getEndTime();
00182 nlassert(endTime>=beginTime);
00183
00184 // Get num Sample
00185 uint numSamples= (uint)ceil( (endTime-beginTime)*_SampleFrameRate);
00186 numSamples= max(1U, numSamples);
00187 nlassert(numSamples<65535);
00188
00189
00190 // Optimize Quaternion track??
00191 //================
00192 if( dynamic_cast<const CAnimatedValueQuat *>(&trackIn->getValue()) )
00193 {
00194 // sample the animation. Store result in _TimeList/_QuatKeyList
00195 sampleQuatTrack(trackIn, beginTime, endTime, numSamples);
00196
00197 // check if the sampled track can be reduced to a TrackDefaultQuat. Test _QuatKeyList.
00198 if( testConstantQuatTrack() )
00199 {
00200 // create a default Track Quat.
00201 CTrackDefaultQuat *trackDefault= new CTrackDefaultQuat;
00202 // setup the uniform value.
00203 trackDefault->setValue(_QuatKeyList[0]);
00204
00205 // return the result.
00206 return trackDefault;
00207 }
00208 // else optimize the sampled animation, and build.
00209 else
00210 {
00211 // optimize.
00212 optimizeQuatTrack();
00213
00214 // Create a sampled quaternion track
00215 CTrackSampledQuat *trackSQ= new CTrackSampledQuat;
00216
00217 // Copy loop from track.
00218 trackSQ->setLoopMode(trackIn->getLoopMode());
00219
00220 // Build it.
00221 trackSQ->build(_TimeList, _QuatKeyList, beginTime, endTime);
00222
00223 // return result.
00224 return trackSQ;
00225 }
00226 }
00227 // Optimize Position track??
00228 //================
00229 else if( dynamic_cast<const CAnimatedValueVector *>(&trackIn->getValue()) )
00230 {
00231 // sample the animation. Store result in _TimeList/_VectorKeyList
00232 sampleVectorTrack(trackIn, beginTime, endTime, numSamples);
00233
00234 // check if the sampled track can be reduced to a TrackDefaultVector. Test _VectorKeyList.
00235 if( testConstantVectorTrack() )
00236 {
00237 // create a default Track Vector.
00238 CTrackDefaultVector *trackDefault= new CTrackDefaultVector;
00239 // setup the uniform value.
00240 trackDefault->setValue(_VectorKeyList[0]);
00241
00242 // return the result.
00243 return trackDefault;
00244 }
00245 // else optimize the sampled animation, and build.
00246 else
00247 {
00248 // optimize.
00249 optimizeVectorTrack();
00250
00251 // Create a sampled Vector track
00252 CTrackSampledVector *trackSV= new CTrackSampledVector;
00253
00254 // Copy loop from track.
00255 trackSV->setLoopMode(trackIn->getLoopMode());
00256
00257 // Build it.
00258 trackSV->build(_TimeList, _VectorKeyList, beginTime, endTime);
00259
00260 // return result.
00261 return trackSV;
00262 }
00263 }
00264 else
00265 {
00266 // Must be a quaternion track or vector track for now.
00267 nlstop;
00268 // Avoid warning.
00269 return cloneTrack(trackIn);
00270 }
00271 }
|
|
|
optimze the current track Definition at line 499 of file animation_optimizer.cpp. References _TimeList, _VectorKeyList, nearlySameVector(), nlassert, t, and uint. Referenced by optimizeTrack().
00500 {
00501 uint numSamples= _VectorKeyList.size();
00502 nlassert(numSamples>0);
00503
00504 // <=2 key? => no opt possible..
00505 if(numSamples<=2)
00506 return;
00507
00508 // prepare dest opt
00509 std::vector<uint16> optTimeList;
00510 std::vector<CVector> optKeyList;
00511 optTimeList.reserve(numSamples);
00512 optKeyList.reserve(numSamples);
00513
00514 // Add the first key.
00515 optTimeList.push_back(_TimeList[0]);
00516 optKeyList.push_back(_VectorKeyList[0]);
00517 double timeRef= _TimeList[0];
00518 CVectorD vectorRef= _VectorKeyList[0];
00519
00520 // For all keys, but the first and the last, test if can remove them.
00521 for(uint i=1; i<numSamples-1; i++)
00522 {
00523 CVectorD vectorCur= _VectorKeyList[i];
00524 CVectorD vectorNext= _VectorKeyList[i+1];
00525 double timeCur= _TimeList[i];
00526 double timeNext= _TimeList[i+1];
00527
00528 // must add the key?
00529 bool mustAdd= false;
00530
00531 // If the Delta time are too big, abort (CTrackSampledVector limitation)
00532 if(timeNext-timeRef>255)
00533 {
00534 mustAdd= true;
00535 }
00536 // else, test interpolation
00537 else
00538 {
00539 // If the 3 Vectors are nearly equals, it is ok (avoid interpolation)
00540 if( nearlySameVector(vectorRef, vectorCur) && nearlySameVector(vectorRef, vectorNext) )
00541 mustAdd= false;
00542 else
00543 {
00544 // interpolate.
00545 CVectorD vectorInterpolated;
00546 double t= (timeCur-timeRef)/(timeNext/timeRef);
00547 vectorInterpolated= vectorRef*(1-t) + vectorNext*t;
00548
00549 // test if cur and interpolate are equal.
00550 if( !nearlySameVector(vectorCur, vectorInterpolated) )
00551 mustAdd= true;
00552 }
00553 }
00554
00555 // If must add the key to the optimized track.
00556 if(mustAdd)
00557 {
00558 optTimeList.push_back(_TimeList[i]);
00559 optKeyList.push_back(_VectorKeyList[i]);
00560 timeRef= _TimeList[i];
00561 vectorRef= _VectorKeyList[i];
00562 }
00563 }
00564
00565 // Add the last key.
00566 optTimeList.push_back(_TimeList[numSamples-1]);
00567 optKeyList.push_back(_VectorKeyList[numSamples-1]);
00568
00569 // copy the optimized track to the main one.
00570 _TimeList= optTimeList;
00571 _VectorKeyList= optKeyList;
00572 }
|
|
||||||||||||||||||||
|
sample the track from beginTime to endTime, sample to numSamples, such that key[0].Time==beginTime and key[numSamples-1].Time==endTime. NB: quaternion are normalized, and are makeClosest()-ed from sample to the next. Definition at line 282 of file animation_optimizer.cpp. References _QuatKeyList, _TimeList, NLMISC::CQuatT< float >::makeClosest(), NLMISC::CQuatT< float >::normalize(), t, and uint. Referenced by optimizeTrack().
00283 {
00284 // resize tmp samples
00285 _TimeList.resize(numSamples);
00286 _QuatKeyList.resize(numSamples);
00287
00288 // Sample the animation.
00289 float t= beginTime;
00290 float dt= 0;
00291 if(numSamples>1)
00292 dt= (endTime-beginTime)/(numSamples-1);
00293 for(uint i=0;i<numSamples; i++, t+=dt)
00294 {
00295 CQuat quat;
00296
00297 // make exact endTime match (avoid precision problem)
00298 if(i==numSamples-1)
00299 t= endTime;
00300
00301 // evaluate the track
00302 const_cast<ITrack*>(trackIn)->interpolate(t, quat);
00303
00304 // normalize this quaternion
00305 quat.normalize();
00306
00307 // force on same hemisphere according to precedent frame.
00308 if(i>0)
00309 {
00310 quat.makeClosest(_QuatKeyList[i-1]);
00311 }
00312
00313 // store time and key.
00314 _TimeList[i]= i;
00315 _QuatKeyList[i]= quat;
00316 }
00317
00318 }
|
|
||||||||||||||||||||
|
sample the track from beginTime to endTime, sample to numSamples, such that key[0].Time==beginTime and key[numSamples-1].Time==endTime. Definition at line 449 of file animation_optimizer.cpp. References _TimeList, _VectorKeyList, t, and uint. Referenced by optimizeTrack().
00450 {
00451 // resize tmp samples
00452 _TimeList.resize(numSamples);
00453 _VectorKeyList.resize(numSamples);
00454
00455 // Sample the animation.
00456 float t= beginTime;
00457 float dt= 0;
00458 if(numSamples>1)
00459 dt= (endTime-beginTime)/(numSamples-1);
00460 for(uint i=0;i<numSamples; i++, t+=dt)
00461 {
00462 CVector vector;
00463
00464 // make exact endTime match (avoid precision problem)
00465 if(i==numSamples-1)
00466 t= endTime;
00467
00468 // evaluate the track
00469 const_cast<ITrack*>(trackIn)->interpolate(t, vector);
00470
00471 // store time and key.
00472 _TimeList[i]= i;
00473 _VectorKeyList[i]= vector;
00474 }
00475
00476 }
|
|
||||||||||||
|
Set the Quaternion Error Thresholds. must be>=0. Default is 0.0001 and 0.000001. Above this value, 2 quaternions are said different. NB: comparing 2 quaternions is made by multiplying the one with the inverse of the other. the W component is then tested and must be >1-threshold (modulo sign) to conclude to equality. Since quat.W= cos(angle/2), you can deduce the angle threshold with angleThre= acos(1-thre)*2 Give 2 value, one For Low precision and High precision. Default setup use high precision. Use addLowPrecisionTrack() to drive low precision tracks. Definition at line 58 of file animation_optimizer.cpp. References _QuaternionThresholdHighPrec, _QuaternionThresholdLowPrec, and nlassert.
00059 {
00060 nlassert(lowPrecThre>=0);
00061 nlassert(highPrecThre>=0);
00062 _QuaternionThresholdLowPrec= 1.0 - lowPrecThre;
00063 _QuaternionThresholdHighPrec= 1.0 - highPrecThre;
00064 }
|
|
|
Set the Sample Frame Rate (>0) Default is 30 fps. NB: final numSamples must be <65535, else assert at optimize() time. Definition at line 78 of file animation_optimizer.cpp. References _SampleFrameRate, and nlassert.
00079 {
00080 nlassert(frameRate>0);
00081 _SampleFrameRate= frameRate;
00082 }
|
|
||||||||||||
|
Same principle as for setQuaternionThreshold(), but for vector tracks (positions/scale). Default is 0.001 and 0.0001. Above this value, 2 vectors are said different. NB: comparing 2 vectors is made by geting the norm of the difference Give 2 value, one For Low precision and High precision. Default setup use high precision. Use addLowPrecisionTrack() to drive low precision tracks. Definition at line 68 of file animation_optimizer.cpp. References _VectorThresholdHighPrec, _VectorThresholdLowPrec, and nlassert.
00069 {
00070 nlassert(lowPrecThre>=0);
00071 nlassert(highPrecThre>=0);
00072 _VectorThresholdLowPrec= lowPrecThre;
00073 _VectorThresholdHighPrec= highPrecThre;
00074 }
|
|
|
Test if the current track is constant (ie always same quaternion value) NB: test if q==qRef or q==-qRef of course. Definition at line 321 of file animation_optimizer.cpp. References _QuatKeyList, nearlySameQuaternion(), nlassert, and uint. Referenced by optimizeTrack().
00322 {
00323 uint numSamples= _QuatKeyList.size();
00324 nlassert(numSamples>0);
00325
00326 // Get the first sample as the reference quaternion, and test others from this one.
00327 CQuat quatRef= _QuatKeyList[0];
00328 for(uint i=0;i<numSamples;i++)
00329 {
00330 // All values must be nearly equal to the reference quaternion.
00331 if(!nearlySameQuaternion(quatRef, _QuatKeyList[i]))
00332 return false;
00333 }
00334
00335 // ok.
00336 return true;
00337 }
|
|
|
Test if the current track is constant (ie always same Vector value) Definition at line 479 of file animation_optimizer.cpp. References _VectorKeyList, nearlySameVector(), nlassert, and uint. Referenced by optimizeTrack().
00480 {
00481 uint numSamples= _VectorKeyList.size();
00482 nlassert(numSamples>0);
00483
00484 // Get the first sample as the reference Vectorer, and test others from this one.
00485 CVector vectorRef= _VectorKeyList[0];
00486 for(uint i=0;i<numSamples;i++)
00487 {
00488 // All values must be nearly equal to the reference vector.
00489 if(!nearlySameVector(vectorRef, _VectorKeyList[i]))
00490 return false;
00491 }
00492
00493 // ok.
00494 return true;
00495 }
|
|
|
Definition at line 116 of file animation_optimizer.h. Referenced by addLowPrecisionTrack(), clearLowPrecisionTracks(), and isLowPrecisionTrack(). |
|
|
Definition at line 109 of file animation_optimizer.h. Referenced by nearlySameQuaternion(), and optimize(). |
|
|
Definition at line 108 of file animation_optimizer.h. Referenced by CAnimationOptimizer(), optimize(), and setQuaternionThreshold(). |
|
|
Definition at line 107 of file animation_optimizer.h. Referenced by CAnimationOptimizer(), optimize(), and setQuaternionThreshold(). |
|
|
Definition at line 120 of file animation_optimizer.h. Referenced by optimizeQuatTrack(), optimizeTrack(), sampleQuatTrack(), and testConstantQuatTrack(). |
|
|
Definition at line 106 of file animation_optimizer.h. Referenced by CAnimationOptimizer(), optimizeTrack(), and setSampleFrameRate(). |
|
|
Definition at line 119 of file animation_optimizer.h. Referenced by optimizeQuatTrack(), optimizeTrack(), optimizeVectorTrack(), sampleQuatTrack(), and sampleVectorTrack(). |
|
|
Definition at line 123 of file animation_optimizer.h. Referenced by optimizeTrack(), optimizeVectorTrack(), sampleVectorTrack(), and testConstantVectorTrack(). |
|
|
Definition at line 112 of file animation_optimizer.h. Referenced by nearlySameVector(), and optimize(). |
|
|
Definition at line 111 of file animation_optimizer.h. Referenced by CAnimationOptimizer(), optimize(), and setVectorThreshold(). |
|
|
Definition at line 110 of file animation_optimizer.h. Referenced by CAnimationOptimizer(), optimize(), and setVectorThreshold(). |
1.3.6