public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { base.RenderOverlay(cameraInfo); if (HoveredSegmentId == 0 || HoveredNodeId == 0) { return; } NetNode.Flags nodeFlags = HoveredNodeId.ToNode().m_flags; Color color = GetToolColor(Input.GetMouseButton(0), false); NetTool.RenderOverlay( cameraInfo, ref HoveredSegmentId.ToSegment(), color, color); }
bool IsSuitableRoadForRoadBridge() { if (!HoveredSegmentId.ToSegment().CanConnectPath()) { return(false); } float minDistance = 1 * NetUtil.MPU + NetUtil.MaxNodeHW(HoveredNodeId); if (HoveredNodeId.ToNode().m_flags.IsFlagSet(NetNode.Flags.Middle)) { return(true); } var diff = HitPos - HoveredNodeId.ToNode().m_position; float diff2 = diff.sqrMagnitude; return(diff2 > minDistance * minDistance); }
/// <summary> /// Calculates accurate vertical element of raycast hit position. /// </summary> internal float GetAccurateHitHeight() { // cache result. float current_hitH = raycastOutput.m_hitPos.y; if (KianCommons.Math.MathUtil.EqualAprox(current_hitH, prev_H, 1e-12f)) { return(prev_H_Fixed); } prev_H = current_hitH; if (HoveredSegmentId.ToSegment().GetClosestLanePosition( raycastOutput.m_hitPos, NetInfo.LaneType.All, VehicleInfo.VehicleType.All, out Vector3 pos, out uint laneId, out int laneIndex, out float laneOffset)) { return(prev_H_Fixed = pos.y); } return(prev_H_Fixed = current_hitH + 0.5f); }
// simulation thread protected bool DetermineHoveredElements() { HoveredSegmentId = 0; HoveredNodeId = 0; if (!m_mouseRayValid) { return(false); } // find currently hovered node RaycastInput nodeInput = new RaycastInput(m_mouseRay, m_mouseRayLength) { m_netService = GetService(), m_ignoreTerrain = true, m_ignoreNodeFlags = NetNode.Flags.None, }; if (RayCast(nodeInput, out raycastOutput)) { HoveredNodeId = raycastOutput.m_netNode; } HoveredSegmentId = GetSegmentFromNode(raycastOutput.m_hitPos); if (HoveredSegmentId != 0) { Debug.Assert(HoveredNodeId != 0, "unexpected: HoveredNodeId == 0"); return(true); } // find currently hovered segment var segmentInput = new RaycastInput(m_mouseRay, m_mouseRayLength) { m_netService = GetService(), m_ignoreTerrain = true, m_ignoreSegmentFlags = NetSegment.Flags.None }; if (RayCast(segmentInput, out raycastOutput)) { HoveredSegmentId = raycastOutput.m_netSegment; } if (HoveredNodeId <= 0 && HoveredSegmentId > 0) { // alternative way to get a node hit: check distance to start and end nodes // of the segment ushort startNodeId = HoveredSegmentId.ToSegment().m_startNode; ushort endNodeId = HoveredSegmentId.ToSegment().m_endNode; var vStart = raycastOutput.m_hitPos - startNodeId.ToNode().m_position; var vEnd = raycastOutput.m_hitPos - endNodeId.ToNode().m_position; float startDist = vStart.magnitude; float endDist = vEnd.magnitude; if (startDist < endDist && startDist < 75f) { HoveredNodeId = startNodeId; } else if (endDist < startDist && endDist < 75f) { HoveredNodeId = endNodeId; } } return(HoveredNodeId != 0 || HoveredSegmentId != 0); }
private bool DetermineHoveredElements() { HoveredSegmentId = 0; HoveredNodeId = 0; HitPos = Vector3.zero; if (!IsMouseRayValid) { return(false); } // find currently hovered node RaycastInput nodeInput = new RaycastInput(m_mouseRay, m_mouseRayLength) { m_netService = { // find road segments m_itemLayers = ItemClass.Layer.Default | ItemClass.Layer.MetroTunnels, m_service = ItemClass.Service.Road }, m_ignoreTerrain = true, m_ignoreNodeFlags = NetNode.Flags.None }; if (RayCast(nodeInput, out RaycastOutput nodeOutput)) { HoveredNodeId = nodeOutput.m_netNode; HitPos = nodeOutput.m_hitPos; } HoveredSegmentId = GetSegmentFromNode(); if (HoveredSegmentId != 0) { Debug.Assert(HoveredNodeId != 0, "unexpected: HoveredNodeId == 0"); return(true); } // find currently hovered segment var segmentInput = new RaycastInput(m_mouseRay, m_mouseRayLength) { m_netService = { // find road segments m_itemLayers = ItemClass.Layer.Default | ItemClass.Layer.MetroTunnels, m_service = ItemClass.Service.Road }, m_ignoreTerrain = true, m_ignoreSegmentFlags = NetSegment.Flags.None }; if (RayCast(segmentInput, out RaycastOutput segmentOutput)) { HoveredSegmentId = segmentOutput.m_netSegment; HitPos = segmentOutput.m_hitPos; } if (HoveredNodeId <= 0 && HoveredSegmentId > 0) { // alternative way to get a node hit: check distance to start and end nodes // of the segment ushort startNodeId = HoveredSegmentId.ToSegment().m_startNode; ushort endNodeId = HoveredSegmentId.ToSegment().m_endNode; var vStart = segmentOutput.m_hitPos - startNodeId.ToNode().m_position; var vEnd = segmentOutput.m_hitPos - endNodeId.ToNode().m_position; float startDist = vStart.magnitude; float endDist = vEnd.magnitude; if (startDist < endDist && startDist < 75f) { HoveredNodeId = startNodeId; } else if (endDist < startDist && endDist < 75f) { HoveredNodeId = endNodeId; } } return(HoveredNodeId != 0 || HoveredSegmentId != 0); }