Changeset 4178 in orxonox.OLD for orxonox/branches/physics/src/util
- Timestamp:
- May 13, 2005, 11:16:33 PM (20 years ago)
- Location:
- orxonox/branches/physics
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
orxonox/branches/physics
- Property svn:externals
-
old new 1 data http://svn.orxonox.ethz.ch/data 1
-
- Property svn:externals
-
orxonox/branches/physics/src/util/animation/animation.cc
r3953 r4178 34 34 35 35 // setting default values 36 this->keyFramesToPlay = -1; 36 37 this->localTime = 0.0; 37 this->bRunning = true;38 this->bRunning = false; 38 39 39 40 AnimationPlayer::getInstance()->addAnimation(this); … … 83 84 break; 84 85 case ANIM_INF_REPLAY: 85 this->replay(); 86 this->rewind(); 87 this->bRunning = true; 86 88 break; 87 89 case ANIM_INF_REWIND: … … 99 101 void Animation::play() 100 102 { 103 this->keyFramesToPlay = -1; 104 this->bRunning = true; 105 } 106 107 /** 108 \brief plays the Next n keyframes 109 \param n the Count of keyFrames to play. 110 */ 111 void Animation::playNextKeyframes(int n) 112 { 113 this->keyFramesToPlay = n-1; 101 114 this->bRunning = true; 102 115 } … … 107 120 void Animation::stop() 108 121 { 122 this->keyFramesToPlay = -1; 109 123 this->rewind(); 110 124 this->bRunning = true; … … 127 141 { 128 142 this->rewind(); 129 this-> bRunning = true;143 this->play(); 130 144 } -
orxonox/branches/physics/src/util/animation/animation.h
r3953 r4178 25 25 ANIM_NEG_EXP: fast, slow 26 26 ANIM_RANDOM: eratic 27 27 28 ANIM_NULL: !!DO NOT USE THIS!! only for internal handling 29 28 30 deprecated QUADRATIC 29 31 */ … … 35 37 ANIM_NEG_EXP, 36 38 ANIM_QUADRATIC, 37 ANIM_RANDOM}; 39 ANIM_RANDOM, 40 ANIM_NULL}; 41 #define ANIM_DEFAULT_FUNCTION ANIM_LINEAR //!< A default function to choose from the above set 38 42 39 43 //! An enumerator describing what the animation should do after the last keyframe. … … 69 73 70 74 void play(); // equals resume(); 75 void playNextKeyframes(int n = 1); 71 76 void stop(); 72 77 void pause(); … … 95 100 BaseObject* baseObject; //!< The same as object in the derived classes, but with reference to BaseObject 96 101 unsigned int keyFrameCount; //!< The Count of KeyFrames. 102 int keyFramesToPlay; //!< How many more Keyframes to play. if negative it will be ignored if 0 stop. 97 103 bool bHandled; //!< If this Animation is handled by the AnimationPlayer. 98 104 bool bRunning; //!< If the animation is running -
orxonox/branches/physics/src/util/animation/animation3d.cc
r3953 r4178 15 15 2005-04-17: Benjamin Grauer 16 16 Rewritte all functions, so it will fit into the Animation-class 17 2005-04-25: Patrick Boenzli 18 Extended the framework to support quatSlerp rotations. Each frame now supports diff mov/rot types. Implemented mov/rot functions 17 19 */ 18 20 … … 42 44 this->nextKeyFrame = tmpKeyFrame; 43 45 44 this->animFunc = &Animation3D::linear; 46 this->animFuncMov = &Animation3D::mLinear; 47 this->animFuncRot = &Animation3D::rLinear; 48 45 49 } 46 50 … … 72 76 this->nextKeyFrame = keyFrameList->nextElement(keyFrameList->firstElement()); 73 77 this->localTime = 0.0; 74 this->setAnimFunc(this->currentKeyFrame->animFunc); 78 this->setAnimFuncMov(this->currentKeyFrame->animFuncMov); 79 this->setAnimFuncRot(this->currentKeyFrame->animFuncRot); 75 80 } 76 81 … … 80 85 \param direction The direction of the new Keyframe. 81 86 \param duration The duration from the new KeyFrame to the next one 82 \param animFunc The function to animate between this keyFrame and the next one 83 */ 84 void Animation3D::addKeyFrame(Vector position, Quaternion direction, float duration, ANIM_FUNCTION animFunc) 87 \param animFuncMov The function to animate position between this keyFrame and the next one 88 \param animFuncMov The function to animate rotation between this keyFrame and the next one 89 */ 90 void Animation3D::addKeyFrame(Vector position, Quaternion direction, float duration, ANIM_FUNCTION animFuncMov, ANIM_FUNCTION animFuncRot) 85 91 { 86 92 // some small check 87 93 if (duration <= 0.0) 88 94 duration = 1.0; 95 // if the Rotation-Animation-function is set ANIM_NULL, animFuncRot will match animFuncRot 96 if (animFuncMov == ANIM_NULL) 97 animFuncMov = ANIM_DEFAULT_FUNCTION; 98 if (animFuncRot == ANIM_NULL) 99 animFuncRot = animFuncMov; 89 100 90 101 KeyFrame3D* tmpKeyFrame; … … 94 105 { 95 106 tmpKeyFrame = this->keyFrameList->firstElement(); 96 this->setAnimFunc(animFunc); 107 //this->setAnimFuncMov(animFuncMov); 108 //this->setAnimFuncRot(animFuncRot); 97 109 } 98 110 else … … 106 118 107 119 tmpKeyFrame->position = position; 120 //tmpKeyFrame->lastPosition = position; 108 121 tmpKeyFrame->direction = direction; 109 122 tmpKeyFrame->duration = duration; 110 tmpKeyFrame->animFunc = animFunc; 123 tmpKeyFrame->animFuncMov = animFuncMov; 124 tmpKeyFrame->animFuncRot = animFuncRot; 111 125 this->keyFrameCount++; 112 126 } 127 128 113 129 114 130 /** … … 123 139 if (localTime >= this->currentKeyFrame->duration) 124 140 { 125 // switching to the next Key-Frame 126 this->localTime -= this->currentKeyFrame->duration; 127 this->currentKeyFrame = this->nextKeyFrame; 128 // checking, if we should still Play the animation 129 if (this->currentKeyFrame == this->keyFrameList->lastElement()) 130 this->handleInfinity(); 131 this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame); 132 this->setAnimFunc(this->currentKeyFrame->animFunc); 133 134 if( this->currentKeyFrame->animFunc == ANIM_NEG_EXP) 141 if (likely(this->keyFramesToPlay != 0)) 135 142 { 136 this->tmpVect = this->nextKeyFrame->position - this->currentKeyFrame->position; 137 this->deltaT = 1/this->currentKeyFrame->duration * logf(1.0 + 600.0/this->tmpVect.len()); 143 if (unlikely(this->keyFramesToPlay > 0)) 144 --this->keyFramesToPlay; 145 // switching to the next Key-Frame 146 this->localTime -= this->currentKeyFrame->duration; 147 this->currentKeyFrame = this->nextKeyFrame; 148 // checking, if we should still Play the animation 149 if (this->currentKeyFrame == this->keyFrameList->lastElement()) 150 this->handleInfinity(); 151 this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame); 152 this->setAnimFuncMov(this->currentKeyFrame->animFuncMov); 153 this->setAnimFuncRot(this->currentKeyFrame->animFuncRot); 138 154 } 139 } 140 155 else 156 this->pause(); 157 } 141 158 /* now animate it */ 142 (this->*animFunc)(this->localTime); 143 /* 144 switch( this->movMode) 145 { 146 case LINEAR: 147 *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position; 148 *this->tmpVect = *this->tmpVect * this->localTime / this->currentFrame->time; 149 this->currentFrame->object->setRelCoor(*this->lastFrame->position + *this->tmpVect); 150 *this->lastPosition = *this->tmpVect; 151 break; 152 case EXP: 153 154 break; 155 case NEG_EXP: 156 *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position; 157 *this->tmpVect = *this->tmpVect * (1 - expf(- this->localTime * this->deltaT)); 158 this->currentFrame->object->setRelCoor(*this->lastFrame->position + *this->tmpVect); 159 *this->lastPosition = *this->tmpVect; 160 break; 161 case SIN: 162 *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position; 163 *this->tmpVect = *this->tmpVect * 0.5*(1 - cos(M_PI * this->localTime / this->currentFrame->time)); 164 this->currentFrame->object->setRelCoor(*this->lastFrame->position + *this->tmpVect); 165 *this->lastPosition = *this->tmpVect; 166 break; 167 case COS: 168 169 break; 170 case QUADRATIC: 171 *this->tmpVect = *this->currentFrame->position - *this->lastFrame->position; 172 *this->tmpVect = *this->tmpVect * 1/3 * ldexpf(this->localTime, 3); 173 break; 174 default: 175 break; 176 } 177 */ 178 } 179 } 180 181 182 /** 183 \brief Sets The kind of Animation between this keyframe and the next one 159 (this->*animFuncMov)(this->localTime); 160 (this->*animFuncRot)(this->localTime); 161 } 162 } 163 164 165 /*==Movement Section==========================================================*/ 166 167 /** 168 \brief Sets The kind of movment Animation between this keyframe and the next one 184 169 \param animFunc The Type of Animation to set 185 170 */ 186 void Animation3D::setAnimFunc (ANIM_FUNCTION animFunc)187 { 188 switch (animFunc )171 void Animation3D::setAnimFuncMov(ANIM_FUNCTION animFuncMov) 172 { 173 switch (animFuncMov) 189 174 { 175 case ANIM_CONSTANT: 176 this->animFuncMov = &Animation3D::mConstant; 177 break; 178 case ANIM_LINEAR: 179 this->animFuncMov = &Animation3D::mLinear; 180 this->object->setRelCoor(this->currentKeyFrame->position); 181 this->currentKeyFrame->lastPosition = Vector(); 182 break; 183 case ANIM_SINE: 184 this->animFuncMov = &Animation3D::mSine; 185 this->object->setRelCoor(this->currentKeyFrame->position); 186 this->currentKeyFrame->lastPosition = Vector(); 187 break; 188 case ANIM_COSINE: 189 this->animFuncMov = &Animation3D::mCosine; 190 this->object->setRelCoor(this->currentKeyFrame->position); 191 this->currentKeyFrame->lastPosition = Vector(); 192 break; 193 case ANIM_EXP: 194 this->object->setRelCoor(this->currentKeyFrame->position); 195 this->animFuncMov = &Animation3D::mExp; 196 break; 197 case ANIM_NEG_EXP: 198 this->animFuncMov = &Animation3D::mNegExp; 199 this->object->setRelCoor(this->currentKeyFrame->position); 200 this->expFactorMov = -1.0 / this->currentKeyFrame->duration * logf(DELTA_X_3D); 201 this->currentKeyFrame->lastPosition = Vector(); 202 break; 203 case ANIM_QUADRATIC: 204 this->object->setRelCoor(this->currentKeyFrame->position); 205 this->animFuncMov = &Animation3D::mQuadratic; 206 break; 207 case ANIM_RANDOM: 208 this->object->setRelCoor(this->currentKeyFrame->position); 209 this->animFuncMov = &Animation3D::mRandom; 210 break; 190 211 default: 191 case ANIM_CONSTANT: 192 this->animFunc = &Animation3D::constant; 193 break; 194 case ANIM_LINEAR: 195 this->animFunc = &Animation3D::linear; 196 break; 197 case ANIM_SINE: 198 this->animFunc = &Animation3D::sine; 199 break; 200 case ANIM_COSINE: 201 this->animFunc = &Animation3D::cosine; 202 break; 203 case ANIM_EXP: 204 this->animFunc = &Animation3D::exp; 205 break; 206 case ANIM_NEG_EXP: 207 this->animFunc = &Animation3D::negExp; 208 break; 209 case ANIM_QUADRATIC: 210 this->animFunc = &Animation3D::quadratic; 211 break; 212 case ANIM_RANDOM: 213 this->animFunc = &Animation3D::random; 214 break; 215 } 216 } 212 break; 213 } 214 } 215 216 217 217 218 218 /** … … 220 220 \param timePassed The time passed since this Keyframe began 221 221 */ 222 void Animation3D:: constant(float timePassed) const223 { 224 this->object->setRelCoor(this->currentKeyFrame->position);222 void Animation3D::mConstant(float timePassed) const 223 { 224 //this->object->setRelCoor(this->currentKeyFrame->position); 225 225 226 226 /* … … 238 238 \todo implement also do this for direction 239 239 */ 240 void Animation3D:: linear(float timePassed) const241 { 242 this->object->setRelCoor(this->currentKeyFrame->position +243 (this->nextKeyFrame->position - this->currentKeyFrame->position) * 244 (timePassed/this->currentKeyFrame->duration));240 void Animation3D::mLinear(float timePassed) const 241 { 242 Vector v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (timePassed/this->currentKeyFrame->duration); 243 this->object->shiftCoor(v - this->currentKeyFrame->lastPosition); 244 this->currentKeyFrame->lastPosition = v; 245 245 } 246 246 … … 251 251 \todo implement 252 252 */ 253 void Animation3D::sine(float timePassed) const 254 { 255 this->linear(timePassed); 256 } 253 void Animation3D::mSine(float timePassed) const 254 { 255 Vector v; 256 if( timePassed < this->currentKeyFrame->duration/2.0) 257 v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * sin( M_PI * timePassed /this->currentKeyFrame->duration) / 2.0; 258 else 259 v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (2.0 + sin( M_PI * (- timePassed /this->currentKeyFrame->duration)) )/ 2.0; 260 261 this->object->shiftCoor(v - this->currentKeyFrame->lastPosition); 262 this->currentKeyFrame->lastPosition = v; 263 } 264 257 265 258 266 /** … … 262 270 \todo implement 263 271 */ 264 void Animation3D::cosine(float timePassed) const 265 { 266 this->linear(timePassed); 267 } 272 void Animation3D::mCosine(float timePassed) const 273 { 274 Vector v; 275 v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (1.0 + cos( M_PI * timePassed / this->currentKeyFrame->duration))/2.0; 276 this->object->shiftCoor(v - this->currentKeyFrame->lastPosition); 277 this->currentKeyFrame->lastPosition = v; 278 279 280 /* 281 this->object->setRelCoor( this->nextKeyFrame->position - 282 (this->nextKeyFrame->position - this->currentKeyFrame->position) * 283 (1.0 + cos( M_PI * timePassed / this->currentKeyFrame->duration))/2.0); 284 */ 285 } 286 287 268 288 269 289 /** … … 271 291 \param timePassed The time passed since this Keyframe began 272 292 */ 273 void Animation3D::exp(float timePassed) const 274 { 275 this->linear(timePassed); 293 void Animation3D::mExp(float timePassed) const 294 { 295 PRINTF(0)("no exp animation3d defined\n"); 296 this->mLinear(timePassed); 276 297 } 277 298 … … 279 300 \brief a negative exponential interpolation between this keyframe and the next one 280 301 \param timePassed The time passed since this Keyframe began 281 282 \todo implement 283 */ 284 void Animation3D::negExp(float timePassed) const 285 { 286 this->linear(timePassed); 287 } 302 */ 303 void Animation3D::mNegExp(float timePassed) const 304 { 305 Vector v; 306 v = (this->nextKeyFrame->position - this->currentKeyFrame->position) * (1.0 - expf(- timePassed * expFactorMov)); 307 this->object->shiftCoor(v - this->currentKeyFrame->lastPosition); 308 this->currentKeyFrame->lastPosition = v; 309 310 /* 311 this->object->setRelCoor( this->currentKeyFrame->position + 312 (this->nextKeyFrame->position - this->currentKeyFrame->position) * 313 (1.0 - expf(- timePassed * expFactorMov)) ); 314 */ 315 } 316 288 317 289 318 /** … … 293 322 \todo implement 294 323 */ 295 void Animation3D::quadratic(float timePassed) const 296 { 297 this->linear(timePassed); 324 void Animation3D::mQuadratic(float timePassed) const 325 { 326 PRINTF(0)("no quadratic animation3d defined\n"); 327 this->mLinear(timePassed); 298 328 } 299 329 … … 302 332 \param timePassed The time passed since this Keyframe began 303 333 */ 304 void Animation3D::random(float timePassed) const 305 { 334 void Animation3D::mRandom(float timePassed) const 335 { 336 /* 306 337 this->object->setRelCoor(this->currentKeyFrame->position + 307 338 (this->nextKeyFrame->position - this->currentKeyFrame->position) * (float)rand()/(float)RAND_MAX); 308 339 this->object->setRelDir(this->currentKeyFrame->direction + 309 340 (this->nextKeyFrame->direction - this->currentKeyFrame->direction)* (float)rand()/(float)RAND_MAX); 310 } 341 */ 342 } 343 344 345 /*==Rotation Section==========================================================*/ 346 347 348 /** 349 \brief Sets The kind of rotation Animation between this keyframe and the next one 350 \param animFunc The Type of Animation to set 351 */ 352 void Animation3D::setAnimFuncRot(ANIM_FUNCTION animFuncRot) 353 { 354 switch (animFuncRot) 355 { 356 default: 357 case ANIM_CONSTANT: 358 this->animFuncRot = &Animation3D::rConstant; 359 break; 360 case ANIM_LINEAR: 361 this->animFuncRot = &Animation3D::rLinear; 362 break; 363 case ANIM_SINE: 364 this->animFuncRot = &Animation3D::rSine; 365 break; 366 case ANIM_COSINE: 367 this->animFuncRot = &Animation3D::rCosine; 368 break; 369 case ANIM_EXP: 370 this->animFuncRot = &Animation3D::rExp; 371 break; 372 case ANIM_NEG_EXP: 373 this->animFuncRot = &Animation3D::rNegExp; 374 this->expFactorRot = -1.0 / this->currentKeyFrame->duration * logf(DELTA_X_3D); 375 break; 376 case ANIM_QUADRATIC: 377 this->animFuncRot = &Animation3D::rQuadratic; 378 break; 379 case ANIM_RANDOM: 380 this->animFuncRot = &Animation3D::rRandom; 381 break; 382 383 } 384 } 385 386 387 /** 388 \brief stays at the value of the currentKeyFrame 389 \param timePassed The time passed since this Keyframe began 390 */ 391 void Animation3D::rConstant(float timePassed) const 392 { 393 this->object->setRelDir(this->currentKeyFrame->direction); 394 } 395 396 /** 397 \brief linear interpolation between this keyframe and the next one 398 \param timePassed The time passed since this Keyframe began 399 400 \todo implement also do this for direction 401 */ 402 void Animation3D::rLinear(float timePassed) const 403 { 404 this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 405 this->currentKeyFrame->direction, 406 timePassed/this->currentKeyFrame->duration) ); 407 } 408 409 /** 410 \brief a Sinusodial Interpolation between this keyframe and the next one 411 \param timePassed The time passed since this Keyframe began 412 413 \todo implement 414 */ 415 void Animation3D::rSine(float timePassed) const 416 { 417 float scale; 418 if( timePassed < this->currentKeyFrame->duration / 2.0) 419 scale = sin( M_PI * timePassed / this->currentKeyFrame->duration); 420 else 421 scale = 1.0 - sin( M_PI * timePassed / this->currentKeyFrame->duration); 422 423 this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 424 this->currentKeyFrame->direction, 425 scale) ); 426 } 427 428 429 /** 430 \brief a cosine interpolation between this keyframe and the next one 431 \param timePassed The time passed since this Keyframe began 432 433 \todo implement 434 */ 435 void Animation3D::rCosine(float timePassed) const 436 { 437 float scale = cos(M_PI * timePassed / this->currentKeyFrame->duration); 438 this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 439 this->currentKeyFrame->direction, 440 scale) ); 441 } 442 443 444 445 /** 446 \brief an exponential interpolation between this keyframe and the next one 447 \param timePassed The time passed since this Keyframe began 448 */ 449 void Animation3D::rExp(float timePassed) const 450 { 451 PRINTF(0)("exp rotation function not implemented\n"); 452 } 453 454 /** 455 \brief a negative exponential interpolation between this keyframe and the next one 456 \param timePassed The time passed since this Keyframe began 457 */ 458 void Animation3D::rNegExp(float timePassed) const 459 { 460 float scale = (1.0 - expf(- timePassed * expFactorRot)); 461 this->object->setRelDir(quatSlerp( this->nextKeyFrame->direction, 462 this->currentKeyFrame->direction, 463 scale) ); 464 } 465 466 467 /** 468 \brief a quadratic interpolation between this keyframe and the next one 469 \param timePassed The time passed since this Keyframe began 470 471 \todo implement 472 */ 473 void Animation3D::rQuadratic(float timePassed) const 474 { 475 PRINTF(0)("quadratic rotation alg not implemented\n"); 476 } 477 478 /** 479 \brief some random animation (fluctuating) 480 \param timePassed The time passed since this Keyframe began 481 */ 482 void Animation3D::rRandom(float timePassed) const 483 { 484 PRINTF(0)("random rotation alg not implemented\n"); 485 } -
orxonox/branches/physics/src/util/animation/animation3d.h
r3953 r4178 9 9 class PNode; 10 10 11 #define DELTA_X_3D 0.05 //!< the percentag of the distance that doesnt have to be done by neg_exp (asymptotical) ~ maschinendelta 12 11 13 //! KeyFrame3D Struct 12 14 /** … … 16 18 float duration; //!< The duration of this KeyFrame 17 19 Vector position; //!< The position of this KeyFrame 20 Vector lastPosition; 18 21 Quaternion direction; //!< The direction of this KeyFrame 19 ANIM_FUNCTION animFunc; //!< with whitch function to iterate to the next KeyFrame3D 22 ANIM_FUNCTION animFuncMov; //!< with whitch function to iterate movement to the next KeyFrame3D 23 ANIM_FUNCTION animFuncRot; //!< with whitch function to iterate rotation to the next KeyFrame3D 20 24 }; 21 25 … … 32 36 virtual void rewind(void); 33 37 34 void addKeyFrame(Vector position, Quaternion direction, float time, ANIM_FUNCTION animFunc = ANIM_LINEAR);38 void addKeyFrame(Vector position, Quaternion direction, float time, ANIM_FUNCTION animFuncMov = ANIM_DEFAULT_FUNCTION, ANIM_FUNCTION animFuncRot = ANIM_NULL); 35 39 // void addKeyFrame(KeyFrame3D* frame); 36 40 37 41 virtual void tick(float dt); 38 42 39 43 private: 40 44 // animation functions 41 void setAnimFunc(ANIM_FUNCTION animFunc); 42 void constant(float timePassed) const; 43 void linear(float timePassed) const; 44 void sine(float timePassed) const; 45 void cosine(float timePassed) const; 46 void exp(float timePassed) const; 47 void negExp(float timePassed) const; 48 void quadratic(float timePassed) const; 49 void random(float timePassed) const; 45 void setAnimFuncMov(ANIM_FUNCTION animFunc); 46 void setAnimFuncRot(ANIM_FUNCTION animFunc); 47 void mConstant(float timePassed) const; 48 void mLinear(float timePassed) const; 49 void mSine(float timePassed) const; 50 void mCosine(float timePassed) const; 51 void mExp(float timePassed) const; 52 void mNegExp(float timePassed) const; 53 void mQuadratic(float timePassed) const; 54 void mRandom(float timePassed) const; 55 void rConstant(float timePassed) const; 56 void rLinear(float timePassed) const; 57 void rSine(float timePassed) const; 58 void rCosine(float timePassed) const; 59 void rExp(float timePassed) const; 60 void rNegExp(float timePassed) const; 61 void rQuadratic(float timePassed) const; 62 void rRandom(float timePassed) const; 50 63 // ANIM_FUNCTION animFunc; 51 void (Animation3D::*animFunc)(float) const; //!< A Function for the AnimationType 64 void (Animation3D::*animFuncMov)(float) const; //!< A Function for the AnimationType 65 void (Animation3D::*animFuncRot)(float) const; //!< A Function for the AnimationType 52 66 53 67 KeyFrame3D* currentKeyFrame; //!< The current KeyFrame … … 60 74 Vector tmpVect; //!< what for?? 61 75 float deltaT; //!< ?? 76 float expFactorMov; 77 float expFactorRot; 62 78 }; -
orxonox/branches/physics/src/util/animation/t_animation.h
r3953 r4178 43 43 void setFuncToAnim(T* object, void (T::*funcToAnim)(float)); 44 44 45 void addKeyFrame(float value, float duration, ANIM_FUNCTION animFunc = ANIM_ LINEAR);45 void addKeyFrame(float value, float duration, ANIM_FUNCTION animFunc = ANIM_DEFAULT_FUNCTION); 46 46 47 47 virtual void rewind(); … … 154 154 if (duration <= 0.0) 155 155 duration = 1.0; 156 if (animFunc == ANIM_NULL) 157 animFunc = ANIM_DEFAULT_FUNCTION; 156 158 157 159 KeyFrameF* tmpKeyFrame; … … 190 192 if (localTime >= this->currentKeyFrame->duration) 191 193 { 192 // switching to the next Key-Frame 193 this->localTime -= this->currentKeyFrame->duration; 194 195 this->currentKeyFrame = this->nextKeyFrame; 196 // checking, if we should still Play the animation 197 if (this->currentKeyFrame == this->keyFrameList->lastElement()) 198 this->handleInfinity(); 199 this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame); 200 201 printf("%p from:%f to:%f\n", this->currentKeyFrame,this->currentKeyFrame->value, this->nextKeyFrame->value); 202 this->setAnimFunc(this->currentKeyFrame->animFunc); 194 if (likely(this->keyFramesToPlay != 0)) 195 { 196 if (unlikely(this->keyFramesToPlay > 0)) 197 --this->keyFramesToPlay; 198 // switching to the next Key-Frame 199 this->localTime -= this->currentKeyFrame->duration; 200 201 this->currentKeyFrame = this->nextKeyFrame; 202 // checking, if we should still Play the animation 203 if (this->currentKeyFrame == this->keyFrameList->lastElement()) 204 this->handleInfinity(); 205 this->nextKeyFrame = this->keyFrameList->nextElement(this->currentKeyFrame); 206 207 printf("%p from:%f to:%f\n", this->currentKeyFrame,this->currentKeyFrame->value, this->nextKeyFrame->value); 208 this->setAnimFunc(this->currentKeyFrame->animFunc); 209 } 210 else 211 this->pause(); 203 212 } 204 213 … … 235 244 { 236 245 this->animFunc = &tAnimation<T>::negExp; 237 float d = fabs(this->currentKeyFrame->value - this->nextKeyFrame->value);238 246 expFactor = - 1.0 / this->currentKeyFrame->duration * logf(DELTA_X); 239 247 break; -
orxonox/branches/physics/src/util/resource_manager.cc
r3953 r4178 92 92 this->dataDir = new char[strlen(dataDir)+1]; 93 93 strcpy(this->dataDir, dataDir); 94 return true; 94 95 } 95 96 else 96 97 { 97 98 PRINTF(1)("%s is not a Directory, and can not be the Data Directory, leaving as %s \n", dataDir, this->dataDir); 98 } 99 return false; 100 } 101 } 102 103 /** 104 \brief checks for the DataDirectory, by looking if 105 \param fileInside is inisde?? 106 */ 107 bool ResourceManager::checkDataDir(const char* fileInside) 108 { 109 bool retVal; 110 if (!isDir(this->dataDir)) 111 { 112 PRINTF(1)("%s is not a directory\n", this->dataDir); 113 return false; 114 } 115 116 char* testFile = new char[strlen(this->dataDir)+strlen(fileInside)+1]; 117 sprintf(testFile, "%s%s", this->dataDir, fileInside); 118 retVal = isFile(testFile); 119 delete testFile; 120 return retVal; 99 121 } 100 122 … … 180 202 // searching if the resource was loaded before. 181 203 Resource* tmpResource = this->locateResourceByInfo(fileName, type, param1, param2,param3); 182 if (tmpResource) // if the resource was notloaded before.204 if (tmpResource) // if the resource was loaded before. 183 205 { 184 206 PRINTF(4)("not loading cached resource %s\n", tmpResource->name); … … 199 221 200 222 // creating the full name. (directoryName + FileName) 201 char* fullName = new char[strlen(dataDir)+strlen(fileName)+1]; 202 sprintf(fullName, "%s%s", this->dataDir, fileName); 203 223 char* fullName = new char[strlen(this->getDataDir())+strlen(fileName)+1]; 224 sprintf(fullName, "%s%s", this->getDataDir(), fileName); 204 225 // Checking for the type of resource \see ResourceType 205 226 switch(type) … … 211 232 tmpResource->modelSize = 1.0; 212 233 213 if( isFile(fullName))234 if(ResourceManager::isFile(fullName)) 214 235 tmpResource->pointer = new OBJModel(fullName, tmpResource->modelSize); 215 236 else … … 508 529 } 509 530 510 stat(tmpDirName, &status); 511 if (status.st_mode & (S_IFDIR 531 if(!stat(tmpDirName, &status)) 532 { 533 if (status.st_mode & (S_IFDIR 512 534 #ifndef __WIN32__ 513 | S_IFLNK535 | S_IFLNK 514 536 #endif 515 )) 516 { 517 delete tmpDirName; 518 return true; 519 } 520 else 521 { 522 delete tmpDirName; 523 return false; 524 } 537 )) 538 { 539 delete tmpDirName; 540 return true; 541 } 542 else 543 { 544 delete tmpDirName; 545 return false; 546 } 547 } 548 else 549 return false; 525 550 } 526 551 … … 532 557 bool ResourceManager::isFile(const char* fileName) 533 558 { 559 char* tmpFileName = ResourceManager::homeDirCheck(fileName); 560 // actually checks the File 534 561 struct stat status; 535 stat(fileName, &status); 536 if (status.st_mode & (S_IFREG 562 if (!stat(tmpFileName, &status)) 563 { 564 if (status.st_mode & (S_IFREG 537 565 #ifndef __WIN32__ 538 | S_IFLNK566 | S_IFLNK 539 567 #endif 540 )) 541 return true; 542 else 543 return false; 544 } 568 )) 569 { 570 delete tmpFileName; 571 return true; 572 } 573 else 574 { 575 delete tmpFileName; 576 return false; 577 } 578 } 579 else 580 { 581 delete tmpFileName; 582 return false; 583 } 584 } 585 586 /** 587 \brief touches a File on the disk (thereby creating it) 588 \param fileName The file to touch 589 */ 590 bool ResourceManager::touchFile(const char* fileName) 591 { 592 char* tmpName = ResourceManager::homeDirCheck(fileName); 593 594 FILE* stream; 595 if( (stream = fopen (tmpName, "w")) == NULL) 596 { 597 PRINTF(1)("could not open %s fro writing\n", fileName); 598 return false; 599 } 600 fclose(stream); 601 602 delete tmpName; 603 } 604 605 /** 606 \brief deletes a File from disk 607 \param fileName the File to delete 608 */ 609 bool ResourceManager::deleteFile(const char* fileName) 610 { 611 char* tmpName = ResourceManager::homeDirCheck(fileName); 612 unlink(tmpName); 613 delete tmpName; 614 } 615 616 /** 617 \param fileName the Name of the file to check 618 \returns The name of the file, including the HomeDir 619 IMPORTANT: this has to be deleted from the outside 620 */ 621 char* ResourceManager::homeDirCheck(const char* name) 622 { 623 char* retName; 624 if (!strncmp(name, "~/", 2)) 625 { 626 char tmpFileName[500]; 627 #ifdef __WIN32__ 628 strcpy(tmpFileName, getenv("USERPROFILE")); 629 #else 630 strcpy(tmpFileName, getenv("HOME")); 631 #endif 632 retName = new char[strlen(tmpFileName)+strlen(name)]; 633 sprintf(retName, "%s%s", tmpFileName, name+1); 634 } 635 else 636 { 637 retName = new char[strlen(name)+1]; 638 strcpy(retName, name); 639 } 640 return retName; 641 } 642 643 /** 644 \param fileName the Name of the File to check 645 \returns The full name of the file, including the DataDir, and NULL if the file does not exist 646 IMPORTANT: this has to be deleted from the outside 647 */ 648 char* ResourceManager::getFullName(const char* fileName) 649 { 650 char* retName = new char[strlen(ResourceManager::getInstance()->getDataDir()) + strlen(fileName)+1]; 651 sprintf(retName, "%s%s", ResourceManager::getInstance()->getDataDir(), fileName); 652 if (ResourceManager::isFile(retName)) 653 return retName; 654 else 655 { 656 delete retName; 657 return NULL; 658 } 659 } 660 545 661 546 662 /** -
orxonox/branches/physics/src/util/resource_manager.h
r3953 r4178 18 18 19 19 //! An eumerator for different fileTypes the resourceManager supports \todo WAV, MP3, OGG support 20 enum ResourceType {OBJ, PRIM, WAV, MP3, OGG, TTF, IMAGE}; 20 enum ResourceType {OBJ, 21 PRIM, 22 WAV, 23 MP3, 24 OGG, 25 TTF, 26 IMAGE}; 21 27 //! An enumerator for different UNLOAD-types. 22 28 /** … … 26 32 RP_GAME: will be unloaded at the end of the whole Game (when closing orxonox) 27 33 */ 28 enum ResourcePriority {RP_NO = 0, RP_LEVEL = 1, RP_CAMPAIGN = 2, RP_GAME = 3}; 34 enum ResourcePriority {RP_NO = 0, 35 RP_LEVEL = 1, 36 RP_CAMPAIGN = 2, 37 RP_GAME = 3}; 29 38 30 39 //! A Struct that keeps track about A resource its name its Type, and so on … … 65 74 66 75 bool setDataDir(const char* dataDir); 76 /** \returns the Name of the data directory */ 77 inline const char* getDataDir(void) const {return this->dataDir;} 78 79 bool checkDataDir(const char* fileInside); 67 80 bool addImageDir(char* imageDir); 68 81 void* load(const char* fileName, ResourcePriority prio = RP_NO, … … 73 86 bool unload(Resource* resource, ResourcePriority = RP_NO); 74 87 bool unloadAllByPriority(ResourcePriority prio); 88 75 89 void debug(void); 90 91 // utility functions of this class 92 static bool isDir(const char* directory); 93 static bool isFile(const char* fileName); 94 static bool touchFile(const char* fileName); 95 static bool deleteFile(const char* fileName); 96 static char* homeDirCheck(const char* fileName); 97 static char* getFullName(const char* fileName); 76 98 77 99 private: … … 87 109 Resource* locateResourceByPointer(const void* pointer); 88 110 89 bool isDir(const char* directory);90 bool isFile(const char* directory);91 92 111 }; 93 112
Note: See TracChangeset
for help on using the changeset viewer.