using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEditor; using System.Reflection; using EasyRoads3D; using EasyRoads3DEditor; public class EasyRoadsEditorMenu : ScriptableObject { [MenuItem( "GameObject/Create Other/EasyRoads3D/New EasyRoads3D Object" )] public static void CreateEasyRoads3DObject () { Terrain[] terrains = (Terrain[]) FindObjectsOfType(typeof(Terrain)); if(terrains.Length == 0){ EditorUtility.DisplayDialog("Alert", "No Terrain objects found! EasyRoads3D objects requires a terrain object to interact with. Please create a Terrain object first", "Close"); return; } if(NewEasyRoads3D.instance == null){ NewEasyRoads3D window = (NewEasyRoads3D)ScriptableObject.CreateInstance(typeof(NewEasyRoads3D)); window.ShowUtility(); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Back Up/Terrain Height Data" )] public static void GetTerrain () { if(GetEasyRoads3DObjects()){ OCDOOCOODO.ODDOQCOOQC(Selection.activeGameObject); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Restore/Terrain Height Data" )] public static void SetTerrain () { if(GetEasyRoads3DObjects()){ OCDOOCOODO.OCOOQQCDDO(Selection.activeGameObject); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Back Up/Terrain Splatmap Data" )] public static void OQCOCDOCDD() { if(GetEasyRoads3DObjects()){ OQCQQDCCCO.OQCOCDOCDD(Selection.activeGameObject); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Restore/Terrain Splatmap Data" )] public static void OOQDODOCQC () { if(GetEasyRoads3DObjects()){ string path = ""; if(EditorUtility.DisplayDialog("Road Splatmap", "Would you like to merge the terrain splatmap(s) with a road splatmap?", "Yes", "No")){ path = EditorUtility.OpenFilePanel("Select png road splatmap texture", "", "png"); } OQCQQDCCCO.OQCODQDQQO(true, 100, 4, path, Selection.activeGameObject); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Back Up/Terrain Vegetation Data" )] public static void OQCDCDOQQO() { if(GetEasyRoads3DObjects()){ OCDOOCOODO.OQCDCDOQQO(Selection.activeGameObject, null, ""); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Back Up/All Terrain Data" )] public static void GetAllData() { if(GetEasyRoads3DObjects()){ OCDOOCOODO.ODDOQCOOQC(Selection.activeGameObject); OQCQQDCCCO.OQCOCDOCDD(Selection.activeGameObject); OCDOOCOODO.OQCDCDOQQO(Selection.activeGameObject, null,""); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Restore/Terrain Vegetation Data" )] public static void OQOQOQQOOD() { if(GetEasyRoads3DObjects()){ OCDOOCOODO.OQOQOQQOOD(Selection.activeGameObject); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Restore/All Terrain Data" )] public static void RestoreAllData() { if(GetEasyRoads3DObjects()){ OCDOOCOODO.OCOOQQCDDO(Selection.activeGameObject); OQCQQDCCCO.OQCODQDQQO(true, 100, 4, "", Selection.activeGameObject); OCDOOCOODO.OQOQOQQOOD(Selection.activeGameObject); }else{ EditorUtility.DisplayDialog("Alert", "No EasyRoads3D objects found! Terrain functions cannot be accessed!", "Close"); } } [MenuItem ("GameObject/Create Other/EasyRoads3D/Side Objects/Object Manager")] static void ShowObjectManager () { if(RoadObjectScript.erInit == ""){ RoadObjectScript[] scripts = (RoadObjectScript[])FindObjectsOfType(typeof(RoadObjectScript)); if(scripts != null) if(scripts.Length != 0) Selection.activeGameObject = scripts[0].gameObject; } if(ObjectManager.instance == null){ if(Terrain.activeTerrain != null)OOCQCOCDOQ.terrainTrees = OOQCOQOQQD.OQDQCDOODQ(); ObjectManager window =(ObjectManager)ScriptableObject.CreateInstance(typeof(ObjectManager)); window.ShowUtility(); } } [MenuItem( "GameObject/Create Other/EasyRoads3D/Build EasyRoads3D Objects" )] public static void FinalizeRoads () { bool destroyTerrainScript = true; if(EditorUtility.DisplayDialog("Build EasyRoads3D Objects", "This process includes destroying all EasyRoads3D control objects. Did you make a backup of the Scene? Do you want to continue?\n\nDepending on the number of EasyRoads3D objects in the Scene and used side objects, this process may take a while. Please be patient. ", "Yes", "No")){ RoadObjectScript[] scripts = (RoadObjectScript[])FindObjectsOfType(typeof(RoadObjectScript)); foreach (RoadObjectScript script in scripts) { bool renderflag = true; bool renderAlreadyDone = false; int num = 0; if(!script.displayRoad){ num = EditorUtility.DisplayDialogComplex ("Disabled EasyRoads3D Object Detected:", script.gameObject.name + " is currently not displayed.\n\nWould you like to activate and finalize this object, destroy this object or skip it in this finalize procedure?", "Finalize", "Destroy", "Skip"); if(num == 0){ script.displayRoad = true; if(script.OOOOODODCQ == null){ List arr = OCDQDCQOCQ.OQOODCQQCO(false); script.ODODCDOOQC(arr, OCDQDCQOCQ.OQQQOOOOOC(arr), OCDQDCQOCQ.OQODCCCCCD(arr)); } script.OOOOODODCQ.OOQCQOCOOC(script.displayRoad, script.OCCOCOOOCC); } if(num == 1){ renderflag = false; } if(num == 2){ renderflag = false; destroyTerrainScript = false; } } if(script.transform != null && renderflag && !script.OQCCDOOOCC){ if(script.OOOOODODCQ == null){ List arr = OCDQDCQOCQ.OQOODCQQCO(false); script.ODODCDOOQC(arr, OCDQDCQOCQ.OQQQOOOOOC(arr), OCDQDCQOCQ.OQODCCCCCD(arr)); } if(RoadObjectScript.erInit == ""){ RoadObjectScript.erInit = OQCOQQCOQO.OQDODODOQD(RoadObjectScript.version); OOQCOQOQQD.erInit = RoadObjectScript.erInit; } if(script.OOOOODODCQ == null){ script.OCQOQOCQDC(script.transform, null, null, null); } OOQCOQOQQD.OQDQQQCDQQ = true; if(!script.OQCCDOOOCC){ script.geoResolution = 0.5f; script.OQOQQQCDOQ(); if(script.objectType < 2) OQCOOCDODD(script); script.OOOOODODCQ.terrainRendered = true; script.ODCDQOOOQC(); } if(script.displayRoad && script.objectType < 2){ if(script.objectType == 1){ SetWaterScript(script); } script.OOOOODODCQ.road.transform.parent = null; script.OOOOODODCQ.road.layer = 0; script.OOOOODODCQ.road.name = script.gameObject.name; } else if(script.OOOOODODCQ.road != null)DestroyImmediate(script.OOOOODODCQ.road); bool flag = false; for(int i=0;i arr = OCDQDCQOCQ.OQOODCQQCO(false); script.OCQOQOCQDC(script.transform, arr, OCDQDCQOCQ.OQQQOOOOOC(arr), OCDQDCQOCQ.OQODCCCCCD(arr)); } flag = true; } return flag; } static private void OQCOOCDODD(RoadObjectScript target){ EditorUtility.DisplayProgressBar("Build EasyRoads3D Object - " + target.gameObject.name,"Initializing", 0); RoadObjectScript[] scripts = (RoadObjectScript[])FindObjectsOfType(typeof(RoadObjectScript)); List rObj = new List(); #if UNITY_4_3 #else //Undo.RegisterUndo(OQCQQDCCCO.terrain.terrainData, "EasyRoads3D Terrain leveling"); #endif foreach(RoadObjectScript script in scripts) { if(script.transform != target.transform) rObj.Add(script.transform); } if(target.ODODQOQO == null){ target.ODODQOQO = target.OOOOODODCQ.OCDCOOOOQC(); target.ODODQOQOInt = target.OOOOODODCQ.OCQQCCDCDD(); } target.ODQCCQDQQC(0.5f, true, false); List hitOQCDQOCDOQ = target.OOOOODODCQ.OQDOODOOOQ(Vector3.zero, target.raise, target.obj, target.OOQDOOQQ, rObj, target.handleVegetation); List changeArr = new List(); float stepsf = Mathf.Floor(hitOQCDQOCDOQ.Count / 10); int steps = Mathf.RoundToInt(stepsf); for(int i = 0; i < 10;i++){ changeArr = target.OOOOODODCQ.OQCCOQCCCD(hitOQCDQOCDOQ, i * steps, steps, changeArr); EditorUtility.DisplayProgressBar("Build EasyRoads3D Object - " + target.gameObject.name,"Updating Terrain", i * 10); } changeArr = target.OOOOODODCQ.OQCCOQCCCD(hitOQCDQOCDOQ, 10 * steps, hitOQCDQOCDOQ.Count - (10 * steps), changeArr); target.OOOOODODCQ.OCQCDDCOOC(changeArr, rObj); target.ODCDQOOOQC(); EditorUtility.ClearProgressBar(); } private static void SetWaterScript(RoadObjectScript target){ for(int i = 0; i < target.OQDDDDCQOQ.Length; i++){ if(target.OOOOODODCQ.road.GetComponent(target.OQDDDDCQOQ[i]) != null && i != target.selectedWaterScript)DestroyImmediate(target.OOOOODODCQ.road.GetComponent(target.OQDDDDCQOQ[i])); } if(target.OQDDDDCQOQ[0] != "None Available!" && target.OOOOODODCQ.road.GetComponent(target.OQDDDDCQOQ[target.selectedWaterScript]) == null){ #if UNITY_5_0 //UnityEngineInternal.APIUpdaterRuntimeServices.AddComponent(target.OOOOODODCQ.road, "Assets/EasyRoads3D/Editor/EasyRoadsEditorMenu.cs (460,4)", target.OQDDDDCQOQ[target.selectedWaterScript]); #else //UnityEngineInternal.APIUpdaterRuntimeServices.AddComponent(target.OOOOODODCQ.road, "Assets/EasyRoads3D/Editor/EasyRoadsEditorMenu.cs (463,4)", target.OQDDDDCQOQ[target.selectedWaterScript]); #endif } } public static Vector3 ReadFile(string file) { Vector3 pos = Vector3.zero; if(File.Exists(file)){ StreamReader streamReader = File.OpenText(file); string line = streamReader.ReadLine(); line = line.Replace(",","."); string[] lines = line.Split("\n"[0]); string[] arr = lines[0].Split("|"[0]); float.TryParse(arr[0],System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out pos.x); float.TryParse(arr[1],System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out pos.y); float.TryParse(arr[2],System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out pos.z); } return pos; } }