Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions fluXis.Import.osu/Storyboards/OsuStoryboardParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ public Storyboard Parse(string data)
toAdd.Add(new StoryboardAnimation(element)
{
Type = animation.Type,
ValueStart = animation.ValueStart,
ValueEnd = animation.ValueStart
StartValue = animation.StartValue,
ValueEnd = animation.StartValue
});
}

Expand Down Expand Up @@ -214,7 +214,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = start.ToStringInvariant(),
StartValue = start.ToStringInvariant(),
ValueEnd = end.ToStringInvariant()
}
};
Expand All @@ -235,7 +235,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = start.ToStringInvariant(),
StartValue = start.ToStringInvariant(),
ValueEnd = end.ToStringInvariant()
}
};
Expand All @@ -258,7 +258,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = $"{startX},{startY}",
StartValue = $"{startX},{startY}",
ValueEnd = $"{endX},{endY}"
}
};
Expand All @@ -282,7 +282,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = startDeg.ToStringInvariant(),
StartValue = startDeg.ToStringInvariant(),
ValueEnd = endDeg.ToStringInvariant()
}
};
Expand All @@ -305,7 +305,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = startX.ToStringInvariant(),
StartValue = startX.ToStringInvariant(),
ValueEnd = endX.ToStringInvariant()
},
new StoryboardAnimation(currentElement)
Expand All @@ -314,7 +314,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = startY.ToStringInvariant(),
StartValue = startY.ToStringInvariant(),
ValueEnd = endY.ToStringInvariant()
}
};
Expand All @@ -335,7 +335,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = start.ToStringInvariant(),
StartValue = start.ToStringInvariant(),
ValueEnd = end.ToStringInvariant()
}
};
Expand All @@ -356,7 +356,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = start.ToStringInvariant(),
StartValue = start.ToStringInvariant(),
ValueEnd = end.ToStringInvariant()
}
};
Expand Down Expand Up @@ -384,7 +384,7 @@ private void parseLine(string line)
StartTime = startTime,
Duration = duration,
Easing = easing,
ValueStart = hexStart,
StartValue = hexStart,
ValueEnd = hexEnd
}
};
Expand Down
7 changes: 7 additions & 0 deletions fluXis/Map/Structures/Bases/IHasStartValue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace fluXis.Map.Structures.Bases;

public interface IHasStartValue<T>
{
T StartValue { get; set; }
bool UseStartValue { get; set; }
}
8 changes: 7 additions & 1 deletion fluXis/Map/Structures/Events/Scrolling/TimeOffsetEvent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace fluXis.Map.Structures.Events.Scrolling;

public class TimeOffsetEvent : IMapEvent, IHasDuration, IHasEasing, IApplicableToHitManager
public class TimeOffsetEvent : IMapEvent, IHasDuration, IHasEasing, IHasStartValue<double>, IApplicableToHitManager
{
[JsonProperty("time")]
public double Time { get; set; }
Expand All @@ -23,6 +23,12 @@ public class TimeOffsetEvent : IMapEvent, IHasDuration, IHasEasing, IApplicableT
[JsonProperty("start-offset")]
public double StartOffset { get; set; }

public double StartValue
{
get => StartOffset;
set => StartOffset = value;
}

[JsonProperty("offset")]
public double TargetOffset { get; set; }

Expand Down
12 changes: 9 additions & 3 deletions fluXis/Map/Structures/Events/ShaderEvent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace fluXis.Map.Structures.Events;

public class ShaderEvent : IMapEvent, IHasDuration, IHasEasing
public class ShaderEvent : IMapEvent, IHasDuration, IHasEasing, IHasStartValue<ShaderEvent.ShaderParameters>
{
[JsonProperty("time")]
public double Time { get; set; }
Expand Down Expand Up @@ -40,11 +40,17 @@ public string ShaderName
public Easing Easing { get; set; }

[JsonProperty("use-start")]
public bool UseStartParams { get; set; }
public bool UseStartValue { get; set; }

[JsonProperty("start-params")]
public ShaderParameters StartParameters { get; set; } = new();

public ShaderParameters StartValue
{
get => StartParameters;
set => StartParameters = value;
}

[JsonProperty("end-params")]
public ShaderParameters EndParameters { get; set; } = new();

Expand Down Expand Up @@ -97,7 +103,7 @@ public void Apply(ShaderTransformHandler shader)
{
using (shader.BeginAbsoluteSequence(Time))
{
if (UseStartParams)
if (UseStartValue)
{
shader.StrengthTo(StartParameters.Strength);
shader.Strength2To(StartParameters.Strength2);
Expand Down
6 changes: 3 additions & 3 deletions fluXis/Screens/Edit/Tabs/Design/DesignShaderHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ private void handleGroup(ShaderType type, IEnumerable<ShaderEvent> events)
}

var previous = events.LastOrDefault(e => e.Time < current.Time);
var startStrength = current.UseStartParams ? current.StartParameters.Strength : previous?.EndParameters.Strength ?? 0;
var startStrength2 = current.UseStartParams ? current.StartParameters.Strength2 : previous?.EndParameters.Strength2 ?? 0;
var startStrength3 = current.UseStartParams ? current.StartParameters.Strength3 : previous?.EndParameters.Strength3 ?? 0;
var startStrength = current.UseStartValue ? current.StartParameters.Strength : previous?.EndParameters.Strength ?? 0;
var startStrength2 = current.UseStartValue ? current.StartParameters.Strength2 : previous?.EndParameters.Strength2 ?? 0;
var startStrength3 = current.UseStartValue ? current.StartParameters.Strength3 : previous?.EndParameters.Strength3 ?? 0;

if (progress < 0)
{
Expand Down
6 changes: 3 additions & 3 deletions fluXis/Screens/Edit/Tabs/Design/Points/Entries/ShaderEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ protected override Drawable[] CreateValueContent()
{
var text = $"{shader.ShaderName} {(int)shader.Duration}ms (";

if (shader.UseStartParams)
if (shader.UseStartValue)
text += $"{shader.StartParameters.Strength} > ";

text += $"{shader.EndParameters.Strength})";
Expand All @@ -54,10 +54,10 @@ protected override IEnumerable<Drawable> CreateSettings()
{
Text = "Use Start Value",
TooltipText = "Enables whether start values should be used.",
Bindable = new Bindable<bool>(shader.UseStartParams),
Bindable = new Bindable<bool>(shader.UseStartValue),
OnValueChanged = enabled =>
{
shader.UseStartParams = enabled;
shader.UseStartValue = enabled;
Map.Update(shader);
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,15 @@ public partial class StoryboardAnimationEntry : CompositeDrawable, IHasPopover
private readonly OutlinedCircle outlineLength;
private readonly FluXisSpriteIcon outlineDiamond;

protected Bindable<bool> UseStartValueBindable;

public StoryboardAnimationEntry(StoryboardAnimation animation, StoryboardAnimationRow row, Colour4 color)
{
Animation = animation;
this.row = row;

UseStartValueBindable = new Bindable<bool>(Animation.UseStartValue);

Anchor = Anchor.CentreLeft;
Origin = Anchor.Centre;

Expand Down Expand Up @@ -140,20 +144,32 @@ protected override bool OnClick(ClickEvent e)
new EditorVariableTitle(Animation.Type.GetDescription(), () => RequestRemove?.Invoke(Animation), false),
new EditorVariableTime(map, Animation, () => row.Item.StartTime),
new EditorVariableLength<StoryboardAnimation>(map, Animation, beatLength),
new EditorVariableToggle()
{
Text = "Use Start Value",
TooltipText = "Enables whether start values should be used.",
Bindable = UseStartValueBindable,
OnValueChanged = enabled =>
{
Animation.UseStartValue = enabled;
map.Update(Animation);
}
},
new EditorVariableTextBox
{
Text = "Start Value",
CurrentValue = Animation.ValueStart,
CurrentValue = Animation.StartValue,
Enabled = UseStartValueBindable,
OnValueChanged = t =>
{
if (validate(t.Text, out var parsed)) Animation.ValueStart = parsed;
if (validate(t.Text, out var parsed)) Animation.StartValue = parsed;
else t.NotifyError();
map.Update(Animation);
},
OnCommit = t =>
{
if (t is not null && validate(t.Text, out var parsed)) t.Text = parsed;
else { t.Text = Animation.ValueStart; t.NotifyError(); }
else { t.Text = Animation.StartValue; t.NotifyError(); }
}
},
new EditorVariableTextBox
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ private void addNew()
var animation = new StoryboardAnimation(Item)
{
StartTime = clock.CurrentTime - Item.StartTime,
ValueStart = getDefault(type),
UseStartValue = false,
StartValue = getDefault(type),
ValueEnd = getDefault(type),
Type = type
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public LuaStoryboardAnimation(LuaStoryboardElement parentElement)
[LuaMember(Name = "type")]
public StoryboardAnimationType Type { get; set; }

[LuaMember(Name = "useStartValue")]
public bool UseStartValue { get; set; } = true;

[LuaMember(Name = "start")]
public string Start { get; set; }

Expand All @@ -41,7 +44,8 @@ public LuaStoryboardAnimation(LuaStoryboardElement parentElement)
Duration = Duration,
Easing = Easing,
Type = Type,
ValueStart = Start,
UseStartValue = UseStartValue,
StartValue = Start,
ValueEnd = End
};
}
9 changes: 6 additions & 3 deletions fluXis/Scripting/Models/Storyboarding/LuaStoryboardElement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public class LuaStoryboardElement : ILuaModel
[LuaHide]
public Dictionary<string, JToken> ExtraParameters { get; set; } = new();

#nullable enable
/// <summary>
/// applies a new animation to this element
/// </summary>
Expand All @@ -70,16 +71,18 @@ public class LuaStoryboardElement : ILuaModel
/// <param name="endVal">the value this animation ends with (input based on type)</param>
/// <param name="ease">the easing function used for this animation</param>
[LuaMember(Name = "animate")]
public void AddAnimation([LuaCustomType(typeof(StoryboardAnimationType))] string type, float time, float len, string startVal, string endVal, [LuaCustomType(typeof(Easing))] string ease) =>
public void AddAnimation([LuaCustomType(typeof(StoryboardAnimationType))] string type, float time, float len, string? startVal, string endVal, [LuaCustomType(typeof(Easing))] string ease) =>
Animations.Add(new LuaStoryboardAnimation(this)
{
StartTime = time,
Duration = len,
Easing = Enum.TryParse<Easing>(ease, out var easing) ? easing : Easing.None,
Type = Enum.Parse<StoryboardAnimationType>(type),
Start = startVal,
End = endVal
UseStartValue = startVal != null,
Start = startVal ?? "",
End = endVal,
});
#nullable restore

[LuaMember(Name = "param")]
public object GetParameter(string key, object fallback)
Expand Down
44 changes: 21 additions & 23 deletions fluXis/Storyboards/Drawables/DrawableStoryboardElement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,60 +40,58 @@ private void load()
using (BeginAbsoluteSequence(Element.StartTime + animation.StartTime))
{
var duration = Math.Max(animation.Duration, 0);
var useStart = animation.UseStartValue;

switch (animation.Type)
{
case StoryboardAnimationType.MoveX:
this.MoveToX(animation.StartFloat).Then()
.MoveToX(animation.EndFloat, duration, animation.Easing);
if (useStart) this.MoveToX(animation.StartFloat);
this.MoveToX(animation.EndFloat, duration, animation.Easing);
break;

case StoryboardAnimationType.MoveY:
this.MoveToY(animation.StartFloat).Then()
.MoveToY(animation.EndFloat, duration, animation.Easing);
if (useStart) this.MoveToY(animation.StartFloat);
this.MoveToY(animation.EndFloat, duration, animation.Easing);
break;

case StoryboardAnimationType.Scale:
this.ScaleTo(animation.StartFloat).Then()
.ScaleTo(animation.EndFloat, duration, animation.Easing);
if (useStart) this.ScaleTo(animation.StartFloat);
this.ScaleTo(animation.EndFloat, duration, animation.Easing);
break;

case StoryboardAnimationType.ScaleVector:
this.ScaleTo(animation.StartVector).Then()
.ScaleTo(animation.EndVector, duration, animation.Easing);
if (useStart) this.ScaleTo(animation.StartVector);
this.ScaleTo(animation.EndVector, duration, animation.Easing);
break;

case StoryboardAnimationType.Width:
this.ResizeWidthTo(animation.StartFloat).Then()
.ResizeWidthTo(animation.EndFloat, duration, animation.Easing);
if (useStart) this.ResizeWidthTo(animation.StartFloat);
this.ResizeWidthTo(animation.EndFloat, duration, animation.Easing);
break;

case StoryboardAnimationType.Height:
this.ResizeHeightTo(animation.StartFloat).Then()
.ResizeHeightTo(animation.EndFloat, duration, animation.Easing);
if (useStart) this.ResizeHeightTo(animation.StartFloat);
this.ResizeHeightTo(animation.EndFloat, duration, animation.Easing);
break;

case StoryboardAnimationType.Rotate:
this.RotateTo(animation.StartFloat).Then()
.RotateTo(animation.EndFloat, duration, animation.Easing);
if (useStart) this.RotateTo(animation.StartFloat);
this.RotateTo(animation.EndFloat, duration, animation.Easing);
break;

case StoryboardAnimationType.Fade:
this.FadeTo(animation.StartFloat).Then()
.FadeTo(animation.EndFloat, duration, animation.Easing);
if (useStart) this.FadeTo(animation.StartFloat);
this.FadeTo(animation.EndFloat, duration, animation.Easing);
break;

case StoryboardAnimationType.Color:
var startColour = Colour4.FromHex(animation.ValueStart);
var endColour = Colour4.FromHex(animation.ValueEnd);

this.FadeColour(startColour).Then()
.FadeColour(endColour, duration, animation.Easing);
if (useStart) this.FadeColour(Colour4.FromHex(animation.StartValue));
this.FadeColour(Colour4.FromHex(animation.ValueEnd), duration, animation.Easing);
break;

case StoryboardAnimationType.Border when AllowBorder:
this.BorderTo(animation.StartFloat).Then()
.BorderTo(animation.EndFloat, duration, animation.Easing);
if (useStart) this.BorderTo(animation.StartFloat);
this.BorderTo(animation.EndFloat, duration, animation.Easing);
break;
}
}
Expand Down
Loading
Loading