2019-01-24 16:43:03 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-05-20 18:22:42 +08:00
using osu.Game.Beatmaps ;
using osu.Game.Rulesets.Edit ;
using osu.Game.Rulesets.Edit.Tools ;
using osu.Game.Rulesets.Mania.Objects ;
using System.Collections.Generic ;
2018-07-17 15:55:50 +08:00
using osu.Framework.Allocation ;
2018-11-12 17:24:18 +08:00
using osu.Game.Rulesets.Mania.UI ;
2019-04-08 17:32:05 +08:00
using osu.Game.Rulesets.Mods ;
2018-10-17 17:01:38 +08:00
using osu.Game.Rulesets.UI ;
2020-04-27 19:35:24 +08:00
using osu.Game.Rulesets.UI.Scrolling ;
2018-11-16 16:12:24 +08:00
using osu.Game.Screens.Edit.Compose.Components ;
2018-11-26 09:44:48 +08:00
using osuTK ;
2018-05-20 18:22:42 +08:00
namespace osu.Game.Rulesets.Mania.Edit
{
2018-11-12 18:41:06 +08:00
[Cached(Type = typeof(IManiaHitObjectComposer))]
public class ManiaHitObjectComposer : HitObjectComposer < ManiaHitObject > , IManiaHitObjectComposer
2018-05-20 18:22:42 +08:00
{
2019-08-29 17:12:29 +08:00
private DrawableManiaEditRuleset drawableRuleset ;
2018-11-26 09:54:54 +08:00
2018-06-07 15:08:37 +08:00
public ManiaHitObjectComposer ( Ruleset ruleset )
2018-05-20 18:22:42 +08:00
: base ( ruleset )
{
}
2018-11-26 09:54:54 +08:00
/// <summary>
/// Retrieves the column that intersects a screen-space position.
/// </summary>
/// <param name="screenSpacePosition">The screen-space position.</param>
/// <returns>The column which intersects with <paramref name="screenSpacePosition"/>.</returns>
2019-08-29 17:12:29 +08:00
public Column ColumnAt ( Vector2 screenSpacePosition ) = > drawableRuleset . GetColumnByPosition ( screenSpacePosition ) ;
2018-11-26 09:54:54 +08:00
2018-11-07 15:43:34 +08:00
private DependencyContainer dependencies ;
2018-07-17 15:55:50 +08:00
protected override IReadOnlyDependencyContainer CreateChildDependencies ( IReadOnlyDependencyContainer parent )
2018-11-07 15:43:34 +08:00
= > dependencies = new DependencyContainer ( base . CreateChildDependencies ( parent ) ) ;
2018-07-17 15:55:50 +08:00
2020-04-27 19:35:24 +08:00
public ManiaPlayfield Playfield = > ( ( ManiaPlayfield ) drawableRuleset . Playfield ) ;
2020-04-28 17:35:37 +08:00
public IScrollingInfo ScrollingInfo = > drawableRuleset . ScrollingInfo ;
2020-04-27 19:35:24 +08:00
public int TotalColumns = > Playfield . TotalColumns ;
public override ( Vector2 position , double time ) GetSnappedPosition ( Vector2 position , double time )
{
var hoc = Playfield . GetColumn ( 0 ) . HitObjectContainer ;
2020-04-28 13:00:14 +08:00
float targetPosition = hoc . ToLocalSpace ( ToScreenSpace ( position ) ) . Y ;
2020-04-27 19:35:24 +08:00
if ( drawableRuleset . ScrollingInfo . Direction . Value = = ScrollingDirection . Down )
{
2020-04-28 17:36:24 +08:00
// We're dealing with screen coordinates in which the position decreases towards the centre of the screen resulting in an increase in start time.
// The scrolling algorithm assumes a top anchor meaning an increase in time corresponds to an increase in position, so when scrolling downwards the coordinates need to be flipped.
targetPosition = hoc . DrawHeight - targetPosition ;
2020-04-27 19:35:24 +08:00
}
double targetTime = drawableRuleset . ScrollingInfo . Algorithm . TimeAt ( targetPosition ,
EditorClock . CurrentTime ,
drawableRuleset . ScrollingInfo . TimeRange . Value ,
hoc . DrawHeight ) ;
return base . GetSnappedPosition ( position , targetTime ) ;
}
2018-11-15 20:37:22 +08:00
2019-12-12 14:58:11 +08:00
protected override DrawableRuleset < ManiaHitObject > CreateDrawableRuleset ( Ruleset ruleset , IBeatmap beatmap , IReadOnlyList < Mod > mods = null )
2018-11-07 15:43:34 +08:00
{
2019-08-29 17:12:29 +08:00
drawableRuleset = new DrawableManiaEditRuleset ( ruleset , beatmap , mods ) ;
2018-11-07 15:43:34 +08:00
// This is the earliest we can cache the scrolling info to ourselves, before masks are added to the hierarchy and inject it
2019-08-29 17:12:29 +08:00
dependencies . CacheAs ( drawableRuleset . ScrollingInfo ) ;
2018-11-07 15:43:34 +08:00
2019-08-29 17:12:29 +08:00
return drawableRuleset ;
2018-11-07 15:43:34 +08:00
}
2018-05-20 18:22:42 +08:00
2020-01-15 18:09:49 +08:00
protected override ComposeBlueprintContainer CreateBlueprintContainer ( ) = > new ManiaBlueprintContainer ( drawableRuleset . Playfield . AllHitObjects ) ;
2020-01-02 10:46:18 +08:00
2018-11-12 17:24:18 +08:00
protected override IReadOnlyList < HitObjectCompositionTool > CompositionTools = > new HitObjectCompositionTool [ ]
{
2018-11-19 17:38:06 +08:00
new NoteCompositionTool ( ) ,
new HoldNoteCompositionTool ( )
2018-11-12 17:24:18 +08:00
} ;
2018-05-20 18:22:42 +08:00
}
}