private void Start() { stickyMouseSource = new StickyMouse(); RoadPositionRecords.OnMapChanged += (object sender, List <Lane> e) => { stickyMouseSource.SetLane(e); }; }
void Start() { stickyMouse = new StickyMouse(); shift_indicators = new List <Lane>(); RoadPositionRecords.OnMapChanged += (sender, e) => { shift_indicators.ForEach(lane => lane.SetGameobjVisible(false)); shift_indicators.Clear(); stickyMouse.SetLane(RoadPositionRecords.allLanes); // Intersect shiftcurves with allLanes // ctrl points added at same time as interest var ctrl_points = new Dictionary <Vector3, Lane>(); var rightShiftCurves = RoadPositionRecords.allLanes.ConvertAll((input) => { var cloned_3d_curve = input.Clone(); cloned_3d_curve.xz_curve.ShiftRight(Lane.laneWidth); foreach (var cp in cloned_3d_curve.ControlPoints) { if (!ctrl_points.ContainsKey(cp)) { ctrl_points.Add(cp, input); } } return(cloned_3d_curve); }).FindAll(input => input.IsValid); var leftShiftCurves = RoadPositionRecords.allLanes.ConvertAll((input) => { var cloned_3d_curve = input.Clone(); cloned_3d_curve.xz_curve.ShiftRight(-Lane.laneWidth); foreach (var cp in cloned_3d_curve.ControlPoints) { if (!ctrl_points.ContainsKey(cp)) { ctrl_points.Add(cp, input); } } return(cloned_3d_curve); }).FindAll(input => input.IsValid); leftShiftCurves.AddRange(rightShiftCurves); stickyMouse.SetVirtualCurve(leftShiftCurves); //For debug: show all shifted curves //leftShiftCurves.ForEach(input => shift_indicators.Add(new Lane(input, _indicate: true))); // Add Intersection points as interest var intersection_points = new Dictionary <Vector3, Lane>(); foreach (Curve3DSampler c in leftShiftCurves) { foreach (Lane l in RoadPositionRecords.allLanes) { foreach (var inter_position in c.IntersectWith(l, filter_self: false, filter_other: true)) { if (((inter_position - c.GetThreedPos(0)).sqrMagnitude < 40f || (inter_position - c.GetThreedPos(1)).sqrMagnitude < 40f) && !intersection_points.ContainsKey(inter_position)) { intersection_points.Add(inter_position, l); } } } } // Merge ctrl_points with priority lower than inter_points foreach (var cp in ctrl_points) { if (!intersection_points.Keys.ToList().Any(input => (input - cp.Key).sqrMagnitude < Lane.laneWidth * Lane.laneWidth)) { intersection_points.Add(cp.Key, cp.Value); } } stickyMouse.SetPoint(intersection_points); }; }