mirror of
https://github.com/Facepunch/sbox-public.git
synced 2025-12-23 22:48:07 -05:00
Sound preview misc fixes (#3655)
* start sound preview playback at scrubber position instead of 0, only increment time if playing * Fix SceneRect calculation so that there isnt 4 pixels of extra scroll when zoomed all the way out, only show scroll bar if there's anything to scroll * clamp scrubber position so it cant be visually dragged outside normal bounds * use correct offset when setting scrubber position during playback * update VisibleRect before redrawing waveform, waveform was previously drawing in wrong position (view from last frame) * clamp on scrubber should be using SceneRect not ContentRect * no need to update VisibleRect twice * use correct offset for scrubber in DoLayout too * update scrubber so it stays nice and stable while playing+zoomed in or scrubbing, use correct offset when manipulating scrubber * offsetting by 4 everywhere is dumb just set HandlePosition on scrubber * fix drift on scrubber while zoomed in --------- Co-authored-by: boxrocket <splatterbiker@gmail.com>
This commit is contained in:
@@ -14,6 +14,7 @@ public partial class SoundPlayer
|
|||||||
Cursor = CursorShape.SizeH;
|
Cursor = CursorShape.SizeH;
|
||||||
Movable = true;
|
Movable = true;
|
||||||
Selectable = true;
|
Selectable = true;
|
||||||
|
HandlePosition = new( 0.5f, 0f );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnPaint()
|
protected override void OnPaint()
|
||||||
@@ -41,6 +42,7 @@ public partial class SoundPlayer
|
|||||||
protected override void OnMouseReleased( GraphicsMouseEvent e )
|
protected override void OnMouseReleased( GraphicsMouseEvent e )
|
||||||
{
|
{
|
||||||
base.OnMouseReleased( e );
|
base.OnMouseReleased( e );
|
||||||
|
TimelineView.MoveScrubber( Position.x );
|
||||||
TimelineView.Scrubbing = false;
|
TimelineView.Scrubbing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +51,7 @@ public partial class SoundPlayer
|
|||||||
base.OnMoved();
|
base.OnMoved();
|
||||||
|
|
||||||
TimelineView.Scrubbing = true;
|
TimelineView.Scrubbing = true;
|
||||||
TimelineView.MoveScrubber( Position.x, false );
|
TimelineView.MoveScrubber( Position.x + 0.5f, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ public partial class SoundPlayer : Widget
|
|||||||
{
|
{
|
||||||
Timeline = parent;
|
Timeline = parent;
|
||||||
SceneRect = new( 0, Size );
|
SceneRect = new( 0, Size );
|
||||||
HorizontalScrollbar = ScrollbarMode.On;
|
HorizontalScrollbar = ScrollbarMode.Auto;
|
||||||
VerticalScrollbar = ScrollbarMode.Off;
|
VerticalScrollbar = ScrollbarMode.Off;
|
||||||
Scale = 1;
|
Scale = 1;
|
||||||
Time = 0;
|
Time = 0;
|
||||||
@@ -152,6 +152,7 @@ public partial class SoundPlayer : Widget
|
|||||||
|
|
||||||
var size = Size;
|
var size = Size;
|
||||||
size.x = MathF.Max( Size.x, PositionFromTime( Duration ) );
|
size.x = MathF.Max( Size.x, PositionFromTime( Duration ) );
|
||||||
|
size.x -= Width - ContentRect.Width;
|
||||||
SceneRect = new( 0, size );
|
SceneRect = new( 0, size );
|
||||||
TimeAxis.Size = new Vector2( size.x, Theme.RowHeight );
|
TimeAxis.Size = new Vector2( size.x, Theme.RowHeight );
|
||||||
Scrubber.Size = new Vector2( 9, size.y );
|
Scrubber.Size = new Vector2( 9, size.y );
|
||||||
@@ -162,7 +163,7 @@ public partial class SoundPlayer : Widget
|
|||||||
WaveForm.SceneRect = r;
|
WaveForm.SceneRect = r;
|
||||||
WaveForm.Analyse();
|
WaveForm.Analyse();
|
||||||
|
|
||||||
Scrubber.Position = Scrubber.Position.WithX( PositionFromTime( Time ) - 3 ).SnapToGrid( 1.0f );
|
Scrubber.Position = Scrubber.Position.WithX( PositionFromTime( Time ) ).SnapToGrid( 1.0f );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnResize()
|
protected override void OnResize()
|
||||||
@@ -191,8 +192,6 @@ public partial class SoundPlayer : Widget
|
|||||||
SoundHandle = null;
|
SoundHandle = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
VisibleRect = Rect.FromPoints( ToScene( LocalRect.TopLeft ), ToScene( LocalRect.BottomRight ) );
|
|
||||||
|
|
||||||
if ( Timeline.Playing && !Scrubbing )
|
if ( Timeline.Playing && !Scrubbing )
|
||||||
{
|
{
|
||||||
var time = Time % Duration;
|
var time = Time % Duration;
|
||||||
@@ -219,13 +218,14 @@ public partial class SoundPlayer : Widget
|
|||||||
if ( Timeline.Playing && !SoundHandle.IsValid() )
|
if ( Timeline.Playing && !SoundHandle.IsValid() )
|
||||||
{
|
{
|
||||||
SoundHandle = EditorUtility.PlaySound( Sound, Time );
|
SoundHandle = EditorUtility.PlaySound( Sound, Time );
|
||||||
SoundHandle.Time = 0;
|
SoundHandle.Time = Time;
|
||||||
SoundHandle.Occlusion = false;
|
SoundHandle.Occlusion = false;
|
||||||
SoundHandle.DistanceAttenuation = false;
|
SoundHandle.DistanceAttenuation = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Scrubber.Position = Scrubber.Position.WithX( PositionFromTime( Time ) - 3 ).SnapToGrid( 1.0f );
|
Scrubber.Position = Scrubber.Position.WithX( PositionFromTime( Time ) ).SnapToGrid( 1.0f );
|
||||||
Time += RealTime.SmoothDelta;
|
if ( Timeline.Playing )
|
||||||
|
Time += RealTime.SmoothDelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( SoundHandle.IsValid() )
|
if ( SoundHandle.IsValid() )
|
||||||
@@ -233,13 +233,16 @@ public partial class SoundPlayer : Widget
|
|||||||
SoundHandle.Paused = Scrubbing;
|
SoundHandle.Paused = Scrubbing;
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeAxis.Update();
|
|
||||||
WaveForm.Update();
|
|
||||||
|
|
||||||
if ( Scrubbing || Timeline.Playing )
|
if ( Scrubbing || Timeline.Playing )
|
||||||
{
|
{
|
||||||
|
Translate( 1 );
|
||||||
CenterOn( Scrubber.Position );
|
CenterOn( Scrubber.Position );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VisibleRect = Rect.FromPoints( ToScene( LocalRect.TopLeft ), ToScene( LocalRect.BottomRight ) );
|
||||||
|
|
||||||
|
TimeAxis.Update();
|
||||||
|
WaveForm.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public float PositionFromTime( float time )
|
public float PositionFromTime( float time )
|
||||||
@@ -261,8 +264,8 @@ public partial class SoundPlayer : Widget
|
|||||||
|
|
||||||
public void MoveScrubber( float position, bool centreOn = true )
|
public void MoveScrubber( float position, bool centreOn = true )
|
||||||
{
|
{
|
||||||
Scrubber.Position = Vector2.Right * (position - 4).SnapToGrid( 1.0f );
|
Scrubber.Position = Vector2.Right * position.Clamp( 0, SceneRect.Width + 4 ).SnapToGrid( 1.0f );
|
||||||
Time = TimeFromPosition( Scrubber.Position.x + 4 );
|
Time = TimeFromPosition( Scrubber.Position.x );
|
||||||
|
|
||||||
if ( SoundHandle.IsValid() )
|
if ( SoundHandle.IsValid() )
|
||||||
{
|
{
|
||||||
@@ -285,6 +288,8 @@ public partial class SoundPlayer : Widget
|
|||||||
|
|
||||||
DoLayout();
|
DoLayout();
|
||||||
|
|
||||||
|
VisibleRect = Rect.FromPoints( ToScene( LocalRect.TopLeft ), ToScene( LocalRect.BottomRight ) );
|
||||||
|
|
||||||
TimeAxis.Update();
|
TimeAxis.Update();
|
||||||
WaveForm.Update();
|
WaveForm.Update();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user