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(); } } }
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); }
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(); } } } } }
// float range = 30; void OnEnable() { BuildingModifier bm = (BuildingModifier)target; bm.AwakeCity(); bm.UpdateCity(); banner = Resources.Load("CSHeader") as Texture; }
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(); } }
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(); } }
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(); } }
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 } }
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)); } }
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; } }