Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __SP_KEYFRAME_SEQUENCE_H__
00009 #define __SP_KEYFRAME_SEQUENCE_H__
00010
00011
00012 #include "Base/spStandard.hpp"
00013 #include "Base/spTransformation3D.hpp"
00014
00015 #include <vector>
00016
00017
00018 namespace sp
00019 {
00020 namespace scene
00021 {
00022
00023
00024 enum EKeyframeFlags
00025 {
00026 KEYFRAME_POSITION = 0x01,
00027 KEYFRAME_ROTATION = 0x02,
00028 KEYFRAME_SCALE = 0x04,
00029 KEYFRAME_ALL = KEYFRAME_POSITION | KEYFRAME_ROTATION | KEYFRAME_SCALE,
00030 };
00031
00032
00038 class SP_EXPORT KeyframeSequence
00039 {
00040
00041 public:
00042
00043 KeyframeSequence();
00044 ~KeyframeSequence();
00045
00046
00047
00048 #if 1 //!!!
00049
00050 void addKeyPosition(u32 Frame, const dim::vector3df &Position);
00051 void addKeyRotation(u32 Frame, const dim::quaternion &Rotation);
00052 void addKeyScale(u32 Frame, const dim::vector3df &Scale);
00053
00054 void addKeyframe(u32 Frame, s32 _deb_ToBeremoved_, const Transformation &Transform, s32 Flags = KEYFRAME_ALL);
00055
00065 bool removeKeyframe(u32 Frame, s32 _deb_ToBeremoved_, s32 Flags = KEYFRAME_ALL);
00066
00083 bool updateSequence();
00084
00093 void setUpdateImmediate(bool Enable);
00094
00095 #endif
00096
00105 void addKeyframe(u32 Frame, const Transformation &Transform);
00106
00108 void removeKeyframe(u32 Frame);
00109
00110
00111
00116 inline const Transformation& getKeyframe(u32 Frame) const
00117 {
00118 return Keyframes_[Frame];
00119 }
00124 inline Transformation& getKeyframe(u32 Frame)
00125 {
00126 return Keyframes_[Frame];
00127 }
00128
00136 inline void interpolate(Transformation &Result, u32 From, u32 To, f32 Interpolation)
00137 {
00138 const u32 FrameCount = Keyframes_.size();
00139 if (From < FrameCount && To < FrameCount)
00140 Result.interpolate(Keyframes_[From], Keyframes_[To], Interpolation);
00141 }
00142
00144 inline u32 getKeyframeCount() const
00145 {
00146 return Keyframes_.size();
00147 }
00148
00150 inline u32 getMinKeyframe() const
00151 {
00152 return MinFrame_;
00153 }
00155 inline u32 getMaxKeyframe() const
00156 {
00157 return MaxFrame_;
00158 }
00159
00161 inline bool getUpdateImmediate() const
00162 {
00163 return UpdateImmediate_;
00164 }
00165
00171 inline bool modified() const
00172 {
00173 return Modified_;
00174 }
00175
00176 private:
00177
00178
00179
00180 #if 1 //!!!
00181
00182 template <class VecT> struct SKey
00183 {
00184 SKey() :
00185 Frame(0)
00186 {
00187 }
00188 SKey(u32 FrameIndex, const VecT &KeyVec) :
00189 Frame (FrameIndex ),
00190 Vec (KeyVec )
00191 {
00192 }
00193 ~SKey()
00194 {
00195 }
00196
00197
00198 u32 Frame;
00199 VecT Vec;
00200 };
00201
00202 typedef SKey<dim::vector3df> SKeyPos;
00203 typedef SKey<dim::quaternion> SKeyRot;
00204 typedef SKey<dim::vector3df> SKeyScl;
00205
00206 #endif
00207
00208
00209
00210 void findRootFrameRange(u32 Frame, u32* LeftFrame, u32* RightFrame);
00211
00212 void pushBackKeyframe(const Transformation &Transform, u32 Frame);
00213 void insertKeyframe(const Transformation &Transform, u32 Frame);
00214
00215 void popBackKeyframe(u32 Frame);
00216 void extractKeyframe(u32 Frame);
00217
00218 #if 1 //!!!
00219
00220 void updateFrameRangeComplete();
00221 void markAsModified();
00222
00223 #endif
00224
00225
00226
00227 template <typename T> void insertKey(std::vector<T> &Keyframes, const T &Key)
00228 {
00229
00230
00231
00232 typename std::vector<T>::reverse_iterator it = Keyframes.rbegin();
00233
00234 while (it != Keyframes.rend() && it->Frame > Key.Frame)
00235 ++it;
00236
00237 if (it != Keyframes.rend() && it->Frame == Key.Frame)
00238 it->Vec = Key.Vec;
00239 else
00240 {
00241
00242 Keyframes.insert(it.base(), Key);
00243
00244
00245 math::Decrease(MinFrame_, Key.Frame);
00246 math::Increase(MaxFrame_, Key.Frame);
00247 }
00248 }
00249
00250 template <typename T> bool removeKey(std::vector<T> &Keyframes, u32 Frame)
00251 {
00252 for (typename std::vector<T>::iterator it = Keyframes.begin(); it != Keyframes.end(); ++it)
00253 {
00254 if (it->Frame == Frame)
00255 {
00256 Keyframes.erase(it);
00257 return true;
00258 }
00259 }
00260 return false;
00261 }
00262
00263 template <typename T> void updateFrameRange(std::vector<T> &Keyframes)
00264 {
00265 for (typename std::vector<T>::iterator it = Keyframes.begin(); it != Keyframes.end(); ++it)
00266 {
00267 math::Decrease(MinFrame_, it->Frame);
00268 math::Increase(MaxFrame_, it->Frame);
00269 }
00270 }
00271
00272 template <typename T> void filterMinFrame(std::vector<T> &Keyframes)
00273 {
00274 if (!Keyframes.empty())
00275 {
00276 const u32 Frame = Keyframes.back().Frame;
00277 if (MinFrame_ > Frame)
00278 MinFrame_ = Frame;
00279 }
00280 }
00281
00282 template <typename T> void filterMaxFrame(std::vector<T> &Keyframes)
00283 {
00284 if (!Keyframes.empty())
00285 {
00286 const u32 Frame = Keyframes.front().Frame;
00287 if (MaxFrame_ < Frame)
00288 MaxFrame_ = Frame;
00289 }
00290 }
00291
00293 template <typename T, class VecT> typename std::vector<T>::iterator getFirstInterpVectors(
00294 std::vector<T> &Keyframes, VecT &FromVec, VecT &ToVec, u32 &FromIndex, u32 &ToIndex)
00295 {
00296 typename std::vector<T>::iterator it = Keyframes.begin();
00297
00298 if (it != Keyframes.end())
00299 {
00300 FromVec = it->Vec;
00301 FromIndex = it->Frame;
00302
00303 ++it;
00304 if (it != Keyframes.end())
00305 {
00306 ToVec = it->Vec;
00307 ToIndex = it->Frame;
00308 }
00309 else
00310 {
00311 ToVec = FromVec;
00312 ToIndex = FromIndex;
00313 }
00314 }
00315
00316 ++ToIndex;
00317
00318 return it;
00319 }
00320
00322 template <typename T, class VecT> void getNextInterpIterator(
00323 std::vector<T> &Keyframes, typename std::vector<T>::iterator &it, u32 Frame,
00324 VecT &FromVec, VecT &ToVec, u32 &FromIndex, u32 &ToIndex)
00325 {
00326 if (it != Keyframes.end() && Frame >= it->Frame)
00327 {
00328 ++it;
00329
00330 FromVec = ToVec;
00331 FromIndex = Frame;
00332
00333 if (it != Keyframes.end())
00334 {
00335 ToVec = it->Vec;
00336 ToIndex = it->Frame + 1;
00337 }
00338 else
00339 ToIndex = Frame + 1;
00340 }
00341 }
00342
00343
00344
00345
00346 std::vector<bool> RootKeyframes_;
00347
00348 #if 1 //!!!
00349
00350 std::vector<SKeyPos> ConstructKeysPos_;
00351 std::vector<SKeyRot> ConstructKeysRot_;
00352 std::vector<SKeyScl> ConstructKeysScl_;
00353
00354 std::vector<Transformation> Keyframes_;
00355
00356 u32 MinFrame_, MaxFrame_;
00357
00358 bool Modified_;
00359 bool UpdateImmediate_;
00360
00361 #endif
00362
00363 };
00364
00365
00366 }
00367
00368 }
00369
00370
00371 #endif
00372
00373
00374
00375