示例#1
0
    public void DropMarker(RoadMarker Mrkr)
    {
        //Recalc the XSecs
        XSecCalculator.CalcXSecs(Mrkr.Index - 1, RoadWidth); //two before the marker
        XSecCalculator.CalcXSecs(Mrkr.Index, RoadWidth);     //before the marker
        XSecCalculator.CalcXSecs(Mrkr.Index + 1, RoadWidth); //after the marker
        XSecCalculator.CalcXSecs(Mrkr.Index + 2, RoadWidth); //two after the marker

        //Add to the build queue

        if ((Mrkr.Index - 2 < Bez.CtrlPts.Count - 4) || (Rd.IsCircular))
        {
            Rd.Sectns[Mrkr.Index - 2].CalcVisibleFenceVerts();
            BuildQueue.Enqueue(Mrkr.Index - 2);
        }
        if ((Mrkr.Index - 1 < Bez.CtrlPts.Count - 4) || (Rd.IsCircular))
        {
            Rd.Sectns[Mrkr.Index - 1].CalcVisibleFenceVerts();
            BuildQueue.Enqueue(Mrkr.Index - 1);
        }
        if ((Mrkr.Index < Bez.CtrlPts.Count - 4) || (Rd.IsCircular))
        {
            Rd.Sectns[Mrkr.Index].CalcVisibleFenceVerts();
            BuildQueue.Enqueue(Mrkr.Index);
        }
        if ((Mrkr.Index + 1 < Bez.CtrlPts.Count - 4) || (Mrkr.Index + 1 <= Bez.CtrlPts.Count - 3 && Rd.IsCircular))
        {
            Rd.Sectns[Mrkr.Index + 1].CalcVisibleFenceVerts();
            BuildQueue.Enqueue(Mrkr.Index + 1);
        }
        //circular road penultimate CtrlPt needs to rebuild Section 1
        if (Mrkr.Index + 1 == Bez.CtrlPts.Count - 3 && Rd.IsCircular)   //doesnt work todo - needs fixing
        {
            Rd.Sectns[1].CalcVisibleFenceVerts();
            BuildQueue.Enqueue(1);
        }
        Mrkr.DroppedPosition = Mrkr.transform.position;
        //Charge for this if they moved the marker more than 1 metre
        if (GameData.current.BezS.CtrlPts == null)
        {
            Rd.Sectns[Mrkr.Index].Chargeable = true;
        }
        else
        {
            if (GameData.current.BezS.CtrlPts[Mrkr.Index] == null)
            {
                Rd.Sectns[Mrkr.Index].Chargeable = true;
            }
            else
            {
                BezCtrlPtSerial bcps          = GameData.current.BezS.CtrlPts[Mrkr.Index];
                Vector3         _oldMarkerPos = bcps.Pos.V3;
                if (Vector3.Distance(Bez.CtrlPts[Mrkr.Index].Pos, _oldMarkerPos) > 1 || Mathf.Abs(bcps.BankAngle - Bez.CtrlPts[Mrkr.Index].BankAngle) > 10)
                {
                    Rd.Sectns[Mrkr.Index].Chargeable = true;
                }
            }
        }
    }
示例#2
0
 void Start()
 {
     FPCam             = GameObject.Find("BuilderCamera").GetComponent <Camera>();
     _rb               = GameObject.Find("BuilderPlayer(Clone)").GetComponent <RoadBuilder>();
     AttachedTransform = transform.parent;
     Bez               = BezierLine.Instance;
     Mrkr              = AttachedTransform.GetComponent <RoadMarker>();
 }
示例#3
0
 public void Init()
 {
     FPCam             = GameObject.Find("BuilderCamera").GetComponent <Camera>();
     _rb               = GameObject.Find("BuilderPlayer(Clone)").GetComponent <RoadBuilder>();
     AttachedTransform = transform.parent;
     Bez               = BezierLine.Instance;
     Mrkr              = AttachedTransform.GetComponent <RoadMarker>();
     int XSecId = Bez.CtrlPts[Mrkr.Index].SegStartIdx;
     //transform.LookAt(Road.Instance.XSecs[XSecId+1].MidPt);
     //transform.Rotate(Vector3.forward, Bez.CtrlPts[Mrkr.Index].BankAngle);
 }
示例#4
0
    /// <summary>
    /// Adds the RoadMarker gameobject which contains the RoadMarker script
    /// </summary>
    public void CreateRoadMarker()
    {
        UnityEngine.Object objRoadMarker = Resources.Load("Prefabs/RoadMarker");
        goRdMkr       = (GameObject)GameObject.Instantiate(objRoadMarker, Pos, Quaternion.identity);
        objRoadMarker = null;
        RoadMarker RoadMarker = goRdMkr.gameObject.GetComponent <RoadMarker>();

        RoadMarker.name   = "RoadMarker" + CtrlPtId;
        RoadMarker.CtrlPt = this;
        RoadMarker.Index  = CtrlPtId;
        goRdMkr.transform.SetParent(Road.Instance.Sectns[CtrlPtId].goSectn.transform);
    }
示例#5
0
    public void DropLoopMarker(RoadMarker Mrkr)
    {
        //Now we look backwards then forwards til we find a non-hairpin and adjust all these
        int PrevNoHPin = Bez.CtrlPts.Count - 3;
        int NxtNoHPin  = Mrkr.Index + 1;

        //Find the previous non-hairpin
        do
        {
            float A = Bez.Angle(PrevNoHPin);
            //Debug.Log("CtrlPt" + PrevNoHPin.ToString() + " Angle = " + A);
            if (Mathf.Abs(Bez.Angle(PrevNoHPin)) > 80)
            {
                PrevNoHPin++; break;
            }
            PrevNoHPin--;
        } while (true);
        //Find the next non-hairpin
        do
        {
            float A = Bez.Angle(NxtNoHPin);
            if (Mathf.Abs(Bez.Angle(NxtNoHPin)) > 80)
            {
                break;
            }
            NxtNoHPin++;
        } while (true);

        //Recalc the XSecs
        for (int CtrlPtId = 1; CtrlPtId <= NxtNoHPin; CtrlPtId++)     //Between the non-hairpin markers
        {
            XSecCalculator.CalcXSecs(CtrlPtId, RoadWidth);
        }

        for (int CtrlPtId = PrevNoHPin + 1; CtrlPtId < Bez.CtrlPts.Count - 1; CtrlPtId++)     //Between the non-hairpin markers
        {
            XSecCalculator.CalcXSecs(CtrlPtId, RoadWidth);
        }


        //Add to the build queue
        Rd.Sectns[Bez.CtrlPts.Count - 3].CalcVisibleFenceVerts();
        BuildQueue.Enqueue(Bez.CtrlPts.Count - 3);
        Rd.Sectns[Mrkr.Index].CalcVisibleFenceVerts();
        BuildQueue.Enqueue(Mrkr.Index);
        Rd.Sectns[Mrkr.Index + 1].CalcVisibleFenceVerts();
        BuildQueue.Enqueue(Mrkr.Index + 1);

        Mrkr.DroppedPosition = Mrkr.transform.position;
    }
示例#6
0
    public void Select()
    {
        if (goRdMkr == null)
        {
            return;
        }
        RoadMarker RM = goRdMkr.gameObject.GetComponent <RoadMarker>();

        if (!RM.Selected)
        {
            RM.Select();
        }
        Current = this;
        RM      = null;
    }
    public void Init()
    {
        FPCam             = GameObject.Find("BuilderCamera").GetComponent <Camera>();
        _rb               = GameObject.Find("BuilderPlayer(Clone)").GetComponent <RoadBuilder>();
        AttachedTransform = transform.parent;
        Bez               = BezierLine.Instance;
        Mrkr              = AttachedTransform.GetComponent <RoadMarker>();
        XSecId            = Bez.CtrlPts[Mrkr.Index].SegStartIdx;

        if (name == "LeftTiltArrow")
        {
            _hand = "L";
            //OtherHandGizmo = Mrkr.GizmoTiltRight.transform;
        }
        else
        {
            _hand = "R";
            //OtherHandGizmo = Mrkr.GizmoTiltLeft.transform;
        }
        _otherHandStartPos = OtherHandGizmo.position;
    }
示例#8
0
    /// <summary>
    /// Inserts a control point just after the selected one
    /// </summary>
    public void InsertControlPoint(int idx)
    {
        Vector3 InsertPos  = Path[(idx - 1) * 20 + 10];
        RLPt    InsertedCP = new RLPt(this, InsertPos);

        InsertPathPoints(idx);               //CtrlPt 3 is Path 40
        CtrlPts.Insert(idx + 1, InsertedCP); //this adds an element just before idx+1
        SetCtrlPtIds();
        InsertedCP.CreateRoadMarker();
        //Rename all the Roadmarkers after the inserted one
        for (int idxAdj = idx + 2; idxAdj < CtrlPts.Count; idxAdj++)
        {
            GameObject goRM = CtrlPts[idxAdj].goRdMkr;
            if (goRM != null)
            {
                RoadMarker RM = goRM.GetComponent <RoadMarker>();
                RM.name  = "RoadMarker" + idxAdj;
                RM.Index = idxAdj;
            }
        }
        //dunno why it ended up with the wrong parent
        CtrlPts[idx + 2].goRdMkr.transform.SetParent(Rd.Sectns[idx + 2].goSectn.transform);
    }
示例#9
0
    private void ReindexSectns(int StartSectnID)
    {
        //Bez.Path
        List <Vector3> PrevPaths = Bez.Path.GetRange(0, Bez.CtrlPts[StartSectnID].SegStartIdx);

        Bez.Path.RemoveRange(0, Bez.CtrlPts[StartSectnID].SegStartIdx);
        Bez.Path.AddRange(PrevPaths);

        //BezCtrlPts
        //remove the extra cp at starts and the two extra at the end
        Bez.CtrlPts.RemoveAt(0);
        Bez.CtrlPts.RemoveAt(Bez.CtrlPts.Count - 1);
        Bez.CtrlPts.RemoveAt(Bez.CtrlPts.Count - 1);
        //Copy the bit before the StartIdx
        List <BezCtrlPt> Prevs = Bez.CtrlPts.Where(c => c.CtrlPtId < StartSectnID).ToList();

        //Paste it at the end
        Bez.CtrlPts.AddRange(Prevs);
        Bez.CtrlPts.RemoveRange(0, StartSectnID - 1);
        //Add the 3 extra CtrlPts
        BezCtrlPt p0 = new BezCtrlPt(Bez, Bez.CtrlPts.Last().Pos);

        Bez.CtrlPts.Insert(0, p0);
        BezCtrlPt p1 = new BezCtrlPt(Bez, Bez.CtrlPts[1].Pos);

        Bez.CtrlPts.Add(p1);
        BezCtrlPt p2 = new BezCtrlPt(Bez, Bez.CtrlPts[2].Pos);

        Bez.CtrlPts.Add(p2);

        Bez.CtrlPts[0].SegStartIdx = 0;
        Bez.SetCtrlPtIds();



        //Road Sections
        iRoadSectn LastSctn = Rd.Sectns.Last();

        Rd.Sectns.Remove(LastSctn);
        List <iRoadSectn> PrevSctns = Rd.Sectns.Where(s => s.Idx > 0 && s.Idx < StartSectnID).ToList();

        Rd.Sectns.AddRange(PrevSctns);
        Rd.Sectns.RemoveRange(1, StartSectnID - 1);
        Rd.Sectns.Add(LastSctn);
        Rd.SetSectionIds();
        for (int SectnID = 1; SectnID < Rd.Sectns.Count - 1; SectnID++)
        {
            Rd.Sectns[SectnID].goSectn.transform.SetSiblingIndex(SectnID);
        }

        //Rename RoadMarkers
        foreach (BezCtrlPt Ctl in Bez.CtrlPts)
        {
            if (Ctl.goRdMkr != null)
            {
                GameObject goRdMkr    = Ctl.goRdMkr;
                RoadMarker RoadMarker = goRdMkr.gameObject.GetComponent <RoadMarker>();
                RoadMarker.name  = "RoadMarker" + Ctl.CtrlPtId;
                RoadMarker.Index = Ctl.CtrlPtId;
                goRdMkr.transform.SetParent(Road.Instance.Sectns[Ctl.CtrlPtId].goSectn.transform);
            }
        }

        //Reindex Segments
        List <RoadSegment> PrevSegs = Rd.Segments.Where(s => s.SectnIdx < StartSectnID).ToList();
        //Rd.XSecs.Join(PrevSegs, x => x.Idx, i => i.Idx, (r) => new XSec);
        var px =
            (from x in Rd.XSecs
             join s in PrevSegs on
             x.Idx equals s.Idx
             select x);
        List <XSec> PrevXSecs = px.Cast <XSec>().ToList();

        Rd.Segments.AddRange(PrevSegs);
        Rd.Segments.RemoveRange(0, PrevSegs.Count);
        for (int i = 0; i < Rd.Segments.Count; i++)
        {
            Rd.Segments[i].Idx        = i;
            Rd.Segments[i].goSeg.name = "RoadSeg" + i;
        }
        foreach (iRoadSectn Sec in Rd.Sectns)
        {
            foreach (RoadSegment seg in Sec.Segments)
            {
                seg.SectnIdx = Sec.Idx;
            }
        }

        Bez.SetSegStartIds();

        //Reindex XSecs
        Rd.XSecs.AddRange(PrevXSecs);
        Rd.XSecs.RemoveRange(0, PrevXSecs.Count);
        for (int i = 0; i < Rd.XSecs.Count; i++)
        {
            Rd.XSecs[i].Idx = i;
        }
    }