Browse Source

Bugfix: Animation splitting code now works correctly

BearishSun 8 years ago
parent
commit
b6fa5e36c2

+ 53 - 6
Source/BansheeCore/Animation/BsAnimationCurve.cpp

@@ -495,10 +495,33 @@ namespace bs
 
 		if (!Math::approxEquals(startKey.time, start))
 		{
-			keyFrames.push_back(evaluateKey(startKey, mKeyframes[startKeyIdx + 1], start));
+			if(start > startKey.time)
+			{
+				if (mKeyframes.size() > (startKeyIdx + 1))
+					keyFrames.push_back(evaluateKey(startKey, mKeyframes[startKeyIdx + 1], start));
+				else
+				{
+					TKeyframe<T> keyCopy = startKey;
+					keyCopy.time = start;
+
+					keyFrames.push_back(keyCopy);
+				}
 
-			if (start > startKey.time)
 				startKeyIdx++;
+			}
+			else
+			{
+				
+				if (startKeyIdx > 0)
+					keyFrames.push_back(evaluateKey(mKeyframes[startKeyIdx - 1], startKey , start));
+				else
+				{
+					TKeyframe<T> keyCopy = startKey;
+					keyCopy.time = start;
+
+					keyFrames.push_back(keyCopy);
+				}
+			}
 		}
 		else
 		{
@@ -508,13 +531,37 @@ namespace bs
 
 		if(!Math::approxEquals(endKey.time, end))
 		{
-			keyFrames.push_back(evaluateKey(endKey, mKeyframes[endKeyIdx + 1], end));
+			if(end > endKey.time)
+			{
+				if (mKeyframes.size() > (endKeyIdx + 1))
+					keyFrames.push_back(evaluateKey(endKey, mKeyframes[endKeyIdx + 1], end));
+				else
+				{
+					TKeyframe<T> keyCopy = endKey;
+					keyCopy.time = end;
 
-			if (end < endKey.time)
-				endKeyIdx--;
+					keyFrames.push_back(keyCopy);
+				}
+			}
+			else
+			{
+				if(endKeyIdx > 0)
+				{
+					keyFrames.push_back(evaluateKey(mKeyframes[endKeyIdx - 1], endKey, end));
+					endKeyIdx--;
+				}
+				else
+				{
+					TKeyframe<T> keyCopy = endKey;
+					keyCopy.time = end;
+
+					keyFrames.push_back(keyCopy);
+				}
+			}
 		}
 
-		keyFrames.insert(keyFrames.begin() + 1, mKeyframes.begin() + startKeyIdx, mKeyframes.begin() + endKeyIdx + 1);
+		if(startKeyIdx < (UINT32)mKeyframes.size() && endKeyIdx > startKeyIdx)
+			keyFrames.insert(keyFrames.begin() + 1, mKeyframes.begin() + startKeyIdx, mKeyframes.begin() + endKeyIdx + 1);
 
 		for (auto& entry : keyFrames)
 			entry.time -= start;

+ 3 - 0
Source/BansheeCore/Importer/BsMeshImportOptions.h

@@ -24,6 +24,9 @@ namespace bs
 	struct BS_CORE_EXPORT AnimationSplitInfo : IReflectable
 	{
 		AnimationSplitInfo() { }
+		AnimationSplitInfo(const String& name, UINT32 startFrame, UINT32 endFrame, bool isAdditive = false)
+			: name(name), startFrame(startFrame), endFrame(endFrame), isAdditive(isAdditive)
+		{ }
 
 		String name;
 		UINT32 startFrame = 0;