Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/particles/quick_animation.cc @ 4421

Last change on this file since 4421 was 4421, checked in by bensch, 19 years ago

orxonox/trunk: lifetime-animation works now via the quickAnimation (only for radius)

File size: 3.3 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: ...
13   co-programmer: ...
14*/
15
16//#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_
17
18#include "quick_animation.h"
19
20#include "compiler.h"
21#include "debug.h"
22#ifndef NULL
23#define NULL 0
24#endif
25
26
27using namespace std;
28
29
30/**
31   \brief standard constructor
32*/
33QuickAnimation::QuickAnimation (void)
34{
35   this->setClassName("QuickAnimation");
36
37   this->first = this->current = NULL;
38}
39
40
41/**
42   \brief standard deconstructor
43
44*/
45QuickAnimation::~QuickAnimation (void)
46{
47  this->current = this->first;
48  QuickKeyFrame delKF;
49 
50  while (this->current != NULL)
51    {
52      this->first = this->current->next;
53      delete this->current;
54      this->current = this->first;
55    }
56
57}
58
59/**
60   \brief adds a new entry to the list of keyframes
61   \param position the position to add the key to
62   \param value the Value to set for the position
63   \returns false if the key existed already for a given position
64*/
65bool QuickAnimation::addEntry(float position, float value)
66{
67  this->current = this->first;
68  while (this->current != NULL)
69    {
70      // if it is between some keyframes
71      if ((!this->current->next && this->current->position < position)
72          || (this->current->position < position && this->current->next->position > position))
73        break;
74      // if it is the same as an already existing keyframe
75      else if (this->current->position == position)
76        return false;
77      this->current = this->current->next;
78    }
79
80  QuickKeyFrame* newKey = new QuickKeyFrame;
81  if (this->first == NULL)
82    {
83      this->first = newKey;
84      this->current = newKey;
85      newKey->next = NULL;
86    }
87  else
88    {
89      newKey->next = this->current->next;
90      this->current->next = newKey;
91    }
92  newKey->value = value;
93  newKey->position = position;
94 
95  this->current = this->first;
96}
97
98/**
99   \brief returns the value of the animation at a certain position
100   \param position the position to get the value from :)
101*/
102float QuickAnimation::getValue(float position)
103{
104  if (unlikely(this->first == NULL))
105    return 0.0;
106  else if (unlikely (this->first->next == NULL))
107    return this->first->value;
108  else
109    {
110      if (unlikely(position < this->current->position))
111        {
112          if (position <= this->first->position)
113            return this->first->value;
114          this->current = this->first;
115        }
116      while (likely(this->current->next != NULL && position > this->current->next->position))
117        this->current = this->current->next;
118      if (this->current->next == NULL)
119        return this->current->value;
120               
121      return this->current->value + (this->current->next->value - this->current->value)
122        * ((position-this->current->position) / (this->current->next->position -this->current->position));
123    }
124}
125
126
127void QuickAnimation::debug(void)
128{
129  this->current = this->first;
130
131  PRINT(0)("QuickAnim:: (position, value)");
132  while(this->current)
133    {
134      PRINT(0)("->(%f, %f)", this->current->position, this->current->value);
135      this->current = this->current->next;
136    }
137
138  PRINT(0)("\n");
139  this->current = this->first;
140}
Note: See TracBrowser for help on using the repository browser.