public void LoadDynamic(bool firstPass, bool incrementalLoading) { #if !DEBUG try { #endif EventBreak eb = eventBreaks.Find(e => e.StartTime > AudioEngine.Time); int loadPoint = incrementalLoading && eb != null ? eb.EndTime : Int32.MaxValue; if (firstPass) { Sort(); //run this once after loading. if (showStoryboard || !incrementalLoading) { //First load is done on main thread. foreach (Event e in events) { if (e.Sprite != null) { if (e.Sprite.Transformations.Count != 0 && e.Sprite.Transformations[0].Time1 > loadPoint) { break; } if (!e.Sprite.Bypass || !incrementalLoading) { e.Load(); } } dynamicLoadIndex++; } } InitialLoadComplete = true; if (incrementalLoading) { dynamicLoadIndex = 0; } else { dynamicLoadCompletedIndex = dynamicLoadIndex; } } else if (dynamicLoadIndex < events.Count) { if (!InitialLoadComplete) { return; } // Wait for the previous loading task to be completed // to avoid queuing them faster than they are processed if (dynamicLoadCompletedIndex < dynamicLoadIndex) { return; } // Load events faster in the middle of a break bool canLoadMoreEvents = BreakCurrent != null && BreakCurrent.StartTime + 1000 < AudioEngine.Time && AudioEngine.Time < BreakCurrent.EndTime - 1000; bool hasLoadableEvent = false; int startIndex = dynamicLoadIndex; int endIndex = startIndex; for (; endIndex < events.Count; endIndex++) { Event e = events[endIndex]; // Skip events that don't need to be loaded if (e.Loaded || e.Sprite == null || e.Sprite.Transformations.Count == 0) { if (!hasLoadableEvent) { startIndex++; } continue; } hasLoadableEvent = true; // Ensure events that are displayed or will be in the next seconds are loaded if (e.StartTime < AudioEngine.Time + (canLoadMoreEvents ? 10000 : 2000)) { continue; } // Stop loading when it reaches the load point if (e.StartTime > loadPoint) { break; } // Load some events each time if (endIndex - startIndex >= (canLoadMoreEvents ? 4 : 1)) { break; } } int loadCount = endIndex - startIndex; if (hasLoadableEvent && loadCount > 0) { #if DEBUG if (loadCount > 4) { Debug.Print("Dynamically loading " + loadCount + " event(s)."); } #endif // Dynamic loads can be shuffled to a second thread. GameBase.RunBackgroundThread(delegate { for (int i = startIndex; i < endIndex; i++) { Event e = events[i]; if (!e.Loaded) { e.Load(); } } dynamicLoadCompletedIndex = endIndex; }); } else { dynamicLoadCompletedIndex = endIndex; } dynamicLoadIndex = endIndex; #if DEBUG if (dynamicLoadIndex == events.Count) { Debug.Print("Finished loading all events."); } #endif } dynamicLoadIndex = Math.Min(dynamicLoadIndex, events.Count); #if !DEBUG } catch { //ensure we continue loading the next events if anything bad happens loading a single event. dynamicLoadIndex++; } #endif }
internal void Update() { bool breakMode = false; if (GameBase.Mode == Modes.Play && AudioEngine.Time < HitObjectManager.hitObjects[0].StartTime - HitObjectManager.PreEmpt) { breakMode = true; } for (int i = 0; i < eventBreaks.Count; i++) { EventBreak e = eventBreaks[i]; if (AudioEngine.Time >= e.StartTime && AudioEngine.Time <= e.EndTime) { breakMode = true; BreakCurrent = e; break; } } if (GameBase.Mode == Modes.Play && Player.Passing != passingCurrent) { passingCurrent = Player.Passing; for (int i = 0; i < storyLayerSets[(int)StoryLayer.Failing].Count; i++) { Event e = storyLayerSets[(int)StoryLayer.Failing][i]; switch (e.Type) { case EventTypes.Sprite: case EventTypes.Animation: if (Player.Passing) { spriteManagerFG.Remove(e.Sprite); } else { spriteManagerFG.Add(e.Sprite); } break; case EventTypes.Sample: if (Player.Passing) { AudioEngine.SampleEvents.Remove(((EventSample)e).SampleCache); } else { AudioEngine.SampleEvents.Add(((EventSample)e).SampleCache); } break; } } if (!firstRun) { for (int i = 0; i < storyLayerSets[(int)StoryLayer.Passing].Count; i++) { Event e = storyLayerSets[(int)StoryLayer.Passing][i]; switch (e.Type) { case EventTypes.Sprite: case EventTypes.Animation: if (Player.Passing) { spriteManagerFG.Add(e.Sprite); } else { spriteManagerFG.Remove(e.Sprite); } break; case EventTypes.Sample: if (Player.Passing) { AudioEngine.SampleEvents.Add(((EventSample)e).SampleCache); } else { AudioEngine.SampleEvents.Remove(((EventSample)e).SampleCache); } break; } } } firstRun = false; } BreakMode = breakMode; if (!breakMode) { BreakCurrent = null; } //foregroundTexture.CurrentScale = GameBase.s_fadeScreen.CurrentScale; if (GameBase.Mode == Modes.Play && SkinManager.Current.SpinnerFadePlayfield && Player.IsSpinning && spriteManagerBG.Blackness < 1) { spriteManagerBG.Blackness += 0.04F; spriteManagerFG.Blackness += 0.04F; } else if (spriteManagerBG.Blackness > 0.3F) { spriteManagerBG.Blackness -= 0.04F; spriteManagerFG.Blackness -= 0.04F; } else if (!breakMode && spriteManagerBG.Blackness < 0.25F) { spriteManagerBG.Blackness += 0.04F; spriteManagerFG.Blackness += 0.04F; if (GameBase.Mode == Modes.Play && breakTop.TagNumeric == 1) { breakTop.TagNumeric = 0; breakTop.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, GameBase.Time - 1, GameBase.Time + 200)); breakBottom.Transformations.Add( new Transformation(TransformationType.Fade, 1, 0, GameBase.Time - 1, GameBase.Time + 200)); } } else if (breakMode && (spriteManagerBG.Blackness > 0 || breakTop.TagNumeric == 0)) { spriteManagerBG.Blackness -= 0.04F; spriteManagerFG.Blackness -= 0.04F; if (GameBase.Mode == Modes.Play && breakTop.TagNumeric == 0) { breakTop.TagNumeric = 1; breakTop.Transformations.Add( new Transformation(TransformationType.Fade, 0, 1, GameBase.Time - 1, GameBase.Time + 200)); breakBottom.Transformations.Add( new Transformation(TransformationType.Fade, 0, 1, GameBase.Time - 1, GameBase.Time + 200)); } } VideoPlaying = false; //Handle video playback. for (int i = 0; i < videoSprites.Count; i++) { pVideo v = videoSprites[i]; if (AudioEngine.AudioState == AudioEngine.AudioStates.Playing || AudioEngine.Time < 0) { VideoPlaying = true; if (!v.Triggered && AudioEngine.Time >= v.StartTime) { v.Start(); v.SeekToCurrent(); } } else { if (v.Triggered) { v.Pause(); } } if (v.Triggered) { if ((Math.Abs(v.video.offset) > 1000) || (v.video.offset != -1 && Math.Abs(v.video.lastSample - (AudioEngine.Time - v.StartTimeOffset)) > 500)) { v.SeekToCurrent(); } } } }
internal void Update() { float targetAlpha = backgroundIsReady && showStoryboard ? 1 : 0; float maskingTargetAlpha = WidescreenStoryboard ? 0 : targetAlpha; if (GameBase.Mode == OsuModes.Edit) { spriteManagerFG.Alpha = spriteManagerBG.Alpha = targetAlpha; spriteManagerMasking.Alpha = maskingTargetAlpha; } else { if (spriteManagerFG.Alpha != targetAlpha) { spriteManagerBG.Alpha = spriteManagerFG.Alpha = OsuMathHelper.Clamp(spriteManagerFG.Alpha + ((targetAlpha < spriteManagerFG.Alpha ? -0.07f : 0.07f) * (float)GameBase.FrameRatio), 0, 1); } if (spriteManagerMasking.Alpha != maskingTargetAlpha) { spriteManagerMasking.Alpha = OsuMathHelper.Clamp(spriteManagerMasking.Alpha + ((maskingTargetAlpha < spriteManagerMasking.Alpha ? -0.07f : 0.07f) * (float)GameBase.FrameRatio), 0, 1); } } bool breakMode = false; if (hitObjectManager.hitObjectsCount > 0) { if (beforeGameplay && AudioEngine.Time > hitObjectManager.EarliestHitObject.HittableStartTime - hitObjectManager.PreEmpt) { beforeGameplay = false; } else if (!afterGameplay && AudioEngine.Time > hitObjectManager.LatestHitObject.HittableEndTime + hitObjectManager.HitWindow50) { afterGameplay = true; } } else { beforeGameplay = true; afterGameplay = false; } if (GameBase.Mode == OsuModes.Play && (beforeGameplay || afterGameplay)) { breakMode = true; } for (int i = 0; i < eventBreaks.Count; i++) { EventBreak e = eventBreaks[i]; if (AudioEngine.Time < e.StartTime || AudioEngine.Time > e.EndTime) { continue; } breakMode = true; BreakCurrent = e; break; } if (GameBase.Mode == OsuModes.Play && Player.Passing != passingCurrent) { passingCurrent = Player.Passing; if (passingCurrent) { InvokeOnPassing(); } else { InvokeOnFailing(); } //Sprites for (int i = 0; i < storyLayerSprites[(int)StoryLayer.Fail].Count; i++) { Event e = storyLayerSprites[(int)StoryLayer.Fail][i]; e.Sprite.Bypass = passingCurrent; } //Samples for (int i = 0; i < storyLayerSamples[(int)StoryLayer.Fail].Count; i++) { EventSample e = (EventSample)storyLayerSamples[(int)StoryLayer.Fail][i]; if (passingCurrent) { AudioEngine.SampleEvents.Remove(e.SampleCache); } else { AudioEngine.SampleEvents.Add(e.SampleCache); } } if (!firstRun) { //Sprites for (int i = 0; i < storyLayerSprites[(int)StoryLayer.Pass].Count; i++) { Event e = storyLayerSprites[(int)StoryLayer.Pass][i]; e.Sprite.Bypass = !passingCurrent; } //Samples for (int i = 0; i < storyLayerSamples[(int)StoryLayer.Pass].Count; i++) { EventSample e = (EventSample)storyLayerSamples[(int)StoryLayer.Pass][i]; if (passingCurrent) { AudioEngine.SampleEvents.Add(e.SampleCache); } else { AudioEngine.SampleEvents.Remove(e.SampleCache); } } } firstRun = false; } if (GameBase.Mode == OsuModes.Play && Player.Loaded && breakMode != BreakMode && !InputManager.ReplayMode) { //toggles go here. are only run on switching mode. if (!breakMode) { NotificationManager.ClearMessageMassive(); //Clear any displaying messages when gameplay starts. } } BreakMode = breakMode; if (!breakMode) { BreakCurrent = null; } UpdateVideo(); UpdateDimming(); if (GameBase.SixtyFramesPerSecondFrame && showStoryboard) { LoadDynamic(false, true); } }