MultiInterpolationAnimationT.cc 7.83 KB
Newer Older
1
2
3
/*===========================================================================*\
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
*                           www.openflipper.org                              *
*                                                                            *
*--------------------------------------------------------------------------- *
*  This file is part of OpenFlipper.                                         *
*                                                                            *
*  OpenFlipper is free software: you can redistribute it and/or modify       *
*  it under the terms of the GNU Lesser General Public License as            *
*  published by the Free Software Foundation, either version 3 of            *
*  the License, or (at your option) any later version with the               *
*  following exceptions:                                                     *
*                                                                            *
*  If other files instantiate templates or use macros                        *
*  or inline functions from this file, or you compile this file and          *
*  link it with other files to produce an executable, this file does         *
*  not by itself cause the resulting executable to be covered by the         *
*  GNU Lesser General Public License. This exception does not however        *
*  invalidate any other reasons why the executable file might be             *
*  covered by the GNU Lesser General Public License.                         *
*                                                                            *
*  OpenFlipper is distributed in the hope that it will be useful,            *
*  but WITHOUT ANY WARRANTY; without even the implied warranty of            *
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
*  GNU Lesser General Public License for more details.                       *
*                                                                            *
*  You should have received a copy of the GNU LesserGeneral Public           *
*  License along with OpenFlipper. If not,                                   *
*  see <http://www.gnu.org/licenses/>.                                       *
*                                                                            *
\*===========================================================================*/

/*===========================================================================*\
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
\*===========================================================================*/

Dirk Wilden's avatar
Dirk Wilden committed
43
44
45
46
47
48
49
50
51
52
53
54
#define MULTIINTERPOLATIONANIMATIONT_C

#include "AnimationT.hh"
#include <algorithm>

//-----------------------------------------------------------------------------------------------------

/**
 * @brief Copy constructor
 *
 * @param _other The animation to copy from
 */
55
56
57
template<class PointT>
MultiInterpolationAnimationT<PointT>::MultiInterpolationAnimationT(const MultiInterpolationAnimationT<PointT> &_other) :
        InterpolationAnimationT<PointT>(NULL, NULL),
Dirk Wilden's avatar
Dirk Wilden committed
58
59
60
61
62
63
        interpolationAnimations_(_other.interpolationAnimations_)
{
}

//-----------------------------------------------------------------------------------------------------

64
65
66
template<class PointT>
AnimationT<PointT>* MultiInterpolationAnimationT<PointT>::copy() {
  return new MultiInterpolationAnimationT<PointT>(*this);
Dirk Wilden's avatar
Dirk Wilden committed
67
68
69
70
}

//-----------------------------------------------------------------------------------------------------

71
72
template<class PointT>
bool MultiInterpolationAnimationT<PointT>::getMinInput(Scalar& _result) {
Dirk Wilden's avatar
Dirk Wilden committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  if (interpolationAnimations_.size() == 0)
    return false;
  else
    interpolationAnimations_[0]->getMinInput(_result);
  
  for (uint i=0;i<interpolationAnimations_.size();++i) {
    Scalar currentInput;
    interpolationAnimations_[i]->getMinInput(currentInput);
    
    if (currentInput < _result)
      _result = currentInput;
  }
  
  return true;
}

//-----------------------------------------------------------------------------------------------------

91
92
template<class PointT>
bool MultiInterpolationAnimationT<PointT>::getMaxInput(Scalar& _result) {
Dirk Wilden's avatar
Dirk Wilden committed
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  if (interpolationAnimations_.size() == 0)
    return false;
  else
    interpolationAnimations_[0]->getMaxInput(_result);
  
  for (uint i=0;i<interpolationAnimations_.size();++i) {
    Scalar currentInput;
    interpolationAnimations_[i]->getMaxInput(currentInput);
    
    if (currentInput > _result)
      _result = currentInput;;
  }
  
  return true;
}

//-----------------------------------------------------------------------------------------------------

/**
 * @brief Returns the number of frames that this animation can playback
 * Note that this is not simply the sum of all animations' frame counts, as they can (and most likely will) overlap.
 */
115
116
template<class PointT>
unsigned int MultiInterpolationAnimationT<PointT>::frameCount()
Dirk Wilden's avatar
Dirk Wilden committed
117
118
119
120
121
122
123
124
125
126
127
{
  Scalar minInput=0, maxInput=0;
  if (getMinInput(minInput) && getMaxInput(maxInput)) {
    return ((maxInput - minInput) * FPS);
  }
  
  return 0;
}

//-----------------------------------------------------------------------------------------------------

128
129
template<class PointT>
PoseT<PointT> * MultiInterpolationAnimationT<PointT>::pose(unsigned int _iFrame) {
Dirk Wilden's avatar
Dirk Wilden committed
130
131
132
133
134
135
136
137
138
139
140
141
142
  //Use the reference pose of the first (in terms of the input value, i.e. the time in most cases)
 
  if (interpolationAnimations_.size() == 0)
    return NULL;
 
  Scalar minValue=0; uint minInterpolationAnimationIndex = 0;
  for (uint i=0; i<interpolationAnimations_.size(); ++i) {
    Scalar currentValue;
    interpolationAnimations_[i]->getMinInput(currentValue);
    Scalar minValueTmp = std::min(minValue, currentValue);
    minInterpolationAnimationIndex = (minValueTmp < minValue) ? i : minInterpolationAnimationIndex;
  }

143
  return pose(_iFrame, interpolationAnimations_[minValue]->getReference());
Dirk Wilden's avatar
Dirk Wilden committed
144
145
146
147
}

//-----------------------------------------------------------------------------------------------------

148
149
template<class PointT>
PoseT<PointT> * MultiInterpolationAnimationT<PointT>::pose(unsigned int _iFrame, Pose* _reference) {
Dirk Wilden's avatar
Dirk Wilden committed
150
151
152
153
154
155
156
157
158
159
  if (_iFrame == 0)
    return _reference;
  
  Pose* newPose = NULL;
  Pose* referenceCopy = new Pose(*_reference);
  
  for (uint i=0; i<interpolationAnimations_.size(); ++i) {
    Scalar minInput, maxInput;
    interpolationAnimations_[i]->getMinInput(minInput); interpolationAnimations_[i]->getMaxInput(maxInput);
    
160
161
    unsigned int minFrame = (minInput * FPS);
    unsigned int maxFrame = (maxInput * FPS);
Dirk Wilden's avatar
Dirk Wilden committed
162
163
164
165
166
167
168
    
    //Check, if the current animation is responsible for displaying this frame
    if (_iFrame < minFrame || _iFrame > maxFrame)
      continue;
    
    if (interpolationAnimations_[i]) {
      if (newPose == NULL)
169
        newPose = interpolationAnimations_[i]->pose(_iFrame - minFrame, referenceCopy);
Dirk Wilden's avatar
Dirk Wilden committed
170
      else
171
        newPose = interpolationAnimations_[i]->pose(_iFrame - minFrame, newPose);
Dirk Wilden's avatar
Dirk Wilden committed
172
173
174
175
176
177
178
179
180
181
182
183
184
    }
  }
  
  delete referenceCopy;
  
  if (newPose == NULL)
    newPose = _reference;
  
  return newPose;
}

//-----------------------------------------------------------------------------------------------------

185
186
template<class PointT>
InterpolationAnimationT<PointT>* MultiInterpolationAnimationT<PointT>::animation(unsigned int _index ) {
Dirk Wilden's avatar
Dirk Wilden committed
187
188
189
190
191
192
193
194
  if ( _index < interpolationAnimations_.size() )
    return interpolationAnimations_[ _index ];
  else 
    return 0;
}

//-----------------------------------------------------------------------------------------------------