/*private void Update()
     * {
     *  if (Input.GetKeyDown("space"))
     *  {
     *      DeleteCity();
     *      LoadBuildingsWithRectanglePlots();
     *      UpdateHeight();
     *  }
     * }*/
    public void LoadBuildingsWithRectanglePlots()
    {
        GameObject baseSpawnPoint = new GameObject("CitySpawn");

        baseSpawnPoint.transform.SetParent(citySpawnPoint.transform);
        baseSpawnPoint.transform.localPosition = Vector3.zero;
        List <RectInt> plots = GetComponent <CityPlotGenerator>().createPlots();

        foreach (RectInt plot in plots)
        {
            GameObject buildingSpawnPoint = new GameObject("BuildingSpawn");
            buildingSpawnPoint.transform.SetParent(baseSpawnPoint.transform);
            BuildingSettings s = buildingSettings[Random.Range(0, buildingSettings.Length)];
            int width          = Mathf.Min(Mathf.Clamp(plot.width / pieceSize - siteOffset, 1, 1000), maxDim);
            int height         = Mathf.Min(Mathf.Clamp(plot.height / pieceSize - siteOffset, 1, 1000), maxDim);

            s.SetSize(new Vector2Int(width, height));
            LoadBuilding(buildingSpawnPoint, s);
            int xpos = plot.x + plot.width - Random.Range(0, siteOffset) * pieceSize;
            int zpos = plot.y + plot.height - Random.Range(0, siteOffset) * pieceSize;


            buildingSpawnPoint.transform.localPosition = new Vector3(xpos, 0, zpos);
            buildingSpawnPoint.transform.rotation      = Quaternion.Euler(0, Random.Range(0f, RotationJitter), 0);
        }
    }
    public void LoadBuilding(GameObject spawnPoint, BuildingSettings settings)
    {
        Building b = BuildingGenerator.Generate(settings);

        GetComponent <BuildingRenderer>().Render(b, spawnPoint);
        //Debug.Log(b.ToString());
    }
    static List <List <Vertical> > GenRectVerticals(BuildingSettings settings, List <RectInt> rectList, int level)
    {
        List <List <Vertical> > rectVerticals = new List <List <Vertical> >();

        foreach (RectInt r in rectList)
        {
            List <Vertical> verticals = new List <Vertical>();
            for (int x = 0; x < r.width; x++)
            {
                for (int y = 0; y < r.height; y++)
                {
                    verticals.Add(Vertical.Wall);
                    int rand = Random.Range(1, 100);
                    if (rand < settings.WindowSeed)
                    {
                        verticals[verticals.Count() - 1] = Vertical.Window;
                    }
                    rand = Random.Range(1, 100);
                    if (level == 1 && rand < settings.DoorSeed)
                    {
                        verticals[verticals.Count() - 1] = Vertical.Door;
                    }
                }
            }
            rectVerticals.Add(verticals);
        }
        return(rectVerticals);
    }
    public override Wing[] GenerateWings(BuildingSettings settings)
    {
        if (settings.Size.x > 1 && settings.Size.y > 1)
        {
            RectInt firstBounds  = new RectInt(0, 0, settings.Size.x, 1);
            RectInt secondBounds = new RectInt(0, 1, 1, settings.Size.y - 1);

            Wing[] wings = new Wing[2];
            if (settings.wingStrategy != null)
            {
                wings[0] = settings.wingStrategy.GenerateWing(settings, firstBounds, settings.Height());
                wings[1] = settings.wingStrategy.GenerateWing(settings, secondBounds, settings.Height());
            }
            else
            {
                wings[0] = ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, firstBounds, settings.Height());
                wings[1] = ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, secondBounds, settings.Height());
            }
            return(wings);
        }
        else
        {
            return(new Wing[]
            {
                settings.wingStrategy != null?
                settings.wingStrategy.GenerateWing(settings, new RectInt(0, 0, settings.Size.x, settings.Size.y), settings.Height()) :
                    ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, new RectInt(0, 0, settings.Size.x, settings.Size.y), settings.Height()),
            });
        }
    }
        private void ShowBuildingElement(BuildingSettings element)
        {
            EditorGUILayout.BeginVertical("box");
            {
                BuildingType saveKind = element.Type;
                element.Type = (BuildingType)EditorGUILayout.EnumPopup("Type Building:", element.Type);
                if (GUI.changed && saveKind != element.Type)
                {
                    if (UsingType.Contains("bt_" + saveKind.ToString()))
                    {
                        UsingType.Remove("bt_" + saveKind.ToString());
                    }
                    UsingType.Add("bt_" + element.Type.ToString());
                }

                element.Material = (Material)EditorGUILayout.ObjectField("Material", element.Material, typeof(Material));

                if (element.Material == null)
                {
                    DisplayErrorMEssage("Not setting material");
                }


                element.IsVolumetric = EditorGUILayout.Toggle("IsVolumetric", element.IsVolumetric);

                EditorGUILayout.LabelField("BuildingHeight");
                EditorGUILayout.BeginHorizontal("box");
                element.MaximumBuildingHeight = EditorGUILayout.IntField("Maximum", element.MaximumBuildingHeight);
                element.MinimumBuildingHeight = EditorGUILayout.IntField("Minimum", element.MinimumBuildingHeight);
                EditorGUILayout.EndHorizontal();
            }
            EditorGUILayout.EndVertical();
        }
    public override Wall[] GenerateWalls(BuildingSettings settings, RectInt bounds, int level)
    {
        Wall[] walls = new Wall[(bounds.size.x + bounds.size.y) * 2];

        List <int> usedIndices = new List <int>();

        if (level == 0 || enableBalconies)
        {
            int doorIndex = Random.Range(0, walls.Length);
            usedIndices.Add(doorIndex);
            walls[doorIndex] = Wall.Door;
        }
        float percentWindows = .50f;
        int   numWindows     = (int)(walls.Length * percentWindows);

        for (int i = 0; i < numWindows; i++)
        {
            int windowIndex = Random.Range(0, walls.Length);
            while (usedIndices.Contains(windowIndex))
            {
                windowIndex = Random.Range(0, walls.Length);
            }
            usedIndices.Add(windowIndex);
            walls[windowIndex] = Wall.Window;
        }

        return(walls);
    }
Beispiel #7
0
 public override Story GenerateStory(BuildingSettings settings, RectInt bounds, int level)
 {
     return(new Story(level, settings.wallsStrategy != null ?
                      settings.wallsStrategy.GenerateWalls(settings, bounds, level) :
                      ((WallsStrategy)ScriptableObject.CreateInstance <DefaultWallsStrategy>()).GenerateWalls(settings, bounds, level),
                      bounds
                      ));
 }
Beispiel #8
0
 public static Building Generate(BuildingSettings settings)
 {
     return(new Building(settings.Size.x, settings.Size.y,
                         settings.wingsStrategy != null ?
                         settings.wingsStrategy.GenerateWings(settings) :
                         ((WingsStrategy)ScriptableObject.CreateInstance <DefaultWingsStrategy>()).GenerateWings(settings)
                         ));
 }
 public override Wing[] GenerateWings(BuildingSettings settings)
 {
     return(new Wing[]
     {
         settings.wingStrategy != null?
         settings.wingStrategy.GenerateWing(settings, new RectInt(0, 0, settings.Size.x, settings.Size.y), settings.Height()) :
             ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, new RectInt(0, 0, settings.Size.x, settings.Size.y), settings.Height())
     });
 }
Beispiel #10
0
    protected BuildingSettings createBuildingSettings(BuildingType type, int min, int max, string material)
    {
        var bs = new BuildingSettings();

        bs.Type     = type;
        bs.Material = (Material)Resources.Load(material, typeof(Material));
        bs.MinimumBuildingHeight = 20;
        bs.MaximumBuildingHeight = 50;
        bs.IsVolumetric          = true;
        return(bs);
    }
        private void CreateMesh(List <Vector3> corners, BuildingSettings typeSettings, MeshData data, Vector2 min, Vector2 size)
        {
            var vertsStartCount = _useTriangulationNet
                    ? CreateRoofTriangulation(corners, data)
                    : CreateRoofClass(corners, data);

            foreach (var c in corners)
            {
                data.UV.Add(new Vector2((c.x - min.x), (c.z - min.y)));
            }
        }
 public override Story[] GenerateStories(BuildingSettings settings, RectInt bounds, int numberOfStories)
 {
     Story[] stories = new Story[numberOfStories];
     for (int level = 0; level < numberOfStories; level++)
     {
         stories[level] = settings.storyStrategy != null?
                          settings.storyStrategy.GenerateStory(settings, bounds, level) :
                              ((StoryStrategy)ScriptableObject.CreateInstance <DefaultStoryStrategy>()).GenerateStory(settings, bounds, level);
     }
     return(stories);
 }
 public override Wing GenerateWing(BuildingSettings settings, RectInt bounds, int numberOfStories)
 {
     return(new Wing(bounds,
                     settings.storiesStrategy != null ?
                     settings.storiesStrategy.GenerateStories(settings, bounds, numberOfStories) :
                     ((StoriesStrategy)ScriptableObject.CreateInstance <DefaultStoriesStrategy>()).GenerateStories(settings, bounds, numberOfStories),
                     settings.roofStrategy != null ?
                     settings.roofStrategy.GenerateRoof(settings, bounds) :
                     ((RoofStrategy)ScriptableObject.CreateInstance <DefaultRoofStrategy>()).GenerateRoof(settings, bounds)
                     ));
 }
    protected BuildingSettings createBuildingSettings(BuildingType type, int min, int max, string material)
    {
        const int EXAGERATION_FACTOR = 2;
        var       bs = new BuildingSettings();

        bs.Type     = type;
        bs.Material = (Material)Resources.Load(material, typeof(Material));
        bs.MinimumBuildingHeight = EXAGERATION_FACTOR * min;
        bs.MaximumBuildingHeight = EXAGERATION_FACTOR * max;
        bs.IsVolumetric          = true;
        return(bs);
    }
Beispiel #15
0
 public override Roof GenerateRoof(BuildingSettings settings, RectInt bounds)
 {
     if (bounds.size.x < bounds.size.y)
     {
         Roof roof = new Roof(RoofType.Peak);
         roof.IsDefault = true;
         return(roof);
     }
     else
     {
         return(new Roof(RoofType.Peak, RoofDirection.East));
     }
 }
 public override Roof GenerateRoof(BuildingSettings settings, RectInt bounds)
 {
     if (bounds.size.x == 1 && bounds.size.y == 1)
     {
         return(new Roof(RoofType.Point));
     }
     else
     {
         Roof roof = new Roof(RoofType.Peak);
         roof.IsDefault = true;
         return(roof);
     }
 }
Beispiel #17
0
    public void LoadBuilding()
    {
        settings = settingsArray[Random.Range(0, settingsArray.Length)];
        SetSize(new Vector2Int(width, depth));
        SetHeight(height);
        Building b = BuildingGenerator.Generate(settings);

        GetComponent <BuildingRenderer>().Render(b, spawnPoint);
        explosionSystem.Play();
        currentCoroutine = LoadAnimation();
        StartCoroutine(currentCoroutine);
        //Debug.Log(b.ToString());
    }
    public override Wing[] GenerateWings(BuildingSettings settings)
    {
        if (settings.Size.x > 2 && settings.Size.y > 1)
        {
            RectInt firstBounds = new RectInt(0, 0, settings.Size.x, 1);
            RectInt secondBounds;
            RectInt thirdBounds;
            if (scaleWings && settings.Size.x > 4)
            {
                int size = settings.Size.x / 2;
                if (size % 2 == 0)
                {
                    size -= 1;
                }
                secondBounds = new RectInt(0, 1, size, settings.Size.y - 1);
                thirdBounds  = new RectInt(settings.Size.x - size, 1, size, settings.Size.y - 1);
            }
            else
            {
                secondBounds = new RectInt(0, 1, 1, settings.Size.y - 1);
                thirdBounds  = new RectInt(settings.Size.x - 1, 1, 1, settings.Size.y - 1);
            }



            Wing[] wings = new Wing[3];
            if (settings.wingStrategy != null)
            {
                wings[0] = settings.wingStrategy.GenerateWing(settings, firstBounds, settings.Height());
                wings[1] = settings.wingStrategy.GenerateWing(settings, secondBounds, settings.Height());
                wings[2] = settings.wingStrategy.GenerateWing(settings, thirdBounds, settings.Height());
            }
            else
            {
                wings[0] = ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, firstBounds, settings.Height());
                wings[1] = ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, secondBounds, settings.Height());
                wings[2] = ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, thirdBounds, settings.Height());
            }
            return(wings);
        }
        else
        {
            return(new Wing[]
            {
                settings.wingStrategy != null?
                settings.wingStrategy.GenerateWing(settings, new RectInt(0, 0, settings.Size.x, settings.Size.y), settings.Height()) :
                    ((WingStrategy)ScriptableObject.CreateInstance <DefaultWingStrategy>()).GenerateWing(settings, new RectInt(0, 0, settings.Size.x, settings.Size.y), settings.Height()),
            });
        }
    }
Beispiel #19
0
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            double _indoorTemp_  = 293.00;
            bool   _indoorConst_ = false;

            DA.GetData(0, ref _indoorTemp_);
            DA.GetData(1, ref _indoorConst_);

            Active constTemperature = (_indoorConst_) ? Active.YES : Active.NO;

            BuildingSettings buildingTemp = new BuildingSettings(_indoorTemp_, constTemperature);

            DA.SetData(0, buildingTemp);
        }
        private static void SetProperties(JSONObject geo, Building building, BuildingSettings typeSettings)
        {
            building.name = "building " + geo["properties"]["id"].ToString();
            if (geo["properties"].HasField("name"))
            {
                building.Name = geo["properties"]["name"].str;
            }

            building.Id      = geo["properties"]["id"].ToString();
            building.Type    = geo["type"].str;
            building.SortKey = (int)geo["properties"]["sort_key"].f;
            building.Kind    = typeSettings.Type.ToString();
            building.Type    = typeSettings.Type.ToString();
            building.GetComponent <MeshRenderer>().material = typeSettings.Material;
        }
        private void CreateMesh(List <Vector3> corners, BuildingSettings typeSettings, MeshData data, Vector2 min, Vector2 size)
        {
            if (_useTriangulationNet)
            {
                CreateRoofTriangulation(corners, data);
            }
            else
            {
                CreateRoofClass(corners, data);
            }

            foreach (var c in corners)
            {
                data.UV.Add(new Vector2((c.x - min.x), (c.z - min.y)));
            }
        }
    public override Roof GenerateRoof(BuildingSettings settings, RectInt bounds)
    {
        for (int i = 0; i < strategies.Length; i++)
        {
            if (Random.Range(0f, 1f) > (1f - randomChance) && useRandom)
            {
                return(new Roof((RoofType)Random.Range(0, 3)));
            }
            Roof roof = strategies[i].GenerateRoof(settings, bounds);
            if (!roof.IsDefault)
            {
                return(roof);
            }
        }

        return(new Roof(RoofType.Peak));
    }
    public override Story[] GenerateStories(BuildingSettings settings, RectInt bounds, int numberOfStories)
    {
        Story[] stories = new Story[numberOfStories];
        for (int level = 0; level < numberOfStories; level++)
        {
            stories[level] = settings.storyStrategy != null?
                             settings.storyStrategy.GenerateStory(settings, bounds, level) :
                                 ((StoryStrategy)ScriptableObject.CreateInstance <DefaultStoryStrategy>()).GenerateStory(settings, bounds, level);

            if (bounds.width > WidthShrinkAmount)
            {
                bounds = new RectInt(bounds.x, bounds.y, bounds.width - WidthShrinkAmount, bounds.height);
            }
            if (bounds.height > HeightShrinkAmount)
            {
                bounds = new RectInt(bounds.x, bounds.y, bounds.width, bounds.height - HeightShrinkAmount);
            }
        }
        return(stories);
    }
    static List <Story> GenStories(BuildingSettings settings)
    {
        int            numberOfStories = Random.Range(settings.MinNumberOfStories, settings.MaxNumberOfStories);
        List <Story>   stories         = new List <Story>();
        List <RectInt> bounds          = new List <RectInt>();

        bounds.Add(new RectInt(0, 0, settings.BuildingSize.x, settings.BuildingSize.y));
        stories.Add(GenStory(settings, bounds, 1));

        for (int i = 1; i < numberOfStories; i++)
        {
            Story prevStory = stories[stories.Count - 1];

            stories.Add(GenStory(settings, prevStory.RectList, i + 1));
        }

        for (int i = 0; i < stories.Count() - 1; i++)
        {
            FixRoof(stories[i + 1], stories[i]);
        }

        return(stories);
    }
 public abstract Wing GenerateWing(BuildingSettings settings, RectInt bounds, int numberOfStories);
Beispiel #26
0
 public abstract Wall[] GenerateWalls(BuildingSettings settings, RectInt bounds, int level);
        private void CreateMesh(List <Vector3> corners, float min_height, float height, BuildingSettings typeSettings, MeshData data, Vector2 min, Vector2 size)
        {
            var vertsStartCount = _useTriangulationNet
                    ? CreateRoofTriangulation(corners, height, data)
                    : CreateRoofClass(corners, height, data);


            foreach (var c in corners)
            {
                data.UV.Add(new Vector2((c.x - min.x), (c.z - min.y)));
            }

            if (typeSettings.IsVolumetric)
            {
                float   d = 0f;
                Vector3 v1;
                Vector3 v2;
                int     ind = 0;
                for (int i = 1; i < corners.Count; i++)
                {
                    v1  = data.Vertices[vertsStartCount + i - 1];
                    v2  = data.Vertices[vertsStartCount + i];
                    ind = data.Vertices.Count;
                    data.Vertices.Add(v1);
                    data.Vertices.Add(v2);
                    data.Vertices.Add(new Vector3(v1.x, min_height, v1.z));
                    data.Vertices.Add(new Vector3(v2.x, min_height, v2.z));

                    d = (v2 - v1).magnitude;

                    data.UV.Add(new Vector2(0, 0));
                    data.UV.Add(new Vector2(d, 0));
                    data.UV.Add(new Vector2(0, height));
                    data.UV.Add(new Vector2(d, height));

                    data.Indices.Add(ind);
                    data.Indices.Add(ind + 2);
                    data.Indices.Add(ind + 1);

                    data.Indices.Add(ind + 1);
                    data.Indices.Add(ind + 2);
                    data.Indices.Add(ind + 3);
                }

                v1  = data.Vertices[vertsStartCount];
                v2  = data.Vertices[vertsStartCount + corners.Count - 1];
                ind = data.Vertices.Count;
                data.Vertices.Add(v1);
                data.Vertices.Add(v2);
                data.Vertices.Add(new Vector3(v1.x, min_height, v1.z));
                data.Vertices.Add(new Vector3(v2.x, min_height, v2.z));

                d = (v2 - v1).magnitude;

                data.UV.Add(new Vector2(0, 0));
                data.UV.Add(new Vector2(d, 0));
                data.UV.Add(new Vector2(0, height));
                data.UV.Add(new Vector2(d, height));

                data.Indices.Add(ind);
                data.Indices.Add(ind + 1);
                data.Indices.Add(ind + 2);

                data.Indices.Add(ind + 1);
                data.Indices.Add(ind + 3);
                data.Indices.Add(ind + 2);
            }
        }
 public abstract Roof GenerateRoof(BuildingSettings settings, RectInt bounds);
 public override Roof GenerateRoof(BuildingSettings settings, RectInt bounds)
 {
     return(new Roof());
 }
Beispiel #30
0
        private void CreateMesh(List <Vector3> corners, float height, BuildingSettings typeSettings, MeshData data, Vector2 min, Vector2 size)
        {
            _mesh = new TriangleNet.Mesh();

            var inp = new InputGeometry(corners.Count);

            for (int i = 0; i < corners.Count; i++)
            {
                var v = corners[i];
                inp.AddPoint(v.x, v.z);
                inp.AddSegment(i, (i + 1) % corners.Count);
            }
            _mesh.Behavior.Algorithm = TriangulationAlgorithm.SweepLine;
            _mesh.Behavior.Quality   = true;
            _mesh.Triangulate(inp);

            var vertsStartCount = data.Vertices.Count;

            data.Vertices.AddRange(corners.Select(x => new Vector3(x.x, height, x.z)).ToList());

            foreach (var tri in _mesh.Triangles)
            {
                data.Indices.Add(vertsStartCount + tri.P1);
                data.Indices.Add(vertsStartCount + tri.P0);
                data.Indices.Add(vertsStartCount + tri.P2);
            }

            foreach (var c in corners)
            {
                data.UV.Add(new Vector2((c.x - min.x), (c.z - min.y)));
            }

            if (typeSettings.IsVolumetric)
            {
                float   d = 0f;
                Vector3 v1;
                Vector3 v2;
                int     ind = 0;
                for (int i = 1; i < corners.Count; i++)
                {
                    v1  = data.Vertices[vertsStartCount + i - 1];
                    v2  = data.Vertices[vertsStartCount + i];
                    ind = data.Vertices.Count;
                    data.Vertices.Add(v1);
                    data.Vertices.Add(v2);
                    data.Vertices.Add(new Vector3(v1.x, 0, v1.z));
                    data.Vertices.Add(new Vector3(v2.x, 0, v2.z));

                    d = (v2 - v1).magnitude;

                    data.UV.Add(new Vector2(0, 0));
                    data.UV.Add(new Vector2(d, 0));
                    data.UV.Add(new Vector2(0, height));
                    data.UV.Add(new Vector2(d, height));

                    data.Indices.Add(ind);
                    data.Indices.Add(ind + 2);
                    data.Indices.Add(ind + 1);

                    data.Indices.Add(ind + 1);
                    data.Indices.Add(ind + 2);
                    data.Indices.Add(ind + 3);
                }

                v1  = data.Vertices[vertsStartCount];
                v2  = data.Vertices[vertsStartCount + corners.Count - 1];
                ind = data.Vertices.Count;
                data.Vertices.Add(v1);
                data.Vertices.Add(v2);
                data.Vertices.Add(new Vector3(v1.x, 0, v1.z));
                data.Vertices.Add(new Vector3(v2.x, 0, v2.z));

                d = (v2 - v1).magnitude;

                data.UV.Add(new Vector2(0, 0));
                data.UV.Add(new Vector2(d, 0));
                data.UV.Add(new Vector2(0, height));
                data.UV.Add(new Vector2(d, height));

                data.Indices.Add(ind);
                data.Indices.Add(ind + 1);
                data.Indices.Add(ind + 2);

                data.Indices.Add(ind + 1);
                data.Indices.Add(ind + 3);
                data.Indices.Add(ind + 2);
            }
        }