Browse Source

Fixing events:
- Events are now added at the exact time the cursor is placed at, not the nearest frame
- Managed events can now be properly instantiated from native code
- Event method name is properly parsed in animation editor's event edit window
- Component.Invoke now triggers properly

BearishSun 9 years ago
parent
commit
d323f43bfb

+ 5 - 3
Source/MBansheeEditor/Windows/Animation/GUICurveEditor.cs

@@ -888,8 +888,7 @@ namespace BansheeEditor
             if (frame != -1)
             {
                 ClearSelection();
-
-                float time = guiEvents.GetTimeForFrame(frame);
+                float time = guiEvents.GetTime(contextClickPosition.x);
 
                 EventInfo eventInfo = new EventInfo();
                 eventInfo.animEvent = new AnimationEvent("", time);
@@ -1178,6 +1177,7 @@ namespace BansheeEditor
         internal void Initialize(AnimationEvent animEvent, string[] componentNames, Action updateCallback)
         {
             int selectedIndex = -1;
+            string methodName = "";
             if (!string.IsNullOrEmpty(animEvent.Name))
             {
                 string[] nameEntries = animEvent.Name.Split('/');
@@ -1192,6 +1192,8 @@ namespace BansheeEditor
                             break;
                         }
                     }
+
+                    methodName = nameEntries[nameEntries.Length - 1];
                 }
             }
 
@@ -1214,7 +1216,7 @@ namespace BansheeEditor
             };// TODO UNDOREDO 
 
             GUITextField methodField = new GUITextField(new LocEdString("Method"), 40, false, "", GUIOption.FixedWidth(190));
-            methodField.Value = animEvent.Name;
+            methodField.Value = methodName;
             methodField.OnChanged += x =>
             {
                 string compName = "";

+ 14 - 0
Source/MBansheeEditor/Windows/Animation/GUITimelineBase.cs

@@ -63,6 +63,20 @@ namespace BansheeEditor
             return MathEx.RoundToInt(time * fps);
         }
 
+        /// <summary>
+        /// Returns the time at the specified pixel value along the timeline.
+        /// </summary>
+        /// <param name="pixel">Coordinate relative to this GUI element, in pixels.</param>
+        /// <returns>Time along the curve at the specified coordinates.</returns>
+        public float GetTime(int pixel)
+        {
+            Rect2I bounds = canvas.Bounds;
+            int relativeCoords = pixel - (bounds.x + PADDING);
+
+            float lengthPerPixel = GetRange() / drawableWidth;
+            return rangeOffset + relativeCoords * lengthPerPixel;
+        }
+
         /// <summary>
         /// Finds the pixel offset relative to the GUI element's origin, of the specified time.
         /// </summary>

+ 0 - 2
Source/MBansheeEditor/Windows/AnimationWindow.cs

@@ -640,8 +640,6 @@ namespace BansheeEditor
 
             float time = guiCurveEditor.GetTimeForFrame(currentFrameIdx);
 
-            Debug.Log(currentFrameIdx + " - " + time);
-
             List<GUIAnimFieldPathValue> values = new List<GUIAnimFieldPathValue>();
             foreach (var kvp in clipInfo.curves)
             {

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

@@ -186,6 +186,8 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_SetCollisionMeshType", &ScriptMeshImportOptions::internal_SetCollisionMeshType);
 		metaData.scriptClass->addInternalCall("Internal_GetAnimationClipSplits", &ScriptMeshImportOptions::internal_GetAnimationClipSplits);
 		metaData.scriptClass->addInternalCall("Internal_SetAnimationClipSplits", &ScriptMeshImportOptions::internal_SetAnimationClipSplits);
+		metaData.scriptClass->addInternalCall("Internal_GetAnimationEvents", &ScriptMeshImportOptions::internal_GetAnimationEvents);
+		metaData.scriptClass->addInternalCall("Internal_SetAnimationEvents", &ScriptMeshImportOptions::internal_SetAnimationEvents);
 	}
 
 	SPtr<MeshImportOptions> ScriptMeshImportOptions::getMeshImportOptions()

+ 1 - 1
Source/SBansheeEngine/Include/BsScriptComponent.h

@@ -64,7 +64,7 @@ namespace BansheeEngine
 		static MonoObject* internal_getSceneObject(ScriptComponent* nativeInstance);
 		static TransformChangedFlags internal_getNotifyFlags(ScriptComponent* nativeInstance);
 		static void internal_setNotifyFlags(ScriptComponent* nativeInstance, TransformChangedFlags flags);
-		static void internal_Invoke(ScriptComponent* nativeInstance, MonoString* name);
+		static void internal_invoke(ScriptComponent* nativeInstance, MonoString* name);
 		static void internal_destroy(ScriptComponent* nativeInstance, bool immediate);
 	};
 

+ 1 - 1
Source/SBansheeEngine/Source/BsScriptAnimationClip.cpp

@@ -134,6 +134,6 @@ namespace BansheeEngine
 		float time = event.time;
 
 		void* params[2] = { monoString, &time };
-		return metaData.scriptClass->createInstance("string,float", params);
+		return metaData.scriptClass->createInstance("string,single", params);
 	}
 }

+ 3 - 2
Source/SBansheeEngine/Source/BsScriptComponent.cpp

@@ -35,6 +35,7 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_GetSceneObject", &ScriptComponent::internal_getSceneObject);
 		metaData.scriptClass->addInternalCall("Internal_GetNotifyFlags", &ScriptComponent::internal_getNotifyFlags);
 		metaData.scriptClass->addInternalCall("Internal_SetNotifyFlags", &ScriptComponent::internal_setNotifyFlags);
+		metaData.scriptClass->addInternalCall("Internal_Invoke", &ScriptComponent::internal_invoke);
 		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptComponent::internal_destroy);
 	}
 
@@ -199,7 +200,7 @@ namespace BansheeEngine
 			nativeInstance->mManagedComponent->mNotifyFlags = flags;
 	}
 
-	void ScriptComponent::internal_Invoke(ScriptComponent* nativeInstance, MonoString* name)
+	void ScriptComponent::internal_invoke(ScriptComponent* nativeInstance, MonoString* name)
 	{
 		HManagedComponent comp = nativeInstance->mManagedComponent;
 		if (checkIfDestroyed(nativeInstance->mManagedComponent))
@@ -230,7 +231,7 @@ namespace BansheeEngine
 
 		if (!found)
 		{
-			LOGWRN("Cannot find method \"" + methodName + "\" to invoke on component of type \"" + 
+			LOGWRN("Method invoke failed. Cannot find method \"" + methodName + "\" on component of type \"" + 
 				compClass->getTypeName() + "\".");
 		}
 	}