Torque3D Documentation / _generateds / assimpAppSequence.cpp

assimpAppSequence.cpp

Engine/source/ts/assimp/assimpAppSequence.cpp

More...

Detailed Description

  1
  2#include "ts/assimp/assimpShapeLoader.h"
  3
  4#include "console/console.h"
  5#include "core/stream/fileStream.h" 
  6#include "core/stringTable.h"
  7#include "math/mathIO.h"
  8#include "ts/tsShape.h"
  9#include "ts/tsShapeInstance.h"
 10#include "materials/materialManager.h"
 11#include "console/persistenceManager.h"
 12#include "ts/assimp/assimpAppMaterial.h"
 13#include "ts/assimp/assimpAppSequence.h"
 14#include "ts/assimp/assimpAppNode.h"
 15
 16AssimpAppSequence::AssimpAppSequence(aiAnimation *a) :
 17   seqStart(0.0f),
 18   mAnim(a)
 19{
 20   mSequenceName = mAnim->mName.C_Str();
 21   if (mSequenceName.isEmpty())
 22      mSequenceName = "ambient";
 23   Con::printf("\n[Assimp] Adding %s animation", mSequenceName.c_str());
 24
 25   fps = (mAnim->mTicksPerSecond > 0) ? mAnim->mTicksPerSecond : 30.0f;
 26
 27   U32 maxKeys = 0;
 28   F32 maxEndTime = 0;
 29   F32 minFrameTime = 100000.0f;
 30   // Detect the frame rate (minimum time between keyframes) and max sequence time
 31   for (U32 i = 0; i < mAnim->mNumChannels; ++i)
 32   {
 33      aiNodeAnim *nodeAnim = mAnim->mChannels[i];
 34      maxKeys = getMax(maxKeys, nodeAnim->mNumPositionKeys);
 35      maxKeys = getMax(maxKeys, nodeAnim->mNumRotationKeys);
 36      maxKeys = getMax(maxKeys, nodeAnim->mNumScalingKeys);
 37
 38      if (nodeAnim->mNumPositionKeys)
 39         maxEndTime = getMax(maxEndTime, (F32) nodeAnim->mPositionKeys[nodeAnim->mNumPositionKeys-1].mTime);
 40      if (nodeAnim->mNumRotationKeys)
 41         maxEndTime = getMax(maxEndTime, (F32) nodeAnim->mRotationKeys[nodeAnim->mNumRotationKeys-1].mTime);
 42      if (nodeAnim->mNumScalingKeys)
 43         maxEndTime = getMax(maxEndTime, (F32) nodeAnim->mScalingKeys[nodeAnim->mNumScalingKeys-1].mTime);
 44
 45      for (U32 key = 1; key < nodeAnim->mNumPositionKeys; ++key)
 46      {
 47         F32 deltaT = nodeAnim->mPositionKeys[key].mTime - nodeAnim->mPositionKeys[key-1].mTime;
 48         minFrameTime = getMin(minFrameTime, deltaT);
 49      }
 50      for (U32 key = 1; key < nodeAnim->mNumRotationKeys; ++key)
 51      {
 52         F32 deltaT = nodeAnim->mRotationKeys[key].mTime - nodeAnim->mRotationKeys[key-1].mTime;
 53         minFrameTime = getMin(minFrameTime, deltaT);
 54      }
 55      for (U32 key = 1; key < nodeAnim->mNumScalingKeys; ++key)
 56      {
 57         F32 deltaT = nodeAnim->mScalingKeys[key].mTime - nodeAnim->mScalingKeys[key-1].mTime;
 58         minFrameTime = getMin(minFrameTime, deltaT);
 59      }
 60   }
 61
 62   S32 timeFactor = ColladaUtils::getOptions().animTiming;
 63   S32 fpsRequest = ColladaUtils::getOptions().animFPS;
 64   if (timeFactor == 0)
 65   {  // Timing specified in frames
 66      fps = mClamp(fpsRequest, 5 /*TSShapeLoader::MinFrameRate*/, TSShapeLoader::MaxFrameRate);
 67      maxKeys = getMax(maxKeys, (U32)maxEndTime);  // Keys won't be assigned for every frame.
 68      seqEnd = maxKeys / fps;
 69      mTimeMultiplier = 1.0f / fps;
 70   }
 71   else
 72   {  // Timing specified in seconds or ms depending on format
 73      if (maxEndTime > 1000.0f || mAnim->mDuration > 1000.0f)
 74         timeFactor = 1000.0f;   // If it's more than 1000 seconds, assume it's ms.
 75
 76      timeFactor = mClamp(timeFactor, 1, 1000);
 77      minFrameTime /= (F32)timeFactor;
 78      maxEndTime /= (F32)timeFactor;
 79      fps = (minFrameTime > 0.0f) ? 1.0f / minFrameTime : fps;
 80      fps = mClamp(fpsRequest, 5 /*TSShapeLoader::MinFrameRate*/, TSShapeLoader::MaxFrameRate);
 81      seqEnd = maxEndTime;
 82      mTimeMultiplier = 1.0f / timeFactor;
 83   }
 84}
 85
 86AssimpAppSequence::~AssimpAppSequence()
 87{
 88}
 89
 90void AssimpAppSequence::setActive(bool active)
 91{
 92   if (active)
 93   {
 94      AssimpAppNode::sActiveSequence = mAnim;
 95      AssimpAppNode::sTimeMultiplier = mTimeMultiplier;
 96   }
 97   else
 98   {
 99      if (AssimpAppNode::sActiveSequence == mAnim)
100         AssimpAppNode::sActiveSequence = NULL;
101   }
102}
103
104U32 AssimpAppSequence::getFlags() const 
105{ 
106   return TSShape::Blend;
107}
108F32 AssimpAppSequence::getPriority() const 
109{ 
110   return 5; 
111}
112F32 AssimpAppSequence::getBlendRefTime() const 
113{ 
114   return -1.0f; 
115}
116