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; } } } }
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>(); }
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); }
/// <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); }
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; }
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; }
/// <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); }
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; } }