s&box Package Code Search
Search C# source code, UI razor templates, shaders, and configs across s&box packages.
link Raw Facepunch API Link: https://public.facepunch.com/sbox/code/search/1/?ident=resync.sbtween&take=20
Showing code results for query:
*
(86 total matches found)
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 );
} ) );
}
}
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 );
} )
);
}
}
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 ) )
);
}
}
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")]
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
}
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();
}
}
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 );
} )
);
}
}
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();
}
}
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();
}
}
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 );
}
}
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 ) ) );
}
}
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; } ) );
}
}
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();
}
}
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();
}
}
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();
}
}
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();
}
}
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.
}
Game
library
using Sandbox;
using SbTween;
namespace SbTween.Examples;
public sealed class SbeDooTest : Component
{
[Property] public Doo DooTweening;
protected override void OnStart()
{
RunDoo( DooTweening );
}
}
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 ) ) );
}
}
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"
}
]
}