/// <summary> /// Get the all the materials from the road network nodes /// </summary> /// <param name="baseobject">The parent object</param> /// <returns>The array of all the materials</returns> private List <Material> FindAllMaterials(GameObject baseobject) { List <Material> materials = new List <Material>(); RoadBuilder rb = baseobject.GetComponent <RoadBuilder>(); foreach (MaterialFrequency mf in rb.Details) { if (!materials.Contains(mf.Material)) { materials.Add(mf.Material); } } Transform[] allChildren = baseobject.GetComponentsInChildren <Transform>(true); foreach (Transform child in allChildren) { OverridableMaterialFrequency omf = child.GetComponent <OverridableMaterialFrequency>(); if (omf != null) { foreach (MaterialFrequency mf in omf.Details) { if (!materials.Contains(mf.Material)) { materials.Add(mf.Material); } } } } return(materials); }
/// <summary> /// Check if we need to auto build the mesh /// </summary> private void TestForAutoBuildOption() { RoadBuilder rb = gameObject.GetComponentInParent <RoadBuilder>(); if (rb == null) { return; } if (rb.AutoBuild) { if (rb.DropToGround) { Debug.Log("Can't use Auto Build when Drop to ground is enabled."); return; } if (!rb.MeshPerNode) { Debug.Log("Can only use Auto Build when Mesh Pre Node is used."); return; } rb.CreateMesh(true); } }
/// <summary> /// Created the intersections of the roads /// </summary> /// <param name="roadBuilderObject">The road builder object</param> public void CreateLayout(RoadBuilder roadBuilderObject) { if (_roadNetworkNode.Details.Roads[0] == null) { return; } if (_roadNetworkNode.Details.Roads[1] == null) { return; } if (_roadNetworkNode.Details.Roads[2] == null) { return; } if (_roadNetworkNode.Details.Roads[3] == null) { return; } if (_roadNetworkNode.Details.Roads[4] == null) { return; } CreateFiveRoads(roadBuilderObject, _roadNetworkNode.Details.Sections); }
/// <summary> /// Create the mesh. /// </summary> public void CreateMesh() { RoadBuilder rb = gameObject.GetComponentInParent <RoadBuilder>(); if (rb != null) { rb.CreateMesh(true); } }
/// <summary> /// Create the road object /// </summary> /// <param name="roadObject">The base object to add the road to</param> /// <param name="sections">The number of sections to use for this road</param> private void CreateFiveRoads(RoadBuilder roadObject, int sections) { float couveSize = 2.5f; _roadNetworkNode.OrderRoads(); IMaterialFrequency materialFrequency = _roadNetworkNode.GetComponent <OverridableMaterialFrequency>(); if (materialFrequency == null) { materialFrequency = RoadConstructorHelper.MaterialFrequencySet; } RoadNetworkNode roadA, roadB, roadC, roadD, roadE; RoadCrossSection rA, rB, rC, rD, rE; RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 0, _roadNetworkNode, out roadA, out rA); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 1, _roadNetworkNode, out roadB, out rB); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 2, _roadNetworkNode, out roadC, out rC); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 3, _roadNetworkNode, out roadD, out rD); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 4, _roadNetworkNode, out roadE, out rE); int connectionSet = IntersectionManager.Instance.AddLinkedIntersecions(rA, rB, rC, rD, rE); _meshSection.AddFiveRoad(connectionSet, _roadNetworkNode, RoadConstructorHelper.GetMainMaterial(materialFrequency)); _meshSection.UpdateEndPoints(roadObject); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[0]), RoadConstructorHelper.Materials(roadA), rA); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[1]), RoadConstructorHelper.Materials(roadB), rB); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[2].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[2]), RoadConstructorHelper.Materials(roadC), rC); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[3].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[3]), RoadConstructorHelper.Materials(roadD), rD); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[4].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[4]), RoadConstructorHelper.Materials(roadE), rE); List <Guid> list = IntersectionManager.Instance[connectionSet]; RoadCrossSection rscA = IntersectionManager.Instance[list[0]]; RoadCrossSection rscB = IntersectionManager.Instance[list[1]]; RoadCrossSection rscC = IntersectionManager.Instance[list[2]]; RoadCrossSection rscD = IntersectionManager.Instance[list[3]]; RoadCrossSection rscE = IntersectionManager.Instance[list[4]]; StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[0]), rscA); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[1]), rscB); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[2].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[2]), rscC); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[3].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[3]), rscD); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[4].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[4]), rscE); }
public void DropNodeToGround() { RoadBuilder rb = gameObject.GetComponentInParent <RoadBuilder>(); if (rb == null) { return; } Vector3 offsets = GetDownGap(transform.position, 2, 0.05f); offsets.y -= rb.transform.position.y; transform.position = offsets; Details.Modified = true; }
/// <summary> /// Populated the materials /// </summary> /// <param name="rnl">The current road network layout</param> public void PopulateDefaultMaterials(RoadNetworkLayout rnl) { if (rnl == null) { return; } RoadBuilder rb = rnl.GetComponent <RoadBuilder>(); if (rb == null) { return; } Copy(rb.GetComponent <IMaterialFrequency>()); }
/// <summary> /// On Draw Gizmo selection. Draw when selected /// </summary> public void OnDrawGizmosSelected() { RoadBuilder rb = GetComponent <RoadBuilder>(); RoadConstructorHelper.CrossSectionDetails = rb.CrossSectionDetails; RoadConstructorHelper.Lighting = rb.Lighting; RoadConstructorHelper.MaterialFrequencySet = rb; RoadConstructorHelper.BaseNodeLayoutNode = GetComponent <RoadNetworkLayout>(); foreach (Transform child in gameObject.transform) { RoadNetworkNode rnr = child.gameObject.GetComponent <RoadNetworkNode>(); if (rnr != null) { rnr.DrawGizmosSelected(); } } }
/// <summary> /// Created the intersections of the roads /// </summary> /// <param name="roadBuilderObject">The road builder object</param> public void CreateLayout(RoadBuilder roadBuilderObject) { float angleRoadStart = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoad(_roadNetworkNode, 0)); Vector3 pos = _roadNetworkNode.transform.position; ICrossSection sc = _roadNetworkNode.gameObject.GetComponent <ICrossSection>(); if (sc == null) { sc = RoadConstructorHelper.CrossSectionDetails; } IMaterialFrequency mf = _roadNetworkNode.gameObject.GetComponent <IMaterialFrequency>(); if (mf == null) { mf = RoadConstructorHelper.MaterialFrequencySet; } RoadCrossSection rA = new RoadCrossSection(pos, angleRoadStart, sc, mf); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, sc, mf, rA); }
/// <summary> /// Update the layout for all the streets /// </summary> /// <param name="roadBuilderObject"></param> public void CreateStreetLayout(RoadBuilder roadBuilderObject) { RoadNetworkNodeHelper.CreateAllStreets(_roadNetworkNode); }
/// <summary> /// Create the road object /// </summary> /// <param name="roadObject">The base object to add the road to</param> /// <param name="sections">The number of sections to use for this road</param> private void CreateCorner(RoadBuilder roadObject, int sections) { // find the point where the two roads meet Vector3 pos = _roadNetworkNode.gameObject.transform.position; // create a corne at this postion Vector3 newpos = pos; float roadAngleA = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoadClampped(_roadNetworkNode, 0) - (Mathf.PI / 2)); float roadAngleB = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoadClampped(_roadNetworkNode, 1) + (Mathf.PI / 2)); float roadAngleDifference = roadAngleB - roadAngleA; float couveSize = 1.85f; float x, z; float road_A_length = GetLengthOfRoad(0); float road_B_length = GetLengthOfRoad(1); float minLength = Mathf.Min(road_A_length, road_B_length); float offSetDownRoad = RoadConstructorHelper.CrossSectionDetails.RoadWidthValue * couveSize; if (offSetDownRoad > minLength / 2) { offSetDownRoad = minLength / 2; } RoadNetworkNode oppositeEnd = _roadNetworkNode.Details.Roads[1].GetComponent <RoadNetworkNode>(); Vector3 roadPointA = oppositeEnd.GetOffSetDownRoad(pos, (offSetDownRoad)); Vector3 outA; bool offSetPos = _roadNetworkNode.GetInnerCorner(0, 1, (offSetDownRoad), out outA); Vector3 CornerPoint = outA; newpos = CornerPoint; // get the gap form point to point Vector3 gap = CornerPoint - roadPointA; couveSize = offSetPos ? gap.magnitude : 0; couveSize = offSetPos ? gap.magnitude : 0; bool backward = false; Radian currentAngle = new Radian(roadAngleA - (float)(Math.PI / 2)); roadAngleDifference = MathsHelper.ClampAngle(roadAngleDifference); if (roadAngleDifference > Mathf.PI) { roadAngleDifference = (Mathf.PI * 2) - roadAngleDifference; currentAngle = new Radian(roadAngleB + (float)(Math.PI / 2)); backward = true; } float diff = roadAngleDifference; x = Mathf.Sin(currentAngle.Value) * (couveSize); z = Mathf.Cos(currentAngle.Value) * (couveSize); newpos.x -= x; newpos.z += z; ICrossSection crossSectionMiddle = RoadConstructorHelper.CrossSection(_roadNetworkNode); IMaterialFrequency materialFrequency = _roadNetworkNode.gameObject.GetComponent <IMaterialFrequency>(); if (materialFrequency == null) { materialFrequency = RoadConstructorHelper.MaterialFrequencySet; } RoadCrossSection rA = new RoadCrossSection(newpos, currentAngle.Value, crossSectionMiddle, materialFrequency); RoadCrossSection Start = rA; float angleStep = Mathf.Abs(diff / sections); for (int i = 0; i < sections; i++) { newpos = CornerPoint; currentAngle.Value += angleStep; x = Mathf.Sin(currentAngle.Value) * (couveSize); z = Mathf.Cos(currentAngle.Value) * (couveSize); newpos.x -= x; newpos.z += z; RoadCrossSection rB = new RoadCrossSection(newpos, currentAngle.Value, crossSectionMiddle, materialFrequency); // TODO Sub divide corners - need to update before the add basic road! _meshSection.AddBasicRoad(IntersectionManager.Instance.AddLinkedIntersecions(rA, rB), RoadConstructorHelper.GetMainMaterial(materialFrequency), 0); rA = rB; } RoadCrossSection End = rA; if (backward) { StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, crossSectionMiddle, materialFrequency, End); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, crossSectionMiddle, materialFrequency, Start); } else { StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, crossSectionMiddle, materialFrequency, End); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, crossSectionMiddle, materialFrequency, Start); } }
/// <summary> /// The inspector for the RoadBuilder /// </summary> public override void OnInspectorGUI() { DrawDefaultInspector(); RoadBuilder roadBuilder = (RoadBuilder)target; GUI.color = Color.red; if (GUILayout.Button("Remove mesh")) { roadBuilder.RemoveRoadMesh(true); SetSceneDirty(); } GUI.color = Color.green; if (GUILayout.Button("Create Mesh")) { roadBuilder.CreateMesh(true); SetSceneDirty(); } GUI.color = Color.yellow; if (GUILayout.Button("Repair layout")) { for (int i = 0; i < 5; i++) { roadBuilder.RepairAllNodes(); } Debug.Log("Repaired all nodes in layout."); EditorGUIUtility.ExitGUI(); } if (!roadBuilder.HasTerrainModifier()) { GUI.color = Color.green; if (GUILayout.Button("Add terrain modifier")) { roadBuilder.AddTerrainModifier(); SetSceneDirty(); } } else { GUI.color = Color.green; if (GUILayout.Button("Modify Terrain to match road")) { roadBuilder.ModifyTerrain(); SetSceneDirty(); } TerrainModifier tm = roadBuilder.GetComponent <TerrainModifier>(); if (tm != null && tm.HasStoredTerrain) { if (GUILayout.Button("Restore previous terrain")) { tm.RestoreTerrain(); SetSceneDirty(); } } GUI.color = Color.red; if (GUILayout.Button("Remove terrain modifier")) { roadBuilder.RemoveTerrainModifier(); SetSceneDirty(); EditorGUIUtility.ExitGUI(); } } }