Răsfoiți Sursa

Fixed skeletal animation trigger event not triggering for a looped animation, if the trigger point is defined at the animation's end. Fixed erroneous AngelScript binding for ValueAnimation::SetEventFrame().

Lasse Öörni 11 ani în urmă
părinte
comite
367f6a345f

+ 13 - 1
Source/Engine/Graphics/AnimationState.cpp

@@ -265,15 +265,23 @@ void AnimationState::AddTime(float delta)
     // Process animation triggers
     if (animation_->GetNumTriggers())
     {
+        bool wrap = false;
+        
         if (delta > 0.0f)
         {
             if (oldTime > time)
+            {
                 oldTime -= length;
+                wrap = true;
+            }
         }
         if (delta < 0.0f)
         {
             if (time > oldTime)
+            {
                 time -= length;
+                wrap = true;
+            }
         }
         if (oldTime > time)
             Swap(oldTime, time);
@@ -281,7 +289,11 @@ void AnimationState::AddTime(float delta)
         const Vector<AnimationTriggerPoint>& triggers = animation_->GetTriggers();
         for (Vector<AnimationTriggerPoint>::ConstIterator i = triggers.Begin(); i != triggers.End(); ++i)
         {
-            if (oldTime <= i->time_ && time > i->time_)
+            float frameTime = i->time_;
+            if (looped_ && wrap)
+                frameTime = fmodf(frameTime, length);
+            
+            if (oldTime <= frameTime && time > frameTime)
             {
                 using namespace AnimationTrigger;
                 

+ 6 - 1
Source/Engine/Script/SceneAPI.cpp

@@ -49,6 +49,11 @@ static void RegisterSerializable(asIScriptEngine* engine)
     RegisterSerializable<Serializable>(engine, "Serializable");
 }
 
+static void ValueAnimationSetEventFrame(float time, const String& eventType, const VariantMap& eventData, ValueAnimation* ptr)
+{
+    ptr->SetEventFrame(time, eventType, eventData);
+}
+
 static void RegisterValueAnimation(asIScriptEngine* engine)
 {
     engine->RegisterEnum("InterpMethod");
@@ -63,7 +68,7 @@ static void RegisterValueAnimation(asIScriptEngine* engine)
     engine->RegisterObjectMethod("ValueAnimation", "void set_valueType(VariantType)", asMETHOD(ValueAnimation, SetValueType), asCALL_THISCALL);
     engine->RegisterObjectMethod("ValueAnimation", "VariantType get_valueType() const", asMETHOD(ValueAnimation, GetValueType), asCALL_THISCALL);
     engine->RegisterObjectMethod("ValueAnimation", "void SetKeyFrame(float, const Variant&in)", asMETHOD(ValueAnimation, SetKeyFrame), asCALL_THISCALL);
-    engine->RegisterObjectMethod("ValueAnimation", "void SetEventFrame(float, const String&in, const Variant&in)", asMETHOD(ValueAnimation, SetEventFrame), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ValueAnimation", "void SetEventFrame(float, const String&in, const VariantMap&in eventData = VariantMap())", asFUNCTION(ValueAnimationSetEventFrame), asCALL_CDECL_OBJLAST);
 }
 
 static void RegisterObjectAnimation(asIScriptEngine* engine)