private static TrackCameras InitCameras() { var data = iRacing.GetDataFeed().First(); var trackName = data.SessionData.WeekendInfo.TrackDisplayName; var trackCameras = new TrackCameras(); foreach (var camera in data.SessionData.CameraInfo.Groups) trackCameras.Add(new TrackCamera { TrackName = trackName, CameraName = camera.GroupName }); return trackCameras; }
private static TrackCameras InitCameras() { var data = iRacing.GetDataFeed().First(); var trackName = data.SessionData.WeekendInfo.TrackDisplayName; var trackCameras = new TrackCameras(); foreach (var camera in data.SessionData.CameraInfo.Groups) { trackCameras.Add(new TrackCamera { TrackName = trackName, CameraName = camera.GroupName }); } return(trackCameras); }
public ReplayControl(SessionData sessionData, Incidents incidents, RemovalEdits removalEdits, TrackCameras trackCameras) { var cameras = trackCameras.Where(tc => tc.TrackName == sessionData.WeekendInfo.TrackDisplayName).ToArray(); TraceInfo.WriteLineIf(cameras.Count() <= 0, "Track Cameras not defined for {0}", sessionData.WeekendInfo.TrackDisplayName); Debug.Assert(cameras.Count() > 0, "Track Cameras not defined for {0}".F(sessionData.WeekendInfo.TrackDisplayName)); foreach (var tc in cameras) tc.CameraNumber = (short)sessionData.CameraInfo.Groups.First(g => g.GroupName.ToLower() == tc.CameraName.ToLower()).GroupNum; var camera = cameras.First(tc => tc.IsRaceStart); var cameraControl = new CameraControl(cameras); cameraControl.CameraOnPositon(1, camera.CameraNumber); var battleMarker = removalEdits.For(InterestState.Battle); var restartMarker = removalEdits.For(InterestState.Restart); var ruleLastSectors = new RuleLastLapPeriod(cameraControl, removalEdits); var ruleUnlimitedIncident = new RuleIncident(cameraControl, removalEdits, incidents, 999); var ruleLimitedIncident = new RuleIncident(cameraControl, removalEdits, incidents, Settings.Default.IgnoreIncidentsBelowPosition); var ruleFirstSectors = new RuleFirstLapPeriod(cameraControl, removalEdits); var rulePaceLaps = new RulePaceLaps(cameraControl, restartMarker, battleMarker); var ruleBattle = new RuleBattle(cameraControl, battleMarker, Settings.Default.CameraStickyPeriod, Settings.Default.BattleStickyPeriod, Settings.Default.BattleGap, Settings.Default.BattleFactor2); ruleRandom = new RuleRandomDriver(cameraControl, sessionData, Settings.Default.CameraStickyPeriod); var ruleForFirstSectors = Settings.Default.IgnoreIncidentsDuringRaceStart ? ruleFirstSectors : ruleFirstSectors.WithVeto(ruleUnlimitedIncident); directionRules = new IDirectionRule[] { ruleLastSectors, ruleForFirstSectors, rulePaceLaps.WithVeto(ruleUnlimitedIncident.WithVeto(ruleLastSectors)), ruleBattle.WithVeto(ruleLimitedIncident.WithVeto(ruleLastSectors)), ruleUnlimitedIncident.WithVeto(ruleLastSectors), ruleRandom.WithVeto(ruleLastSectors) }; currentRule = directionRules[0]; }
public IRacingReplay WithCameras(TrackCameras trackCameras) { this.trackCameras = trackCameras; return this; }
void SetCameraDropDown(System.Collections.Generic.IEnumerable<TrackCamera> cameras, TrackCameras._CameraSelection specialCamera, string defaultName, ComboBox dropDown) { if (specialCamera[TrackName] == null && cameras.Any(tc => tc.CameraName == defaultName)) dropDown.SelectedItem = defaultName; else dropDown.SelectedItem = specialCamera[TrackName]; }
public IRacingReplay WithCameras(TrackCameras trackCameras) { this.trackCameras = trackCameras; return(this); }
internal void _CaptureRaceTest(Action <string> onComplete, IEnumerable <DataSample> samples) { var overlayData = new OverlayData(); var removalEdits = new RemovalEdits(overlayData.RaceEvents); var commentaryMessages = new CommentaryMessages(overlayData); var videoCapture = new VideoCapture(); var recordPitStop = new RecordPitStop(commentaryMessages); var fastestLaps = new RecordFastestLaps(overlayData); var replayControl = new ReplayControl(samples.First().SessionData, incidents, removalEdits, TrackCameras); var sessionDataCapture = new SessionDataCapture(overlayData); var captureLeaderBoardEveryHalfSecond = new SampleFilter(TimeSpan.FromSeconds(0.5), new CaptureLeaderBoard(overlayData, commentaryMessages, removalEdits).Process); var captureCamDriverEveryQuaterSecond = new SampleFilter(TimeSpan.FromSeconds(0.25), new CaptureCamDriver(overlayData).Process); var captureCamDriverEvery4Seconds = new SampleFilter(TimeSpan.FromSeconds(4), new LogCamDriver().Process); TraceDebug.WriteLine("Cameras:"); TraceDebug.WriteLine(TrackCameras.ToString()); ApplyFirstLapCameraDirection(samples, replayControl); samples = samples .VerifyReplayFrames() .WithCorrectedPercentages() .WithCorrectedDistances() .WithFastestLaps() .WithFinishingStatus() .WithPitStopCounts() .TakeUntil(3.Seconds()).Of(d => d.Telemetry.LeaderHasFinished && d.Telemetry.RaceCars.All(c => c.HasSeenCheckeredFlag || c.HasRetired || c.TrackSurface != TrackLocation.OnTrack)) .TakeUntil(3.Seconds()).AfterReplayPaused(); if (shortTestOnly) { samples = samples.AtSpeed(Settings.Default.TimingFactorForShortTest); Settings.AppliedTimingFactor = 1.0 / Settings.Default.TimingFactorForShortTest; } videoCapture.Activate(workingFolder); var startTime = DateTime.Now; overlayData.CapturedVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); foreach (var data in samples) { var relativeTime = DateTime.Now - startTime; replayControl.Process(data); sessionDataCapture.Process(data); captureLeaderBoardEveryHalfSecond.Process(data, relativeTime); captureCamDriverEveryQuaterSecond.Process(data, relativeTime); recordPitStop.Process(data, relativeTime); fastestLaps.Process(data, relativeTime); removalEdits.Process(data, relativeTime); captureCamDriverEvery4Seconds.Process(data, relativeTime); } var files = videoCapture.Deactivate(); removalEdits.Stop(); var overlayFile = SaveOverlayData(overlayData, files); //terminate iRacing after video capture completed try { //ToBe added: Option to select/deselect termination of iRacing after capturing video in new settings Dialog Process[] iRacingProc = Process.GetProcessesByName("iRacingSim64DX11"); iRacingProc[0].Kill(); } catch { throw new Exception("Could not terminate iRacing Simulator".F(workingFolder)); } iRacing.Replay.SetSpeed(0); AltTabBackToApp(); if (files.Count == 0) { throw new Exception("Unable to find video files in '{0}' - possible wrong working folder".F(workingFolder)); } _WithOverlayFile(overlayFile); onComplete(overlayFile); }
public ReplayControl(SessionData sessionData, Incidents incidents, RemovalEdits removalEdits, TrackCameras trackCameras) { var cameras = trackCameras.Where(tc => tc.TrackName == sessionData.WeekendInfo.TrackDisplayName).ToArray(); TraceInfo.WriteLineIf(cameras.Count() <= 0, "Track Cameras not defined for {0}", sessionData.WeekendInfo.TrackDisplayName); Debug.Assert(cameras.Count() > 0, "Track Cameras not defined for {0}".F(sessionData.WeekendInfo.TrackDisplayName)); foreach (var tc in cameras) { tc.CameraNumber = (short)sessionData.CameraInfo.Groups.First(g => g.GroupName.ToLower() == tc.CameraName.ToLower()).GroupNum; } var camera = cameras.First(tc => tc.IsRaceStart); //var cameraControl = new CameraControl(cameras); cameraControl = new CameraControl(cameras); cameraControl.CameraOnPositon(1, camera.CameraNumber); var battleMarker = removalEdits.For(InterestState.Battle); var restartMarker = removalEdits.For(InterestState.Restart); var ruleLastSectors = new RuleLastLapPeriod(cameraControl, removalEdits); var ruleUnlimitedIncident = new RuleIncident(cameraControl, removalEdits, incidents, 999); var ruleLimitedIncident = new RuleIncident(cameraControl, removalEdits, incidents, Settings.Default.IgnoreIncidentsBelowPosition); var ruleFirstSectors = new RuleFirstLapPeriod(cameraControl, removalEdits); var rulePaceLaps = new RulePaceLaps(cameraControl, restartMarker, battleMarker); var ruleBattle = new RuleBattle(cameraControl, battleMarker, Settings.Default.CameraStickyPeriod, Settings.Default.BattleStickyPeriod, Settings.Default.BattleGap, Settings.Default.BattleFactor2); ruleRandom = new RuleRandomDriver(cameraControl, sessionData, Settings.Default.CameraStickyPeriod); var ruleForFirstSectors = Settings.Default.IgnoreIncidentsDuringRaceStart ? ruleFirstSectors : ruleFirstSectors.WithVeto(ruleUnlimitedIncident); directionRules = new IDirectionRule[] { ruleLastSectors, ruleForFirstSectors, rulePaceLaps.WithVeto(ruleUnlimitedIncident.WithVeto(ruleLastSectors)), ruleBattle.WithVeto(ruleLimitedIncident.WithVeto(ruleLastSectors)), ruleUnlimitedIncident.WithVeto(ruleLastSectors), ruleRandom.WithVeto(ruleLastSectors) }; currentRule = directionRules[0]; }
internal void _CaptureRaceTest(Action <string> onComplete, IEnumerable <DataSample> samples) { //identify wheather highlights video only is selected and OBS pause/resume can be used (to be implemented) if (bRecordUsingPauseResume) { //Retrieve list of raceEvents selected depending on the duration of the highlight video var totalRaceEvents = RaceEventExtension.GetInterestingRaceEvents(overlayData.RaceEvents.ToList()); ApplyFirstLapCameraDirection(samples, replayControl); //Record the selected race events into a highlight video raceVideo.Activate(workingFolder); //Active video-capturing and send start command to recording software. OverlayData.CamDriver curCamDriver = overlayData.CamDrivers.First(); //start thread to control / switch cameras while recording ReplayControl.cameraControl.ReplayCameraControlTask(overlayData); //ReplayControl.cameraControl.CameraOnDriver(short.Parse(curCamDriver.CurrentDriver.CarNumber), (short)curCamDriver.camGroupNumber); //cycle through all raceEvents selected for the highlight video and record them (REMARK: Camera switching not implemented yet) foreach (var raceEvent in totalRaceEvents) { TraceInfo.WriteLine("ADV_RECORDING: Type: {0} | Durations-Span: {1} | ".F(raceEvent.GetType(), raceEvent.Duration)); //jump to selected RaceEvent in iRacing Replay int framePositionInRace = raceStartFrameNumber + (int)Math.Round(raceEvent.StartTime * 60.0); iRacing.Replay.MoveToFrame(raceStartFrameNumber + (int)Math.Round(raceEvent.StartTime * 60.0)); iRacing.Replay.SetSpeed((int)replaySpeeds.normal); //start iRacing Replay at selected position raceVideo.Resume(); //resume recording TraceDebug.WriteLine("Recording Race-Event. Frame-Position: {0} | Duration: {1} ms".F(framePositionInRace, 1000 * raceEvent.Duration)); Thread.Sleep((int)(1000 * raceEvent.Duration)); //pause thread until scene is fully recorded. raceVideo.Pause(); //pause recording software before jumping to new position in iRacing Replay } TraceDebug.WriteLine("Video Capture of Race-Events completed"); raceVideo.Stop(); } else //Code to be removed after being able to implment working solution where analysis phase and replay-capture phase are distinct processes. //use local variables for original code instead of global variables introduced to support full analysis in analysis-phase { var overlayData = new OverlayData(); var removalEdits = new RemovalEdits(overlayData.RaceEvents); var commentaryMessages = new CommentaryMessages(overlayData); var recordPitStop = new RecordPitStop(commentaryMessages); var fastestLaps = new RecordFastestLaps(overlayData); var replayControl = new ReplayControl(samples.First().SessionData, incidents, removalEdits, TrackCameras); var sessionDataCapture = new SessionDataCapture(overlayData); var captureLeaderBoardEveryHalfSecond = new SampleFilter(TimeSpan.FromSeconds(0.5), new CaptureLeaderBoard(overlayData, commentaryMessages, removalEdits).Process); var captureCamDriverEveryQuaterSecond = new SampleFilter(TimeSpan.FromSeconds(0.25), new CaptureCamDriver(overlayData).Process); var captureCamDriverEvery4Seconds = new SampleFilter(TimeSpan.FromSeconds(4), new LogCamDriver().Process); TraceDebug.WriteLine("Cameras:"); TraceDebug.WriteLine(TrackCameras.ToString()); var videoCapture = new VideoCapture(); ApplyFirstLapCameraDirection(samples, replayControl); samples = samples .VerifyReplayFrames() .WithCorrectedPercentages() .WithCorrectedDistances() .WithFastestLaps() .WithFinishingStatus() .WithPitStopCounts() .TakeUntil(3.Seconds()).Of(d => d.Telemetry.LeaderHasFinished && d.Telemetry.RaceCars.All(c => c.HasSeenCheckeredFlag || c.HasRetired || c.TrackSurface != TrackLocation.OnTrack)) .TakeUntil(3.Seconds()).AfterReplayPaused(); if (shortTestOnly) { samples = samples.AtSpeed(Settings.Default.TimingFactorForShortTest); Settings.AppliedTimingFactor = 1.0 / Settings.Default.TimingFactorForShortTest; } videoCapture.Activate(workingFolder); //Start video capturing FileName will be given by recording software. var startTime = DateTime.Now; overlayData.CapturedVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); foreach (var data in samples) { var relativeTime = DateTime.Now - startTime; TraceDebug.WriteLine("Recording at time: {0}", relativeTime); replayControl.Process(data); sessionDataCapture.Process(data); captureLeaderBoardEveryHalfSecond.Process(data, relativeTime); captureCamDriverEveryQuaterSecond.Process(data, relativeTime); recordPitStop.Process(data, relativeTime); fastestLaps.Process(data, relativeTime); removalEdits.Process(data, relativeTime); captureCamDriverEvery4Seconds.Process(data, relativeTime); } var files = videoCapture.Deactivate(); //Stop video capturing - returns list with "guessed" filename. Filenmae being different from replay-script due to different time stamp. //investigate whether renaming of video file is necessary. removalEdits.Stop(); var overlayFile = SaveOverlayData(overlayData, files); iRacing.Replay.SetSpeed(0); AltTabBackToApp(); if (files.Count == 0) { throw new Exception("Unable to find video files in '{0}' - possible wrong working folder".F(workingFolder)); } _WithOverlayFile(overlayFile); onComplete(overlayFile); } //terminate iRacing after video capture completed to free up CPU resources if (bCloseiRacingAfterRecording) { try { //To be added: Option to select/deselect termination of iRacing after capturing video in new settings Dialog Process[] iRacingProc = Process.GetProcessesByName("iRacingSim64DX11"); iRacingProc[0].Kill(); } catch { throw new Exception("Could not terminate iRacing Simulator".F(workingFolder)); } } }