public void UpdateAdvertisingCulling()
        {
            CSRandomizerComponent = gameObject.GetComponent <CityRandomizer>();
            csDetailsObject       = CSRandomizerComponent.buildings;
            foreach (Transform go in csDetailsObject.transform.Cast <Transform>().Reverse())
            {
                CSAdvertising rooftops = go.GetComponent(typeof(CSAdvertising)) as CSAdvertising;
                if (rooftops != null)
                {
                    rooftops.instancesX     = advertsDensity;
                    rooftops.lodDistance    = advertsCullingSize;
                    rooftops.useAdvertising = useRooftops;
                    rooftops.animateLodFade = true;
                    rooftops.DeleteSolution();
                    rooftops.UpdateElements();
                }
            }

            foreach (Transform go in csDetailsObject.transform.Cast <Transform>().Reverse())
            {
                BuildingModifier bm = go.GetComponent(typeof(BuildingModifier)) as BuildingModifier;
                if (bm != null)
                {
                    bm.useAdvertising = useRooftops;
                    //   bm.AwakeCity();
                    bm.UpdateCity();
                }
            }
        }
Пример #2
0
        public void UpdateAdv()
        {
            BuildingModifier bm = gameObject.GetComponent <BuildingModifier>() as BuildingModifier;

            advPanelFrontPrefab.transform.position = gameObject.transform.position + new Vector3(0, 6, bm.buildingDepth * 3);
            // advPanelFrontPrefab.transform.localScale = new Vector3 (bm.buildingWidth * 3, 2f, bm.buildingDepth * 3);
        }
Пример #3
0
        public void AwakeMe()
        {
            if (gameObject.activeInHierarchy)
            {
                if (sparseRemove.Length < 10)
                {
                    System.Array.Resize(ref sparseRemove, 10);
                }
                if (sparseRandom.Length < 10)
                {
                    System.Array.Resize(ref sparseRandom, 10);
                }

                for (int i = 0; i < numberOfModifiers; i++)
                {
                    iteration = i;
                    if (rooftopElements[0] != null)
                    {
                        if (useAdvertising)
                        {
                            bmComponent    = gameObject.GetComponent <BuildingModifier>();
                            roofTopsObject = null;
                            // rooftopHolder = null;
                            if (rooftopHolder[iteration] == null)
                            {
                                rooftopHolder[iteration] = new GameObject(gameObject.transform.name + "_Detail");
#if UNITY_EDITOR
                                if (rooftopHolder[iteration].GetComponent <LODGroup>() == null)
                                {
                                    lodComponent = rooftopHolder[iteration].AddComponent <LODGroup>();
                                    UnityEditor.SerializedObject obj = new UnityEditor.SerializedObject(lodComponent);

                                    UnityEditor.SerializedProperty valArrProp = obj.FindProperty("m_LODs.Array");
                                    for (int j = 0; valArrProp.arraySize > j; j++)
                                    {
                                        UnityEditor.SerializedProperty sHeight = obj.FindProperty("m_LODs.Array.data[" + i.ToString() + "].screenRelativeHeight");

                                        if (j == 0)
                                        {
                                            sHeight.doubleValue = 0.8;
                                        }
                                        if (j == 1)
                                        {
                                            sHeight.doubleValue = 0.5;
                                        }
                                        if (j == 2)
                                        {
                                            sHeight.doubleValue = 0.1;
                                        }
                                    }
                                    obj.ApplyModifiedProperties();
                                }
#endif
                            }
                            UpdateElements();
                        }
                    }
                }
            }
        }
Пример #4
0
        //   float range = 30;


        void OnEnable()
        {
            BuildingModifier bm = (BuildingModifier)target;

            bm.AwakeCity();
            bm.UpdateCity();
            banner = Resources.Load("CSHeader") as Texture;
        }
Пример #5
0
        public void AwakeMe()
        {
            lodDistance = 0.2f;
            if (gameObject.activeInHierarchy)
            {
                if (rooftopElements.Length == 0)
                {
                    System.Array.Resize(ref rooftopElements, rooftopElements.Length + 1);
                }
                bmComponent = gameObject.GetComponent <BuildingModifier>();
                if (rooftopHolder == null)
                {
                    rooftopHolder = new GameObject(gameObject.transform.name + "_rooftop");
#if UNITY_EDITOR
                    if (rooftopHolder.GetComponent <LODGroup>() == null)
                    {
                        lodComponent = rooftopHolder.AddComponent <LODGroup>();
                        UnityEditor.SerializedObject obj = new UnityEditor.SerializedObject(lodComponent);

                        UnityEditor.SerializedProperty valArrProp = obj.FindProperty("m_LODs.Array");
                        for (int i = 0; valArrProp.arraySize > i; i++)
                        {
                            UnityEditor.SerializedProperty sHeight = obj.FindProperty("m_LODs.Array.data[" + i.ToString() + "].screenRelativeHeight");

                            if (i == 0)
                            {
                                sHeight.doubleValue = 0.8;
                            }
                            if (i == 1)
                            {
                                sHeight.doubleValue = 0.5;
                            }
                            if (i == 2)
                            {
                                sHeight.doubleValue = 0.1;
                            }
                        }
                        obj.ApplyModifiedProperties();
                    }
#endif
                }
                UpdateElements();
            }
        }
Пример #6
0
        public void UpdateElements()
        {
            if (bmComponent.supportSkewing)
            {
                useRooftops = false;
            }
            if (gameObject.activeInHierarchy && useRooftops)
            {
                if (bmComponent == null)
                {
                    bmComponent = gameObject.GetComponent <BuildingModifier>();
                }
                if (rooftopHolder == null)
                {
                    rooftopHolder = new GameObject(gameObject.transform.name + "_rooftop");
                    if (rooftopHolder.GetComponent <LODGroup>() == null)
                    {
#if UNITY_EDITOR
                        lodComponent = rooftopHolder.AddComponent <LODGroup>();
                        rooftopHolder.AddComponent <MeshFilter>();
                        rooftopHolder.AddComponent <MeshRenderer>();
                        rooftopHolder.transform.parent        = gameObject.transform;
                        rooftopHolder.transform.localPosition = new Vector3(0, 0, 0);
                        UnityEditor.SerializedObject obj = new UnityEditor.SerializedObject(lodComponent);

                        UnityEditor.SerializedProperty valArrProp = obj.FindProperty("m_LODs.Array");
                        for (int k = 0; valArrProp.arraySize > k; k++)
                        {
                            UnityEditor.SerializedProperty sHeight = obj.FindProperty("m_LODs.Array.data[" + k.ToString() + "].screenRelativeHeight");

                            if (k == 0)
                            {
                                sHeight.doubleValue = 0.8;
                            }
                            if (k == 1)
                            {
                                sHeight.doubleValue = 0.5;
                            }
                            if (k == 2)
                            {
                                sHeight.doubleValue = 0.1;
                            }
                        }
                        obj.ApplyModifiedProperties();
#endif
                    }
                }
                Random.InitState(randomSeed);
                int i = 0;

                if (rooftopElements.Length == 0)
                {
                    System.Array.Resize(ref rooftopElements, rooftopElements.Length + 1);
                }
#if UNITY_EDITOR
                isPrefabOriginal = UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == null && UnityEditor.PrefabUtility.GetPrefabObject(gameObject.transform) != null;
#endif
                if (!isPrefabOriginal)
                {
                    if (rooftopHolder == null)
                    {
                        rooftopHolder = new GameObject();
                        rooftopHolder.transform.position = gameObject.transform.position;

                        rooftopHolder.transform.parent = gameObject.transform;
                        rooftopHolder.AddComponent <MeshFilter>();
                        rooftopHolder.transform.name = "ShopDetails_" + gameObject.transform.name;
                    }
                    DeleteSolution();

                    int skipCounter = 0;
                    if (!repeatVertical)
                    {
                        for (int j = 0; j < bmComponent.buildingWidth; j++)
                        {
                            if (skipCounter == 0)
                            {
                                GameObject newObject = Instantiate(rooftopElements[Random.Range(0, rooftopElements.Length)]) as GameObject;
                                newObject.transform.parent = rooftopHolder.transform;
                                newObject.transform.Rotate(0, 0, 180);
                                newObject.transform.position = new Vector3(j * 3f, 0, 0) + offsetVec;
                            }
                            skipCounter++;
                            if (skipCounter >= skip)
                            {
                                skipCounter = 0;
                            }
                        }
                    }

                    else
                    {
                        for (int j = 0; j < bmComponent.buildingWidth; j++)
                        {
                            for (int k = 0; k < bmComponent.buildingWidth; k++)
                            {
                                if (skipCounter == 0)
                                {
                                    GameObject newObject = Instantiate(rooftopElements[Random.Range(0, rooftopElements.Length)]) as GameObject;
                                    newObject.transform.parent = rooftopHolder.transform;
                                    newObject.transform.Rotate(0, 0, 180);
                                    newObject.transform.position = new Vector3(j * 3f, k * 3f, 0) + offsetVec;
                                }
                                skipCounter++;
                                if (skipCounter >= skip)
                                {
                                    skipCounter = 0;
                                }
                            }
                        }
                    }
                    if (rooftopHolder.GetComponentsInChildren <Renderer>().Length > 1)
                    {
                        MergeMeshes();
                    }
                    else
                    {
                        DestroyImmediate(rooftopHolder);
                        return;
                    }



                    MeshCollider mColl = rooftopHolder.GetComponent <MeshCollider>();
                    if (!rooftopHolder.GetComponent <MeshCollider>())
                    {
                        mColl = rooftopHolder.AddComponent <MeshCollider>();
                    }
                    mColl.convex = false;
                    MeshFilter meshF = rooftopHolder.transform.GetComponent <MeshFilter>();
                    mColl.sharedMesh = meshF.sharedMesh;

                    if (roofTopsObject == null && bmComponent.isInRoot)
                    {
                        rooftopHolder.transform.parent = bmComponent.cityRandomizerParent.transform.Find("RooftopDetails");
                    }
                    else
                    {
                        rooftopHolder.transform.parent = bmComponent.gameObject.transform;
                    }

                    rooftopHolder.transform.position   = gameObject.transform.position;
                    rooftopHolder.transform.rotation   = gameObject.transform.rotation;
                    rooftopHolder.transform.localScale = new Vector3(1, bmComponent.scale, 1);;
                }
            }
            if ((!useRooftops && rooftopHolder))
            {
                DeleteSolution();
            }
        }
Пример #7
0
        public void UpdateElements()
        {
            if (bmComponent.supportSkewing)
            {
                useRooftops = false;
            }
            if (gameObject.activeInHierarchy && useRooftops)
            {
                if (bmComponent == null)
                {
                    bmComponent = gameObject.GetComponent <BuildingModifier>();
                }
                if (rooftopHolder == null)
                {
                    rooftopHolder = new GameObject(gameObject.transform.name + "_rooftop");
                    if (rooftopHolder.GetComponent <LODGroup>() == null)
                    {
#if UNITY_EDITOR
                        lodComponent = rooftopHolder.AddComponent <LODGroup>();
                        rooftopHolder.AddComponent <MeshFilter>();
                        rooftopHolder.AddComponent <MeshRenderer>();
                        rooftopHolder.transform.parent        = gameObject.transform;
                        rooftopHolder.transform.localPosition = new Vector3(0, 0, 0);
                        UnityEditor.SerializedObject obj = new UnityEditor.SerializedObject(lodComponent);

                        UnityEditor.SerializedProperty valArrProp = obj.FindProperty("m_LODs.Array");
                        for (int k = 0; valArrProp.arraySize > k; k++)
                        {
                            UnityEditor.SerializedProperty sHeight = obj.FindProperty("m_LODs.Array.data[" + k.ToString() + "].screenRelativeHeight");

                            if (k == 0)
                            {
                                sHeight.doubleValue = 0.8;
                            }
                            if (k == 1)
                            {
                                sHeight.doubleValue = 0.5;
                            }
                            if (k == 2)
                            {
                                sHeight.doubleValue = 0.1;
                            }
                        }
                        obj.ApplyModifiedProperties();
#endif
                    }
                }
                Random.InitState(randomSeed);
                int     i    = 0;
                Vector3 minX = new Vector3(gameObject.transform.position.x + bmComponent.buildingWidth * 3 + bmComponent.roofOffsetX[i].x, gameObject.transform.position.y + bmComponent.floorNumber * 3 + bmComponent.roofOffsetY[i], gameObject.transform.position.z + bmComponent.buildingDepth * 3 + bmComponent.roofOffsetX[i].y);
                Vector3 maxX = new Vector3(gameObject.transform.position.x + bmComponent.buildingWidth * 3 + bmComponent.roofOffsetX[i].x, gameObject.transform.position.y + bmComponent.floorNumber * 3 + bmComponent.roofOffsetY[i], gameObject.transform.position.z + bmComponent.roofOffsetZ[i].y);
                Vector3 minZ = new Vector3(gameObject.transform.position.x + bmComponent.roofOffsetZ[i].x, gameObject.transform.position.y + bmComponent.floorNumber * 3 + bmComponent.roofOffsetY[i], gameObject.transform.position.z + bmComponent.roofOffsetZ[i].y);
                Vector3 maxZ = new Vector3(gameObject.transform.position.x + bmComponent.roofOffsetZ[i].x, gameObject.transform.position.y + bmComponent.floorNumber * 3 + bmComponent.roofOffsetY[i], gameObject.transform.position.z + bmComponent.buildingDepth * 3 + bmComponent.roofOffsetX[i].y);

                float surfacedensity = (minX.z - maxX.z) * (minX.x - minZ.x) * instancesX / 10000;
                if (surfacedensity > 50)
                {
                    surfacedensity = 50;
                }

                if (rooftopElements.Length == 0)
                {
                    System.Array.Resize(ref rooftopElements, rooftopElements.Length + 1);
                }
#if UNITY_EDITOR
                isPrefabOriginal = UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject) == null && UnityEditor.PrefabUtility.GetPrefabObject(gameObject.transform) != null;
#endif
                if (!isPrefabOriginal)
                {
                    if (rooftopHolder == null)
                    {
                        rooftopHolder = new GameObject();
                        rooftopHolder.transform.position = gameObject.transform.position;
                        rooftopHolder.transform.parent   = gameObject.transform;
                        rooftopHolder.AddComponent <MeshFilter>();
                        rooftopHolder.transform.name = "Rooftop_" + gameObject.transform.name;
                    }
                    DeleteSolution();

                    //   greebleArea = new Bounds(Vector3.Lerp(minX, minZ, 0.5f) - rooftopHolder.transform.position, new Vector3(minX.x - minZ.x, 100, minX.z - maxX.z) * 2);
                    greebleAreaX = new Bounds(minX - rooftopHolder.transform.position, new Vector3(0.1f, 200, 500));
                    greebleAreaZ = new Bounds(maxZ - rooftopHolder.transform.position, new Vector3(500, 200, 0.2f));

                    for (int j = 0; j < surfacedensity; j++)
                    {
                        GameObject newObject = Instantiate(rooftopElements[Random.Range(0, rooftopElements.Length)]) as GameObject;
                        newObject.transform.parent     = rooftopHolder.transform;
                        newObject.transform.position   = new Vector3(Random.Range(minZ.x, maxX.x), minZ.y, Random.Range(minZ.z, maxZ.z - 0.2f)) - rooftopHolder.transform.position;
                        newObject.transform.localScale = newObject.transform.localScale * (Random.Range(0.7f, 1.5f));
                        //             newObject.transform.Rotate(new Vector3 (0, 0, 1), Random.Range(0, 4)*90);
                        Bounds newRendererBounds = newObject.GetComponent <Renderer>().bounds;


                        foreach (Transform go in rooftopHolder.transform.Cast <Transform>().Reverse())
                        {
                            if (newRendererBounds.Intersects(go.gameObject.GetComponent <Renderer>().bounds) && go != newObject.transform)
                            {
                                DestroyImmediate(newObject);
                                j = j - 1;
                                break;
                            }
                        }
                        if (newRendererBounds.Intersects(greebleAreaX) || newRendererBounds.Intersects(greebleAreaZ))
                        {
                            DestroyImmediate(newObject);
                        }
                    }
                    // Debug.Log(rooftopHolder.GetComponentsInChildren<Renderer>().Length);
                    if (rooftopHolder.GetComponentsInChildren <Renderer>().Length > 1)
                    {
                        MergeMeshes();
                    }
                    else
                    {
                        DestroyImmediate(rooftopHolder);
                        return;
                    }



                    MeshCollider mColl = rooftopHolder.GetComponent <MeshCollider>();
                    if (!rooftopHolder.GetComponent <MeshCollider>())
                    {
                        mColl = rooftopHolder.AddComponent <MeshCollider>();
                    }
                    mColl.convex = false;
                    MeshFilter meshF = rooftopHolder.transform.GetComponent <MeshFilter>();
                    mColl.sharedMesh = meshF.sharedMesh;

                    if (roofTopsObject == null && bmComponent.isInRoot)
                    {
                        rooftopHolder.transform.parent = bmComponent.cityRandomizerParent.transform.Find("RooftopDetails");
                    }
                    else
                    {
                        rooftopHolder.transform.parent = bmComponent.gameObject.transform;
                    }

                    rooftopHolder.transform.position   = gameObject.transform.position;
                    rooftopHolder.transform.rotation   = gameObject.transform.rotation;
                    rooftopHolder.transform.localScale = new Vector3(1, bmComponent.scale, 1);
                }
            }
            if ((!useRooftops && rooftopHolder))
            {
                DeleteSolution();
            }
        }
Пример #8
0
        public override void OnInspectorGUI()
        {
            BuildingModifier bm = (BuildingModifier)target;


            GUILayout.Box(banner, GUILayout.ExpandWidth(true));

            GUILayout.BeginVertical("box");
            GUILayout.Label("Facade Shape");
            bm.colorVariation4.x = EditorGUILayout.IntSlider("Floor Level Shape", Mathf.FloorToInt(bm.colorVariation4.x), 0, 9);
            //  bm.materialId1 = EditorGUILayout.IntSlider("Material ID 1", bm.materialId1, 20, 29);
            bm.materialId2 = EditorGUILayout.IntSlider("Front Faccade Shape", bm.materialId2, 0, 19);
            bm.materialId3 = EditorGUILayout.IntSlider("Lateral Faccade Shape", bm.materialId3, 0, 19);
            //  bm.materialId4 = EditorGUILayout.IntSlider("Material ID 4", bm.materialId4, 30, 39);
            bm.materialId5 = EditorGUILayout.IntSlider("Subdivision Shape", bm.materialId5, 0, 22);

            bm.colorVariation2.y = EditorGUILayout.Slider("Height Subdivision", (bm.colorVariation2.y), 0f, 9f);
            bm.colorVariation2.z = EditorGUILayout.Slider("Width Subdivision", (bm.colorVariation2.z), 0f, 9f);
            GUILayout.EndHorizontal();
            //configure Prefab



            GUILayout.BeginVertical("box");
            GUILayout.Label("Material Styling");

            // bm.pattern = EditorGUILayout.Slider("Floor Pattern", bm.pattern, 0f, 0.9f);
            bm.colorVariation3.x = EditorGUILayout.Slider("Faccade Mat 1 front/back", bm.colorVariation3.x, 0f, 9f);
            bm.colorVariation3.y = EditorGUILayout.Slider("Faccade Mat 2 front/back", bm.colorVariation3.y, 0f, 9f);
            bm.colorVariation5.x = EditorGUILayout.Slider("Faccade Mat 1 Lateral", bm.colorVariation5.x, 0f, 9f);
            bm.colorVariation5.y = EditorGUILayout.Slider("Faccade Mat 2 Lateral", bm.colorVariation5.y, 0f, 9f);
            bm.rooftopID         = EditorGUILayout.IntSlider("Rooftop Mat", bm.rooftopID, 0, 9);
            bm.colorVariation.z  = EditorGUILayout.Slider("Building floor Colors", (bm.colorVariation.z), 0f, 9f);
            //  bm.customData1 = EditorGUILayout.IntSlider("NotImplemented", bm.customData1, 0, 9);
            bm.customBool2    = EditorGUILayout.Toggle("Blinds in front of Window", bm.customBool2);
            bm.lightnessFront = EditorGUILayout.IntSlider("Lightness front/back", (bm.lightnessFront), 0, 9);
            bm.lightnessSide  = EditorGUILayout.IntSlider("Lightness Sides", (bm.lightnessSide), 0, 9);
            bm.borderCol      = EditorGUILayout.IntSlider("Window Border Col", (bm.borderCol), 0, 9);


            bm.colorVariation2.x = EditorGUILayout.Slider("Window Gloss", bm.colorVariation2.x, 0f, 9f);
            bm.windowOpen        = EditorGUILayout.Slider("Window Lights", bm.windowOpen, 0f, 9f);

            bm.colorVariation2.w = EditorGUILayout.Slider("Blinds open", (bm.colorVariation2.w), 0f, 9f);

            bm.lightsOnOff2 = EditorGUILayout.Slider("Shop Signs Density", (bm.lightsOnOff2), 0f, 9f);
            bm.useGraffiti  = EditorGUILayout.Toggle("Use Graffiti", bm.useGraffiti);



            bm.colorVariation.x = EditorGUILayout.Slider("Faccade Lights Height", bm.colorVariation.x, 0f, 9f);
            bm.lightsOnOff      = EditorGUILayout.Slider("Faccade Lights Tiling", (bm.lightsOnOff), 0f, 9f);
            bm.colorVariation.y = EditorGUILayout.Slider("Lights R", (bm.colorVariation.y), 0f, 9f);

            bm.colorVariation.w = EditorGUILayout.Slider("Lights B", (bm.colorVariation.w), 0f, 9f);


            bm.uniqueMapping = EditorGUILayout.IntField("Unique Mapping", bm.uniqueMapping);
            bm.floorNumber   = EditorGUILayout.IntField("Floor Number", bm.floorNumber);
            bm.buildingDepth = EditorGUILayout.IntField("Building depth", bm.buildingDepth);
            bm.buildingWidth = EditorGUILayout.IntField("Building Width", bm.buildingWidth);
            //   bm.distortXZ = EditorGUILayout.FloatField("Building Width", bm.distortXZ);
            bm.useAdvertising = EditorGUILayout.Toggle("Use Advertising Panels", bm.useAdvertising);
            bm.supportSkewing = EditorGUILayout.Toggle("Support Skewing", bm.supportSkewing);
            if (bm.supportSkewing)
            {
                bm.skew = EditorGUILayout.FloatField("Skew Amount", bm.skew);
            }
            bm.scale                   = EditorGUILayout.FloatField("Scale Floors", bm.scale);
            bm.extendFoundations       = EditorGUILayout.FloatField("Extend Foundations", bm.extendFoundations);
            bm.extFoundationsTreshhold = EditorGUILayout.FloatField("Extend Foundations Threshold", bm.extFoundationsTreshhold);
            bm.useSlantedRoofsResize   = EditorGUILayout.Toggle("Use slanted Roofs", bm.useSlantedRoofsResize);
            bm.slantedRoofsVal         = EditorGUILayout.Vector4Field("Slanted roof val", bm.slantedRoofsVal);
            bm.hasNoFloorLevel         = EditorGUILayout.Toggle("building has no floor level", bm.hasNoFloorLevel);

            //if (GUILayout.Button("Generate Lightmapping UV"))
            //{
            //    bm.GenerateLightmaps();
            //}
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            //if (GUILayout.Button("Split Building X"))
            //{
            //    SplitX();

            //}
            //if (GUILayout.Button("Split Building Z"))
            //{
            //    SplitZ();

            //}

            if (GUILayout.Button("Randomize Materials"))
            {
                bm.colorVariation.x = Random.Range(0, 9);

                bm.colorVariation2.x = Random.Range(0, 9);
                bm.colorVariation2.y = Random.Range(0, 9);
                bm.colorVariation2.z = Random.Range(0, 9);
                bm.colorVariation2.w = Random.Range(2, 9);

                bm.colorVariation3.x = Random.Range(0, 9);
                bm.colorVariation3.y = Random.Range(0, 9);
                bm.colorVariation3.z = Random.Range(0, 9);
                bm.colorVariation3.w = Random.Range(0, 9);

                bm.colorVariation4.x = Random.Range(0, 9);
                bm.colorVariation4.y = Random.Range(0, 9);
                bm.colorVariation4.z = Random.Range(0, 9);
                bm.colorVariation4.w = Random.Range(0, 9);
                bm.lightnessFront    = Random.Range(0, 9);
                bm.lightnessSide     = Random.Range(0, 9);
                bm.colorVariation5.x = Random.Range(0, 9);
                bm.colorVariation5.y = Random.Range(0, 9);
            }
            GUILayout.EndHorizontal();

            GUILayout.BeginVertical("box");
            configurePrefab = EditorGUILayout.Foldout(configurePrefab, "Template Configuration");
            if (configurePrefab)
            {
                bm.meshOriginal = EditorGUILayout.ObjectField("Mesh Template", bm.meshOriginal, typeof(Mesh), true) as Mesh;
                if (GUILayout.Button("Update Mesh Template"))
                {
                    bm.AwakeCity();
                    bm.UpdateCity();
                }
                if (GUILayout.Button("Guess building size"))
                {
                    bm.GuessPrefabSize();
                    bm.AwakeCity();
                    bm.UpdateCity();
                }
                bm.scaleFrom1to3         = EditorGUILayout.Toggle("Model unit is one CScape Unit", bm.scaleFrom1to3);
                bm.lowFloorBound         = EditorGUILayout.Vector3Field("Resizer Center", bm.lowFloorBound);
                bm.thresholdResizeX      = EditorGUILayout.FloatField("Threshold X", bm.thresholdResizeX);
                bm.thresholdResizeY      = EditorGUILayout.FloatField("Threshold Y", bm.thresholdResizeY);
                bm.thresholdResizeZ      = EditorGUILayout.FloatField("Threshold Z", bm.thresholdResizeZ);
                bm.prefabFloors          = EditorGUILayout.IntField("Prefab floor number", bm.prefabFloors);
                bm.prefabWidth           = EditorGUILayout.IntField("Prefab width", bm.prefabWidth);
                bm.prefabDepth           = EditorGUILayout.IntField("Prefab depth", bm.prefabDepth);
                bm.normalThreshold       = EditorGUILayout.Slider("Normal threshold", bm.normalThreshold, 0f, 0.9f);
                bm.floorHeight           = EditorGUILayout.FloatField("Floor Height", bm.floorHeight);
                bm.advertisingPanelCoord = EditorGUILayout.Vector3Field("Advert Panel Zone", bm.advertisingPanelCoord);

                bm.prefabHasVertexInfo = EditorGUILayout.Toggle("Prefab has vertex Info", bm.prefabHasVertexInfo);
                bm.autoMap             = EditorGUILayout.Toggle("Use Auto Map UV", bm.autoMap);
                bm.useFloorLimiting    = EditorGUILayout.Toggle("Use Floor Limiting", bm.useFloorLimiting);
                if (bm.useFloorLimiting)
                {
                    bm.minFloorNumber = EditorGUILayout.IntField("Min floor number", bm.minFloorNumber);
                    bm.maxFloorNumber = EditorGUILayout.IntField("Min floor number", bm.maxFloorNumber);
                }



                ///Rooftops Array
                GUILayout.BeginVertical("Box");
                for (int i = 0; i < bm.roofOffsetY.Length; i++)
                {
                    bm.roofOffsetX[i] = EditorGUILayout.Vector2Field("Roof Elements X", bm.roofOffsetX[i]);
                    bm.roofOffsetZ[i] = EditorGUILayout.Vector2Field("Roof Elements Z", bm.roofOffsetZ[i]);
                    bm.roofOffsetY[i] = EditorGUILayout.FloatField("Roof Height", bm.roofOffsetY[i]);
                }



                GUILayout.BeginHorizontal("Box");
                if (GUILayout.Button("-", "Label", GUILayout.Width(20), GUILayout.Height(15)))
                {
                    System.Array.Resize(ref bm.roofOffsetX, bm.roofOffsetX.Length - 1);
                    System.Array.Resize(ref bm.roofOffsetY, bm.roofOffsetY.Length - 1);
                    System.Array.Resize(ref bm.roofOffsetZ, bm.roofOffsetZ.Length - 1);
                }
                if (GUILayout.Button("+", "Label", GUILayout.Width(20), GUILayout.Height(15)))
                {
                    System.Array.Resize(ref bm.roofOffsetX, bm.roofOffsetX.Length + 1);
                    System.Array.Resize(ref bm.roofOffsetY, bm.roofOffsetY.Length + 1);
                    System.Array.Resize(ref bm.roofOffsetZ, bm.roofOffsetZ.Length + 1);
                }
                GUILayout.EndHorizontal();
                GUILayout.EndVertical();
                /////Advertising Panels layout
                GUILayout.BeginVertical("Box");
                for (int i = 0; i < bm.advertOffsetY.Length; i++)
                {
                    bm.advertOffsetX[i] = EditorGUILayout.Vector2Field("Roof Elements X", bm.advertOffsetX[i]);
                    bm.advertOffsetZ[i] = EditorGUILayout.Vector2Field("Roof Elements Z", bm.advertOffsetZ[i]);
                    bm.advertOffsetY[i] = EditorGUILayout.FloatField("Roof Height", bm.advertOffsetY[i]);
                }



                GUILayout.BeginHorizontal("Box");
                if (GUILayout.Button("-", "Label", GUILayout.Width(20), GUILayout.Height(15)))
                {
                    System.Array.Resize(ref bm.advertOffsetX, bm.advertOffsetX.Length - 1);
                    System.Array.Resize(ref bm.advertOffsetY, bm.advertOffsetY.Length - 1);
                    System.Array.Resize(ref bm.advertOffsetZ, bm.advertOffsetZ.Length - 1);
                }
                if (GUILayout.Button("+", "Label", GUILayout.Width(20), GUILayout.Height(15)))
                {
                    System.Array.Resize(ref bm.advertOffsetX, bm.advertOffsetX.Length + 1);
                    System.Array.Resize(ref bm.advertOffsetY, bm.advertOffsetY.Length + 1);
                    System.Array.Resize(ref bm.advertOffsetZ, bm.advertOffsetZ.Length + 1);
                }
                GUILayout.EndHorizontal();
                GUILayout.EndVertical();
            }
            GUILayout.EndVertical();


            if (GUI.changed)
            {
                bm.UpdateCity();
                EditorUtility.SetDirty(bm);
#if UNITY_5_4_OR_NEWER
                EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());
#endif
            }
        }
Пример #9
0
        void OnSceneGUI()
        {
            bool             editMe;
            BuildingModifier t           = (target as BuildingModifier);
            Quaternion       newRotation = t.gameObject.transform.rotation;

            Undo.RecordObject(t, "Undo building Modification");
            Vector3 point       = Camera.current.WorldToScreenPoint(t.transform.position);
            Vector3 splitPointX = Camera.current.WorldToScreenPoint(t.transform.position + new Vector3((t.buildingWidth / 2) * 3f, 0, 0));
            Vector3 splitPointZ = Camera.current.WorldToScreenPoint(t.transform.position + new Vector3(0, 0, (t.buildingDepth / 2) * 3f));


            Handles.BeginGUI();
            if (Event.current.modifiers == EventModifiers.Alt)
            {
                editMe = true;
            }
            else
            {
                editMe = false;
            }
            GUILayout.BeginVertical();
            //if (editMe)
            //{
            //    if (GUI.Button(new Rect(splitPointX.x - 40, Screen.height - splitPointX.y - 40, 80, 20), "Split X"))
            //    {
            //        SplitX();
            //    }

            //    if (GUI.Button(new Rect(splitPointZ.x - 40, Screen.height - splitPointZ.y - 40, 80, 20), "Split Z"))
            //    {
            //        SplitZ();
            //    }
            //}
            EditorGUI.BeginChangeCheck();
            if (editMe)
            {
                GUILayout.BeginVertical();

                GUI.Label(new Rect(splitPointX.x - 40, Screen.height - splitPointX.y - 20, 100, 30), "id2");
                t.materialId2 = Mathf.RoundToInt(GUI.HorizontalSlider(new Rect(splitPointX.x - 40, Screen.height - splitPointX.y - 10, 80, 20), t.materialId2, 0, 19));
                GUI.Label(new Rect(splitPointX.x - 40, Screen.height - splitPointX.y, 100, 30), "id2");
                t.materialId2 = Mathf.RoundToInt(GUI.HorizontalSlider(new Rect(splitPointX.x - 40, Screen.height - splitPointX.y + 10, 80, 20), t.materialId2, 0, 19));
                GUI.Label(new Rect(point.x, Screen.height - point.y - 30, 100, 30), "Text");
                t.windowOpen = GUI.HorizontalSlider(new Rect(point.x, Screen.height - point.y - 20, 100, 30), t.windowOpen, 0.0F, 9.0F);
                GUI.Label(new Rect(point.x, Screen.height - point.y - 10, 100, 30), "Text");
                t.materialId1 = Mathf.RoundToInt(GUI.HorizontalSlider(new Rect(point.x, Screen.height - point.y, 100, 30), t.materialId1, 20, 29));
                t.gameObject.transform.localPosition = new Vector3(Mathf.CeilToInt(t.gameObject.transform.localPosition.x / 3) * 3, 0, t.gameObject.transform.localPosition.z);
            }

            if (EditorGUI.EndChangeCheck())
            {
                t.UpdateCity();
            }
            GUILayout.EndVertical();
            Handles.EndGUI();

            //  Vector3 position = t.transform.position + Vector3.up * 2f;
            //  float size = 2f;
            //   float pickSize = size * 2f;



            /////////
            if (!editMe)
            {
                if (Event.current.type == EventType.Repaint && configurePrefab)
                {
                    Handles.color = Color.blue;
                    Handles.Label(t.transform.position + Vector3.up * 2,
                                  "Depth: " + t.buildingDepth + "cs units (" + t.buildingDepth * 3 + "m) \n" +
                                  "Width: " + t.buildingWidth + "cs units (" + t.buildingWidth * 3 + "m) \n" +
                                  "Height: " + t.floorNumber + "Floors (" + t.floorNumber * 3 + "m) \n");



                    Vector3 pos = t.transform.position;


                    Vector3[] verts = new Vector3[] {
                        newRotation *(new Vector3(pos.x + t.buildingWidth * 3, pos.y, pos.z + t.buildingDepth * 3) - t.gameObject.transform.position) + t.gameObject.transform.position,
                        newRotation *(new Vector3(pos.x + t.buildingWidth * 3, pos.y, pos.z) - t.gameObject.transform.position) + t.gameObject.transform.position,
                        newRotation *(new Vector3(pos.x, pos.y, pos.z) - t.gameObject.transform.position) + t.gameObject.transform.position,
                        newRotation *(new Vector3(pos.x, pos.y, pos.z + t.buildingDepth * 3) - t.gameObject.transform.position) + t.gameObject.transform.position
                    };

                    Handles.DrawSolidRectangleWithOutline(verts, new Color(1, 1, 1, 0.1f), new Color(0, 0, 0, 1));
                    Handles.color = Color.white;
                    float bwdth = t.buildingWidth;
                    t.buildingWidth = Mathf.CeilToInt(bwdth);
                }
            }



            if (Event.current.type == EventType.Repaint && configurePrefab)
            {
                Handles.color = Color.red;
                Vector3 pos = t.transform.position;

                Vector3[] verts = new Vector3[] {
                    newRotation *(new Vector3(pos.x + t.buildingWidth * 3, pos.y + t.prefabFloors * 3, pos.z + t.buildingDepth * 3) - t.gameObject.transform.position) + t.gameObject.transform.position,
                    newRotation *(new Vector3(pos.x + t.buildingWidth * 3, pos.y + t.prefabFloors * 3, pos.z) - t.gameObject.transform.position) + t.gameObject.transform.position,
                    newRotation *(new Vector3(pos.x, pos.y + t.prefabFloors * 3, pos.z) - t.gameObject.transform.position) + t.gameObject.transform.position,
                    newRotation *(new Vector3(pos.x, pos.y + t.prefabFloors * 3, pos.z + t.buildingDepth * 3) - t.gameObject.transform.position) + t.gameObject.transform.position
                };

                Handles.DrawSolidRectangleWithOutline(verts, new Color(1, 0, 0, 0.1f), new Color(1, 0, 0, 1));
            }


            {
                if (Event.current.type == EventType.Repaint && configurePrefab)
                {
                    for (int i = 0; i < t.roofOffsetY.Length; i++)
                    {
                        Handles.color    = Color.yellow;
                        Handles.lighting = true;
                        //Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual;
                        Vector3 pos = t.transform.position;

                        Vector3[] verts = new Vector3[] {
                            newRotation *(new Vector3(pos.x + t.buildingWidth * 3 + t.roofOffsetX[i].x, pos.y + t.floorNumber * 3 + t.roofOffsetY[i], pos.z + t.buildingDepth * 3 + t.roofOffsetX[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position,
                            newRotation *(new Vector3(pos.x + t.buildingWidth * 3 + t.roofOffsetX[i].x, pos.y + t.floorNumber * 3 + t.roofOffsetY[i], pos.z + t.roofOffsetZ[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position,
                            newRotation *(new Vector3(pos.x + t.roofOffsetZ[i].x, pos.y + t.floorNumber * 3 + t.roofOffsetY[i], pos.z + t.roofOffsetZ[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position,
                            newRotation *(new Vector3(pos.x + t.roofOffsetZ[i].x, pos.y + t.floorNumber * 3 + t.roofOffsetY[i], pos.z + t.buildingDepth * 3 + t.roofOffsetX[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position
                        };

                        Handles.DrawSolidRectangleWithOutline(verts, new Color(1, 1, 0, 0.1f), new Color(1, 0, 0, 1));
                    }

                    ///DraW advert zones
                    for (int i = 0; i < t.advertOffsetY.Length; i++)
                    {
                        Handles.color    = Color.green;
                        Handles.lighting = true;
                        //Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual;
                        Vector3 pos = t.transform.position;

                        Vector3[] verts = new Vector3[] {
                            newRotation *(new Vector3(pos.x + t.buildingWidth * 3 + t.advertOffsetX[i].x, pos.y + t.advertOffsetY[i] + t.advertOffsetZ[i].y, pos.z + t.advertOffsetX[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position,
                            newRotation *(new Vector3(pos.x + t.buildingWidth * 3 + t.advertOffsetX[i].x, pos.y + t.advertOffsetY[i], pos.z + t.advertOffsetX[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position,
                            newRotation *(new Vector3(pos.x + t.advertOffsetZ[i].x, pos.y + t.advertOffsetY[i], pos.z + t.advertOffsetX[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position,
                            newRotation *(new Vector3(pos.x + t.advertOffsetZ[i].x, pos.y + t.advertOffsetY[i] + t.advertOffsetZ[i].y, pos.z + t.advertOffsetX[i].y) - t.gameObject.transform.position) + t.gameObject.transform.position
                        };

                        Handles.DrawSolidRectangleWithOutline(verts, new Color(1, 1, 0, 0.1f), new Color(1, 0, 0, 1));
                    }
                    //    float bwdth = t.buildingWidth;

                    // foreach (Vector3 posCube in verts)
                    // bwdth = Handles.ScaleValueHandle(t.buildingWidth, posCube, Quaternion.identity, 1, Handles.CubeCap, 1);
                    //     t.buildingWidth = Mathf.CeilToInt(bwdth);
                }
            }


            if (configurePrefab)
            {
            }
            float size = HandleUtility.GetHandleSize(point);

            EditorGUI.BeginChangeCheck();
            Handles.color = new Color(1, 0, 0, 1);
            float bdepth = Handles.ScaleValueHandle(t.buildingWidth + 0f, (t.transform.position) + newRotation * ((new Vector3(t.buildingWidth * 3, 0, t.buildingDepth * 1.5f) - t.gameObject.transform.position) + t.gameObject.transform.position), t.transform.rotation * Quaternion.LookRotation(Vector3.right), 10, Handles.CircleHandleCap, 3);

            //   float bdepth = t.buildingWidth;
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Width Slider");
                t.buildingWidth = Mathf.FloorToInt(bdepth);
                t.UpdateCity();
            }


            EditorGUI.BeginChangeCheck();
            Handles.color = new Color(0, 1, 0, 1);
            float height = Handles.ScaleValueHandle(t.floorNumber + 0f, (t.transform.position) + newRotation * ((new Vector3(t.buildingWidth * 1.5f, t.floorNumber * 3, t.buildingDepth * 1.5f) - t.gameObject.transform.position) + t.gameObject.transform.position), t.transform.rotation * Quaternion.LookRotation(Vector3.up), 10, Handles.CircleHandleCap, 3);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Floor Slider");
                t.floorNumber = Mathf.FloorToInt(height);
                t.UpdateCity();
            }

            EditorGUI.BeginChangeCheck();
            Handles.color = new Color(0, 1, 1, 1);
            float width = Handles.ScaleValueHandle(t.buildingDepth + 0f, (t.transform.position) + newRotation * ((new Vector3(t.buildingWidth * 1.5f, 0, t.buildingDepth * 3) - t.gameObject.transform.position) + t.gameObject.transform.position), t.transform.rotation * Quaternion.LookRotation(Vector3.forward), 10, Handles.CircleHandleCap, 3);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Depth Slider");
                t.buildingDepth = Mathf.FloorToInt(width);
                t.UpdateCity();
            }

            EditorGUI.BeginChangeCheck();
            Handles.color = new Color(1, 1, 0, 1);
            int   oldDepth = t.buildingDepth;
            float depth2   = Handles.ScaleValueHandle(t.buildingDepth, (t.transform.position) + newRotation * ((new Vector3(t.buildingWidth * 1.5f, 0, 0) - t.gameObject.transform.position) + t.gameObject.transform.position), t.transform.rotation * Quaternion.LookRotation(Vector3.forward), 10, Handles.CircleHandleCap, -3);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Depth2 Slider");

                t.buildingDepth = Mathf.FloorToInt(depth2);

                t.UpdateCity();
                if (oldDepth != t.buildingDepth)
                {
                    t.gameObject.transform.Translate(0f, 0f, (oldDepth - t.buildingDepth) * 3);
                }
            }

            EditorGUI.BeginChangeCheck();
            Handles.color = new Color(1, 0, 1, 1);
            int   oldWidth = t.buildingWidth;
            float width2   = Handles.ScaleValueHandle(t.buildingWidth, (t.transform.position) + newRotation * ((new Vector3(0, 0, t.buildingDepth * 1.5f) - t.gameObject.transform.position) + t.gameObject.transform.position), t.transform.rotation * Quaternion.LookRotation(Vector3.right), 10, Handles.CircleHandleCap, 3);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Width2 Slider");

                t.buildingWidth = Mathf.FloorToInt(width2);

                t.UpdateCity();
                if (oldWidth != t.buildingWidth)
                {
                    t.gameObject.transform.Translate((oldWidth - t.buildingWidth) * 3, 0f, 0f);
                }
            }
            if (Event.current.type == EventType.Repaint && !configurePrefab)
            {
                Vector3   pos   = t.transform.position;
                Vector3[] verts = new Vector3[] {
                    newRotation *(new Vector3(pos.x + t.buildingWidth * 3, pos.y, pos.z + t.buildingDepth * 3) - t.gameObject.transform.position) + t.gameObject.transform.position,
                    newRotation *(new Vector3(pos.x + t.buildingWidth * 3, pos.y, pos.z) - t.gameObject.transform.position) + t.gameObject.transform.position,
                    newRotation *(new Vector3(pos.x, pos.y, pos.z) - t.gameObject.transform.position) + t.gameObject.transform.position,
                    newRotation *(new Vector3(pos.x, pos.y, pos.z + t.buildingDepth * 3) - t.gameObject.transform.position) + t.gameObject.transform.position
                };
                Handles.color = new Color(1, 1, 1, 0.3f);
                Handles.DrawSolidRectangleWithOutline(verts, new Color(0, 0, 0, 0), new Color(1, 1, 1, 1));
            }
        }
Пример #10
0
        void Update()
        {
            CityRandomizer cityRandomizer = gameObject.GetComponent <CityRandomizer>();

            if (execute)
            {
                foreach (Transform go in rootHolder.transform.Cast <Transform>().Reverse())
                {
                    GuessWorldRotation(go.gameObject);
                    // we have to reset reference object rotation to be able to calculate real bounding box, here we are storing a real rotation
                    Quaternion oldTransform = go.rotation;

                    //reseting rotation
                    go.eulerAngles = new Vector3(go.eulerAngles.x, 0, go.eulerAngles.z);

                    //calculate bounding box and apporximate building size in CScape building units
                    Vector3 center            = go.gameObject.GetComponent <Renderer>().bounds.center;
                    Vector3 bounds            = go.gameObject.GetComponent <Renderer>().bounds.extents;
                    Vector3 CScapeCoordinates = new Vector3(center.x - bounds.x, center.y - bounds.y, center.z - bounds.z);
                    int     depth             = Mathf.FloorToInt((bounds.z * 2f) / 3f);
                    int     width             = Mathf.FloorToInt((bounds.x * 2f) / 3f);
                    int     height            = Mathf.FloorToInt((bounds.y * 2f) / 3f);



                    //take random building objects from a CityRandomizer array of buildings ad choose only those that can fit reference buildings
                    GameObject prefabToInstantiate = null;
                    int        iterations          = districtStyle.prefabs.Length;
                    bool       validate            = false;
                    int        prefabChoice        = Random.Range(0, districtStyle.prefabs.Length);

                    while (validate == false)
                    {
                        prefabToInstantiate = districtStyle.prefabs[prefabChoice];
                        //                      BuildingModifier buildingToInstantiate = prefabToInstantiate.GetComponent<BuildingModifier>();
                        if (prefabToInstantiate.GetComponent <BuildingModifier>().prefabDepth <= depth && prefabToInstantiate.GetComponent <BuildingModifier>().prefabDepth <= depth)
                        {
                            validate = true;
                        }
                        else
                        {
                            prefabChoice++;
                        }

                        if (iterations > districtStyle.prefabs.Length)
                        {
                            prefabToInstantiate = districtStyle.prefabs[0];
                            validate            = true;
                        }

                        iterations++;
                    }

                    //Generate building
                    GameObject cloneH = Instantiate(prefabToInstantiate, CScapeCoordinates, transform.rotation) as GameObject;
                    //parent to reference building
                    cloneH.transform.parent = go.transform;
                    //restore original object rotation
                    go.rotation = oldTransform;
                    //unparent from reference building, and parent to Cscape city
                    cloneH.transform.parent = cityRandomizer.buildings.transform;
                    BuildingModifier buildingModifier = cloneH.GetComponent(typeof(BuildingModifier)) as BuildingModifier;
                    buildingModifier.buildingDepth = depth;
                    buildingModifier.buildingWidth = width;
                    buildingModifier.floorNumber   = height;

                    buildingModifier.AwakeCity();
                    buildingModifier.UpdateCity();
                }


                execute = false;
            }
        }