assimpAppSequence.cpp
Engine/source/ts/assimp/assimpAppSequence.cpp
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