コード例 #1
0
        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));
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        public CameraControl(TrackCamera[] cameras)
        {
            this.cameras = cameras;
            this.random = new Random();

            defaultCamera = cameras.First(tc => tc.IsRaceStart);
        }
コード例 #6
0
        public CameraControl(TrackCamera[] cameras)
        {
            this.cameras = cameras;
            this.random  = new Random();

            defaultCamera = cameras.First(tc => tc.IsRaceStart);
        }
コード例 #7
0
        /// <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;
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        /// <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);
            }
        }
コード例 #14
0
        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);
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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);
        }