00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "LampBasic.h"
00026 #include "Animation/Utility/AnimationCompressor.h"
00027 #include "Animation/VectorInterpolator/VectorInterpolationCompressor.h"
00028 #include "Animation/RotationInterpolator/RotationInterpolationCompressor.h"
00029 #include "Animation/RotationInterpolator/QuaternionArrayInterpolator.h"
00030 #include "Animation/RotationInterpolator/EulerArrayInterpolator.h"
00031 #include "Animation/System/AnimationSet.h"
00032 #include "Animation/Camera/CameraAnimation.h"
00033 #include "Animation/SceneNode/SceneNodeAnimation.h"
00034 #include "Animation/Model/CharacterModelAnimation.h"
00035
00036 namespace Lamp{
00037
00038
00039
00040 AnimationCompressor::AnimationCompressor() :
00041 scaleTolerance_(0.01f), rotationTolerance_(Math::PI * 0.01f),
00042 translationTolerance_(0.1f), scaleCompressor_(NULL),
00043 rotationCompressor_(NULL), translationCompressor_(NULL){
00044 }
00045
00046
00047 AnimationCompressor::~AnimationCompressor(){
00048 Assert(scaleCompressor_ == NULL);
00049 Assert(rotationCompressor_ == NULL);
00050 Assert(translationCompressor_ == NULL);
00051 }
00052
00053
00054
00055
00056 void AnimationCompressor::compress(Animation* animation){
00057
00058 scaleCompressor_ = new VectorInterpolationCompressor();
00059 rotationCompressor_ = new RotationInterpolationCompressor();
00060 translationCompressor_ = new VectorInterpolationCompressor();
00061
00062 compressAnimation(animation);
00063
00064 SafeDelete(translationCompressor_);
00065 SafeDelete(rotationCompressor_);
00066 SafeDelete(scaleCompressor_);
00067 }
00068
00069
00070 void AnimationCompressor::compressAnimation(Animation* animation){
00071 if(animation->isAnimationSet()){
00072 compressAnimationSet(animation->castAnimationSet());
00073 }else if(animation->isCameraAnimation()){
00074 compressCameraAnimation(animation->castCameraAnimation());
00075 }else if(animation->isSceneNodeAnimation()){
00076 compressSceneNodeAnimation(animation->castSceneNodeAnimation());
00077 }else if(animation->isCharacterModelAnimation()){
00078 compressCharacterModelAnimation(
00079 animation->castCharacterModelAnimation());
00080 }else{ Assert(false); }
00081 }
00082
00083
00084 void AnimationCompressor::compressAnimationSet(AnimationSet* animation){
00085 Assert(animation != NULL);
00086 int count = animation->getAnimationCount();
00087 for(int i = 0; i < count; i++){
00088 compressAnimation(animation->getAnimation(i));
00089 }
00090 }
00091
00092
00093 void AnimationCompressor::compressCameraAnimation(CameraAnimation* animation){
00094 Assert(animation != NULL);
00095 CameraAnimationData* data = animation->getCameraAnimationData();
00096 int sequenceCount = data->getSequenceCount();
00097 for(int i = 0; i < sequenceCount; i++){
00098 data->setRotation(i, compressRotation(data->getRotation(i)));
00099 data->setTranslation(i, compressTranslation(data->getTranslation(i)));
00100 }
00101 }
00102
00103
00104 void AnimationCompressor::compressSceneNodeAnimation(
00105 SceneNodeAnimation* animation){
00106 Assert(animation != NULL);
00107 SceneNodeAnimationData* data = animation->getSceneNodeAnimationData();
00108 int sequenceCount = data->getSequenceCount();
00109 for(int i = 0; i < sequenceCount; i++){
00110 data->setScale(i, compressScale(data->getScale(i)));
00111 data->setRotation(i, compressRotation(data->getRotation(i)));
00112 data->setTranslation(i, compressTranslation(data->getTranslation(i)));
00113 }
00114 }
00115
00116
00117 void AnimationCompressor::compressCharacterModelAnimation(
00118 CharacterModelAnimation* animation){
00119 Assert(animation != NULL);
00120 CharacterModelAnimationData* data =
00121 animation->getCharacterModelAnimationData();
00122 int sequenceCount = data->getSequenceCount();
00123 int boneCount = data->getBoneCount();
00124 for(int i = 0; i < sequenceCount; i++){
00125 for(int j = 0; j < boneCount; j++){
00126 data->setScale(i, j, compressScale(data->getScale(i, j)));
00127 data->setRotation(i, j, compressRotation(data->getRotation(i, j)));
00128 data->setTranslation(
00129 i, j, compressTranslation(data->getTranslation(i, j)));
00130 }
00131 }
00132 }
00133
00134
00135
00136
00137 VectorInterpolator* AnimationCompressor::compressScale(
00138 VectorInterpolator* interpolator){
00139
00140 if(interpolator == NULL){ return NULL; }
00141 VectorArrayInterpolator* array =
00142 interpolator->castVectorArrayInterpolator();
00143
00144 if(array == NULL){ return interpolator->duplicate(); }
00145 float maxValue = interpolator->getBoundingBox().getSize().maximumValue();
00146 return scaleCompressor_->compress(array, scaleTolerance_);
00147 }
00148
00149
00150 RotationInterpolator* AnimationCompressor::compressRotation(
00151 RotationInterpolator* interpolator){
00152
00153 if(interpolator == NULL){ return NULL; }
00154 QuaternionArrayInterpolator* array =
00155 interpolator->castQuaternionArrayInterpolator();
00156 if(array == NULL){
00157 EulerArrayInterpolator* eulerArray =
00158 interpolator->castEulerArrayInterpolator();
00159
00160 if(eulerArray == NULL){ return interpolator->duplicate(); }
00161 array = eulerArray->convertQuaternionArrayInterpolator();
00162 }
00163 return rotationCompressor_->compress(array, rotationTolerance_);
00164 }
00165
00166
00167 VectorInterpolator* AnimationCompressor::compressTranslation(
00168 VectorInterpolator* interpolator){
00169
00170 if(interpolator == NULL){ return NULL; }
00171 VectorArrayInterpolator* array =
00172 interpolator->castVectorArrayInterpolator();
00173
00174 if(array == NULL){ return interpolator->duplicate(); }
00175 return translationCompressor_->compress(array, translationTolerance_);
00176 }
00177
00178 }
00179