Пример #1
0
 private void Update_Tray(Beatmap.Track linkedTrack, Beatmap.Note noteData)
 {
     if (linkedTrack.HasTray && noteData.Time < linkedTrack.c_TrayTime && (noteData.Time + noteData.Duration) > MusicTime)
     {
         linkedTrack.c_TrayTime = noteData.Time;
         linkedTrack.c_TrayX    = (noteData.X - noteData.Width * 0.5f, noteData.X + noteData.Width * 0.5f);
     }
 }
Пример #2
0
        private void Update_Movement(Beatmap.Stage linkedStage, Beatmap.Track trackData)
        {
            var(zoneMin, zoneMax, zoneSize, _) = ZoneMinMax;
            float trackWidth  = GetTrackWidth(trackData);
            float stageWidth  = Stage.GetStageWidth(linkedStage);
            float stageHeight = Stage.GetStageHeight(linkedStage);
            float stagePivotY = Stage.GetStagePivotY(linkedStage);
            float stageRotZ   = Stage.GetStageWorldRotationZ(linkedStage);
            var   stagePos    = Stage.GetStagePosition(linkedStage, trackData.StageIndex);
            float rotX        = GetTrackAngle(trackData);
            float trackX      = GetTrackX(trackData);
            var   pos         = Stage.LocalToZone(trackX, 0f, 0f, stagePos, stageWidth, stageHeight, stagePivotY, stageRotZ);

            // Movement
            transform.position      = Util.Vector3Lerp3(zoneMin, zoneMax, pos.x, pos.y);
            transform.localRotation = Quaternion.Euler(0f, 0f, stageRotZ) * Quaternion.Euler(rotX, 0, 0);
            ColSize = MainRenderer.transform.localScale = m_TrackTintRenderer.transform.localScale = new Vector3(
                zoneSize * trackWidth * stageWidth,
                zoneSize * stageHeight,
                1f
                );

            // Tray
            if (trackData.HasTray)
            {
                var traySize      = GetRectSize(SkinType.Tray, trackData.ItemType, false, false);
                var judgeLineSize = GetRectSize(SkinType.JudgeLine, trackData.ItemType);
                var trayPos       = LocalToZone(
                    TrayX, judgeLineSize.y / 2f / stageHeight, 0f,
                    stagePos, stageWidth, stageHeight, stagePivotY, stageRotZ,
                    trackX, trackWidth, rotX
                    );
                m_TrayRenderer.transform.position   = Util.Vector3Lerp3(zoneMin, zoneMax, trayPos.x, trayPos.y);
                m_TrayRenderer.transform.localScale = new Vector3(traySize.x, traySize.y, 1f);
                m_TrayRenderer.Scale = traySize;
            }

            // Renderer
            MainRenderer.RendererEnable        = true;
            m_TrackTintRenderer.RendererEnable = true;
            m_TrackTintRenderer.ItemType       = trackData.ItemType;
            MainRenderer.ItemType         = trackData.ItemType;
            m_TrayRenderer.RendererEnable = trackData.HasTray;
            m_TrayRenderer.ItemType       = trackData.ItemType;
            MainRenderer.Duration         = m_TrayRenderer.Duration = m_TrackTintRenderer.Duration = Duration;
            MainRenderer.Scale            = m_TrackTintRenderer.Scale = new Vector2(stageWidth * trackWidth, stageHeight);
            m_TrackTintRenderer.Tint      = trackData.c_Tint = GetTrackColor(trackData);
            MainRenderer.Alpha            = m_TrayRenderer.Alpha = Stage.GetStageAlpha(linkedStage) * GetTrackAlpha(trackData);
            m_TrackTintRenderer.Alpha    *= MainRenderer.Alpha;
            MainRenderer.SetSortingLayer(SortingLayerID_Track, GetSortingOrder());
            m_TrackTintRenderer.SetSortingLayer(SortingLayerID_TrackTint, GetSortingOrder());
            m_TrayRenderer.SetSortingLayer(SortingLayerID_Tray, GetSortingOrder());
        }
Пример #3
0
 private void LateUpdate_Tray(Beatmap.Track trackData)
 {
     if (trackData.HasTray)
     {
         if (AimTrayX < trackData.c_TrayX.min)
         {
             AimTrayX = Mathf.Lerp(trackData.c_TrayX.min, trackData.c_TrayX.max, trackData.c_TrayTime - MusicTime > 0.5f ? 0.5f : 0.3f);
         }
         else if (AimTrayX > trackData.c_TrayX.max)
         {
             AimTrayX = Mathf.Lerp(trackData.c_TrayX.min, trackData.c_TrayX.max, trackData.c_TrayTime - MusicTime > 0.5f ? 0.5f : 0.7f);
         }
         TrayX = Mathf.Lerp(TrayX, AimTrayX, UnityEngine.Time.deltaTime * 20f);
     }
     trackData.c_TrayTime = float.MaxValue;
 }
Пример #4
0
        private void Update()
        {
            MainRenderer.RendererEnable        = false;
            m_TrackTintRenderer.RendererEnable = false;
            m_TrayRenderer.RendererEnable      = false;
            ColSize       = null;
            LateTrackData = null;

            // Get TrackData
            int trackIndex = transform.GetSiblingIndex();
            var trackData  = !(Beatmap is null) && trackIndex < Beatmap.Tracks.Count ? Beatmap.Tracks[trackIndex] : null;

            if (trackData == null)
            {
                Update_Gizmos(false, trackIndex, 1f);
                gameObject.SetActive(false);
                return;
            }

            Time     = trackData.Time;
            Duration = trackData.Duration;

            // Get/Check Track/Stage
            var linkedStage = trackData.StageIndex >= 0 && trackData.StageIndex < Beatmap.Stages.Count ? Beatmap.Stages[trackData.StageIndex] : null;

            if (linkedStage == null)
            {
                Update_Gizmos(false, trackIndex, 1f);
                gameObject.SetActive(false);
                return;
            }

            Update_Gizmos(trackData._Active, trackIndex, trackData._SpeedMuti);

            if (!trackData._Active)
            {
                gameObject.SetActive(false);
                return;
            }

            LateTrackData = trackData;

            // Movement
            Update_Movement(linkedStage, trackData);
        }
Пример #5
0
        private void FixTrackLogic(Beatmap map, GeneData gene, Beatmap.Track track, int index)
        {
            var config = GetTrackConfig(gene, index);

            if (config.UseConfig)
            {
                bool tiling = GetStageConfig(gene, track.stageIndex).TileTrack;

                if (config.Time_Real.Active)
                {
                    track.time = (int)(config.Time_Real.Value * GetMusicDuration());
                }
                if (config.Duration_Real.Active)
                {
                    track.duration = (int)(config.Duration_Real.Value * map.GetDuration(0, track.stageIndex));
                }
                if (config.ItemType.Active)
                {
                    track.itemType = config.ItemType.Value;
                }
                if (config.X.Active && !tiling)
                {
                    track.x = config.X.Value;
                }
                if (config.Angle.Active)
                {
                    track.angle = config.Angle.Value;
                }
                if (config.Width.Active && !tiling)
                {
                    track.width = config.Width.Value;
                }
                if (config.Speed.Active)
                {
                    track.speed = config.Speed.Value;
                }
                if (config.StageIndex.Active)
                {
                    track.stageIndex = config.StageIndex.Value;
                }
                if (config.HasTray.Active)
                {
                    track.hasTray = config.HasTray.Value == 1;
                }
                if (!config.Motion_X)
                {
                    track.xs.Clear();
                }
                if (!config.Motion_Angle)
                {
                    track.angles.Clear();
                }
                if (!config.Motion_Width)
                {
                    track.widths.Clear();
                }
                if (!config.Motion_Color)
                {
                    track.colors.Clear();
                }
            }
        }
Пример #6
0
 private static bool GetTrackActive(Beatmap.Track data, int trackIndex) =>
 Solo.active ? trackIndex == Solo.track :
 MusicTime >= data.Time && MusicTime <= data.Time + data.Duration;
Пример #7
0
 public static float GetTrackAngle(Beatmap.Track data) => Mathf.LerpAngle(
     data.Angle + Evaluate(data.Angles, MusicTime - data.Time),
     0f,
     Abreast.value
     );
Пример #8
0
 public static float GetTrackAlpha(Beatmap.Track data) => MusicPlaying?Mathf.Clamp01(
     VanishDuration < FLOAT_GAP? 1f : Mathf.Min(MusicTime - data.Time, data.Time + data.Duration - MusicTime) / VanishDuration
     ) : 1f;
Пример #9
0
 public static Color GetTrackColor(Beatmap.Track data) => EvaluateColor(data.Colors, MusicTime - data.Time, PaletteColor(data.Color));
Пример #10
0
 public static float GetTrackX(Beatmap.Track data) => data.X + Evaluate(data.Xs, MusicTime - data.Time);
Пример #11
0
 public static float GetTrackWidth_Motion(Beatmap.Track data) => Evaluate(data.Widths, MusicTime - data.Time, 1f);
Пример #12
0
 public static float GetTrackWidth(Beatmap.Track data) => Mathf.Max(
     data.Width * Evaluate(data.Widths, MusicTime - data.Time, 1f), 0f
     );
Пример #13
0
 public static void UpdateCache(Beatmap.Track data, bool stageActive, int trackIndex, bool timerActive, float parentSpeed)
 {
     data._Active      = stageActive && GetTrackActive(data, trackIndex);
     data._SpeedMuti   = parentSpeed * data.Speed;
     data._TimerActive = timerActive;
 }
Пример #14
0
        private void Update_Movement(Beatmap.Stage linkedStage, Beatmap.Track linkedTrack, Beatmap.Note noteData, Beatmap.Note linkedNote)
        {
            var   stagePos    = Stage.GetStagePosition(linkedStage, linkedTrack.StageIndex);
            float stageWidth  = Stage.GetStageWidth(linkedStage);
            float stagePivotY = Stage.GetStagePivotY(linkedStage);
            float stageHeight = Stage.GetStageHeight(linkedStage);
            float stageRotZ   = Stage.GetStageWorldRotationZ(linkedStage);
            float trackX      = Track.GetTrackX(linkedTrack);
            float trackWidth  = Track.GetTrackWidth(linkedTrack);
            float trackAngle  = Track.GetTrackAngle(linkedTrack);
            float gameOffset  = GetGameDropOffset(noteData.TimingID, noteData._SpeedMuti);
            float noteY01     = MusicTime < Time ? (noteData._NoteDropStart - gameOffset) : 0f;
            float noteSizeY   = noteData._NoteDropEnd - gameOffset - noteY01;

            var(zoneMin, zoneMax, zoneSize, _) = ZoneMinMax;
            bool  isLink      = linkedNote != null;
            bool  activeSelf  = GetNoteActive(noteData, null, noteData._AppearTime);
            float alpha       = Stage.GetStageAlpha(linkedStage) * Track.GetTrackAlpha(linkedTrack) * Mathf.Clamp01(16f - noteY01 * 16f);
            bool  highlighing = MusicTime > Time && MusicTime < Time + Duration;
            float noteZ       = GetNoteZ(noteData);
            var   tint        = highlighing ? HighlightTints[(int)SkinType.Note] : WHITE_32;

            if (TintNote)
            {
                tint *= linkedTrack.c_Tint;
            }

            // Movement
            var noteZonePos = Track.LocalToZone(
                noteData.X, noteY01, noteZ,
                stagePos, stageWidth, stageHeight, stagePivotY, stageRotZ,
                trackX, trackWidth, trackAngle
                );
            var noteRot      = Quaternion.Euler(0f, 0f, stageRotZ) * Quaternion.Euler(trackAngle, 0f, 0f);
            var noteWorldPos = Util.Vector3Lerp3(zoneMin, zoneMax, noteZonePos.x, noteZonePos.y, noteZonePos.z);

            // Size
            var     noteSize          = GetRectSize(SkinType.Note, noteData.ItemType);
            float   minHeight         = GetMinHeight(SkinType.Note, noteData.ItemType);
            float   noteScaleX        = noteSize.x < 0f ? stageWidth * trackWidth * noteData.Width : noteSize.x;
            float   noteScaleY_scaler = Mathf.Max(noteSizeY * stageHeight, minHeight);
            float   noteScaleY        = Mathf.Max(noteSizeY * stageHeight + minHeight, 0f);
            Vector3 zoneNoteScale     = new Vector3(
                zoneSize * noteScaleX,
                zoneSize * noteScaleY,
                1f
                );
            Vector3 zoneNoteScale_scaler = new Vector3(
                zoneSize * noteScaleX,
                zoneSize * noteScaleY_scaler,
                1f
                );

            // Transform
            transform.position  = Late_NoteWorldPos = noteWorldPos;
            ColRot              = MainRenderer.transform.rotation = noteRot;
            ColSize             = MainRenderer.transform.localScale = zoneNoteScale;
            m_Scaler.localScale = zoneNoteScale_scaler;
            m_Scaler.rotation   = noteRot;

            // Renderer
            MainRenderer.RendererEnable = !isLink || activeSelf;
            MainRenderer.ItemType       = noteData.ItemType;
            MainRenderer.Tint           = tint;
            MainRenderer.Alpha          = alpha;
            MainRenderer.Duration       = Duration;
            MainRenderer.Scale          = new Vector2(noteScaleX, noteScaleY);
            MainRenderer.SetSortingLayer(
                Duration <= FLOAT_GAP ? SortingLayerID_Note : SortingLayerID_Note_Hold,
                GetSortingOrder()
                );
        }