public bool IsActive(DataSample data) { var state = GetBattlePosition(data); switch(state.State) { case BattlePosition.Started: directionAction = () => { adjustedCamera = null; SwitchToBattle(data, state.Driver, establishingShot: true); editMarker.Start(data.Telemetry.Positions[battleLeader.CarIdx]); }; return true; case BattlePosition.Inside: directionAction = () => { UpdateBattleCamera(data); UpdateCameraIfOvertake(data); }; return true; case BattlePosition.Finished: directionAction = () => editMarker.Stop(); return true; case BattlePosition.Outside: directionAction = () => { }; return false; } throw new Exception("Invalid Battle state {0}".F(state)); }
public TrackCamera FindACamera(IEnumerable<CameraAngle> cameraAngles, TrackCamera adjustedCamera = null, int adjustRatioBy = 1) { if (adjustedCamera != null) TraceInfo.WriteLine("Adjusting ratio for camera {0} by 1/{1}", adjustedCamera.CameraName, adjustRatioBy); var rand = 0; var offset = 0; var camera = defaultCamera; var selectableCameras = cameras.Where(x => cameraAngles.Contains(x.CameraAngle)); int total = selectableCameras.Sum(x => x == adjustedCamera ? x.Ratio / adjustRatioBy: x.Ratio); // If no camera within specified cameraAngles has non zero ratio select among all if (total == 0) { selectableCameras = cameras; rand = random.Next(100); } else rand = random.Next(total); foreach (var tc in selectableCameras) { var ratio = tc == adjustedCamera ? tc.Ratio / adjustRatioBy : tc.Ratio; if (rand < ratio + offset) { camera = tc; break; } offset += ratio; } return camera; }
public bool IsActive(DataSample data) { var state = GetBattlePosition(data); switch (state.State) { case BattlePosition.Started: directionAction = () => { adjustedCamera = null; SwitchToBattle(data, state.Driver, establishingShot: true); editMarker.Start(data.Telemetry.Positions[battleLeader.CarIdx]); }; return(true); case BattlePosition.Inside: directionAction = () => { UpdateBattleCamera(data); UpdateCameraIfOvertake(data); }; return(true); case BattlePosition.Finished: directionAction = () => editMarker.Stop(); return(true); case BattlePosition.Outside: directionAction = () => { }; return(false); } throw new Exception("Invalid Battle state {0}".F(state)); }
void UpdateBattleCamera(DataSample data) { if (data.Telemetry.SessionTimeSpan <= cameraChangeTime) { return; } cameraChangeTime = data.Telemetry.SessionTimeSpan + this.battleCameraChangePeriod; var otherCar = ChangeCarForCamera(data, battleFollower); var cameraSet = otherCar == null ? new [] { CameraAngle.LookingInfrontOfCar, CameraAngle.LookingAtCar } : new [] { CameraAngle.LookingInfrontOfCar, CameraAngle.LookingBehindCar, CameraAngle.LookingAtCar }; camera = cameraControl.FindACamera(cameraSet, adjustedCamera, 2); adjustedCamera = null; if (camera.CameraAngle == CameraAngle.LookingBehindCar) { TraceInfo.WriteLine("{0} Changing to forward car, with reverse camera", data.Telemetry.SessionTimeSpan); car = otherCar; } else { car = battleFollower; } TraceInfo.WriteLine("{0} Changing camera to driver: {1}; camera: {2}", data.Telemetry.SessionTimeSpan, car.UserName, camera.CameraName); cameraControl.CameraOnDriver(car.CarNumberRaw, camera.CameraNumber); }
public CameraControl(TrackCamera[] cameras) { this.cameras = cameras; this.random = new Random(); defaultCamera = cameras.First(tc => tc.IsRaceStart); }
public CameraControl(TrackCamera[] cameras) { this.cameras = cameras; this.random = new Random(); defaultCamera = cameras.First(tc => tc.IsRaceStart); }
/// <summary> /// Creates a new background presenter for the main menu /// </summary> /// <param name="engine">The engine to use for rendering</param> /// <param name="universe">The universe to display</param> public MenuPresenter(Engine engine, Universe universe) : base(engine, universe) { #region Sanity checks if (engine == null) { throw new ArgumentNullException(nameof(engine)); } if (universe == null) { throw new ArgumentNullException(nameof(universe)); } #endregion // Target a point slightly above the center of the map and then rotate const float rotationHeight = 150, rotationRadius = 750; // Map X = Engine +X // Map Y = Engine -Z var cameraTarget = new DoubleVector3( Universe.Terrain.Center.X, rotationHeight, -Universe.Terrain.Center.Y); var mainCamera = new TrackCamera(rotationRadius, rotationRadius) { Target = cameraTarget, HorizontalRotation = 0, VerticalRotation = 15, Name = "Menu" }; View = new View(Scene, mainCamera) { Name = "Menu", BackgroundColor = universe.FogColor }; View.PreRender += RotateCamera; }
public void Direct(DataSample data) { if (isWatchingRandomDriver) return; isWatchingRandomDriver = true; finishWatchingRandomDriverAt = data.Telemetry.SessionTimeSpan + stickyTime; camera = cameraControl.FindACamera(new[] { CameraAngle.LookingInfrontOfCar, CameraAngle.LookingAtCar, CameraAngle.LookingAtTrack }); car = FindADriver(data); TraceInfo.WriteLine("{0} Changing camera to random driver: {1}; camera: {2}", data.Telemetry.SessionTimeSpan, car.UserName, camera.CameraName); cameraControl.CameraOnDriver((short)car.CarNumberRaw, camera.CameraNumber); }
public void Direct(DataSample data) { if (isWatchingRandomDriver) { return; } isWatchingRandomDriver = true; finishWatchingRandomDriverAt = data.Telemetry.SessionTimeSpan + stickyTime; camera = cameraControl.FindACamera(new[] { CameraAngle.LookingInfrontOfCar, CameraAngle.LookingAtCar, CameraAngle.LookingAtTrack }); car = FindADriver(data); TraceInfo.WriteLine("{0} Changing camera to random driver: {1}; camera: {2}", data.Telemetry.SessionTimeSpan, car.UserName, camera.CameraName); cameraControl.CameraOnDriver((short)car.CarNumberRaw, camera.CameraNumber); }
private void InitializeScene() { var scene = new Scene { Positionables = { Model.Sphere(Engine, XTexture.Get(Engine, "flag.png"), slices: 50, stacks: 50) } }; _camera = new TrackCamera { VerticalRotation = 20 }; var view = new View(scene, _camera) { BackgroundColor = Color.CornflowerBlue }; Engine.Views.Add(view); }
void SwitchToBattle(DataSample data, CarDetails newFollower, bool establishingShot = false) { if (establishingShot) { TraceInfo.WriteLine("{0} New Battle started - Searching for a LookingAtCar camera", data.Telemetry.SessionTimeSpan); } var cameraTypes = establishingShot ? new[] { CameraAngle.LookingAtCar } : new[] { CameraAngle.LookingInfrontOfCar, CameraAngle.LookingBehindCar, CameraAngle.LookingAtCar }; var newFollowerPosition = newFollower.Car(data).Position; battleLeader = data.Telemetry.Cars.First(c => c.Position == newFollowerPosition - 1).Details; battleFollower = newFollower; car = newFollower; camera = cameraControl.FindACamera(cameraTypes, adjustedCamera, 2); if (establishingShot) { adjustedCamera = camera; } else { adjustedCamera = null; } if (camera.CameraAngle == CameraAngle.LookingBehindCar) { TraceInfo.WriteLine("{0} Changing to forward car, with reverse camera", data.Telemetry.SessionTimeSpan); car = battleLeader; } TraceInfo.WriteLine("{0} Changing camera to driver: {1}; camera: {2}; within {3}", data.Telemetry.SessionTimeSpan, car.UserName, camera.CameraName, battleGap); cameraControl.CameraOnDriver(car.CarNumberRaw, camera.CameraNumber); }
public TrackCamera FindACamera(IEnumerable <CameraAngle> cameraAngles, TrackCamera adjustedCamera = null, int adjustRatioBy = 1) { if (adjustedCamera != null) { TraceInfo.WriteLine("Adjusting ratio for camera {0} by 1/{1}", adjustedCamera.CameraName, adjustRatioBy); } var rand = 0; var offset = 0; var camera = defaultCamera; var selectableCameras = cameras.Where(x => cameraAngles.Contains(x.CameraAngle)); int total = selectableCameras.Sum(x => x == adjustedCamera ? x.Ratio / adjustRatioBy: x.Ratio); // If no camera within specified cameraAngles has non zero ratio select among all if (total == 0) { selectableCameras = cameras; rand = random.Next(100); } else { rand = random.Next(total); } foreach (var tc in selectableCameras) { var ratio = tc == adjustedCamera ? tc.Ratio / adjustRatioBy : tc.Ratio; if (rand < ratio + offset) { camera = tc; break; } offset += ratio; } return(camera); }
/// <summary> /// Load session data from iRacing and loads the cameras available for the current loaded /// track and saves the track/camera combination into the users setting /// </summary> void DiscoverAnyNewTrackCameras() { if (!lastSample.IsConnected) return; var allCamerasForTrack = trackCameras.Where(tc => tc.TrackName == lastSample.SessionData.WeekendInfo.TrackDisplayName).ToList(); trackCameras.RemoveAll(tc => tc.TrackName == lastSample.SessionData.WeekendInfo.TrackDisplayName); foreach (var camera in lastSample.SessionData.CameraInfo.Groups) { var trackCamera = allCamerasForTrack.FirstOrDefault(tc => tc.TrackName == lastSample.SessionData.WeekendInfo.TrackDisplayName && tc.CameraName == camera.GroupName); if (trackCamera == null) { trackCamera = new TrackCamera(); trackCamera.TrackName = lastSample.SessionData.WeekendInfo.TrackDisplayName; trackCamera.CameraName = camera.GroupName; } trackCameras.Add(trackCamera); } }
void SwitchToBattle(DataSample data, CarDetails newFollower, bool establishingShot = false) { if (establishingShot) TraceInfo.WriteLine("{0} New Battle started - Searching for a LookingAtCar camera", data.Telemetry.SessionTimeSpan); var cameraTypes = establishingShot ? new[] { CameraAngle.LookingAtCar } : new[] { CameraAngle.LookingInfrontOfCar, CameraAngle.LookingBehindCar, CameraAngle.LookingAtCar }; var newFollowerPosition = newFollower.Car(data).Position; battleLeader = data.Telemetry.Cars.First(c => c.Position == newFollowerPosition - 1).Details; battleFollower = newFollower; car = newFollower; camera = cameraControl.FindACamera(cameraTypes, adjustedCamera, 2); if (establishingShot) adjustedCamera = camera; else adjustedCamera = null; if (camera.CameraAngle == CameraAngle.LookingBehindCar) { TraceInfo.WriteLine("{0} Changing to forward car, with reverse camera", data.Telemetry.SessionTimeSpan); car = battleLeader; } TraceInfo.WriteLine("{0} Changing camera to driver: {1}; camera: {2}; within {3}", data.Telemetry.SessionTimeSpan, car.UserName, camera.CameraName, battleGap); cameraControl.CameraOnDriver(car.CarNumberRaw, camera.CameraNumber); }
void UpdateBattleCamera(DataSample data) { if (data.Telemetry.SessionTimeSpan <= cameraChangeTime) return; cameraChangeTime = data.Telemetry.SessionTimeSpan + this.battleCameraChangePeriod; var otherCar = ChangeCarForCamera(data, battleFollower); var cameraSet = otherCar == null ? new [] {CameraAngle.LookingInfrontOfCar, CameraAngle.LookingAtCar} : new [] { CameraAngle.LookingInfrontOfCar, CameraAngle.LookingBehindCar, CameraAngle.LookingAtCar }; camera = cameraControl.FindACamera(cameraSet, adjustedCamera, 2); adjustedCamera = null; if (camera.CameraAngle == CameraAngle.LookingBehindCar) { TraceInfo.WriteLine("{0} Changing to forward car, with reverse camera", data.Telemetry.SessionTimeSpan); car = otherCar; } else { car = battleFollower; } TraceInfo.WriteLine("{0} Changing camera to driver: {1}; camera: {2}", data.Telemetry.SessionTimeSpan, car.UserName, camera.CameraName); cameraControl.CameraOnDriver(car.CarNumberRaw, camera.CameraNumber); }
void SwitchToBattle(DataSample data, CarDetails newFollower) { var newFollowerPosition = newFollower.Car(data).Position; battleLeader = data.Telemetry.Cars.First(c => c.Position == newFollowerPosition - 1).Details; battleFollower = newFollower; car = newFollower; //.Car(data).Details; camera = cameraControl.FindACamera(CameraAngle.LookingInfrontOfCar, CameraAngle.LookingBehindCar, CameraAngle.LookingAtCar); if (camera.CameraAngle == CameraAngle.LookingBehindCar) { TraceInfo.WriteLine("{0} Changing to forward car, with reverse camera", data.Telemetry.SessionTimeSpan); car = battleLeader; } TraceInfo.WriteLine("{0} Changing camera to driver: {1}; camera: {2}; within {3}", data.Telemetry.SessionTimeSpan, car.UserName, camera.CameraName, battleGap); cameraControl.CameraOnDriver(car.CarNumberRaw, camera.CameraNumber); }