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/InputOutput/TextAnimationSaver.h"
00027 #include "Core/InputOutput/TextFileWriter.h"
00028
00029 #include "Animation/VectorInterpolator/VectorConstantInterpolator.h"
00030 #include "Animation/VectorInterpolator/VectorArrayInterpolator.h"
00031 #include "Animation/VectorInterpolator/VectorLinearInterpolator.h"
00032 #include "Animation/RotationInterpolator/RotationConstantInterpolator.h"
00033 #include "Animation/RotationInterpolator/EulerArrayInterpolator.h"
00034 #include "Animation/RotationInterpolator/QuaternionArrayInterpolator.h"
00035 #include "Animation/RotationInterpolator/QuaternionLinearInterpolator.h"
00036
00037 #include "Animation/System/AnimationManager.h"
00038 #include "Animation/System/AnimationSet.h"
00039 #include "Animation/Camera/CameraAnimation.h"
00040 #include "Animation/SceneNode/SceneNodeAnimation.h"
00041 #include "Animation/Model/CharacterModelAnimation.h"
00042
00043 namespace Lamp{
00044
00045
00046
00047 TextAnimationSaver::TextAnimationSaver(){
00048 }
00049
00050
00051 TextAnimationSaver::~TextAnimationSaver(){
00052 }
00053
00054
00055 void TextAnimationSaver::save(
00056 const String& filePath, AnimationManager* manager){
00057 TextFileWriter* textFileWriter = new TextFileWriter(filePath);
00058 save(textFileWriter, manager);
00059 delete textFileWriter;
00060 }
00061
00062
00063 void TextAnimationSaver::save(
00064 TextWriter* textWriter, AnimationManager* manager){
00065 writer_ = textWriter;
00066 manager_ = manager;
00067
00068 writeHeader();
00069
00070 if(countObjects() == 0){ return; }
00071
00072 writeAnimationList();
00073
00074 writeLink();
00075 writeLineComment();
00076 }
00077
00078
00079 void TextAnimationSaver::writeHeader(){
00080 writeBlockComment("Header");
00081 writer_->writeText("Header {\n");
00082 writer_->writeText("\ttype LampTextAnimationFormat\n");
00083 writer_->writeText("\tversion 0_9_0\n");
00084 writer_->writeText("}\n\n");
00085 }
00086
00087
00088 int TextAnimationSaver::countObjects(){
00089
00090 animationCount_ = manager_->getCount();
00091 animationSetCount_ = 0;
00092 cameraCount_ = 0;
00093 sceneNodeCount_ = 0;
00094 characterModelCount_ = 0;
00095
00096 for(int i = 0; i < animationCount_; i++){
00097 Animation* animation = manager_->get(i);
00098 if(animation->isAnimationSet()){
00099 animationSetCount_++;
00100 }else if(animation->isCameraAnimation()){
00101 cameraCount_++;
00102 }else if(animation->isSceneNodeAnimation()){
00103 sceneNodeCount_++;
00104 }else if(animation->isCharacterModelAnimation()){
00105 characterModelCount_++;
00106 }else{
00107 ErrorOut("TextAnimationSaver::countObjects() "
00108 "Unsupported animation type");
00109 }
00110 }
00111
00112 animationDataCount_ = manager_->getDataCount();
00113 cameraDataCount_ = 0;
00114 sceneNodeDataCount_ = 0;
00115 characterModelDataCount_ = 0;
00116
00117 for(int i = 0; i < animationDataCount_; i++){
00118 AnimationData* data = manager_->getData(i);
00119 if(data->isCameraAnimationData()){
00120 cameraDataCount_++;
00121 }else if(data->isSceneNodeAnimationData()){
00122 sceneNodeDataCount_++;
00123 }else if(data->isCharacterModelAnimationData()){
00124 characterModelDataCount_++;
00125 }else{
00126 ErrorOut("TextAnimationSaver::countObjects() "
00127 "Unsupported animation data type");
00128 }
00129 }
00130 return (animationCount_ + animationDataCount_);
00131 }
00132
00133
00134 void TextAnimationSaver::writeAnimationList(){
00135
00136 if(animationSetCount_ != 0){
00137 writeBlockComment("AnimationSet");
00138 writer_->writeText("AnimationSet {\n");
00139 for(int i = 0; i < animationCount_; i++){
00140 Animation* animation = manager_->get(i);
00141 if(animation->isAnimationSet()){
00142 writeAnimationSet(animation->castAnimationSet());
00143 }
00144 }
00145 writer_->writeText("}\n\n");
00146 }
00147
00148 if(cameraCount_ != 0){
00149 writeBlockComment("CameraAnimation");
00150 writer_->writeText("CameraAnimation {\n");
00151 for(int i = 0; i < animationCount_; i++){
00152 Animation* animation = manager_->get(i);
00153 if(animation->isCameraAnimation()){
00154 writeCameraAnimation(animation->castCameraAnimation());
00155 }
00156 }
00157 writer_->writeText("}\n\n");
00158 }
00159
00160 if(cameraDataCount_ != 0){
00161 writeBlockComment("CameraAnimationData");
00162 writer_->writeText("CameraAnimationData {\n");
00163 for(int i = 0; i < animationDataCount_; i++){
00164 AnimationData* data = manager_->getData(i);
00165 if(data->isCameraAnimationData()){
00166 writeCameraAnimationData(
00167 data->castCameraAnimationData());
00168 }
00169 }
00170 writer_->writeText("}\n\n");
00171 }
00172
00173 if(sceneNodeCount_ != 0){
00174 writeBlockComment("SceneNodeAnimation");
00175 writer_->writeText("SceneNodeAnimation {\n");
00176 for(int i = 0; i < animationCount_; i++){
00177 Animation* animation = manager_->get(i);
00178 if(animation->isSceneNodeAnimation()){
00179 writeSceneNodeAnimation(animation->castSceneNodeAnimation());
00180 }
00181 }
00182 writer_->writeText("}\n\n");
00183 }
00184
00185 if(sceneNodeDataCount_ != 0){
00186 writeBlockComment("SceneNodeAnimationData");
00187 writer_->writeText("SceneNodeAnimationData {\n");
00188 for(int i = 0; i < animationDataCount_; i++){
00189 AnimationData* data = manager_->getData(i);
00190 if(data->isSceneNodeAnimationData()){
00191 writeSceneNodeAnimationData(
00192 data->castSceneNodeAnimationData());
00193 }
00194 }
00195 writer_->writeText("}\n\n");
00196 }
00197
00198 if(characterModelCount_ != 0){
00199 writeBlockComment("CharacterModelAnimation");
00200 writer_->writeText("CharacterModelAnimation {\n");
00201 for(int i = 0; i < animationCount_; i++){
00202 Animation* animation = manager_->get(i);
00203 if(animation->isCharacterModelAnimation()){
00204 writeCharacterModelAnimation(
00205 animation->castCharacterModelAnimation());
00206 }
00207 }
00208 writer_->writeText("}\n\n");
00209 }
00210
00211 if(characterModelDataCount_ != 0){
00212 writeBlockComment("CharacterModelAnimationData");
00213 writer_->writeText("CharacterModelAnimationData {\n");
00214 for(int i = 0; i < animationDataCount_; i++){
00215 AnimationData* data = manager_->getData(i);
00216 if(data->isCharacterModelAnimationData()){
00217 writeCharacterModelAnimationData(
00218 data->castCharacterModelAnimationData());
00219 }
00220 }
00221 writer_->writeText("}\n\n");
00222 }
00223 }
00224
00225
00226 void TextAnimationSaver::writeLink(){
00227 writeBlockComment("Link");
00228
00229 if(animationSetCount_ != 0){
00230 writer_->writeText("AnimationSetLink {\n");
00231 for(int i = 0; i < animationCount_; i++){
00232 Animation* animation = manager_->get(i);
00233 if(animation->isAnimationSet()){
00234 writeAnimationSetLink(animation->castAnimationSet());
00235 }
00236 }
00237 writer_->writeText("}\n\n");
00238 }
00239
00240 if(cameraCount_ != 0){
00241 writer_->writeText("CameraLink {\n");
00242 for(int i = 0; i < animationCount_; i++){
00243 Animation* animation = manager_->get(i);
00244 if(animation->isCameraAnimation()){
00245 writeCameraAnimationLink(
00246 animation->castCameraAnimation());
00247 }
00248 }
00249 writer_->writeText("}\n\n");
00250 }
00251
00252 if(sceneNodeCount_ != 0){
00253 writer_->writeText("SceneNodeLink {\n");
00254 for(int i = 0; i < animationCount_; i++){
00255 Animation* animation = manager_->get(i);
00256 if(animation->isSceneNodeAnimation()){
00257 writeSceneNodeAnimationLink(
00258 animation->castSceneNodeAnimation());
00259 }
00260 }
00261 writer_->writeText("}\n\n");
00262 }
00263
00264 if(characterModelCount_ != 0){
00265 writer_->writeText("CharacterModelLink {\n");
00266 for(int i = 0; i < animationCount_; i++){
00267 Animation* animation = manager_->get(i);
00268 if(animation->isCharacterModelAnimation()){
00269 writeCharacterModelAnimationLink(
00270 animation->castCharacterModelAnimation());
00271 }
00272 }
00273 writer_->writeText("}\n\n");
00274 }
00275 }
00276
00277
00278
00279
00280 void TextAnimationSaver::writeAnimationSet(AnimationSet* animation){
00281 writer_->writeText("\t");
00282 writer_->writeText(animation->getName());
00283 writer_->writeText(" {\n");
00284
00285 writer_->writeText("\t\tenabled ");
00286 writeBool(animation->isEnabled());
00287 writer_->writeText("\n");
00288 writer_->writeText("\t}\n\n");
00289 }
00290
00291
00292
00293
00294 void TextAnimationSaver::writeCameraAnimation(CameraAnimation* animation){
00295 writer_->writeText("\t");
00296 writer_->writeText(animation->getName());
00297 writer_->writeText(" {\n");
00298
00299 writer_->writeText("\t\ttargetName ");
00300 writer_->writeText(animation->getTargetName());
00301 writer_->writeText("\n");
00302
00303 writer_->writeText("\t\tenabled ");
00304 writeBool(animation->isEnabled());
00305 writer_->writeText("\n");
00306 writer_->writeText("\t}\n\n");
00307 }
00308
00309
00310 void TextAnimationSaver::writeCameraAnimationData(
00311 CameraAnimationData* data){
00312 writer_->writeText("\t");
00313 writer_->writeText(data->getName());
00314 writer_->writeText(" {\n");
00315
00316 int sequenceCount = data->getSequenceCount();
00317 writer_->writeFormat("\t\tsequenceCount %d\n", sequenceCount);
00318
00319 String tabDepth = "\t\t\t";
00320 for(int i = 0; i < sequenceCount; i++){
00321 writer_->writeFormat("\t\tsequence %d {\n", i);
00322
00323 writeRotationInterpolator(
00324 data->getRotation(i), "rotation", tabDepth);
00325
00326 writeVectorInterpolator(
00327 data->getTranslation(i), "translation", tabDepth);
00328
00329 writer_->writeText("\t\t\tlooped ");
00330 writeBool(data->isLooped(i));
00331 writer_->writeText("\n\t\t}\n");
00332 }
00333 writer_->writeText("\t}\n\n");
00334 }
00335
00336
00337
00338
00339 void TextAnimationSaver::writeSceneNodeAnimation(SceneNodeAnimation* animation){
00340 writer_->writeText("\t");
00341 writer_->writeText(animation->getName());
00342 writer_->writeText(" {\n");
00343
00344 writer_->writeText("\t\ttargetName ");
00345 writer_->writeText(animation->getTargetName());
00346 writer_->writeText("\n");
00347
00348 writer_->writeText("\t\tenabled ");
00349 writeBool(animation->isEnabled());
00350 writer_->writeText("\n");
00351 writer_->writeText("\t}\n\n");
00352 }
00353
00354
00355 void TextAnimationSaver::writeSceneNodeAnimationData(
00356 SceneNodeAnimationData* data){
00357 writer_->writeText("\t");
00358 writer_->writeText(data->getName());
00359 writer_->writeText(" {\n");
00360
00361 int sequenceCount = data->getSequenceCount();
00362 writer_->writeFormat("\t\tsequenceCount %d\n", sequenceCount);
00363
00364 String tabDepth = "\t\t\t";
00365 for(int i = 0; i < sequenceCount; i++){
00366 writer_->writeFormat("\t\tsequence %d {\n", i);
00367
00368 writeVectorInterpolator(
00369 data->getScale(i), "scale", tabDepth);
00370
00371 writeRotationInterpolator(
00372 data->getRotation(i), "rotation", tabDepth);
00373
00374 writeVectorInterpolator(
00375 data->getTranslation(i), "translation", tabDepth);
00376
00377 writer_->writeText("\t\t\tlooped ");
00378 writeBool(data->isLooped(i));
00379 writer_->writeText("\n\t\t}\n");
00380 }
00381 writer_->writeText("\t}\n\n");
00382 }
00383
00384
00385
00386
00387 void TextAnimationSaver::writeCharacterModelAnimation(
00388 CharacterModelAnimation* animation){
00389 writer_->writeText("\t");
00390 writer_->writeText(animation->getName());
00391 writer_->writeText(" {\n");
00392
00393 writer_->writeText("\t\ttargetName ");
00394 writer_->writeText(animation->getTargetName());
00395 writer_->writeText("\n");
00396
00397 int boneCount = animation->getBoneCount();
00398 writer_->writeFormat("\t\tboneCount %d {\n", boneCount);
00399 for(int i = 0; i < boneCount; i++){
00400 writer_->writeText("\t\t\t");
00401 writer_->writeText(animation->getBoneName(i));
00402 writer_->writeText("\n");
00403 }
00404 writer_->writeText("\t\t}\n");
00405
00406 writer_->writeText("\t\tenabled ");
00407 writeBool(animation->isEnabled());
00408 writer_->writeText("\n");
00409 writer_->writeText("\t}\n\n");
00410 }
00411
00412
00413 void TextAnimationSaver::writeCharacterModelAnimationData(
00414 CharacterModelAnimationData* data){
00415 writer_->writeText("\t");
00416 writer_->writeText(data->getName());
00417 writer_->writeText(" {\n");
00418
00419 int boneCount = data->getBoneCount();
00420 writer_->writeFormat("\t\tboneCount %d\n", boneCount);
00421
00422 int sequenceCount = data->getSequenceCount();
00423 writer_->writeFormat("\t\tsequenceCount %d\n", sequenceCount);
00424
00425 String tabDepth = "\t\t\t\t";
00426 for(int i = 0; i < sequenceCount; i++){
00427 writer_->writeFormat("\t\tsequence %d {\n", i);
00428 for(int j = 0; j < boneCount; j++){
00429 writer_->writeFormat("\t\t\tbone %d {\n", j);
00430
00431 writeVectorInterpolator(
00432 data->getScale(i, j), "scale", tabDepth);
00433
00434 writeRotationInterpolator(
00435 data->getRotation(i, j), "rotation", tabDepth);
00436
00437 writeVectorInterpolator(
00438 data->getTranslation(i, j), "translation", tabDepth);
00439 writer_->writeText("\t\t\t}\n");
00440 }
00441
00442 writer_->writeText("\t\t\tlooped ");
00443 writeBool(data->isLooped(i));
00444 writer_->writeText("\n\t\t}\n");
00445 }
00446 writer_->writeText("\t}\n\n");
00447 }
00448
00449
00450
00451
00452 void TextAnimationSaver::writeAnimationSetLink(AnimationSet* animation){
00453 int childCount = animation->getAnimationCount();
00454 if(childCount == 0){ return; }
00455 writer_->writeText("\t");
00456 writer_->writeText(animation->getName());
00457 writer_->writeText(" {\n");
00458 for(int i = 0; i < childCount; i++){
00459 Animation* child = animation->getAnimation(i);
00460 writer_->writeText("\t\t");
00461 writer_->writeText(child->getName());
00462 writer_->writeText("\n");
00463 }
00464 writer_->writeText("\t}\n\n");
00465 }
00466
00467
00468 void TextAnimationSaver::writeCameraAnimationLink(
00469 CameraAnimation* animation){
00470 writer_->writeText("\t");
00471 writer_->writeText(animation->getName());
00472 writer_->writeText(" ");
00473 writer_->writeText(animation->getAnimationData()->getName());
00474 writer_->writeText("\n");
00475 }
00476
00477
00478 void TextAnimationSaver::writeSceneNodeAnimationLink(
00479 SceneNodeAnimation* animation){
00480 writer_->writeText("\t");
00481 writer_->writeText(animation->getName());
00482 writer_->writeText(" ");
00483 writer_->writeText(animation->getAnimationData()->getName());
00484 writer_->writeText("\n");
00485 }
00486
00487
00488 void TextAnimationSaver::writeCharacterModelAnimationLink(
00489 CharacterModelAnimation* animation){
00490 writer_->writeText("\t");
00491 writer_->writeText(animation->getName());
00492 writer_->writeText(" ");
00493 writer_->writeText(animation->getAnimationData()->getName());
00494 writer_->writeText("\n");
00495 }
00496
00497
00498
00499
00500 void TextAnimationSaver::writeVectorInterpolator(
00501 VectorInterpolator* interpolator,
00502 const String& name, const String& tabDepth){
00503
00504 if(interpolator == NULL){
00505 writer_->writeText(tabDepth);
00506 writer_->writeText(name);
00507 writer_->writeText(" NULL\n");
00508 return;
00509 }
00510
00511 if(interpolator->isVectorConstantInterpolator()){
00512 writeVectorConstantInterpolator(
00513 interpolator->castVectorConstantInterpolator(), name, tabDepth);
00514 }else if(interpolator->isVectorArrayInterpolator()){
00515 writeVectorArrayInterpolator(
00516 interpolator->castVectorArrayInterpolator(), name, tabDepth);
00517 }else if(interpolator->isVectorLinearInterpolator()){
00518 writeVectorLinearInterpolator(
00519 interpolator->castVectorLinearInterpolator(), name, tabDepth);
00520 }else{
00521 ErrorOut("TextAnimationSaver::writeVectorInterpolator() "
00522 "Unsupported interpolater");
00523 }
00524 }
00525
00526
00527 void TextAnimationSaver::writeVectorConstantInterpolator(
00528 VectorConstantInterpolator* interpolator,
00529 const String& name, const String& tabDepth){
00530
00531 writer_->writeText(tabDepth);
00532 writer_->writeText(name);
00533 writer_->writeText(" {\n");
00534
00535 writer_->writeText(tabDepth);
00536 writer_->writeText("\ttype Constant\n");
00537
00538 writer_->writeText(tabDepth);
00539 writer_->writeFormat("\tlength %.8f\n", interpolator->getLength());
00540
00541 writer_->writeText(tabDepth);
00542 Vector3 value = interpolator->getValue();
00543 writer_->writeFormat("\tvalue { %.8f %.8f %.8f }\n",
00544 value.x, value.y, value.z);
00545 writer_->writeText(tabDepth);
00546 writer_->writeText("}\n");
00547 }
00548
00549
00550 void TextAnimationSaver::writeVectorArrayInterpolator(
00551 VectorArrayInterpolator* interpolator,
00552 const String& name, const String& tabDepth){
00553
00554 writer_->writeText(tabDepth);
00555 writer_->writeText(name);
00556 writer_->writeText(" {\n");
00557
00558 writer_->writeText(tabDepth);
00559 writer_->writeText("\ttype Array\n");
00560
00561 writer_->writeText(tabDepth);
00562 int size = interpolator->getSize();
00563 writer_->writeFormat("\tvalue %d {\n", size);
00564 String valueTab = tabDepth + "\t\t";
00565 for(int i = 0; i < size; i++){
00566 writer_->writeText(valueTab);
00567 const Vector3& value = interpolator->getValue(i);
00568 writer_->writeFormat("{ %.8f %.8f %.8f }\n",
00569 value.x, value.y, value.z);
00570 }
00571 writer_->writeText(tabDepth);
00572 writer_->writeText("\t}\n");
00573 writer_->writeText(tabDepth);
00574 writer_->writeText("}\n");
00575 }
00576
00577
00578 void TextAnimationSaver::writeVectorLinearInterpolator(
00579 VectorLinearInterpolator* interpolator,
00580 const String& name, const String& tabDepth){
00581
00582 writer_->writeText(tabDepth);
00583 writer_->writeText(name);
00584 writer_->writeText(" {\n");
00585
00586 writer_->writeText(tabDepth);
00587 writer_->writeText("\ttype Linear\n");
00588
00589 writer_->writeText(tabDepth);
00590 int keyCount = interpolator->getKeyCount();
00591 writer_->writeFormat("\tvalue %d {\n", keyCount);
00592 String valueTab = tabDepth + "\t\t";
00593 for(int i = 0; i < keyCount; i++){
00594 writer_->writeText(valueTab);
00595 float time = interpolator->getTime(i);
00596 const Vector3& value = interpolator->getValue(i);
00597 writer_->writeFormat("%.8f { %.8f %.8f %.8f }\n",
00598 time, value.x, value.y, value.z);
00599 }
00600 writer_->writeText(tabDepth);
00601 writer_->writeText("\t}\n");
00602 writer_->writeText(tabDepth);
00603 writer_->writeText("}\n");
00604 }
00605
00606
00607
00608
00609 void TextAnimationSaver::writeRotationInterpolator(
00610 RotationInterpolator* interpolator,
00611 const String& name, const String& tabDepth){
00612
00613 if(interpolator == NULL){
00614 writer_->writeText(tabDepth);
00615 writer_->writeText(name);
00616 writer_->writeText(" NULL\n");
00617 return;
00618 }
00619
00620 if(interpolator->isRotationConstantInterpolator()){
00621 writeRotationConstantInterpolator(
00622 interpolator->castRotationConstantInterpolator(), name, tabDepth);
00623 }else if(interpolator->isEulerArrayInterpolator()){
00624 writeEulerArrayInterpolator(
00625 interpolator->castEulerArrayInterpolator(), name, tabDepth);
00626 }else if(interpolator->isQuaternionArrayInterpolator()){
00627 writeQuaternionArrayInterpolator(
00628 interpolator->castQuaternionArrayInterpolator(), name, tabDepth);
00629 }else if(interpolator->isQuaternionLinearInterpolator()){
00630 writeQuaternionLinearInterpolator(
00631 interpolator->castQuaternionLinearInterpolator(), name, tabDepth);
00632 }else{
00633 ErrorOut("TextAnimationSaver::writeRotationInterpolator() "
00634 "Unsupported interpolater");
00635 }
00636 }
00637
00638
00639 void TextAnimationSaver::writeRotationConstantInterpolator(
00640 RotationConstantInterpolator* interpolator,
00641 const String& name, const String& tabDepth){
00642
00643 writer_->writeText(tabDepth);
00644 writer_->writeText(name);
00645 writer_->writeText(" {\n");
00646
00647 writer_->writeText(tabDepth);
00648 writer_->writeText("\ttype Constant\n");
00649
00650 writer_->writeText(tabDepth);
00651 writer_->writeFormat("\tlength %.8f\n", interpolator->getLength());
00652
00653 writer_->writeText(tabDepth);
00654 Quaternion value = interpolator->getQuaternion();
00655 writer_->writeFormat("\tquaternionValue { %.8f %.8f %.8f %.8f }\n",
00656 value.x, value.y, value.z, value.w);
00657 writer_->writeText(tabDepth);
00658 writer_->writeText("}\n");
00659 }
00660
00661
00662 void TextAnimationSaver::writeEulerArrayInterpolator(
00663 EulerArrayInterpolator* interpolator,
00664 const String& name, const String& tabDepth){
00665
00666 writer_->writeText(tabDepth);
00667 writer_->writeText(name);
00668 writer_->writeText(" {\n");
00669
00670 writer_->writeText(tabDepth);
00671 writer_->writeText("\ttype EulerArray\n");
00672
00673 writer_->writeText(tabDepth);
00674 int size = interpolator->getSize();
00675 writer_->writeFormat("\tvalue %d {\n", size);
00676 String valueTab = tabDepth + "\t\t";
00677 for(int i = 0; i < size; i++){
00678 writer_->writeText(valueTab);
00679 const Vector3& value = interpolator->getValue(i);
00680 writer_->writeFormat("{ %.8f %.8f %.8f }\n",
00681 value.x, value.y, value.z);
00682 }
00683 writer_->writeText(tabDepth);
00684 writer_->writeText("\t}\n");
00685 writer_->writeText(tabDepth);
00686 writer_->writeText("}\n");
00687 }
00688
00689
00690 void TextAnimationSaver::writeQuaternionArrayInterpolator(
00691 QuaternionArrayInterpolator* interpolator,
00692 const String& name, const String& tabDepth){
00693
00694 writer_->writeText(tabDepth);
00695 writer_->writeText(name);
00696 writer_->writeText(" {\n");
00697
00698 writer_->writeText(tabDepth);
00699 writer_->writeText("\ttype QuaternionArray\n");
00700
00701 writer_->writeText(tabDepth);
00702 int size = interpolator->getSize();
00703 writer_->writeFormat("\tvalue %d {\n", size);
00704 String valueTab = tabDepth + "\t\t";
00705 for(int i = 0; i < size; i++){
00706 writer_->writeText(valueTab);
00707 const Quaternion& value = interpolator->getValue(i);
00708 writer_->writeFormat("{ %.8f %.8f %.8f %.8f }\n",
00709 value.x, value.y, value.z, value.w);
00710 }
00711 writer_->writeText(tabDepth);
00712 writer_->writeText("\t}\n");
00713 writer_->writeText(tabDepth);
00714 writer_->writeText("}\n");
00715 }
00716
00717
00718 void TextAnimationSaver::writeQuaternionLinearInterpolator(
00719 QuaternionLinearInterpolator* interpolator,
00720 const String& name, const String& tabDepth){
00721
00722 writer_->writeText(tabDepth);
00723 writer_->writeText(name);
00724 writer_->writeText(" {\n");
00725
00726 writer_->writeText(tabDepth);
00727 writer_->writeText("\ttype QuaternionLinear\n");
00728
00729 writer_->writeText(tabDepth);
00730 int keyCount = interpolator->getKeyCount();
00731 writer_->writeFormat("\tvalue %d {\n", keyCount);
00732 String valueTab = tabDepth + "\t\t";
00733 for(int i = 0; i < keyCount; i++){
00734 writer_->writeText(valueTab);
00735 float time = interpolator->getTime(i);
00736 const Quaternion& value = interpolator->getValue(i);
00737 writer_->writeFormat("%.8f { %.8f %.8f %.8f %.8f }\n",
00738 time, value.x, value.y, value.z, value.w);
00739 }
00740 writer_->writeText(tabDepth);
00741 writer_->writeText("\t}\n");
00742 writer_->writeText(tabDepth);
00743 writer_->writeText("}\n");
00744 }
00745
00746
00747
00748
00749 void TextAnimationSaver::writeBool(bool flag){
00750 if(flag){
00751 writer_->writeText("true");
00752 }else{
00753 writer_->writeText("false");
00754 }
00755 }
00756
00757
00758 void TextAnimationSaver::writeLineComment(){
00759 writer_->writeText("//----------------------------"
00760 "--------------------------------------------------\n");
00761 }
00762
00763
00764 void TextAnimationSaver::writeBlockComment(const String& blockName){
00765 writeLineComment();
00766 writer_->writeText("// ");
00767 writer_->writeText(blockName);
00768 writer_->writeText(" Block\n");
00769 writeLineComment();
00770 }
00771
00772 }
00773