rokojori_action_library/Runtime/Actions/Visual/TweenCompositorVFX.cs

111 lines
2.2 KiB
C#

using System;
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Tween.svg")]
public partial class TweenCompositorVFX:SequenceAction, Animator
{
[Export]
public CompositorVFX compositorVFX;
[Export]
public float endValue;
[Export]
public Duration duration;
[Export]
public Curve curve;
[ExportGroup( "Editor Testing")]
[Export]
public bool forceStartValue = false;
[Export]
public float forcedStartValue = 0f;
public void OnAnimatorStart(){}
public void OnAnimatorEnd(){}
public void OnAnimatorCancel(){}
int _actionID = -1;
int _timeID = -1;
protected override void _OnTrigger()
{
this.LogInfo( "Started Float Tween" );
// if ( Engine.IsEditorHint() )
// {
// return;
// }
if ( _actionID != -1 )
{
CancelAction( _actionID );
}
_actionID = DispatchStart();
var startValue = compositorVFX.driverValue;
if ( forceStartValue && Engine.IsEditorHint() )
{
startValue = forcedStartValue;
}
AnimationManager.StartAnimation( this, compositorVFX, "driverValue" );
_timeID = TimeLineManager.ScheduleSpanWith( duration,
( span, type )=>
{
// this.LogInfo( "Update Float Tween", startValue );
if ( span.id != _timeID )
{
return;
}
if ( ! AnimationManager.IsAnimating( this, compositorVFX, "driverValue" ) )
{
return;
}
var phase = span.phase;
if ( curve != null )
{
phase = curve.Sample( phase );
}
var value = Mathf.Lerp( startValue, endValue, phase );
compositorVFX.driverValue = value;
if ( type == TimeLineSpanUpdateType.End )
{
compositorVFX.driverValue = value;
AnimationManager.EndAnimation( this, compositorVFX, "driverValue" );
DispatchEnd( _actionID );
_actionID = -1;
_timeID = -1;
}
},
this
).id;
}
}
}