Esempio n. 1
0
    void Update()
    {
        if (action == 0)
        {
            return;
        }

        if (action == 1)
        {
            if (!end)
            {
                end = Input.GetKeyDown(KeyCode.F5);
            }

            if (!step)
            {
                step = Input.GetKeyDown(KeyCode.F10);
            }

            if (!step && !end)
            {
                return;
            }

            if (end)
            {
                RoadNetworkGenerator.EndInteractiveGeneration(ref context);
                action = 0;
            }
            else
            {
                if (!RoadNetworkGenerator.InteractiveGenerationStep(speed, ref context))
                {
                    action = 0;
                }
            }

            // ---

            var roadGeometry = RoadNetworkGeometryBuilder.Build(
                scale,
                Config.highwaySegmentWidth * scale,
                Config.streetSegmentWidth * scale,
                lengthStep,
                context.segments,
                ((displayHighways) ? RoadNetworkTraversal.HIGHWAYS_MASK : 0) | ((displayStreets) ? RoadNetworkTraversal.STREETS_MASK : 0)
                );
            CreateRoadMesh(roadGeometry);

            // ---

            RemoveIcons();
            if (context.debugData.intersections.Count > 0 ||
                context.debugData.snaps.Count > 0 ||
                context.debugData.intersectionsRadius.Count > 0)
            {
                foreach (Vector2 intersection in context.debugData.intersections)
                {
                    iconGOs.Add(CreateIcon(intersection, iconSize, scale, z, intersectionIcon));
                }
                foreach (Vector2 snap in context.debugData.snaps)
                {
                    iconGOs.Add(CreateIcon(snap, iconSize, scale, z, snapIcon));
                }
                foreach (Vector2 intersectionRadius in context.debugData.intersectionsRadius)
                {
                    iconGOs.Add(CreateIcon(intersectionRadius, iconSize, scale, z, intersectionRadiusIcon));
                }
                context.debugData.intersections.Clear();
                context.debugData.snaps.Clear();
                context.debugData.intersectionsRadius.Clear();
            }

            step = false;
        }
    }
Esempio n. 2
0
    void Start()
    {
        if (roadNetwork == null)
        {
            Debug.LogError("RoadNetworkMesh needs a reference to a RoadNetwork");
            return;
        }

        if (!roadNetwork.Finished)
        {
            Debug.LogError("RoadNetworkMesh script can only execute after RoadNetwork (Configure execution order that in Edit > Project Settings > Script Execution Order)");
            return;
        }

        IHeightmap heightmap = null;

        if (heightmapGameObject != null)
        {
            heightmap = UnityEngineHelper.GetInterface <IHeightmap>(heightmapGameObject);
        }

        if (heightmap == null)
        {
            Debug.LogError("RoadNetworkMesh needs a reference to a game object containing at least one component that implements IHeightmap");
            return;
        }

        if (!heightmap.Finished())
        {
            Debug.LogError("RoadNetworkMesh script can only execute after the components that implements IHeightmap (Configure execution order that in Edit > Project Settings > Script Execution Order)");
            return;
        }

        var geometry = RoadNetworkGeometryBuilder.Build(
            1.0f,
            Config.highwaySegmentWidth,
            Config.streetSegmentWidth,
            lengthStep,
            roadNetwork.Segments,
            roadNetwork.Mask
            );

        GameObject     roadGO   = new GameObject("Road");
        List <Vector3> vertices = new List <Vector3>();

        geometry.GetSegmentPositions().ForEach((p) =>
        {
            vertices.Add(new Vector3(p.x, heightmap.GetHeight(p.x, p.y) + zOffset, p.y));
        });
        Mesh mesh = new Mesh();

        mesh.vertices  = vertices.ToArray();
        mesh.triangles = geometry.GetSegmentIndices().ToArray();
        mesh.uv        = geometry.GetSegmentUvs().ToArray();
        mesh.RecalculateNormals();
        GameObject segmentsGO = new GameObject("Segments");

        segmentsGO.AddComponent <MeshFilter>().mesh = mesh;
        var meshRenderer = segmentsGO.AddComponent <MeshRenderer>();

        meshRenderer.material          = roadSegmentsMaterial;
        meshRenderer.shadowCastingMode = ShadowCastingMode.Off;
        segmentsGO.transform.parent    = roadGO.transform;
        vertices = new List <Vector3>();
        geometry.GetCrossingPositions().ForEach((p) =>
        {
            vertices.Add(new Vector3(p.x, heightmap.GetHeight(p.x, p.y) + zOffset, p.y));
        });
        mesh           = new Mesh();
        mesh.vertices  = vertices.ToArray();
        mesh.triangles = geometry.GetCrossingIndices().ToArray();
        mesh.uv        = geometry.GetCrossingUvs().ToArray();
        mesh.RecalculateNormals();
        GameObject crossingsGO = new GameObject("Crossings");

        crossingsGO.AddComponent <MeshFilter>().mesh = mesh;
        meshRenderer                   = crossingsGO.AddComponent <MeshRenderer>();
        meshRenderer.material          = roadCrossingsMaterial;
        meshRenderer.shadowCastingMode = ShadowCastingMode.Off;
        crossingsGO.transform.parent   = roadGO.transform;
        roadGO.transform.parent        = transform;
    }