private void Start()
 {
     stickyMouseSource = new StickyMouse();
     //RoadPositionRecords.OnMapChanged += (object sender, List<Lane> e) =>
     //{
     //    stickyMouseSource.SetLane(e);
     //};
 }
示例#2
0
    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);
        };
    }