Browse Source

Keyframe reduction can now be enabled/disabled via import options

BearishSun 9 years ago
parent
commit
dd7d910e25

+ 14 - 0
Source/BansheeCore/Include/BsMeshImportOptions.h

@@ -110,6 +110,19 @@ namespace BansheeEngine
 		/** Returns a copy of the animation splits array. */
 		/** Returns a copy of the animation splits array. */
 		Vector<AnimationSplitInfo> getAnimationClipSplits() const { return mAnimationSplits; }
 		Vector<AnimationSplitInfo> getAnimationClipSplits() const { return mAnimationSplits; }
 
 
+		/**	
+		 * Enables or disabled keyframe reduction. Keyframe reduction will reduce the number of key-frames in an animation
+		 * clip by removing identical keyframes, and therefore reducing the size of the clip.
+		 */
+		void setKeyFrameReduction(bool enabled) { mReduceKeyFrames = enabled; }
+
+		/**	
+		 * Checks is keyframe reduction enabled.
+		 *
+		 * @see	setKeyFrameReduction
+		 */
+		bool getKeyFrameReduction() const { return mReduceKeyFrames; }
+
 	private:
 	private:
 		bool mCPUReadable;
 		bool mCPUReadable;
 		bool mImportNormals;
 		bool mImportNormals;
@@ -117,6 +130,7 @@ namespace BansheeEngine
 		bool mImportBlendShapes;
 		bool mImportBlendShapes;
 		bool mImportSkin;
 		bool mImportSkin;
 		bool mImportAnimation;
 		bool mImportAnimation;
+		bool mReduceKeyFrames;
 		float mImportScale;
 		float mImportScale;
 		CollisionMeshType mCollisionMeshType;
 		CollisionMeshType mCollisionMeshType;
 		Vector<AnimationSplitInfo> mAnimationSplits;
 		Vector<AnimationSplitInfo> mAnimationSplits;

+ 1 - 0
Source/BansheeCore/Include/BsMeshImportOptionsRTTI.h

@@ -26,6 +26,7 @@ namespace BansheeEngine
 			BS_RTTI_MEMBER_PLAIN(mImportScale, 6)
 			BS_RTTI_MEMBER_PLAIN(mImportScale, 6)
 			BS_RTTI_MEMBER_PLAIN(mCollisionMeshType, 7)
 			BS_RTTI_MEMBER_PLAIN(mCollisionMeshType, 7)
 			BS_RTTI_MEMBER_REFL_ARRAY(mAnimationSplits, 8)
 			BS_RTTI_MEMBER_REFL_ARRAY(mAnimationSplits, 8)
+			BS_RTTI_MEMBER_PLAIN(mReduceKeyFrames, 9)
 		BS_END_RTTI_MEMBERS
 		BS_END_RTTI_MEMBERS
 	public:
 	public:
 		MeshImportOptionsRTTI()
 		MeshImportOptionsRTTI()

+ 2 - 3
Source/BansheeCore/Source/BsMeshImportOptions.cpp

@@ -19,9 +19,8 @@ namespace BansheeEngine
 	}
 	}
 
 
 	MeshImportOptions::MeshImportOptions()
 	MeshImportOptions::MeshImportOptions()
-		:mCPUReadable(false), mImportNormals(true), mImportTangents(true),
-		mImportBlendShapes(false), mImportSkin(false), mImportAnimation(false),
-		mImportScale(1.0f), mCollisionMeshType(CollisionMeshType::None)
+		: mCPUReadable(false), mImportNormals(true), mImportTangents(true), mImportBlendShapes(false), mImportSkin(false)
+		, mImportAnimation(false), mReduceKeyFrames(true), mImportScale(1.0f), mCollisionMeshType(CollisionMeshType::None)
 	{ }
 	{ }
 
 
 	/************************************************************************/
 	/************************************************************************/

+ 5 - 0
Source/MBansheeEditor/Inspectors/MeshInspector.cs

@@ -23,6 +23,7 @@ namespace BansheeEditor
         private GUIFloatField scaleField;
         private GUIFloatField scaleField;
         private GUIToggleField cpuReadableField;
         private GUIToggleField cpuReadableField;
         private GUIEnumField collisionMeshTypeField;
         private GUIEnumField collisionMeshTypeField;
+        private GUIToggleField keyFrameReductionField;
         private GUIArrayField<AnimationSplitInfo, AnimSplitArrayRow> animSplitInfoField;
         private GUIArrayField<AnimationSplitInfo, AnimSplitArrayRow> animSplitInfoField;
         private GUIButton reimportButton;
         private GUIButton reimportButton;
 
 
@@ -69,6 +70,7 @@ namespace BansheeEditor
             scaleField.Value = newImportOptions.Scale;
             scaleField.Value = newImportOptions.Scale;
             cpuReadableField.Value = newImportOptions.CPUReadable;
             cpuReadableField.Value = newImportOptions.CPUReadable;
             collisionMeshTypeField.Value = (ulong)newImportOptions.CollisionMeshType;
             collisionMeshTypeField.Value = (ulong)newImportOptions.CollisionMeshType;
+            keyFrameReductionField.Value = newImportOptions.KeyframeReduction;
 
 
             importOptions = newImportOptions;
             importOptions = newImportOptions;
 
 
@@ -90,6 +92,7 @@ namespace BansheeEditor
             scaleField = new GUIFloatField(new LocEdString("Scale"));
             scaleField = new GUIFloatField(new LocEdString("Scale"));
             cpuReadableField = new GUIToggleField(new LocEdString("CPU readable"));
             cpuReadableField = new GUIToggleField(new LocEdString("CPU readable"));
             collisionMeshTypeField = new GUIEnumField(typeof(CollisionMeshType), new LocEdString("Collision mesh"));
             collisionMeshTypeField = new GUIEnumField(typeof(CollisionMeshType), new LocEdString("Collision mesh"));
+            keyFrameReductionField = new GUIToggleField(new LocEdString("Keyframe Reduction"));
             reimportButton = new GUIButton(new LocEdString("Reimport"));
             reimportButton = new GUIButton(new LocEdString("Reimport"));
 
 
             normalsField.OnChanged += x => importOptions.ImportNormals = x;
             normalsField.OnChanged += x => importOptions.ImportNormals = x;
@@ -100,6 +103,7 @@ namespace BansheeEditor
             scaleField.OnChanged += x => importOptions.Scale = x;
             scaleField.OnChanged += x => importOptions.Scale = x;
             cpuReadableField.OnChanged += x => importOptions.CPUReadable = x;
             cpuReadableField.OnChanged += x => importOptions.CPUReadable = x;
             collisionMeshTypeField.OnSelectionChanged += x => importOptions.CollisionMeshType = (CollisionMeshType)x;
             collisionMeshTypeField.OnSelectionChanged += x => importOptions.CollisionMeshType = (CollisionMeshType)x;
+            keyFrameReductionField.OnChanged += x => importOptions.KeyframeReduction = x;
 
 
             reimportButton.OnClick += TriggerReimport;
             reimportButton.OnClick += TriggerReimport;
 
 
@@ -111,6 +115,7 @@ namespace BansheeEditor
             Layout.AddElement(scaleField);
             Layout.AddElement(scaleField);
             Layout.AddElement(cpuReadableField);
             Layout.AddElement(cpuReadableField);
             Layout.AddElement(collisionMeshTypeField);
             Layout.AddElement(collisionMeshTypeField);
+            Layout.AddElement(keyFrameReductionField);
 
 
             animSplitInfoField = GUIArrayField<AnimationSplitInfo, AnimSplitArrayRow>.Create(
             animSplitInfoField = GUIArrayField<AnimationSplitInfo, AnimSplitArrayRow>.Create(
                 new LocEdString("Animation splits"), importOptions.AnimationClipSplits, Layout);
                 new LocEdString("Animation splits"), importOptions.AnimationClipSplits, Layout);

+ 16 - 0
Source/MBansheeEditor/Windows/Library/ImportOptions.cs

@@ -208,6 +208,16 @@ namespace BansheeEditor
             set { Internal_SetScale(mCachedPtr, value); }
             set { Internal_SetScale(mCachedPtr, value); }
         }
         }
 
 
+        /// <summary>
+        /// Determines if keyframe reduction is enabled. Keyframe reduction will reduce the number of key-frames in an
+        /// animation clip by removing identical keyframes, and therefore reducing the size of the clip.
+        /// </summary>
+        public bool KeyframeReduction
+        {
+            get { return Internal_GetKeyFrameReduction(mCachedPtr); }
+            set { Internal_SetKeyFrameReduction(mCachedPtr, value); }
+        }
+
         /// <summary>
         /// <summary>
         /// Controls what type (if any) of collision mesh should be imported.
         /// Controls what type (if any) of collision mesh should be imported.
         /// </summary>
         /// </summary>
@@ -267,6 +277,12 @@ namespace BansheeEditor
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_SetImportBlendShapes(IntPtr thisPtr, bool value);
         private static extern void Internal_SetImportBlendShapes(IntPtr thisPtr, bool value);
 
 
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern bool Internal_GetKeyFrameReduction(IntPtr thisPtr);
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_SetKeyFrameReduction(IntPtr thisPtr, bool value);
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern AnimationSplitInfo[] Internal_GetAnimationClipSplits(IntPtr thisPtr);
         private static extern AnimationSplitInfo[] Internal_GetAnimationClipSplits(IntPtr thisPtr);
 
 

+ 2 - 0
Source/SBansheeEditor/Include/BsScriptImportOptions.h

@@ -112,6 +112,8 @@ namespace BansheeEngine
 		static void internal_SetImportAnimation(ScriptMeshImportOptions* thisPtr, bool value);
 		static void internal_SetImportAnimation(ScriptMeshImportOptions* thisPtr, bool value);
 		static bool internal_GetImportBlendShapes(ScriptMeshImportOptions* thisPtr);
 		static bool internal_GetImportBlendShapes(ScriptMeshImportOptions* thisPtr);
 		static void internal_SetImportBlendShapes(ScriptMeshImportOptions* thisPtr, bool value);
 		static void internal_SetImportBlendShapes(ScriptMeshImportOptions* thisPtr, bool value);
+		static bool internal_GetKeyFrameReduction(ScriptMeshImportOptions* thisPtr);
+		static void internal_SetKeyFrameReduction(ScriptMeshImportOptions* thisPtr, bool value);
 		static float internal_GetScale(ScriptMeshImportOptions* thisPtr);
 		static float internal_GetScale(ScriptMeshImportOptions* thisPtr);
 		static void internal_SetScale(ScriptMeshImportOptions* thisPtr, float value);
 		static void internal_SetScale(ScriptMeshImportOptions* thisPtr, float value);
 		static int internal_GetCollisionMeshType(ScriptMeshImportOptions* thisPtr);
 		static int internal_GetCollisionMeshType(ScriptMeshImportOptions* thisPtr);

+ 12 - 0
Source/SBansheeEditor/Source/BsScriptImportOptions.cpp

@@ -177,6 +177,8 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_SetImportAnimation", &ScriptMeshImportOptions::internal_SetImportAnimation);
 		metaData.scriptClass->addInternalCall("Internal_SetImportAnimation", &ScriptMeshImportOptions::internal_SetImportAnimation);
 		metaData.scriptClass->addInternalCall("Internal_GetImportBlendShapes", &ScriptMeshImportOptions::internal_GetImportBlendShapes);
 		metaData.scriptClass->addInternalCall("Internal_GetImportBlendShapes", &ScriptMeshImportOptions::internal_GetImportBlendShapes);
 		metaData.scriptClass->addInternalCall("Internal_SetImportBlendShapes", &ScriptMeshImportOptions::internal_SetImportBlendShapes);
 		metaData.scriptClass->addInternalCall("Internal_SetImportBlendShapes", &ScriptMeshImportOptions::internal_SetImportBlendShapes);
+		metaData.scriptClass->addInternalCall("Internal_GetKeyFrameReduction", &ScriptMeshImportOptions::internal_GetKeyFrameReduction);
+		metaData.scriptClass->addInternalCall("Internal_SetKeyFrameReduction", &ScriptMeshImportOptions::internal_SetKeyFrameReduction);
 		metaData.scriptClass->addInternalCall("Internal_GetScale", &ScriptMeshImportOptions::internal_GetScale);
 		metaData.scriptClass->addInternalCall("Internal_GetScale", &ScriptMeshImportOptions::internal_GetScale);
 		metaData.scriptClass->addInternalCall("Internal_SetScale", &ScriptMeshImportOptions::internal_SetScale);
 		metaData.scriptClass->addInternalCall("Internal_SetScale", &ScriptMeshImportOptions::internal_SetScale);
 		metaData.scriptClass->addInternalCall("Internal_GetCollisionMeshType", &ScriptMeshImportOptions::internal_GetCollisionMeshType);
 		metaData.scriptClass->addInternalCall("Internal_GetCollisionMeshType", &ScriptMeshImportOptions::internal_GetCollisionMeshType);
@@ -269,6 +271,16 @@ namespace BansheeEngine
 		thisPtr->getMeshImportOptions()->setImportBlendShapes(value);
 		thisPtr->getMeshImportOptions()->setImportBlendShapes(value);
 	}
 	}
 
 
+	bool ScriptMeshImportOptions::internal_GetKeyFrameReduction(ScriptMeshImportOptions* thisPtr)
+	{
+		return thisPtr->getMeshImportOptions()->getKeyFrameReduction();
+	}
+
+	void ScriptMeshImportOptions::internal_SetKeyFrameReduction(ScriptMeshImportOptions* thisPtr, bool value)
+	{
+		thisPtr->getMeshImportOptions()->setKeyFrameReduction(value);
+	}
+
 	float ScriptMeshImportOptions::internal_GetScale(ScriptMeshImportOptions* thisPtr)
 	float ScriptMeshImportOptions::internal_GetScale(ScriptMeshImportOptions* thisPtr)
 	{
 	{
 		return thisPtr->getMeshImportOptions()->getImportScale();
 		return thisPtr->getMeshImportOptions()->getImportScale();