From 9cb5c7cb7f02729945f3f6971da0e0f71a9c6e8e Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Thu, 21 Nov 2019 23:35:23 +0200 Subject: [PATCH 01/15] functionality to render only half a segment. --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 8 ++-- TLM/TLM/UI/TrafficManagerTool.cs | 64 +++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index 078469dca..8f83adba0 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -133,11 +133,13 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { || (netManager.m_segments.m_buffer[HoveredSegmentId].m_endNode == HoveredNodeId)) && ((nodeFlags & NetNode.Flags.Junction) != NetNode.Flags.None)) { - NetTool.RenderOverlay( + bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId,HoveredNodeId); + MainTool.DrawHalfSegment( cameraInfo, - ref Singleton.instance.m_segments.m_buffer[HoveredSegmentId], + HoveredSegmentId, + bStartNode, MainTool.GetToolColor(altDown, false), - MainTool.GetToolColor(altDown, false)); + false); } } diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index d67c44318..6ac84d0d8 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -446,11 +446,71 @@ public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, DrawOverlayBezier(cameraInfo, bezier, color, alpha); } + public void DrawHalfSegment(RenderManager.CameraInfo cameraInfo, + ushort segmentId, + bool bStartNode, + Color color, + bool alpha = false) { + ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; + float width = segment.Info.m_halfWidth; + ushort nodeId, otherNodeId; + + NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; + + + Vector3 GetPos(ushort nodeId) { + Vector3 pos = nodeBuffer[nodeId].m_position; + float terrainY = Singleton.instance.SampleDetailHeightSmooth(pos); + if (terrainY > pos.y) { + pos.y = terrainY; + } + return pos; + } + + bool IsMiddle(ushort nodeId) { + return (nodeBuffer[nodeId].m_flags & NetNode.Flags.Middle) != 0; + } + + + Bezier3 bezier; + bezier.a = GetPos(segment.m_startNode); + bezier.d = GetPos(segment.m_endNode); + + NetSegment.CalculateMiddlePoints( + bezier.a, + segment.m_startDirection, + bezier.d, + segment.m_endDirection, + IsMiddle(segment.m_startNode), + IsMiddle(segment.m_endNode), + out bezier.b, + out bezier.c); + + if(bStartNode & !IsMiddle(segment.m_endNode)) + bezier = bezier.Cut(0, 0.5f); + if(!bStartNode && !IsMiddle(segment.m_startNode)) + bezier = bezier.Cut(0.5f, 1f); + + Singleton.instance.m_drawCallData.m_overlayCalls++; + Singleton.instance.OverlayEffect.DrawBezier( + cameraInfo, + color, + bezier, + width * 2f, + bStartNode ? 0 : width, + bStartNode ? width : 0, + -1f, + 1280f, + false, + alpha); + } + private void DrawOverlayBezier(RenderManager.CameraInfo cameraInfo, Bezier3 bezier, Color color, - bool alpha = false) { - const float width = 8f; // 8 - small roads; 16 - big roads + bool alpha = false, + float width = 8f) { + //const float width = 8f; // 8 - small roads; 16 - big roads Singleton.instance.m_drawCallData.m_overlayCalls++; Singleton.instance.OverlayEffect.DrawBezier( cameraInfo, From 19e23f7b8fee754df2377811b8ae1ca632731647 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Sat, 23 Nov 2019 05:58:25 +0200 Subject: [PATCH 02/15] #555: removed buggy/reduandant code in DrawNodeCircle() Overlay node raduis is average of all connected segmetns. --- TLM/TLM/UI/TrafficManagerTool.cs | 70 ++++++++++---------------------- 1 file changed, 22 insertions(+), 48 deletions(-) diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index 6ac84d0d8..242e7c4d6 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -1,4 +1,4 @@ -namespace TrafficManager.UI { +namespace TrafficManager.UI { using System; using System.Collections.Generic; using System.Linq; @@ -415,35 +415,28 @@ public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, DrawNodeCircle(cameraInfo, nodeId, GetToolColor(warning, false), alpha); } + /// the average half width of all connected segments + private float NodeRadius(ushort nodeId) { + + float sum_half_width = 0; + int count = 0; + Constants.ServiceFactory.NetService.IterateNodeSegments( + nodeId, + (ushort segmentId, ref NetSegment segment) => { + sum_half_width += segment.Info.m_halfWidth; + count++; + return true; + }); + return sum_half_width / count; + } + public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, ushort nodeId, Color color, bool alpha = false) { - NetNode[] nodesBuffer = Singleton.instance.m_nodes.m_buffer; - NetSegment segment = - Singleton.instance.m_segments.m_buffer[ nodesBuffer[nodeId].m_segment0]; - - Vector3 pos = nodesBuffer[nodeId].m_position; - float terrainY = Singleton.instance.SampleDetailHeightSmooth(pos); - if (terrainY > pos.y) { - pos.y = terrainY; - } - - Bezier3 bezier; - bezier.a = pos; - bezier.d = pos; - - NetSegment.CalculateMiddlePoints( - bezier.a, - segment.m_startDirection, - bezier.d, - segment.m_endDirection, - false, - false, - out bezier.b, - out bezier.c); - - DrawOverlayBezier(cameraInfo, bezier, color, alpha); + float r = NodeRadius(nodeId); + Vector3 pos = Singleton.instance.m_nodes.m_buffer[nodeId].m_position; + DrawOverlayCircle(cameraInfo, color, pos, r * 2, alpha); } public void DrawHalfSegment(RenderManager.CameraInfo cameraInfo, @@ -486,10 +479,11 @@ bool IsMiddle(ushort nodeId) { out bezier.b, out bezier.c); + if(bStartNode & !IsMiddle(segment.m_endNode)) bezier = bezier.Cut(0, 0.5f); - if(!bStartNode && !IsMiddle(segment.m_startNode)) - bezier = bezier.Cut(0.5f, 1f); + if (!bStartNode && !IsMiddle(segment.m_startNode)) + bezier = bezier.Cut(0.5f, 1); Singleton.instance.m_drawCallData.m_overlayCalls++; Singleton.instance.OverlayEffect.DrawBezier( @@ -505,26 +499,6 @@ bool IsMiddle(ushort nodeId) { alpha); } - private void DrawOverlayBezier(RenderManager.CameraInfo cameraInfo, - Bezier3 bezier, - Color color, - bool alpha = false, - float width = 8f) { - //const float width = 8f; // 8 - small roads; 16 - big roads - Singleton.instance.m_drawCallData.m_overlayCalls++; - Singleton.instance.OverlayEffect.DrawBezier( - cameraInfo, - color, - bezier, - width * 2f, - width, - width, - -1f, - 1280f, - false, - alpha); - } - [UsedImplicitly] private void DrawOverlayCircle(RenderManager.CameraInfo cameraInfo, Color color, From da2384c417d8ce587830bb4f520d46b9bd1b3b37 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Sat, 23 Nov 2019 09:18:51 +0200 Subject: [PATCH 03/15] Changed highlited colors. --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 42 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index 8f83adba0..924d370cd 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -6,6 +6,7 @@ namespace TrafficManager.UI.SubTools { using GenericGameBridge.Service; using Manager.Impl; using State; + using TrafficManager.API.Traffic.Data; using UnityEngine; public class LaneArrowTool : SubTool { @@ -41,7 +42,7 @@ public override void OnPrimaryClickOverlay() { LaneArrowManager.SeparateTurningLanes.SeparateSegmentLanes(HoveredSegmentId, HoveredNodeId, out res); } else if (ctrlDown) { LaneArrowManager.SeparateTurningLanes.SeparateNode(HoveredNodeId, out res); - } else { + } else if (HasOutgoingLanes()) { SelectedSegmentId = HoveredSegmentId; SelectedNodeId = HoveredNodeId; } @@ -108,13 +109,19 @@ public override void OnToolGUI(Event e) { cursorInSecondaryPanel_ = windowRect3.Contains(Event.current.mousePosition); } + private bool HasOutgoingLanes() { + ExtSegmentEndManager segEndMan = ExtSegmentEndManager.Instance; + ExtSegmentEnd segEnd = segEndMan.ExtSegmentEnds[segEndMan.GetIndex(HoveredSegmentId, HoveredNodeId)]; + return segEnd.incoming; // Outgoing lanes toward the node is incomming lanes to the segment end. + } + public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { NetManager netManager = Singleton.instance; bool ctrlDown = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl); bool altDown = Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt); - if (ctrlDown) { + if (ctrlDown && !cursorInSecondaryPanel_ && (HoveredNodeId != 0)) { // draw hovered node MainTool.DrawNodeCircle(cameraInfo, HoveredNodeId, Input.GetMouseButton(0)); return; @@ -132,29 +139,30 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { if (((netManager.m_segments.m_buffer[HoveredSegmentId].m_startNode == HoveredNodeId) || (netManager.m_segments.m_buffer[HoveredSegmentId].m_endNode == HoveredNodeId)) && ((nodeFlags & NetNode.Flags.Junction) != NetNode.Flags.None)) - { + { bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId,HoveredNodeId); + Color color = MainTool.GetToolColor(false, !HasOutgoingLanes()); MainTool.DrawHalfSegment( cameraInfo, HoveredSegmentId, bStartNode, - MainTool.GetToolColor(altDown, false), - false); + color, + altDown); } } - if (SelectedSegmentId == 0) return; - - Color color; - if (altDown && HoveredSegmentId == SelectedSegmentId) - color = MainTool.GetToolColor(true, true); - else - color = MainTool.GetToolColor(true, false); - NetTool.RenderOverlay( - cameraInfo, - ref Singleton.instance.m_segments.m_buffer[SelectedSegmentId], - color, - color); + if (SelectedSegmentId != 0) { + Color color = MainTool.GetToolColor(true, false); + if (altDown && HoveredSegmentId == SelectedSegmentId) { + color.r += 30; + } + + NetTool.RenderOverlay( + cameraInfo, + ref Singleton.instance.m_segments.m_buffer[SelectedSegmentId], + color, + color); + } } private void GuiLaneChangeWindow(int num) { From ac4c22c400e9dbf2f66700953e540a9d58e0dd89 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Sat, 23 Nov 2019 16:18:25 +0200 Subject: [PATCH 04/15] Fixed LHD lane separation for 2way roads. --- TLM/TLM/Manager/Impl/LaneArrowManager.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/TLM/TLM/Manager/Impl/LaneArrowManager.cs b/TLM/TLM/Manager/Impl/LaneArrowManager.cs index 75fdff6b5..daf6e33e6 100644 --- a/TLM/TLM/Manager/Impl/LaneArrowManager.cs +++ b/TLM/TLM/Manager/Impl/LaneArrowManager.cs @@ -320,14 +320,19 @@ public static void SeparateSegmentLanes(ushort segmentId, ushort nodeId, out Set return; // no junction } + bool lhd = LaneArrowManager.Instance.Services.SimulationService.LeftHandDrive; if (srcLaneCount == 2 && numdirs == 3) { - LaneArrowManager.Instance.SetLaneArrows(laneList[0].laneId, LaneArrows.LeftForward); - LaneArrowManager.Instance.SetLaneArrows(laneList[1].laneId, LaneArrows.Right); + if (!lhd) { + LaneArrowManager.Instance.SetLaneArrows(laneList[0].laneId, LaneArrows.LeftForward); + LaneArrowManager.Instance.SetLaneArrows(laneList[1].laneId, LaneArrows.Right); + }else { + LaneArrowManager.Instance.SetLaneArrows(laneList[1].laneId, LaneArrows.ForwardRight); + LaneArrowManager.Instance.SetLaneArrows(laneList[0].laneId, LaneArrows.Left); + } return; } int l = 0, f = 0, r = 0; - bool lhd = LaneArrowManager.Instance.Services.SimulationService.LeftHandDrive; if (numdirs == 2) { if (!lhd) { //if right hand drive then favour the more difficult left turns. From f67adb30b61ddcb8504176fea00d430354f7696a Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Sun, 24 Nov 2019 03:02:37 +0200 Subject: [PATCH 05/15] fixed bug, change highlight size and colors. hoverNodeId will change to the other end of the segment if there is no junction --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 44 ++++++++++++++++------------ TLM/TLM/UI/TrafficManagerTool.cs | 13 ++++---- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index 924d370cd..d2e86a281 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -115,12 +115,30 @@ private bool HasOutgoingLanes() { return segEnd.incoming; // Outgoing lanes toward the node is incomming lanes to the segment end. } + + protected ushort HoveredNodeId { + get { + NetNode[] nodesBuffer = Singleton.instance.m_nodes.m_buffer; + bool IsJunction(ushort nodeId) => (nodesBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; + if (!IsJunction(TrafficManagerTool.HoveredNodeId)) + { + ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[HoveredSegmentId]; + ushort otherNodeId = segment.GetOtherNode(TrafficManagerTool.HoveredNodeId); + if (IsJunction(otherNodeId)) { + return otherNodeId; + } + } + return TrafficManagerTool.HoveredNodeId; + } + set => TrafficManagerTool.HoveredNodeId = value; + } + public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { NetManager netManager = Singleton.instance; bool ctrlDown = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl); bool altDown = Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt); - + bool PrimaryDown = Input.GetMouseButton(0); if (ctrlDown && !cursorInSecondaryPanel_ && (HoveredNodeId != 0)) { // draw hovered node MainTool.DrawNodeCircle(cameraInfo, HoveredNodeId, Input.GetMouseButton(0)); @@ -140,28 +158,18 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { || (netManager.m_segments.m_buffer[HoveredSegmentId].m_endNode == HoveredNodeId)) && ((nodeFlags & NetNode.Flags.Junction) != NetNode.Flags.None)) { - bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId,HoveredNodeId); - Color color = MainTool.GetToolColor(false, !HasOutgoingLanes()); - MainTool.DrawHalfSegment( - cameraInfo, - HoveredSegmentId, - bStartNode, - color, - altDown); + bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId, HoveredNodeId); + Color color = MainTool.GetToolColor(PrimaryDown, !HasOutgoingLanes()); + bool alpha = !altDown && HasOutgoingLanes(); + MainTool.DrawHalfSegment(cameraInfo, HoveredSegmentId, bStartNode, color, alpha); } } if (SelectedSegmentId != 0) { Color color = MainTool.GetToolColor(true, false); - if (altDown && HoveredSegmentId == SelectedSegmentId) { - color.r += 30; - } - - NetTool.RenderOverlay( - cameraInfo, - ref Singleton.instance.m_segments.m_buffer[SelectedSegmentId], - color, - color); + bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(SelectedSegmentId, SelectedNodeId); + bool alpha = !altDown && HoveredSegmentId == SelectedSegmentId; + MainTool.DrawHalfSegment(cameraInfo, SelectedSegmentId, bStartNode, color, alpha); } } diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index 242e7c4d6..cfe894902 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -449,8 +449,6 @@ public void DrawHalfSegment(RenderManager.CameraInfo cameraInfo, ushort nodeId, otherNodeId; NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; - - Vector3 GetPos(ushort nodeId) { Vector3 pos = nodeBuffer[nodeId].m_position; float terrainY = Singleton.instance.SampleDetailHeightSmooth(pos); @@ -460,9 +458,9 @@ Vector3 GetPos(ushort nodeId) { return pos; } - bool IsMiddle(ushort nodeId) { - return (nodeBuffer[nodeId].m_flags & NetNode.Flags.Middle) != 0; - } + bool IsMiddle(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Middle) != 0; + + bool IsJunction(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; Bezier3 bezier; @@ -479,10 +477,9 @@ bool IsMiddle(ushort nodeId) { out bezier.b, out bezier.c); - - if(bStartNode & !IsMiddle(segment.m_endNode)) + if(bStartNode & IsJunction(segment.m_endNode)) bezier = bezier.Cut(0, 0.5f); - if (!bStartNode && !IsMiddle(segment.m_startNode)) + if (!bStartNode && IsJunction(segment.m_startNode)) bezier = bezier.Cut(0.5f, 1); Singleton.instance.m_drawCallData.m_overlayCalls++; From cb4084837d6415c1bb93604f975dc8284e685a94 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Sun, 24 Nov 2019 23:09:35 +0200 Subject: [PATCH 06/15] better organisation of code. --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 22 ++++++++++++++++++++-- TLM/TLM/UI/TrafficManagerTool.cs | 15 +++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index d2e86a281..6dad518a1 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -133,6 +133,24 @@ protected ushort HoveredNodeId { set => TrafficManagerTool.HoveredNodeId = value; } + private void DrawSegmentEnd( + RenderManager.CameraInfo cameraInfo, + ushort segmentId, + bool bStartNode, + Color color, + bool alpha = false) { + ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; + NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; + bool IsJunction(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; + + float cut = 0.5f; + if (bStartNode & !IsJunction(segment.m_endNode)) + cut = 1; + if (!bStartNode && !IsJunction(segment.m_startNode)) + cut = 1; + MainTool.DrawCutSegment(cameraInfo, segmentId, cut, bStartNode, color, alpha); + } + public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { NetManager netManager = Singleton.instance; @@ -161,7 +179,7 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId, HoveredNodeId); Color color = MainTool.GetToolColor(PrimaryDown, !HasOutgoingLanes()); bool alpha = !altDown && HasOutgoingLanes(); - MainTool.DrawHalfSegment(cameraInfo, HoveredSegmentId, bStartNode, color, alpha); + DrawSegmentEnd(cameraInfo, HoveredSegmentId, bStartNode, color, alpha); } } @@ -169,7 +187,7 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { Color color = MainTool.GetToolColor(true, false); bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(SelectedSegmentId, SelectedNodeId); bool alpha = !altDown && HoveredSegmentId == SelectedSegmentId; - MainTool.DrawHalfSegment(cameraInfo, SelectedSegmentId, bStartNode, color, alpha); + DrawSegmentEnd(cameraInfo, SelectedSegmentId, bStartNode, color, alpha); } } diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index cfe894902..0a5348e11 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -439,8 +439,9 @@ public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, DrawOverlayCircle(cameraInfo, color, pos, r * 2, alpha); } - public void DrawHalfSegment(RenderManager.CameraInfo cameraInfo, + public void DrawCutSegment(RenderManager.CameraInfo cameraInfo, ushort segmentId, + float cut, bool bStartNode, Color color, bool alpha = false) { @@ -460,9 +461,6 @@ Vector3 GetPos(ushort nodeId) { bool IsMiddle(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Middle) != 0; - bool IsJunction(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; - - Bezier3 bezier; bezier.a = GetPos(segment.m_startNode); bezier.d = GetPos(segment.m_endNode); @@ -477,10 +475,11 @@ Vector3 GetPos(ushort nodeId) { out bezier.b, out bezier.c); - if(bStartNode & IsJunction(segment.m_endNode)) - bezier = bezier.Cut(0, 0.5f); - if (!bStartNode && IsJunction(segment.m_startNode)) - bezier = bezier.Cut(0.5f, 1); + if (bStartNode) { + bezier = bezier.Cut(0, cut); + } else { + bezier = bezier.Cut(1 - cut, 1); + } Singleton.instance.m_drawCallData.m_overlayCalls++; Singleton.instance.OverlayEffect.DrawBezier( From 88068a70f1c3e45020e37e42955f87dcfc006433 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Thu, 28 Nov 2019 00:10:31 +0200 Subject: [PATCH 07/15] highlights take into consideration oneway roads. --- TLM/TLM/UI/SubTool.cs | 6 ++-- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 46 ++++++++++++++++------------ 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/TLM/TLM/UI/SubTool.cs b/TLM/TLM/UI/SubTool.cs index 8d450429c..6d953e3e7 100644 --- a/TLM/TLM/UI/SubTool.cs +++ b/TLM/TLM/UI/SubTool.cs @@ -1,4 +1,4 @@ -namespace TrafficManager.UI { +namespace TrafficManager.UI { using ColossalFramework.UI; using JetBrains.Annotations; using Textures; @@ -78,12 +78,12 @@ private Texture2D BorderlessTexture { private GUIStyle borderlessStyle_; - protected ushort HoveredNodeId { + protected virtual ushort HoveredNodeId { get => TrafficManagerTool.HoveredNodeId; set => TrafficManagerTool.HoveredNodeId = value; } - protected ushort HoveredSegmentId { + protected virtual ushort HoveredSegmentId { get => TrafficManagerTool.HoveredSegmentId; set => TrafficManagerTool.HoveredSegmentId = value; } diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index 6dad518a1..dbcfdd71d 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -42,7 +42,7 @@ public override void OnPrimaryClickOverlay() { LaneArrowManager.SeparateTurningLanes.SeparateSegmentLanes(HoveredSegmentId, HoveredNodeId, out res); } else if (ctrlDown) { LaneArrowManager.SeparateTurningLanes.SeparateNode(HoveredNodeId, out res); - } else if (HasOutgoingLanes()) { + } else if (IsHoverValid()) { SelectedSegmentId = HoveredSegmentId; SelectedNodeId = HoveredNodeId; } @@ -109,28 +109,37 @@ public override void OnToolGUI(Event e) { cursorInSecondaryPanel_ = windowRect3.Contains(Event.current.mousePosition); } - private bool HasOutgoingLanes() { + + private bool IsHoverValid() => IsSegmentEndHoverable(HoveredSegmentId, HoveredNodeId); + private bool IsSegmentEndHoverable(ushort segmentId, ushort nodeId) { +#if DEBUG + if(!Constants.ServiceFactory.NetService.IsNodeValid(nodeId) || + !Constants.ServiceFactory.NetService.IsSegmentValid(segmentId)) { + throw new System.Exception("Invalid node or segment ID"); + } +#endif ExtSegmentEndManager segEndMan = ExtSegmentEndManager.Instance; - ExtSegmentEnd segEnd = segEndMan.ExtSegmentEnds[segEndMan.GetIndex(HoveredSegmentId, HoveredNodeId)]; - return segEnd.incoming; // Outgoing lanes toward the node is incomming lanes to the segment end. - } + ExtSegmentEnd segEnd = segEndMan.ExtSegmentEnds[segEndMan.GetIndex(segmentId, nodeId)]; + NetNode[] nodesBuffer = Singleton.instance.m_nodes.m_buffer; + bool IsJunction(ushort nodeId) => (nodesBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; + // Outgoing lanes toward the node is incomming lanes to the segment end. + return IsJunction(nodeId) && segEnd.incoming; + } - protected ushort HoveredNodeId { + protected override ushort HoveredNodeId { get { - NetNode[] nodesBuffer = Singleton.instance.m_nodes.m_buffer; - bool IsJunction(ushort nodeId) => (nodesBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; - if (!IsJunction(TrafficManagerTool.HoveredNodeId)) + if (!IsSegmentEndHoverable(HoveredSegmentId, base.HoveredNodeId)) { ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[HoveredSegmentId]; - ushort otherNodeId = segment.GetOtherNode(TrafficManagerTool.HoveredNodeId); - if (IsJunction(otherNodeId)) { + ushort otherNodeId = segment.GetOtherNode(base.HoveredNodeId); + if (IsSegmentEndHoverable(HoveredSegmentId, otherNodeId)) { return otherNodeId; } } - return TrafficManagerTool.HoveredNodeId; + return base.HoveredNodeId; } - set => TrafficManagerTool.HoveredNodeId = value; + set => base.HoveredNodeId = value; } private void DrawSegmentEnd( @@ -140,13 +149,11 @@ private void DrawSegmentEnd( Color color, bool alpha = false) { ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; - NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; - bool IsJunction(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; float cut = 0.5f; - if (bStartNode & !IsJunction(segment.m_endNode)) + if (bStartNode & !IsSegmentEndHoverable(segmentId, segment.m_endNode)) cut = 1; - if (!bStartNode && !IsJunction(segment.m_startNode)) + if (!bStartNode && !IsSegmentEndHoverable(segmentId, segment.m_startNode)) cut = 1; MainTool.DrawCutSegment(cameraInfo, segmentId, cut, bStartNode, color, alpha); } @@ -176,9 +183,10 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { || (netManager.m_segments.m_buffer[HoveredSegmentId].m_endNode == HoveredNodeId)) && ((nodeFlags & NetNode.Flags.Junction) != NetNode.Flags.None)) { + bool canHover = IsHoverValid(); bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId, HoveredNodeId); - Color color = MainTool.GetToolColor(PrimaryDown, !HasOutgoingLanes()); - bool alpha = !altDown && HasOutgoingLanes(); + Color color = MainTool.GetToolColor(PrimaryDown, !canHover); + bool alpha = !altDown && canHover; DrawSegmentEnd(cameraInfo, HoveredSegmentId, bStartNode, color, alpha); } } From 354369600c33cc07f288e8b82d859c3d6964760d Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Thu, 28 Nov 2019 05:43:06 +0200 Subject: [PATCH 08/15] changed function names --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 2 +- TLM/TLM/UI/TrafficManagerTool.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index dbcfdd71d..ee5b4d23f 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -155,7 +155,7 @@ private void DrawSegmentEnd( cut = 1; if (!bStartNode && !IsSegmentEndHoverable(segmentId, segment.m_startNode)) cut = 1; - MainTool.DrawCutSegment(cameraInfo, segmentId, cut, bStartNode, color, alpha); + MainTool.DrawCutSegmentEnd(cameraInfo, segmentId, cut, bStartNode, color, alpha); } public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index 0a5348e11..901b92fce 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -416,7 +416,7 @@ public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, } /// the average half width of all connected segments - private float NodeRadius(ushort nodeId) { + private float CalculateNodeRadius(ushort nodeId) { float sum_half_width = 0; int count = 0; @@ -434,12 +434,12 @@ public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, ushort nodeId, Color color, bool alpha = false) { - float r = NodeRadius(nodeId); + float r = CalculateNodeRadius(nodeId); Vector3 pos = Singleton.instance.m_nodes.m_buffer[nodeId].m_position; DrawOverlayCircle(cameraInfo, color, pos, r * 2, alpha); } - public void DrawCutSegment(RenderManager.CameraInfo cameraInfo, + public void DrawCutSegmentEnd(RenderManager.CameraInfo cameraInfo, ushort segmentId, float cut, bool bStartNode, From 3cd907c17666776e88727335018524d257fccbaf Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Thu, 28 Nov 2019 06:57:08 +0200 Subject: [PATCH 09/15] Fixed an intermittent bug with debug build. --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index ee5b4d23f..c3cb4adc2 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -112,10 +112,13 @@ public override void OnToolGUI(Event e) { private bool IsHoverValid() => IsSegmentEndHoverable(HoveredSegmentId, HoveredNodeId); private bool IsSegmentEndHoverable(ushort segmentId, ushort nodeId) { + if(nodeId == 0 || segmentId == 0) { + return false; + } #if DEBUG if(!Constants.ServiceFactory.NetService.IsNodeValid(nodeId) || !Constants.ServiceFactory.NetService.IsSegmentValid(segmentId)) { - throw new System.Exception("Invalid node or segment ID"); + Debug.LogError("Invalid node or segment ID"); } #endif ExtSegmentEndManager segEndMan = ExtSegmentEndManager.Instance; From fdb44b6c1ed4aad4465c37d22b2220638cf7b57e Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Thu, 28 Nov 2019 22:08:59 +0200 Subject: [PATCH 10/15] polished the code. --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 37 ++++++++++++++++++++-------- TLM/TLM/UI/TrafficManagerTool.cs | 9 +++++++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index c3cb4adc2..43d0ebfaa 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -42,7 +42,7 @@ public override void OnPrimaryClickOverlay() { LaneArrowManager.SeparateTurningLanes.SeparateSegmentLanes(HoveredSegmentId, HoveredNodeId, out res); } else if (ctrlDown) { LaneArrowManager.SeparateTurningLanes.SeparateNode(HoveredNodeId, out res); - } else if (IsHoverValid()) { + } else if (HasHoverLaneArrows()) { SelectedSegmentId = HoveredSegmentId; SelectedNodeId = HoveredNodeId; } @@ -109,9 +109,15 @@ public override void OnToolGUI(Event e) { cursorInSecondaryPanel_ = windowRect3.Contains(Event.current.mousePosition); } + /// + /// Determines whether or not the hovered segment end has lane arrows. + /// + private bool HasHoverLaneArrows() => HasSegmentEndLaneArrows(HoveredSegmentId, HoveredNodeId); - private bool IsHoverValid() => IsSegmentEndHoverable(HoveredSegmentId, HoveredNodeId); - private bool IsSegmentEndHoverable(ushort segmentId, ushort nodeId) { + /// + /// determines whether or not the given segment end has lane arrows. + /// + private bool HasSegmentEndLaneArrows(ushort segmentId, ushort nodeId) { if(nodeId == 0 || segmentId == 0) { return false; } @@ -132,11 +138,15 @@ private bool IsSegmentEndHoverable(ushort segmentId, ushort nodeId) { protected override ushort HoveredNodeId { get { - if (!IsSegmentEndHoverable(HoveredSegmentId, base.HoveredNodeId)) + // if the current segment end does not have lane arrows + // and the other end of the segment does have lane arrows, then + // assume the user intends to hover over that one. + // This code makes it easier to hover over small segments. + if (!HasSegmentEndLaneArrows(HoveredSegmentId, base.HoveredNodeId)) { ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[HoveredSegmentId]; ushort otherNodeId = segment.GetOtherNode(base.HoveredNodeId); - if (IsSegmentEndHoverable(HoveredSegmentId, otherNodeId)) { + if (HasSegmentEndLaneArrows(HoveredSegmentId, otherNodeId)) { return otherNodeId; } } @@ -145,6 +155,9 @@ protected override ushort HoveredNodeId { set => base.HoveredNodeId = value; } + /// + /// Draws a half sausage to highlight the segment end. + /// private void DrawSegmentEnd( RenderManager.CameraInfo cameraInfo, ushort segmentId, @@ -154,9 +167,14 @@ private void DrawSegmentEnd( ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; float cut = 0.5f; - if (bStartNode & !IsSegmentEndHoverable(segmentId, segment.m_endNode)) + + // if the other side of the segment does not have lane arrows then + // the length of the hover is not reduced by half. + // but the highlight still looks like a half sausage. + // this is important to give user visual feedback which area is hoverable. + if (bStartNode & !HasSegmentEndLaneArrows(segmentId, segment.m_endNode)) cut = 1; - if (!bStartNode && !IsSegmentEndHoverable(segmentId, segment.m_startNode)) + if (!bStartNode && !HasSegmentEndLaneArrows(segmentId, segment.m_startNode)) cut = 1; MainTool.DrawCutSegmentEnd(cameraInfo, segmentId, cut, bStartNode, color, alpha); } @@ -184,9 +202,8 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { if (((netManager.m_segments.m_buffer[HoveredSegmentId].m_startNode == HoveredNodeId) || (netManager.m_segments.m_buffer[HoveredSegmentId].m_endNode == HoveredNodeId)) - && ((nodeFlags & NetNode.Flags.Junction) != NetNode.Flags.None)) - { - bool canHover = IsHoverValid(); + && ((nodeFlags & NetNode.Flags.Junction) != NetNode.Flags.None)) { + bool canHover = HasHoverLaneArrows(); bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId, HoveredNodeId); Color color = MainTool.GetToolColor(PrimaryDown, !canHover); bool alpha = !altDown && canHover; diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index 901b92fce..367e5c233 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -439,12 +439,21 @@ public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, DrawOverlayCircle(cameraInfo, color, pos, r * 2, alpha); } + /// + /// Draws a half sausage at segment end. + /// + /// + /// The lenght of the highlight [0~1] + /// Determines the direction of the half sausage. public void DrawCutSegmentEnd(RenderManager.CameraInfo cameraInfo, ushort segmentId, float cut, bool bStartNode, Color color, bool alpha = false) { + if( segmentId == 0) { + return; + } ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; float width = segment.Info.m_halfWidth; ushort nodeId, otherNodeId; From 0d47af13edb8f49548e87d912fa8a34bebedbad4 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Fri, 29 Nov 2019 15:04:22 +0200 Subject: [PATCH 11/15] review fixes. --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index 43d0ebfaa..8468cf1c6 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -166,16 +166,15 @@ private void DrawSegmentEnd( bool alpha = false) { ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; - float cut = 0.5f; - // if the other side of the segment does not have lane arrows then // the length of the hover is not reduced by half. // but the highlight still looks like a half sausage. // this is important to give user visual feedback which area is hoverable. - if (bStartNode & !HasSegmentEndLaneArrows(segmentId, segment.m_endNode)) - cut = 1; - if (!bStartNode && !HasSegmentEndLaneArrows(segmentId, segment.m_startNode)) - cut = 1; + bool con = + HasSegmentEndLaneArrows(segmentId, segment.m_startNode) ^ + HasSegmentEndLaneArrows(segmentId, segment.m_startNode); + float cut = con ? 1f : 0.5f; + MainTool.DrawCutSegmentEnd(cameraInfo, segmentId, cut, bStartNode, color, alpha); } From e8406364ddfcdb3f08ac5c536138b5940ca47b74 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Fri, 29 Nov 2019 15:26:23 +0200 Subject: [PATCH 12/15] got rid of red highlight. --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index 8468cf1c6..bfb1fa36b 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -172,7 +172,7 @@ private void DrawSegmentEnd( // this is important to give user visual feedback which area is hoverable. bool con = HasSegmentEndLaneArrows(segmentId, segment.m_startNode) ^ - HasSegmentEndLaneArrows(segmentId, segment.m_startNode); + HasSegmentEndLaneArrows(segmentId, segment.m_endNode); float cut = con ? 1f : 0.5f; MainTool.DrawCutSegmentEnd(cameraInfo, segmentId, cut, bStartNode, color, alpha); @@ -192,6 +192,7 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { // Log._Debug($"LaneArrow Overlay: {HoveredNodeId} {HoveredSegmentId} {SelectedNodeId} {SelectedSegmentId}"); if (!cursorInSecondaryPanel_ + && HasHoverLaneArrows() && (HoveredSegmentId != 0) && (HoveredNodeId != 0) && ((HoveredSegmentId != SelectedSegmentId) @@ -202,10 +203,9 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { if (((netManager.m_segments.m_buffer[HoveredSegmentId].m_startNode == HoveredNodeId) || (netManager.m_segments.m_buffer[HoveredSegmentId].m_endNode == HoveredNodeId)) && ((nodeFlags & NetNode.Flags.Junction) != NetNode.Flags.None)) { - bool canHover = HasHoverLaneArrows(); bool bStartNode = (bool)Constants.ServiceFactory.NetService.IsStartNode(HoveredSegmentId, HoveredNodeId); - Color color = MainTool.GetToolColor(PrimaryDown, !canHover); - bool alpha = !altDown && canHover; + Color color = MainTool.GetToolColor(PrimaryDown, false); + bool alpha = !altDown; DrawSegmentEnd(cameraInfo, HoveredSegmentId, bStartNode, color, alpha); } } From 31d7b112527fcb15d4368a20eff4de5fd73eab21 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Fri, 29 Nov 2019 15:30:21 +0200 Subject: [PATCH 13/15] fixed comment --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index bfb1fa36b..73b8fdeca 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -166,9 +166,8 @@ private void DrawSegmentEnd( bool alpha = false) { ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; - // if the other side of the segment does not have lane arrows then - // the length of the hover is not reduced by half. - // but the highlight still looks like a half sausage. + // if only one side of the segment has lane arrows then the length of the + // is 1. but the highlight still looks like a sausage which is cut at one end. // this is important to give user visual feedback which area is hoverable. bool con = HasSegmentEndLaneArrows(segmentId, segment.m_startNode) ^ From bd9f56eaa6342692059c9790b75820193f87fd60 Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Tue, 3 Dec 2019 02:30:04 +0200 Subject: [PATCH 14/15] PR fixes --- TLM/TLM/UI/SubTools/LaneArrowTool.cs | 4 ++-- TLM/TLM/UI/TrafficManagerTool.cs | 30 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/TLM/TLM/UI/SubTools/LaneArrowTool.cs b/TLM/TLM/UI/SubTools/LaneArrowTool.cs index 73b8fdeca..5ca05148a 100644 --- a/TLM/TLM/UI/SubTools/LaneArrowTool.cs +++ b/TLM/TLM/UI/SubTools/LaneArrowTool.cs @@ -130,10 +130,10 @@ private bool HasSegmentEndLaneArrows(ushort segmentId, ushort nodeId) { ExtSegmentEndManager segEndMan = ExtSegmentEndManager.Instance; ExtSegmentEnd segEnd = segEndMan.ExtSegmentEnds[segEndMan.GetIndex(segmentId, nodeId)]; NetNode[] nodesBuffer = Singleton.instance.m_nodes.m_buffer; - bool IsJunction(ushort nodeId) => (nodesBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; + bool bJunction = (nodesBuffer[nodeId].m_flags & NetNode.Flags.Junction) != 0; // Outgoing lanes toward the node is incomming lanes to the segment end. - return IsJunction(nodeId) && segEnd.incoming; + return bJunction && segEnd.incoming; } protected override ushort HoveredNodeId { diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index 1f34a0d1a..fdd55f4f3 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -410,6 +410,7 @@ protected override void OnToolGUI(Event e) { } } + public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, ushort nodeId, bool warning = false, @@ -417,8 +418,21 @@ public void DrawNodeCircle(RenderManager.CameraInfo cameraInfo, DrawNodeCircle(cameraInfo, nodeId, GetToolColor(warning, false), alpha); } + /// + /// Gets the coordinates of the given node. + /// + private static Vector3 GetNodePos(ushort nodeId) { + NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; + Vector3 pos = nodeBuffer[nodeId].m_position; + float terrainY = Singleton.instance.SampleDetailHeightSmooth(pos); + if (terrainY > pos.y) { + pos.y = terrainY; + } + return pos; + } + /// the average half width of all connected segments - private float CalculateNodeRadius(ushort nodeId) { + private static float CalculateNodeRadius(ushort nodeId) { float sum_half_width = 0; int count = 0; @@ -460,21 +474,13 @@ public void DrawCutSegmentEnd(RenderManager.CameraInfo cameraInfo, float width = segment.Info.m_halfWidth; ushort nodeId, otherNodeId; - NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; - Vector3 GetPos(ushort nodeId) { - Vector3 pos = nodeBuffer[nodeId].m_position; - float terrainY = Singleton.instance.SampleDetailHeightSmooth(pos); - if (terrainY > pos.y) { - pos.y = terrainY; - } - return pos; - } + NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; bool IsMiddle(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Middle) != 0; Bezier3 bezier; - bezier.a = GetPos(segment.m_startNode); - bezier.d = GetPos(segment.m_endNode); + bezier.a = GetNodePos(segment.m_startNode); + bezier.d = GetNodePos(segment.m_endNode); NetSegment.CalculateMiddlePoints( bezier.a, From a5ec48e964423aa22f7780a8c00717441c0a9b6b Mon Sep 17 00:00:00 2001 From: "kian.zarrin" Date: Wed, 4 Dec 2019 03:44:34 +0200 Subject: [PATCH 15/15] removed unsued variables. --- TLM/TLM/UI/TrafficManagerTool.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index fdd55f4f3..b9e8d7e82 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -472,8 +472,6 @@ public void DrawCutSegmentEnd(RenderManager.CameraInfo cameraInfo, } ref NetSegment segment = ref Singleton.instance.m_segments.m_buffer[segmentId]; float width = segment.Info.m_halfWidth; - ushort nodeId, otherNodeId; - NetNode[] nodeBuffer = Singleton.instance.m_nodes.m_buffer; bool IsMiddle(ushort nodeId) => (nodeBuffer[nodeId].m_flags & NetNode.Flags.Middle) != 0;