void HandleLaneCustomization() { // Handle lane settings Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition); m_hoveredLanes = ushort.MaxValue; foreach (FastList <SegmentLaneMarker> laneMarkers in m_hoveredLaneMarkers.Values) { if (laneMarkers.m_size == 0) { continue; } for (int i = 0; i < laneMarkers.m_size; i++) { SegmentLaneMarker marker = laneMarkers.m_buffer[i]; if (NetManager.instance.m_lanes.m_buffer[marker.m_lane].m_segment != m_hoveredSegment) { continue; } if (marker.IntersectRay(mouseRay)) { m_hoveredLanes = marker.m_laneIndex; break; } } if (m_hoveredLanes != ushort.MaxValue) { break; } } if (m_hoveredLanes != ushort.MaxValue && Input.GetMouseButtonUp(0)) { SegmentLaneMarker[] hoveredMarkers = m_hoveredLaneMarkers[m_hoveredLanes].ToArray(); HashSet <uint> hoveredLanes = new HashSet <uint>(hoveredMarkers.Select(m => m.m_lane)); if (m_selectedLaneMarkers.RemoveAll(m => hoveredLanes.Contains(m.m_lane)) == 0) { m_selectedLaneMarkers.AddRange(hoveredMarkers); } } else if (Input.GetMouseButtonUp(1)) { m_selectedLaneMarkers.Clear(); } }
/// <summary> /// Intersects mouse ray with marker bounds. /// </summary> /// <returns><c>true</c>if mouse ray intersects with marker <c>false</c> otherwise</returns> internal bool IntersectRay() => SegmentMarker.IntersectRay();