s&box Package Code Search

Search C# source code, UI razor templates, shaders, and configs across s&box packages.

Showing code results for query: * (86 total matches found)
resync.sbtween / Code/SbTween/Extensions/LightExtensions.cs
Game library
using Sandbox;
using Sandbox.UI;
using System;

namespace SbTween;

public static class LightExtensions
{

	public static BaseTween TweenLightColor( this Light Light, Color target, float duration )
	{
		Color start = Light.LightColor;
		var tween = new BaseTween( duration );
		tween.Target = Light.GameObject;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => start = Light.LightColor )
			.OnUpdate( p => Light.LightColor = Color.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenRadius( this SpotLight light, float target, float duration )
	{
		if ( !light.IsValid() ) return null;

		float start = light.Radius;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = light.Radius )
			.OnUpdate( p => light.Radius = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenConeOuter( this SpotLight light, float target, float duration )
	{
		if ( !light.IsValid() ) return null;

		float start = light.ConeOuter;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = light.ConeOuter )
			.OnUpdate( p => light.ConeOuter = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenInnerCone( this SpotLight light, float target, float duration )
	{
		if ( !light.IsValid() ) return null;

		float start = light.ConeInner;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = light.ConeInner )
			.OnUpdate( p => light.ConeInner = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenAttenuation( this PointLight light, float target, float duration )
	{
		if ( !light.IsValid() ) return null;

		float start = light.Attenuation;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = light.Attenuation )
			.OnUpdate( p => light.Attenuation = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenRadius( this PointLight light, float target, float duration )
	{
		if ( !light.IsValid() ) return null;

		float start = light.Radius;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = light.Radius )
			.OnUpdate( p => light.Radius = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenAttenuation( this SpotLight light, float target, float duration )
	{
		if ( !light.IsValid() ) return null;

		float start = light.Attenuation;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = light.Attenuation )
			.OnUpdate( p => light.Attenuation = MathX.Lerp( start, target, p ) ) );
	}

	//FLICKERING LIGHT
	public static BaseTween TweenFlickerLight( this PointLight light, float minBrightness, float maxBrightness, float duration, float speed = 10f )
	{
		if ( !light.IsValid() ) return null;

		float time = 0f;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnUpdate( _ =>
			{
				time += Time.Delta * speed;
				float noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );
				float t = (noise + 1f) * 0.5f;
				light.Attenuation = MathX.Lerp( minBrightness, maxBrightness, t );
			} ) );
	}

	public static BaseTween TweenFlickerLight( this SpotLight light, float minBrightness, float maxBrightness, float duration, float speed = 10f )
	{
		if ( !light.IsValid() ) return null;

		float time = 0f;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnUpdate( _ =>
			{
				time += Time.Delta * speed;
				float noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );
				float t = (noise + 1f) * 0.5f;
				light.Attenuation = MathX.Lerp( minBrightness, maxBrightness, t );
			} ) );
	}

	//FLICKERING Color

	public static BaseTween TweenFlickerColor( this PointLight light, Color colorA, Color colorB, float duration, float speed = 10f )
	{
		if ( !light.IsValid() ) return null;

		float time = 0f;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnUpdate( _ =>
			{
				time += Time.Delta * speed;
				float noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );
				float t = (noise + 1f) * 0.5f;
				light.LightColor = Color.Lerp( colorA, colorB, t );
			} ) );
	}

	public static BaseTween TweenFlickerColor( this SpotLight light, Color colorA, Color colorB, float duration, float speed = 10f )
	{
		if ( !light.IsValid() ) return null;

		float time = 0f;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnUpdate( _ =>
			{
				time += Time.Delta * speed;
				float noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );
				float t = (noise + 1f) * 0.5f;
				light.LightColor = Color.Lerp( colorA, colorB, t );
			} ) );
	}

}
resync.sbtween / SbTween/Extensions/AudioExtensions.cs
Game library
using Sandbox;
using System;

namespace SbTween;

public static class AudioExtensions
{
	public static BaseTween TweenVolume( this SoundPointComponent sound, float targetVolume, float duration )
	{
		float startVolume = sound.Volume;
		var tween = new BaseTween( duration );
		tween.Target = sound.GameObject;

		return TweenManager.Instance.AddTween( tween
			.OnStart( () => startVolume = sound.Volume )
			.OnUpdate( p =>
			{
				if ( !sound.IsValid() ) return;
				sound.Volume = MathX.Lerp( startVolume, targetVolume, p );
			} )
		);
	}
	
	public static BaseTween TweenPitch( this SoundPointComponent sound, float targetPitch, float duration )
	{
		float startPitch = sound.Pitch;
		var tween = new BaseTween( duration );
		tween.Target = sound.GameObject;

		return TweenManager.Instance.AddTween( tween
			.OnStart( () => startPitch = sound.Pitch )
			.OnUpdate( p =>
			{
				if ( !sound.IsValid() ) return;
				sound.Pitch = MathX.Lerp( startPitch, targetPitch, p );
			} )
		);
	}
}
resync.sbtween / SbTween/Extensions/MathTweenExtensions.cs
Game library
using Sandbox;
using System;

namespace SbTween;

public static class MathTweenExtensions
{
	public static BaseTween TweenInCircle( this GameObject obj, float duration, Vector3 axis, float range, float speed, bool snapping = false )
	{
		Vector3 centerPos = obj.WorldPosition;
		var tween = new BaseTween( duration );
		tween.Target = obj;

		Vector3 normal = axis.Normal;
		Vector3 v1 = Vector3.Cross( normal, MathF.Abs( normal.z ) < 0.9f ? Vector3.Up : Vector3.Forward ).Normal;
		Vector3 v2 = Vector3.Cross( normal, v1 ).Normal;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !obj.IsValid() ) return;

				float angleDegrees = p * 360f * speed;
				float angleRadians = angleDegrees * (MathF.PI / 180f);

				float cos = MathF.Cos( angleRadians ) * range;
				float sin = MathF.Sin( angleRadians ) * range;

				Vector3 rotatedOffset = (v1 * cos) + (v2 * sin);
				obj.WorldPosition = centerPos + rotatedOffset;
			} )
		);
	}

	public static BaseTween TweenSpiral( this GameObject obj, float duration, Vector3 axis, float speed, float frequency )
	{
		Vector3 startPos = obj.WorldPosition;
		var tween = new BaseTween( duration );
		tween.Target = obj;

		return TweenManager.Instance.AddTween( tween
			.OnStart( () => startPos = obj.WorldPosition )
			.OnUpdate( p =>
			{
				if ( !obj.IsValid() ) return;

				float angle = p * MathF.PI * 2f * frequency;

				float currentRadius = p * speed;

				float x = MathF.Cos( angle ) * currentRadius;
				float y = MathF.Sin( angle ) * currentRadius;

				Vector3 axisOffset = axis * p;

				Vector3 circleOffset = new Vector3( x, y, 0 );

				obj.WorldPosition = startPos + axisOffset + circleOffset;
			} )
		);
	}
	
	public static BaseTween TweenPunchFloat( this GameObject obj, float v, float amplitude, float duration, int vibrations = 5, float elasticity = 1f, Action<float> setter = null )
	{
		var tween = new BaseTween( duration );
		tween.Target = obj;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !obj.IsValid() ) return;
				if ( p >= 1.0f )
				{
					setter?.Invoke( v );
					return;
				}
				
				float decay = MathF.Pow( 1f - p, elasticity * 3f );

				float omega = vibrations * MathF.PI * 2f;
				float oscillation = MathF.Sin( p * omega );

				float currentOffset = amplitude * oscillation * decay;

				setter?.Invoke( v + currentOffset );
			} )
			.OnComplete( () => setter?.Invoke( v ) )
		);
	}
	
	public static BaseTween TweenShakeFloat( this GameObject obj, float baseline, float strength, float duration, Action<float> setter = null )
	{
		var tween = new BaseTween( duration );
		tween.Target = obj;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !obj.IsValid() ) return;
				if ( p >= 1.0f )
				{
					setter?.Invoke( baseline );
					return;
				}

				float currentStrength = strength * (1.0f - p);
             
				float randomOffset = Game.Random.Float( -currentStrength, currentStrength );

				setter?.Invoke( baseline + randomOffset );
			} )
			.OnComplete( () => setter?.Invoke( baseline ) )
		);
	}
}
resync.sbtween / .obj/__compiler_extra.cs
Game library
global using static Sandbox.Internal.GlobalGameNamespace;
global using Microsoft.AspNetCore.Components;
global using Microsoft.AspNetCore.Components.Rendering;
[assembly: global::System.Reflection.AssemblyMetadata( "AddonTitle", "SbTween" )]
[assembly: global::System.Reflection.AssemblyMetadata( "AddonIdent", "sbtween" )]
[assembly: global::System.Reflection.AssemblyMetadata( "OrgIdent", "resync" )]
[assembly: global::System.Reflection.AssemblyMetadata( "Ident", "resync.sbtween" )]
[assembly: global::System.Reflection.AssemblyMetadata( "CompileTime", "6/17/2026 7:47:49 AM" )]
[assembly: global::System.Reflection.AssemblyMetadata( "EngineVersion", "25" )]
[assembly: global::System.Reflection.AssemblyMetadata( "EngineMinorVersion", "1" )]

[assembly: System.Runtime.Versioning.TargetFramework( ".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0" )]
[assembly: global::System.Reflection.AssemblyVersion("0.0.146.0")]
[assembly: global::System.Reflection.AssemblyFileVersion("0.0.146.0")]
resync.sbtween / Code/SbTween/Core/TweenPlayer.cs
Game library
using Sandbox;
using System;

namespace SbTween;

[Title( "SbTween Player" )]
[Category( "Tweening" )]
[Icon( "play_arrow" )]
public sealed class SbTweenPlayer : Component, Component.ExecuteInEditor
{
    // BUTTONS
    [Group( "Buttons" ), Button( "Play", "play_arrow" )]
    public void PlayButton() => Play();

    [Group( "Buttons" ), Button( "Stop", "stop" )]
    public void StopButton() => Stop();

    // SETUP
    [Property, Group( "Setup" )] public TweenType Type { get; set; } = TweenType.Move;

    // VECTORS & TRANSFORMS
    [Property, Group( "Setup" ), ShowIf( nameof( IsVector ), true )] public Vector3 From { get; set; }
    [Property, Group( "Setup" ), ShowIf( nameof( IsVector ), true )] public Vector3 To { get; set; }

    [Property, Group( "Setup" ), ShowIf( nameof( IsVector2D ), true )] public Vector2 From2D { get; set; }
    [Property, Group( "Setup" ), ShowIf( nameof( IsVector2D ), true )] public Vector2 To2D { get; set; }

    // RENDER / TINT
    [Property, Group( "Setup" ), ShowIf( nameof( Type ), TweenType.Tint )] public Color ColorFrom { get; set; } = Color.White;
    [Property, Group( "Setup" ), ShowIf( nameof( Type ), TweenType.Tint )] public Color ColorTo { get; set; } = Color.White;

    // SHAKE JUICE
    [Property, Group( "Setup" ), ShowIf( nameof( IsShake ), true )] public float Strength { get; set; } = 1.0f;

    // MATH / PROCEDURAL
    [Property, Group( "Setup" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public Vector3 Axis { get; set; } = Vector3.Up * 100f;
    [Property, Group( "Setup" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public float Speed { get; set; } = 1f;
    [Property, Group( "Setup" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public float Frequency { get; set; } = 5f;
    [Property, Group( "Setup" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public float Range { get; set; } = 5f;

    // IN CIRCLE SNAPPING
    [Property, Group( "Setup" ), ShowIf( nameof( Type ), TweenType.InCircle )] public bool Snapping { get; set; } = false;

    // SETTINGS
    [Property, Group( "Settings" )] public float Duration { get; set; } = 1.0f;
    [Property, Group( "Settings" )] public float Delay { get; set; } = 0.0f;

    [Property, Group( "Settings" )]
    [Title( "Loops (0 = Once, -1 = Infinite)" )]
    public int Loops { get; set; } = 0;

    [Property, Group( "Settings" )] public LoopType LoopMode { get; set; } = LoopType.Restart;
    [Property, Group( "Settings" )] public EaseType Easing { get; set; } = EaseType.Linear;
    [Property, Group( "Settings" )] public bool AutoPlay { get; set; } = true;
    [Property, Group( "Settings" )] public string TweenID { get; set; } = "";

    [Property, Group( "Settings" )] public bool UseCurve { get; set; } = false;
    [Property, Group( "Settings" ), ShowIf( nameof( UseCurve ), true )] public Curve TweenCurve { get; set; } = Curve.Linear;

    // EVENTS
    [Property, Group( "Events" )] public Action _OnStart { get; set; }
    [Property, Group( "Events" )] public Action _OnComplete { get; set; }
    [Property, Group( "Debug" )] public bool GizmoDebug { get; set; } = true;

    // REFLECTION LOOKUPS FOR EDITOR SHOWIFs
    [Hide] public bool IsCircularOrSpiral => Type == TweenType.InCircle || Type == TweenType.Spiral;
    [Hide] public bool IsShake => Type == TweenType.ShakeScale || Type == TweenType.ShakeLocation || Type == TweenType.ShakeRotation;
    [Hide] public bool IsVector => Type == TweenType.Move || Type == TweenType.MoveLocal || Type == TweenType.Rotate || Type == TweenType.RotateLocal || Type == TweenType.Scale;
    [Hide] public bool IsVector2D => Type == TweenType.Move2D || Type == TweenType.MoveLocal2D;

    private BaseTween _currentTween;
    private TweenSnapshot _initialState;
    private int _completedLoops = 0;
    private bool _isReversing = false;

    private Vector3 _incrementalFrom;
    private Vector3 _incrementalTo;
    private Vector2 _incrementalFrom2D;
    private Vector2 _incrementalTo2D;
    private bool _isIncrementalStarted = false;

    protected override void OnStart()
    {
       if ( Game.IsPlaying && AutoPlay )
       {
          Play();
       }
    }

    protected override void OnUpdate()
    {
       if ( Game.IsPlaying ) return;
       if ( _currentTween == null ) return;

       if ( !_currentTween.IsFinished && !_currentTween.IsPaused )
       {
          GameObject.Transform.Local = GameObject.Transform.Local;
       }
    }

    protected override void DrawGizmos()
    {
       if ( !GizmoDebug || !Gizmo.IsSelected ) return;
       if ( Type != TweenType.Move && Type != TweenType.MoveLocal ) return;

       using ( Gizmo.Scope() )
       {
          Gizmo.Transform = new Transform().WithPosition( 0 ).WithRotation( Rotation.Identity ).WithScale( 1 );
          float sphereRadius = 6f;

          Gizmo.Draw.Color = Color.Green;
          Gizmo.Draw.SolidSphere( From, sphereRadius );
          Gizmo.Draw.Text( "FROM", new Transform( From + Vector3.Up * 10f ) );

          Gizmo.Draw.Color = Color.Red;
          Gizmo.Draw.SolidSphere( To, sphereRadius );
          Gizmo.Draw.Text( "TO", new Transform( To + Vector3.Up * 10f ) );

          Gizmo.Draw.Color = Color.Yellow.WithAlpha( 0.4f );
          Gizmo.Draw.Line( From, To );

          var mid = (From + To) / 2f;
          var dir = (To - From).Normal;
          if ( dir.Length > 0.1f )
          {
             Gizmo.Draw.Arrow( mid, mid + dir * 15f, 10f, 5f );
          }
       }
    }

    public void Play()
    {
       StopInternal();

       if ( _initialState == null )
       {
          _initialState = new TweenSnapshot();
          _initialState.Capture( GameObject );
       }

       if ( LoopMode == LoopType.Incremental && !IsCircularOrSpiral )
       {
          if ( !_isIncrementalStarted )
          {
             _incrementalFrom = From;
             _incrementalTo = To;
             _incrementalFrom2D = From2D;
             _incrementalTo2D = To2D;
             _isIncrementalStarted = true;
          }
       }
       else
       {
          _isIncrementalStarted = false;
       }

       if ( !IsCircularOrSpiral && LoopMode != LoopType.Incremental )
       {
          ResetToState( !_isReversing );
       }

       GameObject.Transform.ClearInterpolation();

       _currentTween = CreateTweenInstance( _isReversing );
       if ( _currentTween == null ) return;

       _currentTween
          .SetDelay( Delay )
          .OnStart( () => _OnStart?.Invoke() );

       if ( UseCurve ) 
          _currentTween.WithCurve( TweenCurve );
       else 
          _currentTween.SetEase( Easing );

       if ( !string.IsNullOrEmpty( TweenID ) )
       {
          _currentTween.SetId( TweenID );
       }

       if ( LoopMode == LoopType.Incremental && !IsCircularOrSpiral )
       {
          _currentTween.OnComplete( () => HandleCompletion() );
       }
       else
       {
          _currentTween.SetLoops( Loops, LoopMode );
          _currentTween.OnComplete( () => _OnComplete?.Invoke() );
       }

       _currentTween.Play();
    }

    public void Stop()
    {
       StopInternal();
       _completedLoops = 0;
       _isReversing = false;
       _isIncrementalStarted = false;

       if ( _initialState != null )
       {
          _initialState.Restore();
       }
       _initialState = null;
    }

    private void StopInternal()
    {
       _currentTween?.Stop();
       _currentTween = null;
    }

    private void HandleCompletion()
    {
       _OnComplete?.Invoke();
       bool hasMoreLoops = Loops == -1 || _completedLoops < Loops;

       switch ( LoopMode )
       {
          case LoopType.YoYo:
             _isReversing = !_isReversing;
             if ( !_isReversing && Loops != -1 ) _completedLoops++;

             if ( hasMoreLoops || _isReversing )
             {
                Play();
             }
             break;

          case LoopType.Incremental:
             if ( hasMoreLoops )
             {
                if ( Loops != -1 ) _completedLoops++;
                if ( IsVector )
                {
                   var delta = _incrementalTo - _incrementalFrom;
                   _incrementalFrom = _incrementalTo;
                   _incrementalTo += delta;
                }
                else if ( IsVector2D )
                {
                   var delta2D = _incrementalTo2D - _incrementalFrom2D;
                   _incrementalFrom2D = _incrementalTo2D;
                   _incrementalTo2D += delta2D;
                }
                _isReversing = false;
                Play();
             }
             break;

          case LoopType.Restart:
             if ( hasMoreLoops )
             {
                if ( Loops != -1 ) _completedLoops++;
                _isReversing = false;
                Play();
             }
             break;
       }
    }

    private void ResetToState( bool useFrom )
    {
       if ( Type == TweenType.Tint )
       {
          var mr = Components.Get<ModelRenderer>();
          if ( mr.IsValid() ) mr.Tint = useFrom ? ColorFrom : ColorTo;
       }
       else if ( IsVector2D )
       {
          var val2D = useFrom ? From2D : To2D;
          switch ( Type )
          {
             case TweenType.Move2D: 
                GameObject.WorldPosition = new Vector3( val2D.x, val2D.y, GameObject.WorldPosition.z ); 
                break;
             case TweenType.MoveLocal2D: 
                GameObject.LocalPosition = new Vector3( val2D.x, val2D.y, GameObject.LocalPosition.z ); 
                break;
          }
       }
       else
       {
          var val = useFrom ? From : To;
          switch ( Type )
          {
             case TweenType.Move: GameObject.WorldPosition = val; break;
             case TweenType.MoveLocal: GameObject.LocalPosition = val; break;
             case TweenType.Scale: GameObject.LocalScale = val; break;
             case TweenType.Rotate: GameObject.WorldRotation = Rotation.From( val.x, val.y, val.z ); break;
             case TweenType.RotateLocal: GameObject.LocalRotation = Rotation.From( val.x, val.y, val.z ); break;
          }
       }
    }

    private BaseTween CreateTweenInstance( bool reverse )
    {
       // Calculate explicit dimensional targets contextually
       Vector3 startVal = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalFrom : From;
       Vector3 endVal = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalTo : To;
       Vector3 targetVal = reverse ? startVal : endVal;

       Vector2 startVal2D = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalFrom2D : From2D;
       Vector2 endVal2D = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalTo2D : To2D;
       Vector2 targetVal2D = reverse ? startVal2D : endVal2D;

       Color targetColor = reverse ? ColorFrom : ColorTo;

       var t = Type switch
       {
          TweenType.Move => GameObject.TweenMove( targetVal, Duration ),
          TweenType.MoveLocal => GameObject.TweenMoveLocal( targetVal, Duration ),
          TweenType.Rotate => GameObject.TweenRotate( Rotation.From( targetVal.x, targetVal.y, targetVal.z ), Duration ),
          TweenType.RotateLocal => GameObject.TweenRotateLocal( Rotation.From( targetVal.x, targetVal.y, targetVal.z ), Duration ),
          TweenType.Scale => GameObject.TweenScale( targetVal, Duration ),
          TweenType.Move2D => GameObject.TweenMove2D( targetVal2D, Duration ),
          TweenType.MoveLocal2D => GameObject.TweenMoveLocal2D( targetVal2D, Duration ),
          
          TweenType.Tint => Components.Get<ModelRenderer>()?.TweenTint( targetColor, Duration ),

          TweenType.ShakeLocation => GameObject.TweenShakeLocation( Duration, Strength ),
          TweenType.ShakeRotation => GameObject.TweenShakeRotation( Duration, Strength ),
          TweenType.ShakeScale => GameObject.TweenShakeScale( Duration, Strength ),

          TweenType.InCircle => GameObject.TweenInCircle( Duration, Axis, Range, Speed, Snapping ),
          TweenType.Spiral => GameObject.TweenSpiral( Duration, Axis, Speed, Frequency ),

          _ => null
       };

       if ( t != null )
       {
          t.Target = this.GameObject;
          t.LoopMode = LoopMode;
       }

       return t;
    }
}

public enum TweenType
{
    Move,
    MoveLocal,
    Rotate,
    RotateLocal,
    Scale,
    Move2D,
    MoveLocal2D,
    Tint,
    ShakeLocation,
    ShakeRotation, 
    ShakeScale,
    Spiral,
    InCircle
}
resync.sbtween / Code/SbTween/Examples/SBECubeTL.cs
Game library
using Sandbox;
using SbTween;

namespace SbTween.Examples;

public sealed class SBECubeTL : Component
{
	[Property] public Vector3 vectorUP;

	protected override void OnStart()
	{
		this.TweenMove( vectorUP, 3 ).SetEase( EaseType.Linear ).SetLoops(-1, LoopType.YoYo ).Play();
	}
	
}
resync.sbtween / Code/SbTween/Extensions/CameraExtensions.cs
Game library
using Sandbox;

namespace SbTween;

public static class CameraExtensions
{
	public static BaseTween TweenFieldOfView( this CameraComponent self, float to, float duration )
	{
		float from = self.FieldOfView;
		var tween = new BaseTween( duration );
		tween.Target = self.GameObject;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !self.IsValid() ) return;
				self.FieldOfView = from.LerpTo( to, p );
			} )
		);
	}
	
	public static BaseTween TweenZNear( this CameraComponent self, float to, float duration )
	{
		float from = self.ZNear;
		var tween = new BaseTween( duration );
		tween.Target = self.GameObject;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !self.IsValid() ) return;
				self.ZNear = from.LerpTo( to, p );
			} )
		);
	}

	public static BaseTween TweenZFar( this CameraComponent self, float to, float duration )
	{
		float from = self.ZFar;
		var tween = new BaseTween( duration );
		tween.Target = self.GameObject;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !self.IsValid() ) return;
				self.ZFar = from.LerpTo( to, p );
			} )
		);
	}

	public static BaseTween TweenBackgroundColor( this CameraComponent self, Color to, float duration )
	{
		Color from = self.BackgroundColor;
		var tween = new BaseTween( duration );
		tween.Target = self.GameObject;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !self.IsValid() ) return;
				self.BackgroundColor = Color.Lerp( from, to, p );
			} )
		);
	}

	public static BaseTween TweenOrthoHeight( this CameraComponent self, float to, float duration )
	{
		float from = self.OrthographicHeight;
		var tween = new BaseTween( duration );
		tween.Target = self.GameObject;

		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p =>
			{
				if ( !self.IsValid() ) return;
				self.OrthographicHeight = from.LerpTo( to, p );
			} )
		);
	}
}
resync.sbtween / SbTween/Examples/ActionGraph/SbeActionGraphTest.cs
Game library
using System;
using Sandbox;
using SbTween;

namespace SbTween.Examples;


public sealed class SbeActionGraphTest : Component
{
	[Property] public Action actionTest;

	protected override void OnStart()
	{
		actionTest.Invoke();
	}

	public void RestartAction()
	{
		actionTest.Invoke();
	}
}
resync.sbtween / SbTween/Examples/SbeCubeSpiral.cs
Game library
using Sandbox;

namespace SbTween.Examples;

public sealed class SbeCubeSpiral : Component
{
	[Property] public Vector3 axis;
	[Property] public float speed;
	[Property] public float frequency;

	protected override void OnStart()
	{
		GameObject.TweenSpiral( 4, axis, speed, frequency ).SetLoops(-1, LoopType.YoYo ).Play();
	}
}
resync.sbtween / SbTween/Examples/SbeTRS.cs
Game library
using Sandbox;
using SbTween;

namespace SbTween.Examples;

public sealed class SbeTRS : Component
{
	protected override void OnStart()
	{
		this.TweenShakeRotation( 0.6f, 5 ).SetLoops( -1, LoopType.YoYo );
	}
}
resync.sbtween / SbTween/Extensions/PostProcessingExtensions.cs
Game library
using Sandbox;
using System;

namespace SbTween;

public static class PostProcessingExtensions
{
	// FilmGrain

	public static BaseTween TweenIntensity( this FilmGrain pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Intensity;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Intensity )
			.OnUpdate( p => pp.Intensity = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenResponse( this FilmGrain pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Response;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Response )
			.OnUpdate( p => pp.Response = MathX.Lerp( start, target, p ) ) );
	}

	// Bloom

	public static BaseTween TweenStrength( this Bloom pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Strength;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Strength )
			.OnUpdate( p => pp.Strength = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenThreshold( this Bloom pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Threshold;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Threshold )
			.OnUpdate( p => pp.Threshold = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenGamma( this Bloom pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Gamma;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Gamma )
			.OnUpdate( p => pp.Gamma = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenTint( this Bloom pp, Color target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		Color start = pp.Tint;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Tint )
			.OnUpdate( p => pp.Tint = Color.Lerp( start, target, p ) ) );
	}

	// Blur

	public static BaseTween TweenSize( this Blur pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Size;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Size )
			.OnUpdate( p => pp.Size = MathX.Lerp( start, target, p ) ) );
	}

	// ChromaticAberration 

	public static BaseTween TweenScale( this ChromaticAberration pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Scale;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Scale )
			.OnUpdate( p => pp.Scale = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenOffset( this ChromaticAberration pp, Vector3 target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		Vector3 start = pp.Offset;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Offset )
			.OnUpdate( p => pp.Offset = Vector3.Lerp( start, target, p ) ) );
	}

	// ColorAdjustments

	public static BaseTween TweenBlend( this ColorAdjustments pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Blend;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Blend )
			.OnUpdate( p => pp.Blend = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenSaturation( this ColorAdjustments pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Saturation;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Saturation )
			.OnUpdate( p => pp.Saturation = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenHueRotate( this ColorAdjustments pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.HueRotate;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.HueRotate )
			.OnUpdate( p => pp.HueRotate = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenBrightness( this ColorAdjustments pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Brightness;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Brightness )
			.OnUpdate( p => pp.Brightness = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenContrast( this ColorAdjustments pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Contrast;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Contrast )
			.OnUpdate( p => pp.Contrast = MathX.Lerp( start, target, p ) ) );
	}

	// Vignette

	public static BaseTween TweenIntensity( this Vignette pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Intensity;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Intensity )
			.OnUpdate( p => pp.Intensity = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenSmoothness( this Vignette pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Smoothness;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Smoothness )
			.OnUpdate( p => pp.Smoothness = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenRoundness( this Vignette pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Roundness;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Roundness )
			.OnUpdate( p => pp.Roundness = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenColor( this Vignette pp, Color target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		Color start = pp.Color;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Color )
			.OnUpdate( p => pp.Color = Color.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenCenter( this Vignette pp, Vector2 target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		Vector2 start = pp.Center;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Center )
			.OnUpdate( p => pp.Center = Vector2.Lerp( start, target, p ) ) );
	}

	// DepthOfField

	public static BaseTween TweenBlurSize( this DepthOfField pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.BlurSize;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.BlurSize )
			.OnUpdate( p => pp.BlurSize = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenFocalDistance( this DepthOfField pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.FocalDistance;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.FocalDistance )
			.OnUpdate( p => pp.FocalDistance = MathX.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenFocusRange( this DepthOfField pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.FocusRange;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.FocusRange )
			.OnUpdate( p => pp.FocusRange = MathX.Lerp( start, target, p ) ) );
	}

	// Sharpen 

	public static BaseTween TweenSharpen( this Sharpen pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Scale;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Scale )
			.OnUpdate( p => pp.Scale = MathX.Lerp( start, target, p ) ) );
	}
	public static BaseTween TweenTexelSize( this Sharpen pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.TexelSize;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.TexelSize )
			.OnUpdate( p => pp.TexelSize = MathX.Lerp( start, target, p ) ) );
	}

	// Pixelate

	public static BaseTween TweenScale( this Pixelate pp, float target, float duration )
	{
		if ( !pp.IsValid() ) return null;
		float start = pp.Scale;
		return TweenManager.Instance.AddTween( new BaseTween( duration )
			.OnStart( () => start = pp.Scale )
			.OnUpdate( p => pp.Scale = MathX.Lerp( start, target, p ) ) );
	}
}
resync.sbtween / Code/SbTween/Core/TweenExtensions.cs
Game library
using Sandbox;
using Sandbox.UI;
using System;

namespace SbTween;

public static class TweenExtensions
{
	// Shortcuts (! this is really important otherwise you can't hookup tweeners to components)


	// TIMELINE
	public static void Pause( this Component self, string id = null )
	{
		if ( string.IsNullOrEmpty( id ) )
			TweenManager.Instance?.Pause( self.GameObject );
		else
			TweenManager.Instance?.Pause( id );
	}

	public static void Play( this Component self, string id = null )
	{
		if ( string.IsNullOrEmpty( id ) )
			TweenManager.Instance?.Play( self.GameObject );
		else
			TweenManager.Instance?.Play( id );
	}

	public static void KillTween( this GameObject self, string id )
	{
		if ( string.IsNullOrEmpty( id ) ) return;

		TweenManager.Instance?.KillTweenOnObject( self, id );
	}

	public static void KillAllTweens( this GameObject self )
	{
		TweenManager.Instance?.KillAllTweensOnObject( self );
	}


	// TWEENS
	public static BaseTween TweenMove( this Component self, Vector3 target, float duration ) => self.GameObject.TweenMove( target, duration );
	public static BaseTween TweenMoveLocal( this Component self, Vector3 target, float duration ) => self.GameObject.TweenMoveLocal( target, duration );
	public static BaseTween TweenMove2D( this Component self, Vector2 target, float duration ) => self.GameObject.TweenMove2D( target, duration );
	public static BaseTween TweenMoveLocal2D( this Component self, Vector2 target, float duration ) => self.GameObject.TweenMoveLocal2D( target, duration );
	public static BaseTween TweenRotateLocal( this Component self, Rotation target, float duration ) => self.GameObject.TweenRotateLocal( target, duration );
	public static BaseTween TweenRotate( this Component self, Rotation target, float duration ) => self.GameObject.TweenRotate( target, duration );
	public static BaseTween TweenScale( this Component self, Vector3 target, float duration ) => self.GameObject.TweenScale( target, duration );
	public static BaseTween TweenShakeLocation( this Component self, float duration, float strength = 10f ) => self.GameObject.TweenShakeLocation( duration, strength );
	public static BaseTween TweenShakeRotation( this Component self, float duration, float strength = 5f ) => self.GameObject.TweenShakeRotation( duration, strength );
	public static BaseTween TweenShakeScale( this Component self, float duration, float strength = 0.2f ) => self.GameObject.TweenShakeScale( duration, strength );
	public static BaseTween TweenFloat( this Component self, float start, float end, float duration, Action<float> setter ) => self.GameObject.TweenFloat( start, end, duration, setter );

	// 3D VECTOR
	public static BaseTween TweenMove( this GameObject obj, Vector3 target, float duration )
	{
		Vector3 start = obj.WorldPosition;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => start = obj.WorldPosition )
			.OnUpdate( p => obj.WorldPosition = Vector3.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenMoveLocal( this GameObject obj, Vector3 target, float duration )
	{
		Vector3 start = obj.LocalPosition;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => start = obj.LocalPosition )
			.OnUpdate( p => obj.LocalPosition = Vector3.Lerp( start, target, p ) ) );
	}

	// 3D ROTATION
	public static BaseTween TweenRotate( this GameObject obj, Rotation target, float duration )
	{
		Rotation start = obj.WorldRotation;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => start = obj.WorldRotation )
			.OnUpdate( p => obj.WorldRotation = Rotation.Lerp( start, target, p ) ) );
	}

	public static BaseTween TweenRotateLocal( this GameObject obj, Rotation target, float duration )
	{
		Rotation start = obj.LocalRotation;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => start = obj.LocalRotation )
			.OnUpdate( p => obj.LocalRotation = Rotation.Lerp( start, target, p ) ) );
	}

	// 3D SCALE
	public static BaseTween TweenScale( this GameObject obj, Vector3 target, float duration )
	{
		Vector3 start = obj.LocalScale;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => start = obj.LocalScale )
			.OnUpdate( p => obj.LocalScale = Vector3.Lerp( start, target, p ) ) );
	}
	
	// 2D VECTOR
	public static BaseTween TweenMove2D( this GameObject obj, Vector2 target, float duration )
	{
		Vector2 start = new Vector2( obj.WorldPosition.x, obj.WorldPosition.y );
		float originalZ = obj.WorldPosition.z;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => {
				start = new Vector2( obj.WorldPosition.x, obj.WorldPosition.y );
				originalZ = obj.WorldPosition.z;
			} )
			.OnUpdate( p => {
				Vector2 current2D = Vector2.Lerp( start, target, p );
				obj.WorldPosition = new Vector3( current2D.x, current2D.y, originalZ );
			} ) );
	}

	public static BaseTween TweenMoveLocal2D( this GameObject obj, Vector2 target, float duration )
	{
		Vector2 start = new Vector2( obj.LocalPosition.x, obj.LocalPosition.y );
		float originalZ = obj.LocalPosition.z;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => {
				start = new Vector2( obj.LocalPosition.x, obj.LocalPosition.y );
				originalZ = obj.LocalPosition.z;
			} )
			.OnUpdate( p => {
				Vector2 current2D = Vector2.Lerp( start, target, p );
				obj.LocalPosition = new Vector3( current2D.x, current2D.y, originalZ );
			} ) );
	}

	// RENDER
	public static BaseTween TweenTint( this ModelRenderer mr, Color target, float duration )
	{
		Color start = mr.Tint;
		var tween = new BaseTween( duration );
		tween.Target = mr.GameObject;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => start = mr.Tint )
			.OnUpdate( p => mr.Tint = Color.Lerp( start, target, p ) ) );
	}

	// FLOAT TWEEN
	public static BaseTween TweenFloat( this GameObject obj, float start, float end, float duration, Action<float> setter )
	{
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnUpdate( p => setter?.Invoke( MathX.Lerp( start, end, p ) ) ) );
	}

	// SHAKERS
	public static BaseTween TweenShakeLocation( this GameObject obj, float duration, float strength = 10f )
	{
		Vector3 startPos = obj.WorldPosition;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => startPos = obj.WorldPosition )
			.OnUpdate( p => {
				if ( !obj.IsValid() ) return;
				var randomDir = new Vector3( Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ) );
				obj.WorldPosition = startPos + (randomDir * strength * (1 - p));
			} )
			.OnComplete( () => { if ( obj.IsValid() ) obj.WorldPosition = startPos; } ) );
	}

	public static BaseTween TweenShakeRotation( this GameObject obj, float duration, float strength = 5f )
	{
		Rotation startRot = obj.WorldRotation;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => startRot = obj.WorldRotation )
			.OnUpdate( p => {
				if ( !obj.IsValid() ) return;
				var randomAngles = new Angles( Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ) );
				obj.WorldRotation = startRot * Rotation.From( randomAngles * strength * (1 - p) );
			} )
			.OnComplete( () => { if ( obj.IsValid() ) obj.WorldRotation = startRot; } ) );
	}

	public static BaseTween TweenShakeScale( this GameObject obj, float duration, float strength = 0.2f )
	{
		Vector3 startScale = obj.LocalScale;
		var tween = new BaseTween( duration );
		tween.Target = obj;
		return TweenManager.Instance.AddTween( tween
			.OnStart( () => startScale = obj.LocalScale )
			.OnUpdate( p => {
				if ( !obj.IsValid() ) return;
				var randomScale = new Vector3( Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ) );
				obj.LocalScale = startScale + (randomScale * strength * (1 - p));
			} )
			.OnComplete( () => { if ( obj.IsValid() ) obj.LocalScale = startScale; } ) );
	}
}
resync.sbtween / Code/SbTween/Examples/SbecubeSeq.cs
Game library
using Sandbox;
using SbTween;

namespace SbTween.Examples;

public sealed class SbecubeSeq : Component
{
	[Property] public ModelRenderer MR;

	protected override void OnStart()
	{
		var exampleSeq = new TweenSequence()
			.Append( this.TweenMove( new Vector3( -257.631989f, -510.453766f, 181.270782f ), 1 ) )
			.Append( MR.TweenTint( new Color32( 0, 255, 0, 255 ), 0.5f ) )
			.Append( this.TweenMove( new Vector3( -257.631989f, -510.453766f, 37.8219452f ), 0.87f ) )
			.Append( this.TweenScale( new Vector3( 0.617f, 0.617f, 0.116f ), 0.5f ) )
			.Append( this.TweenScale( new Vector3( 0.617f, 0.617f, 0.617f ), 1 ) )
			.Append( MR.TweenTint( new Color32( 0, 255, 255, 255 ), 1 ) ).SetLoops(-1).SetDelay(3);

		exampleSeq.Play();
		
	}
}
resync.sbtween / Code/SbTween/Examples/SbecubeTR.cs
Game library
using Sandbox;
using SbTween;


namespace SbTween.Examples;

public sealed class SbecubeTR : Component
{
	[Property] public EaseType easingType;

	protected override void OnStart()
	{
		this.TweenRotate(Rotation.From(0,180,0), 1).SetEase( easingType ).SetLoops(-1).Play();
	}
}
resync.sbtween / Code/SbTween/Examples/SbecubeTS.cs
Game library
using Sandbox;
using SbTween;

namespace SbTween.Examples;

public sealed class SbecubeTS : Component
{
	protected override void OnStart()
	{
		this.TweenScale( new Vector3( 0.5f, 1f, 0.5f ),0.5f ).SetLoops(-1,LoopType.YoYo).SetEase(EaseType.InBounce).Play();
	}
}
resync.sbtween / Code/SbTween/Examples/TextRenderer/Sbe_TextTweenProperty.cs
Game library
using Sandbox;

namespace SbTween.Examples;

public sealed class Sbe_TextTweenProperty : Component
{
	[Property] public TextRenderer TR;
	[Property] public Color GlowText;

	protected override void OnStart()
	{
		TR.TweenFontSize( 52f, 2 ).SetLoops( -1, LoopType.YoYo ).Play();
		TR.TweenOutlineColor(GlowText, 0.8f).SetLoops(-1, LoopType.YoYo ).Play();
		TR.TweenFontWeight(600, 0.4f).SetLoops(-1, LoopType.YoYo ).Play();
	}


}
resync.sbtween / SbTween/Core/BaseTween.cs
Game library
using Sandbox;
using System;

namespace SbTween;

public class BaseTween
{
    // Core Settings 
    public float Duration { get; set; }
    public float Elapsed { get; private set; }
    public float Delay { get; private set; }
    public EaseType Ease { get; set; } = EaseType.Linear;
    public Func<float, float> TimingFunction { get; set; }
    public GameObject Target { get; set; }
    public string Id { get; set; }


    // Looping 
    public LoopType LoopMode { get; set; } = LoopType.Restart;
    public int Loops { get; private set; } = 0; // 0 = once, -1 = infinity.
    private int _loopsDone = 0;

    // State 
    public bool IsFinished { get; private set; }
    public bool IsPaused { get; private set; }
    public bool IsReversed { get; private set; }

    // Events
    private Action _onStart;
    private Action _onComplete;
    private Action _onLoop;
    private Action<float> _onUpdate;

    private bool _hasStarted = false;

    public BaseTween( float duration )
    {
       Duration = duration;
    }

    public BaseTween SetDelay( float seconds )
    {
       Delay = seconds;
       return this;
    }

    public BaseTween SetId( string id )
    {
       Id = id;
       return this;
    }
    protected float GetEasedProgress( float p )
    {
       return TimingFunction != null ? TimingFunction( p ) : p;
    }

    public void Update( float deltaTime )
    {
       if ( IsFinished || IsPaused ) return;

       if ( Delay > 0 )
       {
          Delay -= deltaTime;
          return;
       }

       if ( !_hasStarted )
       {
          _onStart?.Invoke();
          _hasStarted = true;
       }

       if ( IsReversed )
          Elapsed -= deltaTime;
       else
          Elapsed += deltaTime;

       // Calculate un-clamped progress to detect precise boundaries safely
       float rawProgress = Elapsed / Duration;
       float progress = Math.Clamp( rawProgress, 0f, 1.0f );
       float finalProgress = TimingFunction != null ? TimingFunction( progress ) : Easing.Apply( Ease, progress );

       if ( LoopMode == LoopType.Incremental )
       {
          _onUpdate?.Invoke( finalProgress + _loopsDone );
       }
       else
       {
          _onUpdate?.Invoke( finalProgress );
       }

       // Boundary detection checking against raw values to prevent precision lockups
       if ( (!IsReversed && rawProgress >= 1.0f) || (IsReversed && rawProgress <= 0f) )
       {
          if ( Loops == -1 || _loopsDone < Loops )
          {
             _loopsDone++;
             _onLoop?.Invoke();

             if ( LoopMode == LoopType.YoYo )
             {
                IsReversed = !IsReversed;
                // Snap Elapsed to the exact boundaries so the next frame increments cleanly
                Elapsed = IsReversed ? Duration : 0f;
             }
             else
             {
                Elapsed = 0f;
             }
          }
          else
          {
             IsFinished = true;
             _onComplete?.Invoke();
             
             // Auto-remove from manager if active
             if ( TweenManager.Current is { } Tweener )
             {
                Tweener.RemoveTween( this );
             }
          }
       }
    }

    // Chaining Method
    public BaseTween SetEase( EaseType ease ) { Ease = ease; return this; }
    public BaseTween SetLoops( int loops, LoopType type = LoopType.Restart )
    {
       Loops = loops;
       LoopMode = type;
       return this;
    }

    public BaseTween OnStart( Action a ) { _onStart = a; return this; }
    public BaseTween OnUpdate( Action<float> a ) 
    { 
	    if ( a == null ) return this;
   
	    _onUpdate = _onUpdate == null ? a : (Action<float>)Delegate.Combine(_onUpdate, a); 
	    return this; 
    }
    public BaseTween OnComplete( Action a ) { _onComplete = a; return this; }
    public BaseTween OnLoop( Action a ) { _onLoop = a; return this; }

    public BaseTween WithCurve( Curve curve )
    {
       TimingFunction = t => curve.Evaluate( t );
       return this;
    }

    // Playback 
    public void Pause() => IsPaused = true;
    public void Play()
    {
       IsPaused = false;
       IsFinished = false;

       if ( TweenManager.Current is { } Tweener )
       {
          Tweener.AddTween( this );
       }
    }
    public void Kill() => IsFinished = true;
    public void Reverse() => IsReversed = !IsReversed;
    public void Reset()
    {
       Elapsed = 0;
       IsFinished = false;
       IsPaused = true;
       _hasStarted = false;
       _loopsDone = 0;
    }

    public void Stop()
    {
       IsFinished = true;
       IsPaused = true;

       if ( TweenManager.Current is { } Tweener )
       {
          Tweener.RemoveTween( this );
       }
    }
}



public enum LoopType
{
    Restart,    // 0 to 1, 0 -> 1
    YoYo,       // 0 to 1 to 0
    Incremental // 0 to 1, then 1 -> 2, then 2 -> 3 etc etc.
}
resync.sbtween / SbTween/Examples/Doo/SbeDooTest.cs
Game library
using Sandbox;
using SbTween;

namespace SbTween.Examples;

public sealed class SbeDooTest : Component
{
	[Property] public Doo DooTweening;

	protected override void OnStart()
	{
		RunDoo( DooTweening );
	}
}
resync.sbtween / SbTween/Extensions/MiscExtensions.cs
Game library
using Sandbox;

namespace SbTween;

public static class MiscExtensions
{
	// DECALS
	public static BaseTween TweenLifeTime( this Decal self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.LifeTime.ConstantValue; 
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.LifeTime = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenSize( this Decal self, Vector2 target, float duration )
    {
       if ( !self.IsValid() ) return null;
       Vector2 start = self.Size;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Size = Vector2.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenScale( this Decal self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.Scale.ConstantValue;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Scale = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenRotation( this Decal self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.Rotation.ConstantValue;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Rotation = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenDepth( this Decal self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.Depth;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Depth = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenParallax( this Decal self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.Parallax.ConstantValue;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Parallax = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenColorTint( this Decal self, Color target, float duration )
    {
       if ( !self.IsValid() ) return null;
       Color start = self.ColorTint.ConstantValue;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.ColorTint = Color.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenColorMix( this Decal self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.ColorMix.ConstantValue;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.ColorMix = MathX.Lerp( start, target, p ) ) );
    }
    
    // CUBEMAP FOG 

    public static BaseTween TweenBlur( this CubemapFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.Blur;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Blur = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenStartDistance( this CubemapFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.StartDistance;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.StartDistance = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenEndDistance( this CubemapFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.EndDistance;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.EndDistance = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenFalloffExponent( this CubemapFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.FalloffExponent;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.FalloffExponent = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenHeightWidth( this CubemapFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.HeightWidth;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.HeightWidth = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenHeightStart( this CubemapFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.HeightStart;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.HeightStart = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenHeightExponent( this CubemapFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.HeightExponent;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.HeightExponent = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenTint( this CubemapFog self, Color target, float duration )
    {
       if ( !self.IsValid() ) return null;
       Color start = self.Tint;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Tint = Color.Lerp( start, target, p ) ) );
    }
    
    // GRADIENT FOG

    public static BaseTween TweenStartDistance( this GradientFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.StartDistance;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.StartDistance = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenEndDistance( this GradientFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.EndDistance;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.EndDistance = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenFalloffExponent( this GradientFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.FalloffExponent;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.FalloffExponent = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenColor( this GradientFog self, Color target, float duration )
    {
       if ( !self.IsValid() ) return null;
       Color start = self.Color;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Color = Color.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenHeight( this GradientFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.Height;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.Height = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenVerticalFalloffExponent( this GradientFog self, float target, float duration )
    {
       if ( !self.IsValid() ) return null;
       float start = self.VerticalFalloffExponent;
       return TweenManager.Instance.AddTween( new BaseTween( duration )
          .OnUpdate( p => self.VerticalFalloffExponent = MathX.Lerp( start, target, p ) ) );
    }
    
    // VOLUMETRIC FOG

    public static BaseTween TweenStrength( this VolumetricFogVolume self, float target, float duration )
    {
	    if ( !self.IsValid() ) return null;
	    float start = self.Strength;
	    return TweenManager.Instance.AddTween( new BaseTween( duration )
		    .OnUpdate( p => self.Strength = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenFalloffExponent( this VolumetricFogVolume self, float target, float duration )
    {
	    if ( !self.IsValid() ) return null;
	    float start = self.FalloffExponent;
	    return TweenManager.Instance.AddTween( new BaseTween( duration )
		    .OnUpdate( p => self.FalloffExponent = MathX.Lerp( start, target, p ) ) );
    }

    public static BaseTween TweenColor( this VolumetricFogVolume self, Color target, float duration )
    {
	    if ( !self.IsValid() ) return null;
	    Color start = self.Color;
	    return TweenManager.Instance.AddTween( new BaseTween( duration )
		    .OnUpdate( p => self.Color = Color.Lerp( start, target, p ) ) );
    }
}
resync.sbtween / Code/SbTween/Core/Convertors/EaseTypeConverter.cs
Game library
#nullable enable
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace SbTween;

public class EaseTypeConverter : JsonConverter<EaseType>
{
    public override EaseType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Number)
        {
            long num = reader.GetInt64();
            return (EaseType)num;
        }
        else if (reader.TokenType == JsonTokenType.String)
        {
            string? str = reader.GetString();
            if (!string.IsNullOrEmpty(str) && Enum.TryParse<EaseType>(str, true, out var result))
	            return result;
        }

        return EaseType.Linear;
    }

    public override void Write(Utf8JsonWriter writer, EaseType value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}
Debug: View Raw JSON Response
{
    "TotalCount": 86,
    "Files": [
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Extensions/LightExtensions.cs",
            "FileName": "LightExtensions.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing Sandbox.UI;\r\nusing System;\r\n\r\nnamespace SbTween;\r\n\r\npublic static class LightExtensions\r\n{\r\n\r\n\tpublic static BaseTween TweenLightColor( this Light Light, Color target, float duration )\r\n\t{\r\n\t\tColor start = Light.LightColor;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = Light.GameObject;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => start = Light.LightColor )\r\n\t\t\t.OnUpdate( p => Light.LightColor = Color.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenRadius( this SpotLight light, float target, float duration )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat start = light.Radius;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = light.Radius )\r\n\t\t\t.OnUpdate( p => light.Radius = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenConeOuter( this SpotLight light, float target, float duration )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat start = light.ConeOuter;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = light.ConeOuter )\r\n\t\t\t.OnUpdate( p => light.ConeOuter = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenInnerCone( this SpotLight light, float target, float duration )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat start = light.ConeInner;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = light.ConeInner )\r\n\t\t\t.OnUpdate( p => light.ConeInner = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenAttenuation( this PointLight light, float target, float duration )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat start = light.Attenuation;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = light.Attenuation )\r\n\t\t\t.OnUpdate( p => light.Attenuation = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenRadius( this PointLight light, float target, float duration )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat start = light.Radius;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = light.Radius )\r\n\t\t\t.OnUpdate( p => light.Radius = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenAttenuation( this SpotLight light, float target, float duration )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat start = light.Attenuation;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = light.Attenuation )\r\n\t\t\t.OnUpdate( p => light.Attenuation = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t//FLICKERING LIGHT\r\n\tpublic static BaseTween TweenFlickerLight( this PointLight light, float minBrightness, float maxBrightness, float duration, float speed = 10f )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat time = 0f;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnUpdate( _ =>\r\n\t\t\t{\r\n\t\t\t\ttime += Time.Delta * speed;\r\n\t\t\t\tfloat noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );\r\n\t\t\t\tfloat t = (noise + 1f) * 0.5f;\r\n\t\t\t\tlight.Attenuation = MathX.Lerp( minBrightness, maxBrightness, t );\r\n\t\t\t} ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenFlickerLight( this SpotLight light, float minBrightness, float maxBrightness, float duration, float speed = 10f )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat time = 0f;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnUpdate( _ =>\r\n\t\t\t{\r\n\t\t\t\ttime += Time.Delta * speed;\r\n\t\t\t\tfloat noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );\r\n\t\t\t\tfloat t = (noise + 1f) * 0.5f;\r\n\t\t\t\tlight.Attenuation = MathX.Lerp( minBrightness, maxBrightness, t );\r\n\t\t\t} ) );\r\n\t}\r\n\r\n\t//FLICKERING Color\r\n\r\n\tpublic static BaseTween TweenFlickerColor( this PointLight light, Color colorA, Color colorB, float duration, float speed = 10f )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat time = 0f;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnUpdate( _ =>\r\n\t\t\t{\r\n\t\t\t\ttime += Time.Delta * speed;\r\n\t\t\t\tfloat noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );\r\n\t\t\t\tfloat t = (noise + 1f) * 0.5f;\r\n\t\t\t\tlight.LightColor = Color.Lerp( colorA, colorB, t );\r\n\t\t\t} ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenFlickerColor( this SpotLight light, Color colorA, Color colorB, float duration, float speed = 10f )\r\n\t{\r\n\t\tif ( !light.IsValid() ) return null;\r\n\r\n\t\tfloat time = 0f;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnUpdate( _ =>\r\n\t\t\t{\r\n\t\t\t\ttime += Time.Delta * speed;\r\n\t\t\t\tfloat noise = MathF.Sin( time * 1.3f ) * MathF.Sin( time * 2.7f ) * MathF.Sin( time * 0.9f );\r\n\t\t\t\tfloat t = (noise + 1f) * 0.5f;\r\n\t\t\t\tlight.LightColor = Color.Lerp( colorA, colorB, t );\r\n\t\t\t} ) );\r\n\t}\r\n\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Extensions/AudioExtensions.cs",
            "FileName": "AudioExtensions.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing System;\r\n\r\nnamespace SbTween;\r\n\r\npublic static class AudioExtensions\r\n{\r\n\tpublic static BaseTween TweenVolume( this SoundPointComponent sound, float targetVolume, float duration )\r\n\t{\r\n\t\tfloat startVolume = sound.Volume;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = sound.GameObject;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => startVolume = sound.Volume )\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !sound.IsValid() ) return;\r\n\t\t\t\tsound.Volume = MathX.Lerp( startVolume, targetVolume, p );\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\t\r\n\tpublic static BaseTween TweenPitch( this SoundPointComponent sound, float targetPitch, float duration )\r\n\t{\r\n\t\tfloat startPitch = sound.Pitch;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = sound.GameObject;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => startPitch = sound.Pitch )\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !sound.IsValid() ) return;\r\n\t\t\t\tsound.Pitch = MathX.Lerp( startPitch, targetPitch, p );\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Extensions/MathTweenExtensions.cs",
            "FileName": "MathTweenExtensions.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing System;\r\n\r\nnamespace SbTween;\r\n\r\npublic static class MathTweenExtensions\r\n{\r\n\tpublic static BaseTween TweenInCircle( this GameObject obj, float duration, Vector3 axis, float range, float speed, bool snapping = false )\r\n\t{\r\n\t\tVector3 centerPos = obj.WorldPosition;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\r\n\t\tVector3 normal = axis.Normal;\r\n\t\tVector3 v1 = Vector3.Cross( normal, MathF.Abs( normal.z ) < 0.9f ? Vector3.Up : Vector3.Forward ).Normal;\r\n\t\tVector3 v2 = Vector3.Cross( normal, v1 ).Normal;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !obj.IsValid() ) return;\r\n\r\n\t\t\t\tfloat angleDegrees = p * 360f * speed;\r\n\t\t\t\tfloat angleRadians = angleDegrees * (MathF.PI / 180f);\r\n\r\n\t\t\t\tfloat cos = MathF.Cos( angleRadians ) * range;\r\n\t\t\t\tfloat sin = MathF.Sin( angleRadians ) * range;\r\n\r\n\t\t\t\tVector3 rotatedOffset = (v1 * cos) + (v2 * sin);\r\n\t\t\t\tobj.WorldPosition = centerPos + rotatedOffset;\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static BaseTween TweenSpiral( this GameObject obj, float duration, Vector3 axis, float speed, float frequency )\r\n\t{\r\n\t\tVector3 startPos = obj.WorldPosition;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => startPos = obj.WorldPosition )\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !obj.IsValid() ) return;\r\n\r\n\t\t\t\tfloat angle = p * MathF.PI * 2f * frequency;\r\n\r\n\t\t\t\tfloat currentRadius = p * speed;\r\n\r\n\t\t\t\tfloat x = MathF.Cos( angle ) * currentRadius;\r\n\t\t\t\tfloat y = MathF.Sin( angle ) * currentRadius;\r\n\r\n\t\t\t\tVector3 axisOffset = axis * p;\r\n\r\n\t\t\t\tVector3 circleOffset = new Vector3( x, y, 0 );\r\n\r\n\t\t\t\tobj.WorldPosition = startPos + axisOffset + circleOffset;\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\t\r\n\tpublic static BaseTween TweenPunchFloat( this GameObject obj, float v, float amplitude, float duration, int vibrations = 5, float elasticity = 1f, Action<float> setter = null )\r\n\t{\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !obj.IsValid() ) return;\r\n\t\t\t\tif ( p >= 1.0f )\r\n\t\t\t\t{\r\n\t\t\t\t\tsetter?.Invoke( v );\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tfloat decay = MathF.Pow( 1f - p, elasticity * 3f );\r\n\r\n\t\t\t\tfloat omega = vibrations * MathF.PI * 2f;\r\n\t\t\t\tfloat oscillation = MathF.Sin( p * omega );\r\n\r\n\t\t\t\tfloat currentOffset = amplitude * oscillation * decay;\r\n\r\n\t\t\t\tsetter?.Invoke( v + currentOffset );\r\n\t\t\t} )\r\n\t\t\t.OnComplete( () => setter?.Invoke( v ) )\r\n\t\t);\r\n\t}\r\n\t\r\n\tpublic static BaseTween TweenShakeFloat( this GameObject obj, float baseline, float strength, float duration, Action<float> setter = null )\r\n\t{\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !obj.IsValid() ) return;\r\n\t\t\t\tif ( p >= 1.0f )\r\n\t\t\t\t{\r\n\t\t\t\t\tsetter?.Invoke( baseline );\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfloat currentStrength = strength * (1.0f - p);\r\n             \r\n\t\t\t\tfloat randomOffset = Game.Random.Float( -currentStrength, currentStrength );\r\n\r\n\t\t\t\tsetter?.Invoke( baseline + randomOffset );\r\n\t\t\t} )\r\n\t\t\t.OnComplete( () => setter?.Invoke( baseline ) )\r\n\t\t);\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": ".obj/__compiler_extra.cs",
            "FileName": "__compiler_extra.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "global using static Sandbox.Internal.GlobalGameNamespace;\r\nglobal using Microsoft.AspNetCore.Components;\r\nglobal using Microsoft.AspNetCore.Components.Rendering;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \"AddonTitle\", \"SbTween\" )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \"AddonIdent\", \"sbtween\" )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \"OrgIdent\", \"resync\" )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \"Ident\", \"resync.sbtween\" )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \"CompileTime\", \"6/17/2026 7:47:49 AM\" )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \"EngineVersion\", \"25\" )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \"EngineMinorVersion\", \"1\" )]\r\n\r\n[assembly: System.Runtime.Versioning.TargetFramework( \".NETCoreApp,Version=v9.0\", FrameworkDisplayName = \".NET 9.0\" )]\r\n[assembly: global::System.Reflection.AssemblyVersion(\"0.0.146.0\")]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\"0.0.146.0\")]"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Core/TweenPlayer.cs",
            "FileName": "TweenPlayer.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing System;\r\n\r\nnamespace SbTween;\r\n\r\n[Title( \"SbTween Player\" )]\r\n[Category( \"Tweening\" )]\r\n[Icon( \"play_arrow\" )]\r\npublic sealed class SbTweenPlayer : Component, Component.ExecuteInEditor\r\n{\r\n    // BUTTONS\r\n    [Group( \"Buttons\" ), Button( \"Play\", \"play_arrow\" )]\r\n    public void PlayButton() => Play();\r\n\r\n    [Group( \"Buttons\" ), Button( \"Stop\", \"stop\" )]\r\n    public void StopButton() => Stop();\r\n\r\n    // SETUP\r\n    [Property, Group( \"Setup\" )] public TweenType Type { get; set; } = TweenType.Move;\r\n\r\n    // VECTORS & TRANSFORMS\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsVector ), true )] public Vector3 From { get; set; }\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsVector ), true )] public Vector3 To { get; set; }\r\n\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsVector2D ), true )] public Vector2 From2D { get; set; }\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsVector2D ), true )] public Vector2 To2D { get; set; }\r\n\r\n    // RENDER / TINT\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( Type ), TweenType.Tint )] public Color ColorFrom { get; set; } = Color.White;\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( Type ), TweenType.Tint )] public Color ColorTo { get; set; } = Color.White;\r\n\r\n    // SHAKE JUICE\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsShake ), true )] public float Strength { get; set; } = 1.0f;\r\n\r\n    // MATH / PROCEDURAL\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public Vector3 Axis { get; set; } = Vector3.Up * 100f;\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public float Speed { get; set; } = 1f;\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public float Frequency { get; set; } = 5f;\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( IsCircularOrSpiral ), true )] public float Range { get; set; } = 5f;\r\n\r\n    // IN CIRCLE SNAPPING\r\n    [Property, Group( \"Setup\" ), ShowIf( nameof( Type ), TweenType.InCircle )] public bool Snapping { get; set; } = false;\r\n\r\n    // SETTINGS\r\n    [Property, Group( \"Settings\" )] public float Duration { get; set; } = 1.0f;\r\n    [Property, Group( \"Settings\" )] public float Delay { get; set; } = 0.0f;\r\n\r\n    [Property, Group( \"Settings\" )]\r\n    [Title( \"Loops (0 = Once, -1 = Infinite)\" )]\r\n    public int Loops { get; set; } = 0;\r\n\r\n    [Property, Group( \"Settings\" )] public LoopType LoopMode { get; set; } = LoopType.Restart;\r\n    [Property, Group( \"Settings\" )] public EaseType Easing { get; set; } = EaseType.Linear;\r\n    [Property, Group( \"Settings\" )] public bool AutoPlay { get; set; } = true;\r\n    [Property, Group( \"Settings\" )] public string TweenID { get; set; } = \"\";\r\n\r\n    [Property, Group( \"Settings\" )] public bool UseCurve { get; set; } = false;\r\n    [Property, Group( \"Settings\" ), ShowIf( nameof( UseCurve ), true )] public Curve TweenCurve { get; set; } = Curve.Linear;\r\n\r\n    // EVENTS\r\n    [Property, Group( \"Events\" )] public Action _OnStart { get; set; }\r\n    [Property, Group( \"Events\" )] public Action _OnComplete { get; set; }\r\n    [Property, Group( \"Debug\" )] public bool GizmoDebug { get; set; } = true;\r\n\r\n    // REFLECTION LOOKUPS FOR EDITOR SHOWIFs\r\n    [Hide] public bool IsCircularOrSpiral => Type == TweenType.InCircle || Type == TweenType.Spiral;\r\n    [Hide] public bool IsShake => Type == TweenType.ShakeScale || Type == TweenType.ShakeLocation || Type == TweenType.ShakeRotation;\r\n    [Hide] public bool IsVector => Type == TweenType.Move || Type == TweenType.MoveLocal || Type == TweenType.Rotate || Type == TweenType.RotateLocal || Type == TweenType.Scale;\r\n    [Hide] public bool IsVector2D => Type == TweenType.Move2D || Type == TweenType.MoveLocal2D;\r\n\r\n    private BaseTween _currentTween;\r\n    private TweenSnapshot _initialState;\r\n    private int _completedLoops = 0;\r\n    private bool _isReversing = false;\r\n\r\n    private Vector3 _incrementalFrom;\r\n    private Vector3 _incrementalTo;\r\n    private Vector2 _incrementalFrom2D;\r\n    private Vector2 _incrementalTo2D;\r\n    private bool _isIncrementalStarted = false;\r\n\r\n    protected override void OnStart()\r\n    {\r\n       if ( Game.IsPlaying && AutoPlay )\r\n       {\r\n          Play();\r\n       }\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n       if ( Game.IsPlaying ) return;\r\n       if ( _currentTween == null ) return;\r\n\r\n       if ( !_currentTween.IsFinished && !_currentTween.IsPaused )\r\n       {\r\n          GameObject.Transform.Local = GameObject.Transform.Local;\r\n       }\r\n    }\r\n\r\n    protected override void DrawGizmos()\r\n    {\r\n       if ( !GizmoDebug || !Gizmo.IsSelected ) return;\r\n       if ( Type != TweenType.Move && Type != TweenType.MoveLocal ) return;\r\n\r\n       using ( Gizmo.Scope() )\r\n       {\r\n          Gizmo.Transform = new Transform().WithPosition( 0 ).WithRotation( Rotation.Identity ).WithScale( 1 );\r\n          float sphereRadius = 6f;\r\n\r\n          Gizmo.Draw.Color = Color.Green;\r\n          Gizmo.Draw.SolidSphere( From, sphereRadius );\r\n          Gizmo.Draw.Text( \"FROM\", new Transform( From + Vector3.Up * 10f ) );\r\n\r\n          Gizmo.Draw.Color = Color.Red;\r\n          Gizmo.Draw.SolidSphere( To, sphereRadius );\r\n          Gizmo.Draw.Text( \"TO\", new Transform( To + Vector3.Up * 10f ) );\r\n\r\n          Gizmo.Draw.Color = Color.Yellow.WithAlpha( 0.4f );\r\n          Gizmo.Draw.Line( From, To );\r\n\r\n          var mid = (From + To) / 2f;\r\n          var dir = (To - From).Normal;\r\n          if ( dir.Length > 0.1f )\r\n          {\r\n             Gizmo.Draw.Arrow( mid, mid + dir * 15f, 10f, 5f );\r\n          }\r\n       }\r\n    }\r\n\r\n    public void Play()\r\n    {\r\n       StopInternal();\r\n\r\n       if ( _initialState == null )\r\n       {\r\n          _initialState = new TweenSnapshot();\r\n          _initialState.Capture( GameObject );\r\n       }\r\n\r\n       if ( LoopMode == LoopType.Incremental && !IsCircularOrSpiral )\r\n       {\r\n          if ( !_isIncrementalStarted )\r\n          {\r\n             _incrementalFrom = From;\r\n             _incrementalTo = To;\r\n             _incrementalFrom2D = From2D;\r\n             _incrementalTo2D = To2D;\r\n             _isIncrementalStarted = true;\r\n          }\r\n       }\r\n       else\r\n       {\r\n          _isIncrementalStarted = false;\r\n       }\r\n\r\n       if ( !IsCircularOrSpiral && LoopMode != LoopType.Incremental )\r\n       {\r\n          ResetToState( !_isReversing );\r\n       }\r\n\r\n       GameObject.Transform.ClearInterpolation();\r\n\r\n       _currentTween = CreateTweenInstance( _isReversing );\r\n       if ( _currentTween == null ) return;\r\n\r\n       _currentTween\r\n          .SetDelay( Delay )\r\n          .OnStart( () => _OnStart?.Invoke() );\r\n\r\n       if ( UseCurve ) \r\n          _currentTween.WithCurve( TweenCurve );\r\n       else \r\n          _currentTween.SetEase( Easing );\r\n\r\n       if ( !string.IsNullOrEmpty( TweenID ) )\r\n       {\r\n          _currentTween.SetId( TweenID );\r\n       }\r\n\r\n       if ( LoopMode == LoopType.Incremental && !IsCircularOrSpiral )\r\n       {\r\n          _currentTween.OnComplete( () => HandleCompletion() );\r\n       }\r\n       else\r\n       {\r\n          _currentTween.SetLoops( Loops, LoopMode );\r\n          _currentTween.OnComplete( () => _OnComplete?.Invoke() );\r\n       }\r\n\r\n       _currentTween.Play();\r\n    }\r\n\r\n    public void Stop()\r\n    {\r\n       StopInternal();\r\n       _completedLoops = 0;\r\n       _isReversing = false;\r\n       _isIncrementalStarted = false;\r\n\r\n       if ( _initialState != null )\r\n       {\r\n          _initialState.Restore();\r\n       }\r\n       _initialState = null;\r\n    }\r\n\r\n    private void StopInternal()\r\n    {\r\n       _currentTween?.Stop();\r\n       _currentTween = null;\r\n    }\r\n\r\n    private void HandleCompletion()\r\n    {\r\n       _OnComplete?.Invoke();\r\n       bool hasMoreLoops = Loops == -1 || _completedLoops < Loops;\r\n\r\n       switch ( LoopMode )\r\n       {\r\n          case LoopType.YoYo:\r\n             _isReversing = !_isReversing;\r\n             if ( !_isReversing && Loops != -1 ) _completedLoops++;\r\n\r\n             if ( hasMoreLoops || _isReversing )\r\n             {\r\n                Play();\r\n             }\r\n             break;\r\n\r\n          case LoopType.Incremental:\r\n             if ( hasMoreLoops )\r\n             {\r\n                if ( Loops != -1 ) _completedLoops++;\r\n                if ( IsVector )\r\n                {\r\n                   var delta = _incrementalTo - _incrementalFrom;\r\n                   _incrementalFrom = _incrementalTo;\r\n                   _incrementalTo += delta;\r\n                }\r\n                else if ( IsVector2D )\r\n                {\r\n                   var delta2D = _incrementalTo2D - _incrementalFrom2D;\r\n                   _incrementalFrom2D = _incrementalTo2D;\r\n                   _incrementalTo2D += delta2D;\r\n                }\r\n                _isReversing = false;\r\n                Play();\r\n             }\r\n             break;\r\n\r\n          case LoopType.Restart:\r\n             if ( hasMoreLoops )\r\n             {\r\n                if ( Loops != -1 ) _completedLoops++;\r\n                _isReversing = false;\r\n                Play();\r\n             }\r\n             break;\r\n       }\r\n    }\r\n\r\n    private void ResetToState( bool useFrom )\r\n    {\r\n       if ( Type == TweenType.Tint )\r\n       {\r\n          var mr = Components.Get<ModelRenderer>();\r\n          if ( mr.IsValid() ) mr.Tint = useFrom ? ColorFrom : ColorTo;\r\n       }\r\n       else if ( IsVector2D )\r\n       {\r\n          var val2D = useFrom ? From2D : To2D;\r\n          switch ( Type )\r\n          {\r\n             case TweenType.Move2D: \r\n                GameObject.WorldPosition = new Vector3( val2D.x, val2D.y, GameObject.WorldPosition.z ); \r\n                break;\r\n             case TweenType.MoveLocal2D: \r\n                GameObject.LocalPosition = new Vector3( val2D.x, val2D.y, GameObject.LocalPosition.z ); \r\n                break;\r\n          }\r\n       }\r\n       else\r\n       {\r\n          var val = useFrom ? From : To;\r\n          switch ( Type )\r\n          {\r\n             case TweenType.Move: GameObject.WorldPosition = val; break;\r\n             case TweenType.MoveLocal: GameObject.LocalPosition = val; break;\r\n             case TweenType.Scale: GameObject.LocalScale = val; break;\r\n             case TweenType.Rotate: GameObject.WorldRotation = Rotation.From( val.x, val.y, val.z ); break;\r\n             case TweenType.RotateLocal: GameObject.LocalRotation = Rotation.From( val.x, val.y, val.z ); break;\r\n          }\r\n       }\r\n    }\r\n\r\n    private BaseTween CreateTweenInstance( bool reverse )\r\n    {\r\n       // Calculate explicit dimensional targets contextually\r\n       Vector3 startVal = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalFrom : From;\r\n       Vector3 endVal = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalTo : To;\r\n       Vector3 targetVal = reverse ? startVal : endVal;\r\n\r\n       Vector2 startVal2D = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalFrom2D : From2D;\r\n       Vector2 endVal2D = (LoopMode == LoopType.Incremental && _isIncrementalStarted) ? _incrementalTo2D : To2D;\r\n       Vector2 targetVal2D = reverse ? startVal2D : endVal2D;\r\n\r\n       Color targetColor = reverse ? ColorFrom : ColorTo;\r\n\r\n       var t = Type switch\r\n       {\r\n          TweenType.Move => GameObject.TweenMove( targetVal, Duration ),\r\n          TweenType.MoveLocal => GameObject.TweenMoveLocal( targetVal, Duration ),\r\n          TweenType.Rotate => GameObject.TweenRotate( Rotation.From( targetVal.x, targetVal.y, targetVal.z ), Duration ),\r\n          TweenType.RotateLocal => GameObject.TweenRotateLocal( Rotation.From( targetVal.x, targetVal.y, targetVal.z ), Duration ),\r\n          TweenType.Scale => GameObject.TweenScale( targetVal, Duration ),\r\n          TweenType.Move2D => GameObject.TweenMove2D( targetVal2D, Duration ),\r\n          TweenType.MoveLocal2D => GameObject.TweenMoveLocal2D( targetVal2D, Duration ),\r\n          \r\n          TweenType.Tint => Components.Get<ModelRenderer>()?.TweenTint( targetColor, Duration ),\r\n\r\n          TweenType.ShakeLocation => GameObject.TweenShakeLocation( Duration, Strength ),\r\n          TweenType.ShakeRotation => GameObject.TweenShakeRotation( Duration, Strength ),\r\n          TweenType.ShakeScale => GameObject.TweenShakeScale( Duration, Strength ),\r\n\r\n          TweenType.InCircle => GameObject.TweenInCircle( Duration, Axis, Range, Speed, Snapping ),\r\n          TweenType.Spiral => GameObject.TweenSpiral( Duration, Axis, Speed, Frequency ),\r\n\r\n          _ => null\r\n       };\r\n\r\n       if ( t != null )\r\n       {\r\n          t.Target = this.GameObject;\r\n          t.LoopMode = LoopMode;\r\n       }\r\n\r\n       return t;\r\n    }\r\n}\r\n\r\npublic enum TweenType\r\n{\r\n    Move,\r\n    MoveLocal,\r\n    Rotate,\r\n    RotateLocal,\r\n    Scale,\r\n    Move2D,\r\n    MoveLocal2D,\r\n    Tint,\r\n    ShakeLocation,\r\n    ShakeRotation, \r\n    ShakeScale,\r\n    Spiral,\r\n    InCircle\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Examples/SBECubeTL.cs",
            "FileName": "SBECubeTL.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing SbTween;\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class SBECubeTL : Component\r\n{\r\n\t[Property] public Vector3 vectorUP;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tthis.TweenMove( vectorUP, 3 ).SetEase( EaseType.Linear ).SetLoops(-1, LoopType.YoYo ).Play();\r\n\t}\r\n\t\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Extensions/CameraExtensions.cs",
            "FileName": "CameraExtensions.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\n\r\nnamespace SbTween;\r\n\r\npublic static class CameraExtensions\r\n{\r\n\tpublic static BaseTween TweenFieldOfView( this CameraComponent self, float to, float duration )\r\n\t{\r\n\t\tfloat from = self.FieldOfView;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = self.GameObject;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !self.IsValid() ) return;\r\n\t\t\t\tself.FieldOfView = from.LerpTo( to, p );\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\t\r\n\tpublic static BaseTween TweenZNear( this CameraComponent self, float to, float duration )\r\n\t{\r\n\t\tfloat from = self.ZNear;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = self.GameObject;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !self.IsValid() ) return;\r\n\t\t\t\tself.ZNear = from.LerpTo( to, p );\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static BaseTween TweenZFar( this CameraComponent self, float to, float duration )\r\n\t{\r\n\t\tfloat from = self.ZFar;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = self.GameObject;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !self.IsValid() ) return;\r\n\t\t\t\tself.ZFar = from.LerpTo( to, p );\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static BaseTween TweenBackgroundColor( this CameraComponent self, Color to, float duration )\r\n\t{\r\n\t\tColor from = self.BackgroundColor;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = self.GameObject;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !self.IsValid() ) return;\r\n\t\t\t\tself.BackgroundColor = Color.Lerp( from, to, p );\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n\r\n\tpublic static BaseTween TweenOrthoHeight( this CameraComponent self, float to, float duration )\r\n\t{\r\n\t\tfloat from = self.OrthographicHeight;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = self.GameObject;\r\n\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p =>\r\n\t\t\t{\r\n\t\t\t\tif ( !self.IsValid() ) return;\r\n\t\t\t\tself.OrthographicHeight = from.LerpTo( to, p );\r\n\t\t\t} )\r\n\t\t);\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Examples/ActionGraph/SbeActionGraphTest.cs",
            "FileName": "SbeActionGraphTest.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using System;\r\nusing Sandbox;\r\nusing SbTween;\r\n\r\nnamespace SbTween.Examples;\r\n\r\n\r\npublic sealed class SbeActionGraphTest : Component\r\n{\r\n\t[Property] public Action actionTest;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tactionTest.Invoke();\r\n\t}\r\n\r\n\tpublic void RestartAction()\r\n\t{\r\n\t\tactionTest.Invoke();\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Examples/SbeCubeSpiral.cs",
            "FileName": "SbeCubeSpiral.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class SbeCubeSpiral : Component\r\n{\r\n\t[Property] public Vector3 axis;\r\n\t[Property] public float speed;\r\n\t[Property] public float frequency;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tGameObject.TweenSpiral( 4, axis, speed, frequency ).SetLoops(-1, LoopType.YoYo ).Play();\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Examples/SbeTRS.cs",
            "FileName": "SbeTRS.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing SbTween;\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class SbeTRS : Component\r\n{\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tthis.TweenShakeRotation( 0.6f, 5 ).SetLoops( -1, LoopType.YoYo );\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Extensions/PostProcessingExtensions.cs",
            "FileName": "PostProcessingExtensions.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing System;\r\n\r\nnamespace SbTween;\r\n\r\npublic static class PostProcessingExtensions\r\n{\r\n\t// FilmGrain\r\n\r\n\tpublic static BaseTween TweenIntensity( this FilmGrain pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Intensity;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Intensity )\r\n\t\t\t.OnUpdate( p => pp.Intensity = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenResponse( this FilmGrain pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Response;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Response )\r\n\t\t\t.OnUpdate( p => pp.Response = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// Bloom\r\n\r\n\tpublic static BaseTween TweenStrength( this Bloom pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Strength;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Strength )\r\n\t\t\t.OnUpdate( p => pp.Strength = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenThreshold( this Bloom pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Threshold;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Threshold )\r\n\t\t\t.OnUpdate( p => pp.Threshold = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenGamma( this Bloom pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Gamma;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Gamma )\r\n\t\t\t.OnUpdate( p => pp.Gamma = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenTint( this Bloom pp, Color target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tColor start = pp.Tint;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Tint )\r\n\t\t\t.OnUpdate( p => pp.Tint = Color.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// Blur\r\n\r\n\tpublic static BaseTween TweenSize( this Blur pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Size;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Size )\r\n\t\t\t.OnUpdate( p => pp.Size = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// ChromaticAberration \r\n\r\n\tpublic static BaseTween TweenScale( this ChromaticAberration pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Scale;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Scale )\r\n\t\t\t.OnUpdate( p => pp.Scale = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenOffset( this ChromaticAberration pp, Vector3 target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tVector3 start = pp.Offset;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Offset )\r\n\t\t\t.OnUpdate( p => pp.Offset = Vector3.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// ColorAdjustments\r\n\r\n\tpublic static BaseTween TweenBlend( this ColorAdjustments pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Blend;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Blend )\r\n\t\t\t.OnUpdate( p => pp.Blend = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenSaturation( this ColorAdjustments pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Saturation;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Saturation )\r\n\t\t\t.OnUpdate( p => pp.Saturation = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenHueRotate( this ColorAdjustments pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.HueRotate;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.HueRotate )\r\n\t\t\t.OnUpdate( p => pp.HueRotate = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenBrightness( this ColorAdjustments pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Brightness;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Brightness )\r\n\t\t\t.OnUpdate( p => pp.Brightness = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenContrast( this ColorAdjustments pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Contrast;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Contrast )\r\n\t\t\t.OnUpdate( p => pp.Contrast = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// Vignette\r\n\r\n\tpublic static BaseTween TweenIntensity( this Vignette pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Intensity;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Intensity )\r\n\t\t\t.OnUpdate( p => pp.Intensity = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenSmoothness( this Vignette pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Smoothness;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Smoothness )\r\n\t\t\t.OnUpdate( p => pp.Smoothness = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenRoundness( this Vignette pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Roundness;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Roundness )\r\n\t\t\t.OnUpdate( p => pp.Roundness = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenColor( this Vignette pp, Color target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tColor start = pp.Color;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Color )\r\n\t\t\t.OnUpdate( p => pp.Color = Color.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenCenter( this Vignette pp, Vector2 target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tVector2 start = pp.Center;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Center )\r\n\t\t\t.OnUpdate( p => pp.Center = Vector2.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// DepthOfField\r\n\r\n\tpublic static BaseTween TweenBlurSize( this DepthOfField pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.BlurSize;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.BlurSize )\r\n\t\t\t.OnUpdate( p => pp.BlurSize = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenFocalDistance( this DepthOfField pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.FocalDistance;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.FocalDistance )\r\n\t\t\t.OnUpdate( p => pp.FocalDistance = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenFocusRange( this DepthOfField pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.FocusRange;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.FocusRange )\r\n\t\t\t.OnUpdate( p => pp.FocusRange = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// Sharpen \r\n\r\n\tpublic static BaseTween TweenSharpen( this Sharpen pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Scale;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Scale )\r\n\t\t\t.OnUpdate( p => pp.Scale = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\tpublic static BaseTween TweenTexelSize( this Sharpen pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.TexelSize;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.TexelSize )\r\n\t\t\t.OnUpdate( p => pp.TexelSize = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// Pixelate\r\n\r\n\tpublic static BaseTween TweenScale( this Pixelate pp, float target, float duration )\r\n\t{\r\n\t\tif ( !pp.IsValid() ) return null;\r\n\t\tfloat start = pp.Scale;\r\n\t\treturn TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t\t.OnStart( () => start = pp.Scale )\r\n\t\t\t.OnUpdate( p => pp.Scale = MathX.Lerp( start, target, p ) ) );\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Core/TweenExtensions.cs",
            "FileName": "TweenExtensions.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing Sandbox.UI;\r\nusing System;\r\n\r\nnamespace SbTween;\r\n\r\npublic static class TweenExtensions\r\n{\r\n\t// Shortcuts (! this is really important otherwise you can't hookup tweeners to components)\r\n\r\n\r\n\t// TIMELINE\r\n\tpublic static void Pause( this Component self, string id = null )\r\n\t{\r\n\t\tif ( string.IsNullOrEmpty( id ) )\r\n\t\t\tTweenManager.Instance?.Pause( self.GameObject );\r\n\t\telse\r\n\t\t\tTweenManager.Instance?.Pause( id );\r\n\t}\r\n\r\n\tpublic static void Play( this Component self, string id = null )\r\n\t{\r\n\t\tif ( string.IsNullOrEmpty( id ) )\r\n\t\t\tTweenManager.Instance?.Play( self.GameObject );\r\n\t\telse\r\n\t\t\tTweenManager.Instance?.Play( id );\r\n\t}\r\n\r\n\tpublic static void KillTween( this GameObject self, string id )\r\n\t{\r\n\t\tif ( string.IsNullOrEmpty( id ) ) return;\r\n\r\n\t\tTweenManager.Instance?.KillTweenOnObject( self, id );\r\n\t}\r\n\r\n\tpublic static void KillAllTweens( this GameObject self )\r\n\t{\r\n\t\tTweenManager.Instance?.KillAllTweensOnObject( self );\r\n\t}\r\n\r\n\r\n\t// TWEENS\r\n\tpublic static BaseTween TweenMove( this Component self, Vector3 target, float duration ) => self.GameObject.TweenMove( target, duration );\r\n\tpublic static BaseTween TweenMoveLocal( this Component self, Vector3 target, float duration ) => self.GameObject.TweenMoveLocal( target, duration );\r\n\tpublic static BaseTween TweenMove2D( this Component self, Vector2 target, float duration ) => self.GameObject.TweenMove2D( target, duration );\r\n\tpublic static BaseTween TweenMoveLocal2D( this Component self, Vector2 target, float duration ) => self.GameObject.TweenMoveLocal2D( target, duration );\r\n\tpublic static BaseTween TweenRotateLocal( this Component self, Rotation target, float duration ) => self.GameObject.TweenRotateLocal( target, duration );\r\n\tpublic static BaseTween TweenRotate( this Component self, Rotation target, float duration ) => self.GameObject.TweenRotate( target, duration );\r\n\tpublic static BaseTween TweenScale( this Component self, Vector3 target, float duration ) => self.GameObject.TweenScale( target, duration );\r\n\tpublic static BaseTween TweenShakeLocation( this Component self, float duration, float strength = 10f ) => self.GameObject.TweenShakeLocation( duration, strength );\r\n\tpublic static BaseTween TweenShakeRotation( this Component self, float duration, float strength = 5f ) => self.GameObject.TweenShakeRotation( duration, strength );\r\n\tpublic static BaseTween TweenShakeScale( this Component self, float duration, float strength = 0.2f ) => self.GameObject.TweenShakeScale( duration, strength );\r\n\tpublic static BaseTween TweenFloat( this Component self, float start, float end, float duration, Action<float> setter ) => self.GameObject.TweenFloat( start, end, duration, setter );\r\n\r\n\t// 3D VECTOR\r\n\tpublic static BaseTween TweenMove( this GameObject obj, Vector3 target, float duration )\r\n\t{\r\n\t\tVector3 start = obj.WorldPosition;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => start = obj.WorldPosition )\r\n\t\t\t.OnUpdate( p => obj.WorldPosition = Vector3.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenMoveLocal( this GameObject obj, Vector3 target, float duration )\r\n\t{\r\n\t\tVector3 start = obj.LocalPosition;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => start = obj.LocalPosition )\r\n\t\t\t.OnUpdate( p => obj.LocalPosition = Vector3.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// 3D ROTATION\r\n\tpublic static BaseTween TweenRotate( this GameObject obj, Rotation target, float duration )\r\n\t{\r\n\t\tRotation start = obj.WorldRotation;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => start = obj.WorldRotation )\r\n\t\t\t.OnUpdate( p => obj.WorldRotation = Rotation.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenRotateLocal( this GameObject obj, Rotation target, float duration )\r\n\t{\r\n\t\tRotation start = obj.LocalRotation;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => start = obj.LocalRotation )\r\n\t\t\t.OnUpdate( p => obj.LocalRotation = Rotation.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// 3D SCALE\r\n\tpublic static BaseTween TweenScale( this GameObject obj, Vector3 target, float duration )\r\n\t{\r\n\t\tVector3 start = obj.LocalScale;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => start = obj.LocalScale )\r\n\t\t\t.OnUpdate( p => obj.LocalScale = Vector3.Lerp( start, target, p ) ) );\r\n\t}\r\n\t\r\n\t// 2D VECTOR\r\n\tpublic static BaseTween TweenMove2D( this GameObject obj, Vector2 target, float duration )\r\n\t{\r\n\t\tVector2 start = new Vector2( obj.WorldPosition.x, obj.WorldPosition.y );\r\n\t\tfloat originalZ = obj.WorldPosition.z;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => {\r\n\t\t\t\tstart = new Vector2( obj.WorldPosition.x, obj.WorldPosition.y );\r\n\t\t\t\toriginalZ = obj.WorldPosition.z;\r\n\t\t\t} )\r\n\t\t\t.OnUpdate( p => {\r\n\t\t\t\tVector2 current2D = Vector2.Lerp( start, target, p );\r\n\t\t\t\tobj.WorldPosition = new Vector3( current2D.x, current2D.y, originalZ );\r\n\t\t\t} ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenMoveLocal2D( this GameObject obj, Vector2 target, float duration )\r\n\t{\r\n\t\tVector2 start = new Vector2( obj.LocalPosition.x, obj.LocalPosition.y );\r\n\t\tfloat originalZ = obj.LocalPosition.z;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => {\r\n\t\t\t\tstart = new Vector2( obj.LocalPosition.x, obj.LocalPosition.y );\r\n\t\t\t\toriginalZ = obj.LocalPosition.z;\r\n\t\t\t} )\r\n\t\t\t.OnUpdate( p => {\r\n\t\t\t\tVector2 current2D = Vector2.Lerp( start, target, p );\r\n\t\t\t\tobj.LocalPosition = new Vector3( current2D.x, current2D.y, originalZ );\r\n\t\t\t} ) );\r\n\t}\r\n\r\n\t// RENDER\r\n\tpublic static BaseTween TweenTint( this ModelRenderer mr, Color target, float duration )\r\n\t{\r\n\t\tColor start = mr.Tint;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = mr.GameObject;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => start = mr.Tint )\r\n\t\t\t.OnUpdate( p => mr.Tint = Color.Lerp( start, target, p ) ) );\r\n\t}\r\n\r\n\t// FLOAT TWEEN\r\n\tpublic static BaseTween TweenFloat( this GameObject obj, float start, float end, float duration, Action<float> setter )\r\n\t{\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnUpdate( p => setter?.Invoke( MathX.Lerp( start, end, p ) ) ) );\r\n\t}\r\n\r\n\t// SHAKERS\r\n\tpublic static BaseTween TweenShakeLocation( this GameObject obj, float duration, float strength = 10f )\r\n\t{\r\n\t\tVector3 startPos = obj.WorldPosition;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => startPos = obj.WorldPosition )\r\n\t\t\t.OnUpdate( p => {\r\n\t\t\t\tif ( !obj.IsValid() ) return;\r\n\t\t\t\tvar randomDir = new Vector3( Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ) );\r\n\t\t\t\tobj.WorldPosition = startPos + (randomDir * strength * (1 - p));\r\n\t\t\t} )\r\n\t\t\t.OnComplete( () => { if ( obj.IsValid() ) obj.WorldPosition = startPos; } ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenShakeRotation( this GameObject obj, float duration, float strength = 5f )\r\n\t{\r\n\t\tRotation startRot = obj.WorldRotation;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => startRot = obj.WorldRotation )\r\n\t\t\t.OnUpdate( p => {\r\n\t\t\t\tif ( !obj.IsValid() ) return;\r\n\t\t\t\tvar randomAngles = new Angles( Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ) );\r\n\t\t\t\tobj.WorldRotation = startRot * Rotation.From( randomAngles * strength * (1 - p) );\r\n\t\t\t} )\r\n\t\t\t.OnComplete( () => { if ( obj.IsValid() ) obj.WorldRotation = startRot; } ) );\r\n\t}\r\n\r\n\tpublic static BaseTween TweenShakeScale( this GameObject obj, float duration, float strength = 0.2f )\r\n\t{\r\n\t\tVector3 startScale = obj.LocalScale;\r\n\t\tvar tween = new BaseTween( duration );\r\n\t\ttween.Target = obj;\r\n\t\treturn TweenManager.Instance.AddTween( tween\r\n\t\t\t.OnStart( () => startScale = obj.LocalScale )\r\n\t\t\t.OnUpdate( p => {\r\n\t\t\t\tif ( !obj.IsValid() ) return;\r\n\t\t\t\tvar randomScale = new Vector3( Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ), Random.Shared.Float( -1, 1 ) );\r\n\t\t\t\tobj.LocalScale = startScale + (randomScale * strength * (1 - p));\r\n\t\t\t} )\r\n\t\t\t.OnComplete( () => { if ( obj.IsValid() ) obj.LocalScale = startScale; } ) );\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Examples/SbecubeSeq.cs",
            "FileName": "SbecubeSeq.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing SbTween;\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class SbecubeSeq : Component\r\n{\r\n\t[Property] public ModelRenderer MR;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tvar exampleSeq = new TweenSequence()\r\n\t\t\t.Append( this.TweenMove( new Vector3( -257.631989f, -510.453766f, 181.270782f ), 1 ) )\r\n\t\t\t.Append( MR.TweenTint( new Color32( 0, 255, 0, 255 ), 0.5f ) )\r\n\t\t\t.Append( this.TweenMove( new Vector3( -257.631989f, -510.453766f, 37.8219452f ), 0.87f ) )\r\n\t\t\t.Append( this.TweenScale( new Vector3( 0.617f, 0.617f, 0.116f ), 0.5f ) )\r\n\t\t\t.Append( this.TweenScale( new Vector3( 0.617f, 0.617f, 0.617f ), 1 ) )\r\n\t\t\t.Append( MR.TweenTint( new Color32( 0, 255, 255, 255 ), 1 ) ).SetLoops(-1).SetDelay(3);\r\n\r\n\t\texampleSeq.Play();\r\n\t\t\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Examples/SbecubeTR.cs",
            "FileName": "SbecubeTR.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing SbTween;\r\n\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class SbecubeTR : Component\r\n{\r\n\t[Property] public EaseType easingType;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tthis.TweenRotate(Rotation.From(0,180,0), 1).SetEase( easingType ).SetLoops(-1).Play();\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Examples/SbecubeTS.cs",
            "FileName": "SbecubeTS.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing SbTween;\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class SbecubeTS : Component\r\n{\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tthis.TweenScale( new Vector3( 0.5f, 1f, 0.5f ),0.5f ).SetLoops(-1,LoopType.YoYo).SetEase(EaseType.InBounce).Play();\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Examples/TextRenderer/Sbe_TextTweenProperty.cs",
            "FileName": "Sbe_TextTweenProperty.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class Sbe_TextTweenProperty : Component\r\n{\r\n\t[Property] public TextRenderer TR;\r\n\t[Property] public Color GlowText;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tTR.TweenFontSize( 52f, 2 ).SetLoops( -1, LoopType.YoYo ).Play();\r\n\t\tTR.TweenOutlineColor(GlowText, 0.8f).SetLoops(-1, LoopType.YoYo ).Play();\r\n\t\tTR.TweenFontWeight(600, 0.4f).SetLoops(-1, LoopType.YoYo ).Play();\r\n\t}\r\n\r\n\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Core/BaseTween.cs",
            "FileName": "BaseTween.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing System;\r\n\r\nnamespace SbTween;\r\n\r\npublic class BaseTween\r\n{\r\n    // Core Settings \r\n    public float Duration { get; set; }\r\n    public float Elapsed { get; private set; }\r\n    public float Delay { get; private set; }\r\n    public EaseType Ease { get; set; } = EaseType.Linear;\r\n    public Func<float, float> TimingFunction { get; set; }\r\n    public GameObject Target { get; set; }\r\n    public string Id { get; set; }\r\n\r\n\r\n    // Looping \r\n    public LoopType LoopMode { get; set; } = LoopType.Restart;\r\n    public int Loops { get; private set; } = 0; // 0 = once, -1 = infinity.\r\n    private int _loopsDone = 0;\r\n\r\n    // State \r\n    public bool IsFinished { get; private set; }\r\n    public bool IsPaused { get; private set; }\r\n    public bool IsReversed { get; private set; }\r\n\r\n    // Events\r\n    private Action _onStart;\r\n    private Action _onComplete;\r\n    private Action _onLoop;\r\n    private Action<float> _onUpdate;\r\n\r\n    private bool _hasStarted = false;\r\n\r\n    public BaseTween( float duration )\r\n    {\r\n       Duration = duration;\r\n    }\r\n\r\n    public BaseTween SetDelay( float seconds )\r\n    {\r\n       Delay = seconds;\r\n       return this;\r\n    }\r\n\r\n    public BaseTween SetId( string id )\r\n    {\r\n       Id = id;\r\n       return this;\r\n    }\r\n    protected float GetEasedProgress( float p )\r\n    {\r\n       return TimingFunction != null ? TimingFunction( p ) : p;\r\n    }\r\n\r\n    public void Update( float deltaTime )\r\n    {\r\n       if ( IsFinished || IsPaused ) return;\r\n\r\n       if ( Delay > 0 )\r\n       {\r\n          Delay -= deltaTime;\r\n          return;\r\n       }\r\n\r\n       if ( !_hasStarted )\r\n       {\r\n          _onStart?.Invoke();\r\n          _hasStarted = true;\r\n       }\r\n\r\n       if ( IsReversed )\r\n          Elapsed -= deltaTime;\r\n       else\r\n          Elapsed += deltaTime;\r\n\r\n       // Calculate un-clamped progress to detect precise boundaries safely\r\n       float rawProgress = Elapsed / Duration;\r\n       float progress = Math.Clamp( rawProgress, 0f, 1.0f );\r\n       float finalProgress = TimingFunction != null ? TimingFunction( progress ) : Easing.Apply( Ease, progress );\r\n\r\n       if ( LoopMode == LoopType.Incremental )\r\n       {\r\n          _onUpdate?.Invoke( finalProgress + _loopsDone );\r\n       }\r\n       else\r\n       {\r\n          _onUpdate?.Invoke( finalProgress );\r\n       }\r\n\r\n       // Boundary detection checking against raw values to prevent precision lockups\r\n       if ( (!IsReversed && rawProgress >= 1.0f) || (IsReversed && rawProgress <= 0f) )\r\n       {\r\n          if ( Loops == -1 || _loopsDone < Loops )\r\n          {\r\n             _loopsDone++;\r\n             _onLoop?.Invoke();\r\n\r\n             if ( LoopMode == LoopType.YoYo )\r\n             {\r\n                IsReversed = !IsReversed;\r\n                // Snap Elapsed to the exact boundaries so the next frame increments cleanly\r\n                Elapsed = IsReversed ? Duration : 0f;\r\n             }\r\n             else\r\n             {\r\n                Elapsed = 0f;\r\n             }\r\n          }\r\n          else\r\n          {\r\n             IsFinished = true;\r\n             _onComplete?.Invoke();\r\n             \r\n             // Auto-remove from manager if active\r\n             if ( TweenManager.Current is { } Tweener )\r\n             {\r\n                Tweener.RemoveTween( this );\r\n             }\r\n          }\r\n       }\r\n    }\r\n\r\n    // Chaining Method\r\n    public BaseTween SetEase( EaseType ease ) { Ease = ease; return this; }\r\n    public BaseTween SetLoops( int loops, LoopType type = LoopType.Restart )\r\n    {\r\n       Loops = loops;\r\n       LoopMode = type;\r\n       return this;\r\n    }\r\n\r\n    public BaseTween OnStart( Action a ) { _onStart = a; return this; }\r\n    public BaseTween OnUpdate( Action<float> a ) \r\n    { \r\n\t    if ( a == null ) return this;\r\n   \r\n\t    _onUpdate = _onUpdate == null ? a : (Action<float>)Delegate.Combine(_onUpdate, a); \r\n\t    return this; \r\n    }\r\n    public BaseTween OnComplete( Action a ) { _onComplete = a; return this; }\r\n    public BaseTween OnLoop( Action a ) { _onLoop = a; return this; }\r\n\r\n    public BaseTween WithCurve( Curve curve )\r\n    {\r\n       TimingFunction = t => curve.Evaluate( t );\r\n       return this;\r\n    }\r\n\r\n    // Playback \r\n    public void Pause() => IsPaused = true;\r\n    public void Play()\r\n    {\r\n       IsPaused = false;\r\n       IsFinished = false;\r\n\r\n       if ( TweenManager.Current is { } Tweener )\r\n       {\r\n          Tweener.AddTween( this );\r\n       }\r\n    }\r\n    public void Kill() => IsFinished = true;\r\n    public void Reverse() => IsReversed = !IsReversed;\r\n    public void Reset()\r\n    {\r\n       Elapsed = 0;\r\n       IsFinished = false;\r\n       IsPaused = true;\r\n       _hasStarted = false;\r\n       _loopsDone = 0;\r\n    }\r\n\r\n    public void Stop()\r\n    {\r\n       IsFinished = true;\r\n       IsPaused = true;\r\n\r\n       if ( TweenManager.Current is { } Tweener )\r\n       {\r\n          Tweener.RemoveTween( this );\r\n       }\r\n    }\r\n}\r\n\r\n\r\n\r\npublic enum LoopType\r\n{\r\n    Restart,    // 0 to 1, 0 -> 1\r\n    YoYo,       // 0 to 1 to 0\r\n    Incremental // 0 to 1, then 1 -> 2, then 2 -> 3 etc etc.\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Examples/Doo/SbeDooTest.cs",
            "FileName": "SbeDooTest.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\nusing SbTween;\r\n\r\nnamespace SbTween.Examples;\r\n\r\npublic sealed class SbeDooTest : Component\r\n{\r\n\t[Property] public Doo DooTweening;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tRunDoo( DooTweening );\r\n\t}\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "SbTween/Extensions/MiscExtensions.cs",
            "FileName": "MiscExtensions.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "using Sandbox;\r\n\r\nnamespace SbTween;\r\n\r\npublic static class MiscExtensions\r\n{\r\n\t// DECALS\r\n\tpublic static BaseTween TweenLifeTime( this Decal self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.LifeTime.ConstantValue; \r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.LifeTime = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenSize( this Decal self, Vector2 target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       Vector2 start = self.Size;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Size = Vector2.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenScale( this Decal self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.Scale.ConstantValue;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Scale = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenRotation( this Decal self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.Rotation.ConstantValue;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Rotation = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenDepth( this Decal self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.Depth;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Depth = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenParallax( this Decal self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.Parallax.ConstantValue;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Parallax = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenColorTint( this Decal self, Color target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       Color start = self.ColorTint.ConstantValue;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.ColorTint = Color.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenColorMix( this Decal self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.ColorMix.ConstantValue;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.ColorMix = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n    \r\n    // CUBEMAP FOG \r\n\r\n    public static BaseTween TweenBlur( this CubemapFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.Blur;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Blur = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenStartDistance( this CubemapFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.StartDistance;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.StartDistance = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenEndDistance( this CubemapFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.EndDistance;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.EndDistance = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenFalloffExponent( this CubemapFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.FalloffExponent;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.FalloffExponent = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenHeightWidth( this CubemapFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.HeightWidth;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.HeightWidth = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenHeightStart( this CubemapFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.HeightStart;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.HeightStart = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenHeightExponent( this CubemapFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.HeightExponent;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.HeightExponent = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenTint( this CubemapFog self, Color target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       Color start = self.Tint;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Tint = Color.Lerp( start, target, p ) ) );\r\n    }\r\n    \r\n    // GRADIENT FOG\r\n\r\n    public static BaseTween TweenStartDistance( this GradientFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.StartDistance;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.StartDistance = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenEndDistance( this GradientFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.EndDistance;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.EndDistance = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenFalloffExponent( this GradientFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.FalloffExponent;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.FalloffExponent = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenColor( this GradientFog self, Color target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       Color start = self.Color;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Color = Color.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenHeight( this GradientFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.Height;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.Height = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenVerticalFalloffExponent( this GradientFog self, float target, float duration )\r\n    {\r\n       if ( !self.IsValid() ) return null;\r\n       float start = self.VerticalFalloffExponent;\r\n       return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n          .OnUpdate( p => self.VerticalFalloffExponent = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n    \r\n    // VOLUMETRIC FOG\r\n\r\n    public static BaseTween TweenStrength( this VolumetricFogVolume self, float target, float duration )\r\n    {\r\n\t    if ( !self.IsValid() ) return null;\r\n\t    float start = self.Strength;\r\n\t    return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t    .OnUpdate( p => self.Strength = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenFalloffExponent( this VolumetricFogVolume self, float target, float duration )\r\n    {\r\n\t    if ( !self.IsValid() ) return null;\r\n\t    float start = self.FalloffExponent;\r\n\t    return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t    .OnUpdate( p => self.FalloffExponent = MathX.Lerp( start, target, p ) ) );\r\n    }\r\n\r\n    public static BaseTween TweenColor( this VolumetricFogVolume self, Color target, float duration )\r\n    {\r\n\t    if ( !self.IsValid() ) return null;\r\n\t    Color start = self.Color;\r\n\t    return TweenManager.Instance.AddTween( new BaseTween( duration )\r\n\t\t    .OnUpdate( p => self.Color = Color.Lerp( start, target, p ) ) );\r\n    }\r\n}\r\n"
        },
        {
            "Ident": "resync.sbtween",
            "Path": "Code/SbTween/Core/Convertors/EaseTypeConverter.cs",
            "FileName": "EaseTypeConverter.cs",
            "PackageType": "library",
            "CodeKind": "Game",
            "AssetVersionId": 283981,
            "IsPrivate": false,
            "Code": "#nullable enable\r\nusing System;\r\nusing System.Text.Json;\r\nusing System.Text.Json.Serialization;\r\n\r\nnamespace SbTween;\r\n\r\npublic class EaseTypeConverter : JsonConverter<EaseType>\r\n{\r\n    public override EaseType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)\r\n    {\r\n        if (reader.TokenType == JsonTokenType.Number)\r\n        {\r\n            long num = reader.GetInt64();\r\n            return (EaseType)num;\r\n        }\r\n        else if (reader.TokenType == JsonTokenType.String)\r\n        {\r\n            string? str = reader.GetString();\r\n            if (!string.IsNullOrEmpty(str) && Enum.TryParse<EaseType>(str, true, out var result))\r\n\t            return result;\r\n        }\r\n\r\n        return EaseType.Linear;\r\n    }\r\n\r\n    public override void Write(Utf8JsonWriter writer, EaseType value, JsonSerializerOptions options)\r\n    {\r\n        writer.WriteStringValue(value.ToString());\r\n    }\r\n}\r\n"
        }
    ]
}