Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #6
0
        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;
        }
Пример #7
0
        /// <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();
                }
            }
        }