using System; using System.Linq; using System.Collections.Generic; using UnityEngine; using RenderHeads.Media.AVProVideo; using Assets.Scripts.Scenes.VideoRide; using Assets.Scenes.Ride.Scripts.Model.RiderModels; using UnityEngine.Assertions; namespace Assets.AR { public class ARTrainingController : ARLaneGameObjectsController { public MediaPlayer mediaPlayer; private ARData aRData; private RouteDetailData detail; private VideoPointsSync videoPointsSync; private readonly List collisionList = new List(); ARVideoPlayerControl VideoPlayerControl; ARLaneGameObject[] rides { get; set; } public ARLaneGameObject mainRiderObject { get; set; } public Light arLight; private Light arBackLight { get; set; } public CameraDistance RiderCameraDistance { get; set; } public VideoPlayMode VideoControlMode { get; private set; } private float autoCameraSwitchTimeCounter = 80f; float timers = 0f; private VideoGameManager manager; public int VisibleModels { get; private set; } private int visibleModelsLimit = 20; public int VisibleRiderTitlesLimit => this.VisibleModelsLimit + 10; public int VisibleModelsLimit { get => this.visibleModelsLimit; set => this.visibleModelsLimit = Mathf.Clamp(value, 20, 100); } private Dictionary visibleRiders = new Dictionary(); private Dictionary riders = new Dictionary(); //private Dictionary riderNameViews { get; set; } //= new Dictionary(); //private Dictionary riderValueViews = new Dictionary(); public GameObject BikerFemalePrefab => Resources.Load("UI/Prefab/AR/VidePlayer"); public GameObject BikerMalePrefab => Resources.Load("UI/Prefab/AR/VidePlayer_NV"); private bool paused { get; set; } protected override void Start() { base.Start(); this.arObjects.Clear(); manager = GetComponent(); } public void Initialize(ARData arData, RouteDetailData routeDetailData) { //ar数据加载本地,本地没有就下载 this.aRData = arData; this.detail = routeDetailData; this.RiderCameraDistance = AR.CameraDistance.Middle; videoPointsSync = new VideoPointsSync(detail.VideoPoints.Select(c => new VideoPoint() { Distance = (float)c.Distance, Time = (float)c.VideoTime })); videoSync = videoPointsSync; this.VideoPlayerControl = new ARVideoPlayerControl { VideoSyncSource = videoSync }; this.videoPlayer = mediaPlayer.gameObject.AddComponent(); this.videoPlayer.videoPlayer = mediaPlayer; SetArRoute(new ARRoute(aRData.Route), videoSync, videoPlayer); this.VideoPlayerControl.VideoFrameOffset = this.Route.VideoFrameOffset; this.VideoPlayerControl.Route = Route; this.VideoPlayerControl.SetVideoPlayer(videoPlayer); rides = FindObjectsOfType(); SetUpLight(); } protected override void Update() { if (videoPlayer == null ) return; timers -= Time.deltaTime; while (timers <= 0) { UpdateRiders(); RemoveRiders(); timers += 0.2f; } if (mainRiderObject == null || Route == null) { videoPlayer.Pause(); return; } this.PlayFrameDistance(); VideoPlayerControl.UpdateVideoPlayRate(mainRiderObject.PreSpeed, mainRiderObject.Distance); this.FrameIndexDistanceCorrection = this.VideoPlayerControl.FrameIndexDistanceCorrection; this.UpdateCameraFollowDistance(); base.Update(); this.UpdateRidersVisibility(); this.UpdateRidersLean(); this.UpdateBackLight(); this.SetUpVideoControlMode(); } /// /// 更新骑行者的实时数据 /// private void UpdateRiders() { foreach (var dic in manager.rideObjs) { var item = dic.Value; if (!this.arObjects.Contains(item)) this.arObjects.Add(item); if (!this.riderObjects.ContainsKey(item.UserId)) this.riderObjects.Add(item.UserId, item); item.PreSpeed = item.Speed; item.Speed = (float)dic.Key.OnlineSpeed; item.DeltaDistance = (float)(dic.Key.EndDistance - dic.Key.PreDistance); item.Route = Route; item.VideoSync = videoPointsSync; item.IsAtFinish = dic.Key.EndDistance >= manager.GetMapRoute().Distance*1000f; if (dic.Key.UserId != manager.CurrentUserId) continue; mainRiderObject = item; //如果速度为0就停止播放视频 if (item.DeltaDistance == 0 || item.Speed == 0) { item.DeltaDistance = 0; videoPlayer.Pause(); } else { videoPlayer.Resume(); } } } /// /// 移除不可见的骑行者 /// private void RemoveRiders() { this.arObjects.RemoveAll(c => !manager.rideObjs.Select(m => m.Key.UserId.ToString()).Contains(c.UserId.ToString())); var keys = riderObjects.Keys.ToList(); foreach (var item in keys) { if (!manager.rideObjs.Keys.Where(c => c.UserId == item).Any()) { riderObjects.Remove(item); } } } /// /// 将每秒的距离转换为每帧的距离 /// private void PlayFrameDistance() { var delta = Time.deltaTime; foreach (var obj in this.riderObjects.Values.Where(obj => obj.DeltaDistance != 0)) { obj.Distance = Mathf.Lerp(obj.Distance, obj.Distance + obj.DeltaDistance, delta); obj.RouteDistance = Mathf.Lerp(obj.RouteDistance, obj.RouteDistance + obj.DeltaDistance, delta); } } /// /// 设置camera的跟随距离 /// private void SetUpVideoControlMode() { if (Input.GetKeyDown(KeyCode.F)) this.SetVideoControlMode(VideoPlayMode.Front); if (Input.GetKeyDown(KeyCode.P)) this.SetVideoControlMode(VideoPlayMode.AutoPanorama); if (!Input.GetKeyDown(KeyCode.B)) return; this.SetVideoControlMode(VideoPlayMode.Rear); } /// /// 设置光线 /// private void SetUpLight() { this.arLight.type = LightType.Directional; this.arLight.transform.rotation = Quaternion.Euler(90f, 0.0f, 0.0f); this.arLight.shadows = LightShadows.Soft; this.arLight.shadowStrength = 1f; var gameObject2 = new GameObject("ARBackLight"); gameObject2.layer = this.gameObject.layer; gameObject2.transform.SetParent(this.transform); this.arBackLight = gameObject2.AddComponent(); this.arBackLight.type = LightType.Directional; this.arBackLight.transform.rotation = Quaternion.Euler(0.0f, 0.0f, 0.0f); this.arBackLight.shadows = LightShadows.None; this.arBackLight.intensity = 0.5f; } public void SetVideoControlMode(VideoPlayMode mode) { if (mode == this.VideoControlMode) return; if (!this.AR360Version) mode = VideoPlayMode.Front; this.VideoControlMode = mode; this.autoCameraSwitchTimeCounter = 80f; if (mode == VideoPlayMode.AutoPanorama) return; this.videoPlayer.IntendedRear = mode == VideoPlayMode.Rear; } //更新摄像机的位置 private void UpdateCameraFollowDistance() { var cameraFollowDistance = GetCameraFollowDistance(this.RiderCameraDistance); this.VideoPlayerControl.CameraFollowDistance = cameraFollowDistance; } //人物是否显示 protected override bool IsObjectActive(ARGameObject arObject) { var flag = base.IsObjectActive(arObject); if (arObject != this.mainRiderObject) return flag; if ((double)this.VideoPlayerControl.CameraFollowDistance > 0.0 || this.AR360Version) return flag; return flag && (double)this.VideoPlayerControl.CameraDistanceError > 5.0; } //获取摄像机的位置 public static float GetCameraFollowDistance(CameraDistance distance) { switch (distance) { case AR.CameraDistance.FirstPerson: return 0.0f; case AR.CameraDistance.Near: return 1.5f; case AR.CameraDistance.Middle: return 5f; case AR.CameraDistance.Far: return 10f; default: throw new ArgumentException("Unknown rider's camera distance."); } } //添加骑手 public void AddRider(OnlineRiderModel rider) { if (this.riders.ContainsKey(rider.UserId)) return; this.riders.Add(rider.UserId, rider); } //移除骑手 public void RemoveRider(int riderId) { if (!this.riders.ContainsKey(riderId)) return; this.riders.Remove(riderId); this.DestroyRider(riderId); this.DestroyRiderTitle(riderId); } //创建人物 private AbstractRenderer CreateRiderModel(OnlineRiderModel rider, float lane) { GameObject gameObject; PlayerRenderer riderModel; if (rider.Sex == 1) { gameObject = UnityEngine.Object.Instantiate(this.BikerMalePrefab); gameObject.name = "RiderMale " + rider.UserId.ToString(); riderModel = gameObject.AddComponent(); riderModel.Initialize(true, false); } else { gameObject = UnityEngine.Object.Instantiate(this.BikerFemalePrefab); gameObject.name = "RiderFemale " + rider.UserId.ToString(); riderModel = gameObject.AddComponent(); riderModel.Initialize(false, false); } gameObject.transform.parent = this.transform; gameObject.transform.position = ARGameObjectsController.DefaultObjectPosition; //gameObject.layer = 9; riderModel.Route = this.Route; riderModel.VideoSync = this.videoSync; //riderModel.VideoPlayer = this.videoPlayer; //riderModel.ColorUser = rider.UserColor; //riderModel.ColorSkin = rider.SkinColor; // ModelTexturesList modelTextures = this.GetModelTextures(rider.JerseyId); //riderModel.JerseyTexture = modelTextures.JerseyTexture; //riderModel.HelmTexture = modelTextures.HelmTexture; //riderModel.BikeTexture = modelTextures.BikeTexture; if ((double)lane != -1.0) riderModel.Lane = lane; this.riderObjects.Add(rider.UserId, (ARLaneGameObject)riderModel); this.arObjects.Add((ARGameObject)riderModel); //是否 if (this.IsMainRider(rider)) this.mainRiderObject = (ARLaneGameObject)riderModel; return (AbstractRenderer)riderModel; } private ARLaneGameObject CreateRiderObject(OnlineRiderModel rider, float lane) { ARLaneGameObject riderObject = new GameObject("RiderObject " + rider.UserId.ToString()) { transform = { parent = this.transform }, //layer = 9 }.AddComponent(); riderObject.Route = this.Route; riderObject.VideoSync = this.videoSync; //riderObject.VideoPlayer = this.videoPlayer; if ((double)lane != -1.0) riderObject.Lane = lane; this.riderObjects.Add(rider.UserId, riderObject); this.arObjects.Add((ARGameObject)riderObject); if (this.IsMainRider(rider)) this.mainRiderObject = riderObject; return riderObject; } //销毁骑手 private void DestroyRider(int riderId) { ARLaneGameObject arLaneObject; if (!this.riderObjects.TryGetValue(riderId, out arLaneObject)) return; this.arObjects.Remove((ARGameObject)arLaneObject); this.riderObjects.Remove(riderId); if ((UnityEngine.Object)arLaneObject == (UnityEngine.Object)this.mainRiderObject) this.mainRiderObject = (ARLaneGameObject)null; UnityEngine.Object.Destroy((UnityEngine.Object)arLaneObject.gameObject); } //创建骑行人员头顶的名字 private void CreateRiderTitle(OnlineRiderModel rider) { //RiderNameView riderNameView = UIRect.Create(this.transform, "Name " + rider.Id.ToString()); //riderNameView.RectTransform.pivot = new Vector2(0.5f, 0.5f); //riderNameView.gameObject.layer = 9; //riderNameView.NameLabel.Font = Fonts.WorkSansBlack; //riderNameView.SetName(rider.NameShort); //switch (rider) //{ // case GhostRider _: // riderNameView.SetAvatarResourceIcon(AvatarView.IconType.Ghost); // riderNameView.SetAvatarBorderColor(rider.UserColor); // riderNameView.SetAvatarBorderWidth(2f); // break; // case StravaRider stravaRider: // switch (stravaRider.EffortType) // { // case EffortType.Kom: // riderNameView.SetAvatarResourceIcon(AvatarView.IconType.StravaKom); // break; // case EffortType.Qom: // riderNameView.SetAvatarResourceIcon(AvatarView.IconType.StravaQom); // break; // case EffortType.Pr: // riderNameView.SetAvatarResourceIcon(AvatarView.IconType.StravaPr); // break; // } // riderNameView.SetAvatarBorderColor(Color.clear); // riderNameView.SetAvatarBorderWidth(0.0f); // break; // default: // riderNameView.SetAvatarUrl(rider.AvatarUrl); // riderNameView.SetAvatarBorderColor(rider.UserColor); // riderNameView.SetAvatarBorderWidth(2f); // break; //} //riderNameView.BackgroundColor = this.GetRiderTitleBackgroundColor(rider); //riderNameView.SetCornerRadius(float.MaxValue); //riderNameView.TrimSize(); //this.riderNameViews.Add(rider.Id, (UIRect)riderNameView); //if (rider is StravaRider) // return; //RiderValueView riderValueView = UIRect.Create(this.transform, "Value " + rider.Id.ToString()); //riderValueView.RectTransform.pivot = new Vector2(0.5f, 0.5f); //riderValueView.gameObject.layer = 9; //this.riderValueViews.Add(rider.Id, riderValueView); } private void CreateRiderTitleObject(OnlineRiderModel rider) { //UIRect uiRect = UIRect.Create(this.transform, "TitleObject " + rider.Id.ToString()); //uiRect.Size = new Vector2(150f, 26f); //uiRect.RectTransform.pivot = new Vector2(0.5f, 0.5f); //uiRect.gameObject.layer = 9; //uiRect.AddComponent().renderMode = RenderMode.WorldSpace; //uiRect.AddComponent().size = (Vector3)uiRect.Size; //this.riderNameViews.Add(rider.Id, uiRect); } private void DestroyRiderTitle(int riderId) { //UIRect uiRect; //if (this.riderNameViews.TryGetValue(riderId, out uiRect)) //{ // this.riderNameViews.Remove(riderId); // UnityEngine.Object.Destroy((UnityEngine.Object)uiRect.gameObject); //} //RiderValueView riderValueView; //if (!this.riderValueViews.TryGetValue(riderId, out riderValueView)) // return; //this.riderValueViews.Remove(riderId); //UnityEngine.Object.Destroy((UnityEngine.Object)riderValueView.gameObject); } private void UpdateRidersVisibility() { if (!this.videoPlayer.Initialized) return; this.UpdateVisibleRiders(); return; //删除当前道路上应该消失的骑手 foreach (int num in this.riderObjects.Keys.ToArray()) { if (!this.visibleRiders.ContainsKey(num)) { ARLaneGameObject riderObject = this.riderObjects[num]; if (!riderObject.IsAtFinish || (double)riderObject.VisibilityLevel <= 0.0) { this.DestroyRider(num); this.DestroyRiderTitle(num); } } } //新增应该显示的骑手 foreach (VisibleRiderItem visibleRiderItem in this.visibleRiders.Values) { var rider = visibleRiderItem.Rider; bool showModel = visibleRiderItem.ShowModel; ARLaneGameObject arLaneObject; //二次检查 if (this.riderObjects.TryGetValue(rider.UserId, out arLaneObject)) { if (arLaneObject is AbstractRenderer) { if (!showModel) { float lane = arLaneObject.Lane; this.DestroyRider(rider.UserId); this.CreateRiderObject(rider, lane); } } else if (showModel) { float lane = arLaneObject.Lane; this.DestroyRider(rider.UserId); this.CreateRiderModel(rider, lane); } } else { if (showModel) this.CreateRiderModel(rider, visibleRiderItem.Lane); else this.CreateRiderObject(rider, visibleRiderItem.Lane); this.CreateRiderTitleObject(rider); } } } private void UpdateVisibleRiders() { var visibilityModels = ARGameObject.MaxDistanceVisibilityModels; var visibilityDistance = this.MaximumVisibilityDistance; var routeDistance = this.CameraDistance; var flag = this.AllowStartOrder && (double)routeDistance < 200.0; var num1 = flag ? visibilityModels : visibilityDistance; var a1 = this.videoPlayer.IsRear ? visibilityDistance : 1f; var riderTitlesLimit = this.VisibleRiderTitlesLimit; var a2 = 5; var num2 = Mathf.Max(a1, this.GetOvertakingThreshold(routeDistance) + 1f); var distance1 = routeDistance - num2; var distance2 = routeDistance + num1; float num3; if (flag) { num3 = this.StartRegionRouteWidth; } else { var videoFrameAtDistance1 = this.videoSync.GetVideoFrameAtDistance(distance1); var videoFrameAtDistance2 = this.videoSync.GetVideoFrameAtDistance(distance2); num3 = (float)(0.5 * ((double)(this.Route.GetLeftSideOffset(videoFrameAtDistance1) + this.Route.GetRightSideOffset(videoFrameAtDistance1)) + (double)(this.Route.GetLeftSideOffset(videoFrameAtDistance2) + this.Route.GetRightSideOffset(videoFrameAtDistance2)))); } var num4 = num3 / 0.7f; var num5 = this.paused ? 0.0f : 0.5f; var maxLane = Math.Max(0.0f, num4 - num5); var visibleRiderItemList1 = new List(); var visibleRiderItemList2 = new List(); var routeRiders = this.riders.Values; foreach (var rider in routeRiders) { if (!rider.IsFinished) { float modelRouteDistance = this.GetRouteDistance(0, (float)rider.RouteDistance); float num6 = modelRouteDistance - routeDistance; if (this.IsMultilap) { if ((double)modelRouteDistance + this.lapLength >= (double)distance1 && (double)modelRouteDistance + this.lapLength <= (double)distance2) num6 = modelRouteDistance + (float)this.lapLength - routeDistance; else if ((double)modelRouteDistance - this.lapLength >= (double)distance1 && (double)modelRouteDistance - this.lapLength <= (double)distance2) num6 = modelRouteDistance - (float)this.lapLength - routeDistance; } if ((double)num6 > -(double)num2 && (double)num6 < (double)num1) { float num7 = -1f; ARLaneGameObject laneObject; if (this.riderObjects.TryGetValue(rider.UserId, out laneObject)) { if ((double)laneObject.Lane > (double)num4) { if (this.IsMainRider(rider)) { laneObject.Lane = num4; laneObject.DeltaLane = 0.0f; this.UpdateRiderCurvature(laneObject, 0.0f, Time.deltaTime); this.UpdateLaneChangingDirection(laneObject, 0.0f, Time.deltaTime); } else continue; } } else { num7 = this.GetLane((float)rider.RouteDistance, modelRouteDistance); if ((double)num7 > (double)maxLane) { if (this.IsMainRider(rider)) num7 = num4; else continue; } } VisibleRiderItem visibleRiderItem = new VisibleRiderItem() { Rider = rider, DeltaDistance = num6, ModelDistance = modelRouteDistance, Lane = num7 }; if ((double)num6 < 0.0) visibleRiderItemList1.Add(visibleRiderItem); else visibleRiderItemList2.Add(visibleRiderItem); } } } visibleRiderItemList1.Sort((Comparison)((p1, p2) => p2.DeltaDistance.CompareTo(p1.DeltaDistance))); visibleRiderItemList2.Sort((Comparison)((p1, p2) => p1.DeltaDistance.CompareTo(p2.DeltaDistance))); this.RemoveRidersOutside(visibleRiderItemList1, maxLane); this.RemoveRidersOutside(visibleRiderItemList2, maxLane); this.PrioritizeRider(visibleRiderItemList1, (Predicate)(i => this.IsMainRider(i.Rider))); this.PrioritizeRider(visibleRiderItemList2, (Predicate)(i => this.IsMainRider(i.Rider))); var visibleRiderItemList3 = new List(); if (!this.videoPlayer.IsRear) { int num8 = Mathf.Min(a2, visibleRiderItemList1.Count); for (int index = 0; index < num8; ++index) visibleRiderItemList3.Add(visibleRiderItemList1[index]); int num9 = Mathf.Min(riderTitlesLimit - num8, visibleRiderItemList2.Count); for (int index = 0; index < num9; ++index) visibleRiderItemList3.Add(visibleRiderItemList2[index]); } else { int num10 = Mathf.Min(a2, visibleRiderItemList2.Count); for (int index = 0; index < num10; ++index) visibleRiderItemList3.Add(visibleRiderItemList2[index]); int num11 = Mathf.Min(riderTitlesLimit - num10, visibleRiderItemList1.Count); for (int index = 0; index < num11; ++index) visibleRiderItemList3.Add(visibleRiderItemList1[index]); } int num12 = 0; this.visibleRiders.Clear(); foreach (VisibleRiderItem visibleRiderItem in visibleRiderItemList3) { var rider = visibleRiderItem.Rider; float num13 = Mathf.Abs(visibleRiderItem.DeltaDistance); if ((double)num13 < (double)visibilityModels - 5.0) { if (num12 < this.VisibleModelsLimit) { visibleRiderItem.ShowModel = true; this.visibleRiders.Add(rider.UserId, visibleRiderItem); ++num12; } } else if ((double)num13 < (double)visibilityDistance - 5.0 && this.visibleRiders.Count < this.VisibleRiderTitlesLimit) { visibleRiderItem.ShowModel = false; this.visibleRiders.Add(rider.UserId, visibleRiderItem); } } this.VisibleModels = num12; } private void PrioritizeRider( List list, Predicate predicate) { int index = list.FindIndex(predicate); if (index == -1) return; var visibleRiderItem = list[index]; list.RemoveAt(index); list.Insert(0, visibleRiderItem); } private void RemoveRidersOutside( List sortedList, float maxLane) { VisibleRiderItem visibleRiderItem = (VisibleRiderItem)null; foreach (VisibleRiderItem sorted in sortedList) { //排除当前骑行的主人公和分区组长 if ((double)sorted.Lane != -1.0 && !this.IsMainRider(sorted.Rider)) { if (visibleRiderItem == null) { visibleRiderItem = sorted; } else { float routeDistance1 = (float)visibleRiderItem.Rider.RouteDistance; float routeDistance2 = (float)sorted.Rider.RouteDistance; float collisionParameter = ARLaneGameObjectsController.GetCollisionParameter(routeDistance1, routeDistance2, this.GetOvertakingThreshold(routeDistance1)); sorted.Lane += collisionParameter; if ((double)sorted.Lane > (double)maxLane) sorted.Lane = float.MaxValue; else visibleRiderItem = sorted; } } } sortedList.RemoveAll((Predicate)(i => (double)i.Lane == 3.4028234663852886E+38)); } private bool IsMainRider(OnlineRiderModel rider) => rider.IsSelf; //更新骑手的偏移角度 private void UpdateRidersLean() { foreach (ARLaneGameObject riderObject in this.riderObjects.Values) { float num1 = this.Route.GetTrajectoryCurvature(riderObject.Frame) + riderObject.Curvature; float z1; if ((double)num1 == 0.0) { z1 = 0.0f; } else { double speed = riderObject.Speed; float f = 57.29578f * Mathf.Atan((float)(speed * speed * (double)num1 / 9.81)); float num2 = (double)f >= 0.0 ? 1f : -1f; float num3 = Mathf.Abs(f); if ((double)num3 > 20.0) f = (float)((double)Mathf.Atan((float)(((double)num3 - 20.0) / 10.5)) * 10.5 + 20.0) * num2; float num4 = Mathf.Clamp(f, -35f, 35f); float z2 = riderObject.Lean.z; z1 = Mathf.Clamp(num4, z2 - 60f * Time.deltaTime, z2 + 60f * Time.deltaTime); } float y = Mathf.Clamp(riderObject.LaneChangingDirection, -6f, 6f); riderObject.Lean = new Vector3(0.0f, y, z1); } } //更新后背的光线 private void UpdateBackLight() { this.arBackLight.transform.position = this.UnityCamera.transform.position; this.arBackLight.transform.rotation = this.UnityCamera.transform.rotation; this.arLight.transform.rotation = this.Route.GetLightDirection(this.videoPlayer.CurrentFrame); this.arLight.shadowStrength = this.Route.GetShadowIntensity(this.videoPlayer.CurrentFrame); } protected void LateUpdate() => this.UpdateRiderTitles(); private void UpdateRiderTitles() { //foreach (int key in this.riderNameViews.Keys) //{ // ARLaneObject riderObject = this.riderObjects[key]; // UIRect riderNameView = this.riderNameViews[key]; // RiderValueView riderValueView; // this.riderValueViews.TryGetValue(key, out riderValueView); // float num1 = Vector3.Distance(riderObject.transform.position, this.UnityCamera.transform.position); // if (!riderObject.gameObject.activeSelf || (double)num1 > (double)this.MaximumVisibilityDistance || this.SelectedPanorama == null && (double)num1 < 3.0) // { // riderNameView.Active = false; // if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null) // riderValueView.Active = false; // } // else // { // riderNameView.Active = true; // if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null) // riderValueView.Active = (double)num1 < 30.0; // float nameViewAlpha = this.GetNameViewAlpha(num1); // if ((double)nameViewAlpha < 1.0) // riderNameView.Alpha = nameViewAlpha; // float t = this.GetValueViewAlpha(num1); // if ((double)t < 1.0 && (UnityEngine.Object)riderValueView != (UnityEngine.Object)null) // riderValueView.Alpha = t; // //if (this.sportProfile == SportProfile.Running) // //{ // // if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null) // // riderValueView.Active = false; // // t = 0.0f; // //} // Vector3 vector3 = 5f * this.uiScale * Mathf.Max(0.1f, this.SelectedPanorama != null ? 1f : this.GetDistanceScale(num1)); // Quaternion rotation = this.UnityCamera.transform.rotation; // //if (this.SelectedPanorama != null) // //{ // // rotation = this.PanoramaCamera.transform.rotation; // //} // //else // { // if ((double)riderObject.Distance < (double)this.CameraDistance) // rotation *= Quaternion.Euler(0.0f, 180f, 0.0f); // if (this.videoPlayer.IsRear) // rotation *= Quaternion.Euler(0.0f, 180f, 0.0f); // } // float num2 = Mathf.Lerp(-0.5f * this.Route.RiderScale, 0.6f * this.Route.RiderScale, Mathf.Clamp01(VTMath.Lerp(ARObject.MaxDistanceVisibilityModels - 5f, 1f, ARObject.MaxDistanceVisibilityModels, 0.0f, num1))); // float num3 = 14f; // float num4 = Mathf.Lerp(num2 + vector3.y * (0.5f * riderNameView.Height), num2 + vector3.y * (float)((double)num3 + 0.5 * (double)riderNameView.Height + 5.0), t); // float num5 = -this.Route.RiderScale * riderObject.PositionOffset.y; // riderNameView.transform.localScale = vector3; // riderNameView.transform.position = riderObject.transform.position + rotation * new Vector3(0.0f, num4 + num5, 0.0f); // riderNameView.transform.rotation = rotation; // if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null) // { // float num6 = num2 + vector3.y * (0.5f * num3); // riderValueView.transform.localScale = vector3; // riderValueView.transform.position = riderObject.transform.position + rotation * new Vector3(0.0f, num6 + num5, 0.0f); // riderValueView.transform.rotation = rotation; // } // } //} } public void Pause() => this.paused = true; public void Resume() => this.paused = false; private class VisibleRiderItem { public OnlineRiderModel Rider; public float ModelDistance; public float DeltaDistance; public bool ShowModel; public float Lane; } } }