From 2a65acb203686a8e94f0e5f5722b030d2c0b26b3 Mon Sep 17 00:00:00 2001 From: Krzysztof Date: Sat, 13 Jun 2020 02:06:58 +0200 Subject: [PATCH] Revert "Apply Shift+Click speed limit to entire roundabout (#920)" This reverts commit 857641056b4f83b3329c7cf4569a5cc1e25bd058. --- .../SubTools/SpeedLimits/SpeedLimitsTool.cs | 289 +++++++----------- 1 file changed, 109 insertions(+), 180 deletions(-) diff --git a/TLM/TLM/UI/SubTools/SpeedLimits/SpeedLimitsTool.cs b/TLM/TLM/UI/SubTools/SpeedLimits/SpeedLimitsTool.cs index 963154792..d9dcbd8ad 100644 --- a/TLM/TLM/UI/SubTools/SpeedLimits/SpeedLimitsTool.cs +++ b/TLM/TLM/UI/SubTools/SpeedLimits/SpeedLimitsTool.cs @@ -1,21 +1,21 @@ namespace TrafficManager.UI.SubTools.SpeedLimits { - using ColossalFramework; using ColossalFramework.UI; + using ColossalFramework; using CSUtil.Commons; using GenericGameBridge.Service; - using System; using System.Collections.Generic; + using System; using TrafficManager.API.Traffic.Data; using TrafficManager.Manager.Impl; using TrafficManager.State; using TrafficManager.Traffic; - using TrafficManager.UI.Helpers; - using TrafficManager.UI.SubTools.PrioritySigns; using TrafficManager.UI.Textures; - using TrafficManager.Util; + using TrafficManager.UI.Helpers; using TrafficManager.Util.Caching; - using UnityEngine; + using TrafficManager.Util; using static TrafficManager.Util.Shortcuts; + using UnityEngine; + using TrafficManager.UI.SubTools.PrioritySigns; public class SpeedLimitsTool : LegacySubTool { public const int @@ -43,7 +43,7 @@ public const int /// 0 = no limit /// null = default /// - private SpeedValue? currentPaletteSpeedLimit = new SpeedValue(-1f); + private SpeedValue ?currentPaletteSpeedLimit = new SpeedValue(-1f); private readonly Dictionary> segmentCenterByDir = new Dictionary>(); @@ -96,21 +96,12 @@ private struct RenderData { private RenderData renderData_; public SpeedLimitsTool(TrafficManagerTool mainTool) - : base(mainTool) { + : base(mainTool) + { CachedVisibleSegmentIds = new GenericArrayCache(NetManager.MAX_SEGMENT_COUNT); LastCachedCamera = new CameraTransformValue(); } - internal static void SetSpeedLimit(LanePos lane, SpeedValue? speed) { - ushort segmentId = lane.laneId.ToLane().m_segment; - SpeedLimitManager.Instance.SetSpeedLimit( - segmentId: segmentId, - laneIndex: lane.laneIndex, - laneInfo: segmentId.ToSegment().Info.m_lanes[lane.laneIndex], - laneId: lane.laneId, - speedLimit: speed?.GameUnits); - } - public override bool IsCursorInPanel() { return base.IsCursorInPanel() || cursorInSecondaryPanel; } @@ -165,21 +156,17 @@ public override void OnToolGUI(Event e) { private void RenderLaneOverlay(RenderManager.CameraInfo cameraInfo, uint laneId) { var marker = new SegmentLaneMarker(laneBuffer[laneId].m_bezier); bool pressed = Input.GetMouseButton(0); - Color color = MainTool.GetToolColor(pressed, false); + Color color = MainTool.GetToolColor(pressed,false); if (!ShowLimitsPerLane) { marker.Size = 3f; // lump the lanes together. } marker.RenderOverlay(cameraInfo, color, pressed); } - /// - /// Renders all lanes with the given - /// if NetInfo.Direction.None, all lanes are rendered. - /// private int RenderSegmentSideOverlay( RenderManager.CameraInfo cameraInfo, ushort segmentId, - NetInfo.Direction finalDirection = NetInfo.Direction.None) { + NetInfo.Direction finalDirection) { int count = 0; bool pressed = Input.GetMouseButton(0); Color color = MainTool.GetToolColor(pressed, false); @@ -193,7 +180,7 @@ private int RenderSegmentSideOverlay( byte laneIndex) => { bool render = (laneInfo.m_laneType & SpeedLimitManager.LANE_TYPES) != 0; render &= (laneInfo.m_vehicleType & SpeedLimitManager.VEHICLE_TYPES) != 0; - render &= laneInfo.m_finalDirection == finalDirection || finalDirection == NetInfo.Direction.None; + render &= laneInfo.m_finalDirection == finalDirection; if (render) { RenderLaneOverlay(cameraInfo, laneId); count++; @@ -206,10 +193,6 @@ private int RenderSegmentSideOverlay( private void RenderLanes(RenderManager.CameraInfo cameraInfo) { if (!MultiSegmentMode) { RenderLaneOverlay(cameraInfo, renderData_.LaneId); - } else if (RoundaboutMassEdit.Instance.TraverseLoop(renderData_.SegmentId, out var segmentList)) { - var lanes = FollowRoundaboutLane(segmentList, renderData_.SegmentId, renderData_.SortedLaneIndex); - foreach (var lane in lanes) - RenderLaneOverlay(cameraInfo, lane.laneId); } else { bool LaneVisitorFun(SegmentLaneTraverser.SegmentLaneVisitData data) { if (data.SortedLaneIndex == renderData_.SortedLaneIndex) { @@ -217,65 +200,21 @@ bool LaneVisitorFun(SegmentLaneTraverser.SegmentLaneVisitData data) { } return true; } - { - SegmentLaneTraverser.Traverse( - renderData_.SegmentId, - SegmentTraverser.TraverseDirection.AnyDirection, - SegmentTraverser.TraverseSide.AnySide, - SegmentLaneTraverser.LaneStopCriterion.LaneCount, - SegmentTraverser.SegmentStopCriterion.Junction, - SpeedLimitManager.LANE_TYPES, - SpeedLimitManager.VEHICLE_TYPES, - LaneVisitorFun); - } + SegmentLaneTraverser.Traverse( + renderData_.SegmentId, + SegmentTraverser.TraverseDirection.AnyDirection, + SegmentTraverser.TraverseSide.AnySide, + SegmentLaneTraverser.LaneStopCriterion.LaneCount, + SegmentTraverser.SegmentStopCriterion.Junction, + SpeedLimitManager.LANE_TYPES, + SpeedLimitManager.VEHICLE_TYPES, + LaneVisitorFun); } } - /// - /// iterates through the given roundabout returning an enumeration - /// of all lanes with a matching based on - /// - /// input list of roundabout segments (must be oneway, and in the same direction). - /// The segment to match lane agaisnt - /// - private IEnumerable FollowRoundaboutLane(List segmentList, ushort segmentId0, int sortedLaneIndex) { - bool invert0 = segmentId0.ToSegment().m_flags.IsFlagSet(NetSegment.Flags.Invert); - int count0 = netService.GetSortedLanes( - segmentId: segmentId0, - segment: ref segmentId0.ToSegment(), - startNode: null, - laneTypeFilter: SpeedLimitManager.LANE_TYPES, - vehicleTypeFilter: SpeedLimitManager.VEHICLE_TYPES, - sort: false).Count; - foreach (ushort segmentId in segmentList) { - bool invert = segmentId.ToSegment().m_flags.IsFlagSet(NetSegment.Flags.Invert); - var lanes = netService.GetSortedLanes( - segmentId: segmentId, - segment: ref segmentId.ToSegment(), - startNode: null, - laneTypeFilter: SpeedLimitManager.LANE_TYPES, - vehicleTypeFilter: SpeedLimitManager.VEHICLE_TYPES, - reverse: invert != invert0, - sort: true); - int index = sortedLaneIndex; - - // if lane count does not match, assume segments are connected from outer side of the roundabout. - if (invert0) { - int diff = lanes.Count - count0; - index += diff; - } - if (0 <= index && index < lanes.Count) { - yield return lanes[index]; - } - } // foreach - } - private void RenderSegmentsSide(RenderManager.CameraInfo cameraInfo) { if (!MultiSegmentMode) { RenderSegmentSideOverlay(cameraInfo, renderData_.SegmentId, renderData_.FinalDirection); - } else if (RoundaboutMassEdit.Instance.TraverseLoop(renderData_.SegmentId, out var segmentList)) { - foreach (ushort segmentId in segmentList) - RenderSegmentSideOverlay(cameraInfo, segmentId); } else { SegmentTraverser.Traverse( renderData_.SegmentId, @@ -366,7 +305,8 @@ private void ShowSigns(bool viewOnly) { bool hover = false; for (int segmentIdIndex = CachedVisibleSegmentIds.Size - 1; segmentIdIndex >= 0; - segmentIdIndex--) { + segmentIdIndex--) + { ushort segmentId = CachedVisibleSegmentIds.Values[segmentIdIndex]; // draw speed limits if ((MainTool.GetToolMode() == ToolMode.VehicleRestrictions) && @@ -545,7 +485,8 @@ private void GuiDefaultsWindow(int num) { GUILayout.FlexibleSpace(); if (GUILayout.Button(Translation.SpeedLimits.Get("Button:Save"), - GUILayout.Width(70))) { + GUILayout.Width(70))) + { SpeedLimitManager.Instance.FixCurrentSpeedLimits(info); SpeedLimitManager.Instance.SetCustomNetInfoSpeedLimit(info, currentSpeedLimit.GameUnits); } @@ -571,7 +512,8 @@ private void UpdateRoadTex(NetInfo info) { if (info != null) { if ((info.m_Atlas != null) && (info.m_Atlas.material != null) && (info.m_Atlas.material.mainTexture != null) && - info.m_Atlas.material.mainTexture is Texture2D mainTex) { + info.m_Atlas.material.mainTexture is Texture2D mainTex) + { UITextureAtlas.SpriteInfo spriteInfo = info.m_Atlas[info.m_Thumbnail]; if ((spriteInfo != null) && (spriteInfo.texture != null) && @@ -647,7 +589,7 @@ private void GuiSpeedLimitsWindow(int num) { } } { - if (currentPaletteSpeedLimit == null) { + if (currentPaletteSpeedLimit == null ) { GUI.color = Color.gray; } GuiSpeedLimitsWindow_AddClearButton(); @@ -786,7 +728,7 @@ private bool DrawSpeedLimitHandles(ushort segmentId, Vector3 center = segment.m_bounds.center; NetManager netManager = Singleton.instance; - SpeedValue? speedLimitToSet = viewOnly + SpeedValue ?speedLimitToSet = viewOnly ? new SpeedValue(-1f) : currentPaletteSpeedLimit; @@ -870,7 +812,8 @@ private bool DrawSpeedLimitHandles(ushort segmentId, if (!viewOnly && !onlyMonorailLanes && ((laneInfo.m_vehicleType & VehicleInfo.VehicleType.Monorail) != - VehicleInfo.VehicleType.None)) { + VehicleInfo.VehicleType.None)) + { Texture2D tex1 = RoadUI.VehicleInfoSignTextures[ LegacyExtVehicleType.ToNew(ExtVehicleType.PassengerTrain)]; MainTool.DrawStaticSquareOverlayGridTexture( @@ -902,50 +845,42 @@ private bool DrawSpeedLimitHandles(ushort segmentId, speedLimitToSet?.GameUnits); if (MultiSegmentMode) { - if (new RoundaboutMassEdit().TraverseLoop(segmentId, out var segmentList)) { - var lanes = FollowRoundaboutLane(segmentList, segmentId, sortedLaneIndex); - foreach (var lane in lanes) { - if (lane.laneId == laneId) // the speed limit for this lane has already been set. - continue; - SetSpeedLimit(lane, speedLimitToSet); - } - } else { - int slIndexCopy = sortedLaneIndex; - SegmentLaneTraverser.Traverse( - segmentId, - SegmentTraverser.TraverseDirection.AnyDirection, - SegmentTraverser.TraverseSide.AnySide, - SegmentLaneTraverser.LaneStopCriterion.LaneCount, - SegmentTraverser.SegmentStopCriterion.Junction, - SpeedLimitManager.LANE_TYPES, - SpeedLimitManager.VEHICLE_TYPES, - data => { - if (data.SegVisitData.Initial) { - return true; - } + int slIndexCopy = sortedLaneIndex; + + SegmentLaneTraverser.Traverse( + segmentId, + SegmentTraverser.TraverseDirection.AnyDirection, + SegmentTraverser.TraverseSide.AnySide, + SegmentLaneTraverser.LaneStopCriterion.LaneCount, + SegmentTraverser.SegmentStopCriterion.Junction, + SpeedLimitManager.LANE_TYPES, + SpeedLimitManager.VEHICLE_TYPES, + data => { + if (data.SegVisitData.Initial) { + return true; + } + + if (slIndexCopy != data.SortedLaneIndex) { + return true; + } + + Constants.ServiceFactory.NetService.ProcessSegment( + data.SegVisitData.CurSeg.segmentId, + (ushort curSegmentId, ref NetSegment curSegment) => { + NetInfo.Lane curLaneInfo = curSegment.Info.m_lanes[ + data.CurLanePos.laneIndex]; - if (slIndexCopy != data.SortedLaneIndex) { + SpeedLimitManager.Instance.SetSpeedLimit( + curSegmentId, + data.CurLanePos.laneIndex, + curLaneInfo, + data.CurLanePos.laneId, + speedLimitToSet?.GameUnits); return true; - } - - Constants.ServiceFactory.NetService.ProcessSegment( - data.SegVisitData.CurSeg.segmentId, - (ushort curSegmentId, ref NetSegment curSegment) => { - NetInfo.Lane curLaneInfo = curSegment.Info.m_lanes[ - data.CurLanePos.laneIndex]; - - SpeedLimitManager.Instance.SetSpeedLimit( - curSegmentId, - data.CurLanePos.laneIndex, - curLaneInfo, - data.CurLanePos.laneId, - speedLimitToSet?.GameUnits); - return true; - }); + }); - return true; - }); - } + return true; + }); } } @@ -1006,59 +941,53 @@ private bool DrawSpeedLimitHandles(ushort segmentId, currentPaletteSpeedLimit?.GameUnits); if (MultiSegmentMode) { - if (new RoundaboutMassEdit().TraverseLoop(segmentId, out var segmentList)) { - foreach (ushort segId in segmentList) { - SpeedLimitManager.Instance.SetSpeedLimit( - segId, - currentPaletteSpeedLimit?.GameUnits); - } - } else { - NetInfo.Direction normDir = e.Key; - if ((netManager.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None) { - normDir = NetInfo.InvertDirection(normDir); - } - - SegmentLaneTraverser.Traverse( - segmentId, - SegmentTraverser.TraverseDirection.AnyDirection, - SegmentTraverser.TraverseSide.AnySide, - SegmentLaneTraverser.LaneStopCriterion.LaneCount, - SegmentTraverser.SegmentStopCriterion.Junction, - SpeedLimitManager.LANE_TYPES, - SpeedLimitManager.VEHICLE_TYPES, - data => { - if (data.SegVisitData.Initial) { - return true; - } - - bool reverse = - data.SegVisitData.ViaStartNode - == data.SegVisitData.ViaInitialStartNode; - - ushort otherSegmentId = data.SegVisitData.CurSeg.segmentId; - NetInfo otherSegmentInfo = - netManager.m_segments.m_buffer[otherSegmentId].Info; - byte laneIndex = data.CurLanePos.laneIndex; - NetInfo.Lane laneInfo = otherSegmentInfo.m_lanes[laneIndex]; - - NetInfo.Direction otherNormDir = laneInfo.m_finalDirection; - - if (((netManager.m_segments.m_buffer[otherSegmentId].m_flags - & NetSegment.Flags.Invert) - != NetSegment.Flags.None) ^ reverse) { - otherNormDir = NetInfo.InvertDirection(otherNormDir); - } - - if (otherNormDir == normDir) { - SpeedLimitManager.Instance.SetSpeedLimit( - otherSegmentId, - laneInfo.m_finalDirection, - speedLimitToSet?.GameUnits); - } + NetInfo.Direction normDir = e.Key; + if ((netManager.m_segments.m_buffer[segmentId].m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None) { + normDir = NetInfo.InvertDirection(normDir); + } + SegmentLaneTraverser.Traverse( + segmentId, + SegmentTraverser.TraverseDirection.AnyDirection, + SegmentTraverser.TraverseSide.AnySide, + SegmentLaneTraverser.LaneStopCriterion.LaneCount, + SegmentTraverser.SegmentStopCriterion.Junction, + SpeedLimitManager.LANE_TYPES, + SpeedLimitManager.VEHICLE_TYPES, + data => + { + if (data.SegVisitData.Initial) { return true; - }); - } + } + + bool reverse = + data.SegVisitData.ViaStartNode + == data.SegVisitData.ViaInitialStartNode; + + ushort otherSegmentId = data.SegVisitData.CurSeg.segmentId; + NetInfo otherSegmentInfo = + netManager.m_segments.m_buffer[otherSegmentId].Info; + byte laneIndex = data.CurLanePos.laneIndex; + NetInfo.Lane laneInfo = otherSegmentInfo.m_lanes[laneIndex]; + + NetInfo.Direction otherNormDir = laneInfo.m_finalDirection; + + if (((netManager.m_segments.m_buffer[otherSegmentId].m_flags + & NetSegment.Flags.Invert) + != NetSegment.Flags.None) ^ reverse) + { + otherNormDir = NetInfo.InvertDirection(otherNormDir); + } + + if (otherNormDir == normDir) { + SpeedLimitManager.Instance.SetSpeedLimit( + otherSegmentId, + laneInfo.m_finalDirection, + speedLimitToSet?.GameUnits); + } + + return true; + }); } }