rj-action-library/Runtime/UI/Transitions/ActiveStyleTransition.cs

146 lines
4.2 KiB
C#

using Godot;
using Rokojori;
using System.Collections.Generic;
using System;
namespace Rokojori
{
[Tool]
public class ActiveStyleTransition<V,P>
{
public V value;
public List<V> lastValues = [];
public List<float> lastWeights = [];
public P propertyType;
public TimeLine timeLine;
public float start;
public float end;
public Curve curve;
public bool transitioning;
public float GetUnclampedTransitionPhase()
{
var transitionPhase = timeLine.ComputeRange( start, end );
return transitionPhase;
}
public float ComputeTransitionWeight( float phase )
{
var amount = MathX.Clamp01( phase );
if ( curve != null )
{
amount = curve.Sample( amount );
}
return amount;
}
public float GetTransitionWeight()
{
var transitionPhase = GetUnclampedTransitionPhase();
return ComputeTransitionWeight( transitionPhase );
}
public void EndTransition()
{
transitioning = false;
lastValues = [];
lastWeights = [];
}
public void StartTransition( Control control, V nextValue, TransitionSettings transitionSettings )
{
if ( ! transitioning )
{
lastValues = [ value ];
lastWeights = [ 1f ];
}
else
{
var valueWeight = GetTransitionWeight();
var lastWeight = 1f - valueWeight;
for ( int i = 0; i < lastWeights.Count; i++ )
{
lastWeights[ i ] *= lastWeight;
}
lastValues.Add( value );
lastWeights.Add( valueWeight );
}
value = nextValue;
timeLine = UI.GetTimeLine( control, transitionSettings.timeLine );
start = timeLine.position;
end = start + transitionSettings.duration;
transitioning = true;
curve = transitionSettings.curve;
}
// public static O ProcessTransition<O>(
// UIStylePropertyContainer container, O computedValue,
// List<ActiveStyleTransition<V,P>> activeTransitions, V activeValue, P property,
// Func<TransitionSettingsAll> getTransitionSettings,
// Func<V,O> computeValue,
// Func<O,O,float,O> lerpValue
// )
// {
// var propertyTransition = activeTransitions.Find( t => t != null && EqualityComparer<P>.Default.Equals( t.propertyType, property ) );
// if ( propertyTransition == null )
// {
// propertyTransition = new ActiveStyleTransition<V, P>();
// propertyTransition.propertyType = property;
// propertyTransition.value = activeValue;
// propertyTransition.transitioning = false;
// activeTransitions.Add( propertyTransition );
// return computedValue;
// }
// else
// {
// if ( ! EqualityComparer<V>.Default.Equals( propertyTransition.value, activeValue ) &&
// ! propertyTransition.transitioning && getTransitionSettings() != null )
// {
// var transitionSettings = getTransitionSettings();
// propertyTransition.timeLine = transitionSettings.timeLine;
// propertyTransition.start = transitionSettings.timeLine.position;
// propertyTransition.end = propertyTransition.start + transitionSettings.duration;
// propertyTransition.transitioning = true;
// propertyTransition.curve = transitionSettings.curve;
// }
// }
// if ( EqualityComparer<V>.Default.Equals( propertyTransition.value, activeValue ) )
// {
// propertyTransition.transitioning = false;
// return computedValue;
// }
// var computedTransitionValue = computeValue( propertyTransition.value );
// var transitionPhase = propertyTransition.timeLine.ComputeRange( propertyTransition.start, propertyTransition.end );
// if ( transitionPhase >= 1 )
// {
// activeTransitions.Remove( propertyTransition );
// }
// var amount = MathX.Clamp01( transitionPhase );
// var curveAmount = amount;
// if ( propertyTransition.curve != null )
// {
// curveAmount = propertyTransition.curve.Sample( curveAmount );
// }
// return lerpValue( computedTransitionValue, computedValue, curveAmount );
// }
}
}