diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index c24be5ba9..c22a3118d 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -1544,10 +1544,67 @@ private: } + // ------------------------------------------------------------------------------------------------ + // get the number of fps for a FrameRate enumerated value + static double FrameRateToDouble(FileGlobalSettings::FrameRate fp, double customFPSVal = -1.0) + { + switch(fp) { + case FileGlobalSettings::FrameRate_DEFAULT: + return 1.0; + + case FileGlobalSettings::FrameRate_120: + return 120.0; + + case FileGlobalSettings::FrameRate_100: + return 100.0; + + case FileGlobalSettings::FrameRate_60: + return 60.0; + + case FileGlobalSettings::FrameRate_50: + return 50.0; + + case FileGlobalSettings::FrameRate_48: + return 48.0; + + case FileGlobalSettings::FrameRate_30: + case FileGlobalSettings::FrameRate_30_DROP: + return 30.0; + + case FileGlobalSettings::FrameRate_NTSC_DROP_FRAME: + case FileGlobalSettings::FrameRate_NTSC_FULL_FRAME: + return 29.9700262; + + case FileGlobalSettings::FrameRate_PAL: + return 25.0; + + case FileGlobalSettings::FrameRate_CINEMA: + return 24.0; + + case FileGlobalSettings::FrameRate_1000: + return 1000.0; + + case FileGlobalSettings::FrameRate_CINEMA_ND: + return 23.976; + + case FileGlobalSettings::FrameRate_CUSTOM: + return customFPSVal; + } + + ai_assert(false); + return -1.0f; + } + + // ------------------------------------------------------------------------------------------------ // convert animation data to aiAnimation et al void ConvertAnimations() { + // first of all determine framerate + const FileGlobalSettings::FrameRate fps = doc.GlobalSettings().TimeMode(); + const float custom = doc.GlobalSettings().CustomFrameRate(); + anim_fps = FrameRateToDouble(fps, custom); + const std::vector& animations = doc.AnimationStacks(); BOOST_FOREACH(const AnimationStack* stack, animations) { ConvertAnimationStack(*stack); @@ -1677,7 +1734,7 @@ private: // for some mysterious reason, mDuration is simply the maximum key -- the // validator always assumes animations to start at zero. anim->mDuration = max_time /*- min_time */; - anim->mTicksPerSecond = 1.0; + anim->mTicksPerSecond = anim_fps; } @@ -2282,8 +2339,8 @@ private: // ------------------------------------------------------------------------------------------------ void InterpolateKeys(aiVectorKey* valOut,const KeyTimeList& keys, const KeyFrameListList& inputs, const bool geom, - double& maxTime, - double& minTime) + double& max_time, + double& min_time) { ai_assert(keys.size()); @@ -2331,11 +2388,11 @@ private: } } - // magic value to convert fbx times to milliseconds - valOut->mTime = CONVERT_FBX_TIME(time); + // magic value to convert fbx times to seconds + valOut->mTime = CONVERT_FBX_TIME(time) * anim_fps; - minTime = std::min(minTime, valOut->mTime); - maxTime = std::max(maxTime, valOut->mTime); + min_time = std::min(min_time, valOut->mTime); + max_time = std::max(max_time, valOut->mTime); valOut->mValue.x = result[0]; valOut->mValue.y = result[1]; @@ -2386,7 +2443,7 @@ private: } else { for (size_t i = 0; i < times.size(); ++i) { - out_quat[i].mTime = CONVERT_FBX_TIME(times[i]); + out_quat[i].mTime = CONVERT_FBX_TIME(times[i]) * anim_fps; out_quat[i].mValue = def_rotation; } } @@ -2396,7 +2453,7 @@ private: } else { for (size_t i = 0; i < times.size(); ++i) { - out_scale[i].mTime = CONVERT_FBX_TIME(times[i]); + out_scale[i].mTime = CONVERT_FBX_TIME(times[i]) * anim_fps; out_scale[i].mValue = def_scale; } } @@ -2406,7 +2463,7 @@ private: } else { for (size_t i = 0; i < times.size(); ++i) { - out_translation[i].mTime = CONVERT_FBX_TIME(times[i]); + out_translation[i].mTime = CONVERT_FBX_TIME(times[i]) * anim_fps; out_translation[i].mValue = def_translate; } } @@ -2565,6 +2622,7 @@ private: typedef std::map NodeNameMap; NodeNameMap node_names; + double anim_fps; aiScene* const out; const FBX::Document& doc; diff --git a/code/FBXDocument.h b/code/FBXDocument.h index 63f779ddc..7fcc3b066 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -1150,7 +1150,6 @@ public: FrameRate_1000 = 12, FrameRate_CINEMA_ND = 13, FrameRate_CUSTOM = 14, - FrameRate_TIME_MODE_COUNT = 15, FrameRate_MAX// end-of-enum sentinel };