public override void OnInspectorGUI() { //Get our resource m_manager = (GaiaSessionManager)target; //Set up the box style if (m_boxStyle == null) { m_boxStyle = new GUIStyle(GUI.skin.box); m_boxStyle.normal.textColor = GUI.skin.label.normal.textColor; m_boxStyle.fontStyle = FontStyle.Bold; m_boxStyle.alignment = TextAnchor.UpperLeft; } //Setup the wrap style if (m_wrapStyle == null) { m_wrapStyle = new GUIStyle(GUI.skin.label); m_wrapStyle.wordWrap = true; } //Set up the description wrap style if (m_descWrapStyle == null) { m_descWrapStyle = new GUIStyle(GUI.skin.textArea); m_descWrapStyle.wordWrap = true; } //Scroll m_scrollPosition = GUILayout.BeginScrollView(m_scrollPosition, false, false); //Create a nice text intro GUILayout.BeginVertical("Gaia Session Manager", m_boxStyle); GUILayout.Space(20); EditorGUILayout.LabelField("Track and control session creation and playback.", m_wrapStyle); GUILayout.Space(4); EditorGUILayout.BeginHorizontal(); m_manager.m_session = (GaiaSession)EditorGUILayout.ObjectField(GetLabel("Session"), m_manager.m_session, typeof(GaiaSession), false); if (GUILayout.Button(GetLabel("New"), GUILayout.Width(45))) { m_manager.CreateSession(); } EditorGUILayout.EndHorizontal(); GUILayout.EndVertical(); if (m_manager.m_session == null) { GUILayout.EndScrollView(); return; } //Track changes EditorGUI.BeginChangeCheck(); //Make some space GUILayout.Space(4); //Wrap it up in a box GUILayout.BeginVertical(m_boxStyle); GUILayout.BeginVertical("Summary:", m_boxStyle); GUILayout.Space(20); //Display the basic details EditorGUILayout.LabelField("Name"); if (m_manager.IsLocked()) { GUI.enabled = false; } string name = EditorGUILayout.TextArea(m_manager.m_session.m_name, m_descWrapStyle, GUILayout.MinHeight(15)); GUI.enabled = true; EditorGUILayout.LabelField("Description"); if (m_manager.IsLocked()) { GUI.enabled = false; } string description = EditorGUILayout.TextArea(m_manager.m_session.m_description, m_descWrapStyle, GUILayout.MinHeight(45)); Texture2D previewImage = m_manager.GetPreviewImage(); if (!m_manager.IsLocked()) { previewImage = (Texture2D)EditorGUILayout.ObjectField(GetLabel("Preview Image"), m_manager.m_session.m_previewImage, typeof(Texture2D), false, GUILayout.MaxHeight(15f)); } //Detect change in session and handle changes to preview image float width, height; if (m_manager.m_session.GetInstanceID() != m_lastSessionID) { m_lastPreviewImgName = ""; m_lastSessionID = m_manager.m_session.GetInstanceID(); if (m_manager.HasPreviewImage()) { previewImage = m_manager.GetPreviewImage(); m_lastPreviewImgName = previewImage.name; } } else //Process changes to preview image { if (previewImage == null) { if (m_manager.IsLocked()) //Undo change if locked { if (m_manager.HasPreviewImage()) { previewImage = m_manager.GetPreviewImage(); m_lastPreviewImgName = previewImage.name; Debug.LogWarning("You can not change the image on a locked session"); } } else { if (m_manager.HasPreviewImage()) { m_manager.RemovePreviewImage(); m_lastPreviewImgName = ""; } } } else { //Handle changes to preview image if (previewImage.name != m_lastPreviewImgName) { if (m_manager.IsLocked()) //Revert { if (m_manager.HasPreviewImage()) { previewImage = m_manager.GetPreviewImage(); m_lastPreviewImgName = previewImage.name; Debug.LogWarning("You can not change the image on a locked session"); } else { previewImage = null; m_lastPreviewImgName = ""; } } else { //Make it readable Gaia.Utils.MakeTextureReadable(previewImage); //Make a new texture from it Texture2D newTexture = new Texture2D(previewImage.width, previewImage.height, TextureFormat.ARGB32, false); newTexture.name = m_manager.m_session.m_name; newTexture.SetPixels(previewImage.GetPixels(0)); newTexture.Apply(); //Resize and scale it width = 320; height = previewImage.height * (width / previewImage.width); Gaia.ScaleTexture.Bilinear(newTexture, (int)width, (int)height); //Compress it //newTexture.Compress(true); //And store its content m_manager.AddPreviewImage(newTexture); //Assign back to the texture for the scene previewImage = newTexture; m_lastPreviewImgName = previewImage.name; } } } } GUI.enabled = true; //In response to locked above if (previewImage != null) { //Get aspect ratio and available space and display the image width = Screen.width - 43f; height = previewImage.height * (width / previewImage.width); GUILayout.Label(previewImage, GUILayout.MaxWidth(width), GUILayout.MaxHeight(height)); } EditorGUILayout.LabelField("Created", m_manager.m_session.m_dateCreated); EditorGUILayout.LabelField("Dimensions", string.Format("w{0} d{1} h{2}", m_manager.m_session.m_terrainWidth, m_manager.m_session.m_terrainDepth, m_manager.m_session.m_terrainHeight)); if (m_manager.IsLocked()) { GUI.enabled = false; } m_manager.m_session.m_seaLevel = EditorGUILayout.Slider(GetLabel("Sea Level"), m_manager.m_session.m_seaLevel, 0f, m_manager.m_session.m_terrainDepth); GUI.enabled = true; //In response to locked above bool locked = EditorGUILayout.Toggle(GetLabel("Locked"), m_manager.m_session.m_isLocked); GUILayout.EndVertical(); //Iterate through the operations GUILayout.BeginVertical("Operations:", m_boxStyle); GUILayout.Space(20); if (m_manager.m_session.m_operations.Count == 0) { GUILayout.Space(5); GUILayout.Label("No operations yet..."); GUILayout.Space(5); } else { GaiaOperation op; EditorGUI.indentLevel++; for (int opIdx = 0; opIdx < m_manager.m_session.m_operations.Count; opIdx++) { op = m_manager.m_session.m_operations[opIdx]; if (op.m_isActive) { op.m_isFoldedOut = EditorGUILayout.Foldout(op.m_isFoldedOut, op.m_description, true); } else { op.m_isFoldedOut = EditorGUILayout.Foldout(op.m_isFoldedOut, op.m_description + " [inactive]", true); } if (op.m_isFoldedOut) { EditorGUI.indentLevel++; EditorGUILayout.LabelField("Description", op.m_description, m_wrapStyle); EditorGUILayout.LabelField("Created", op.m_operationDateTime); if (m_manager.m_session.m_isLocked) { GUI.enabled = false; } op.m_isActive = EditorGUILayout.Toggle(GetLabel("Active"), op.m_isActive); GUI.enabled = true; int dataLength = 0; for (int idx = 0; idx < op.m_operationDataJson.GetLength(0); idx++) { dataLength += op.m_operationDataJson[idx].Length; } EditorGUILayout.LabelField("Data", dataLength.ToString() + " bytes"); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (m_manager.m_session.m_isLocked) { GUI.enabled = false; } if (GUILayout.Button(GetLabel("Delete"))) { if (EditorUtility.DisplayDialog("Delete Operation ?", "Are you sure you want to delete this operation ?", "Yes", "No")) { m_manager.RemoveOperation(opIdx); } } GUI.enabled = true; if (GUILayout.Button(GetLabel("Apply"))) { m_manager.Apply(opIdx); } if (GUILayout.Button(GetLabel("Play"))) { m_manager.PlayOperation(opIdx); } GUILayout.EndHorizontal(); EditorGUI.indentLevel--; } //EditorGUILayout.Space(); } EditorGUI.indentLevel--; } GUILayout.EndVertical(); //Create a nice text intro if (!m_manager.m_session.m_isLocked) { GUILayout.BeginVertical(m_boxStyle); m_manager.m_genShowRandomGenerator = EditorGUILayout.BeginToggleGroup(GetLabel(" Random Terrain Generator"), m_manager.m_genShowRandomGenerator); if (m_manager.m_genShowRandomGenerator) { m_manager.m_genNumStampsToGenerate = EditorGUILayout.IntSlider(GetLabel("Stamps"), m_manager.m_genNumStampsToGenerate, 1, 20); m_manager.m_genScaleWidth = EditorGUILayout.Slider(GetLabel("Width Scale"), m_manager.m_genScaleWidth, 0.5f, 100f); m_manager.m_genScaleHeight = EditorGUILayout.Slider(GetLabel("Height Scale"), m_manager.m_genScaleHeight, 0.5f, 100f); m_manager.m_genBorderStyle = (Gaia.GaiaConstants.GeneratorBorderStyle)EditorGUILayout.EnumPopup(GetLabel("Border Style"), m_manager.m_genBorderStyle); m_manager.m_genChanceOfHills = EditorGUILayout.Slider(GetLabel("Hill Chance"), m_manager.m_genChanceOfHills, 0f, 1f); m_manager.m_genChanceOfIslands = EditorGUILayout.Slider(GetLabel("Island Chance"), m_manager.m_genChanceOfIslands, 0f, 1f); m_manager.m_genChanceOfLakes = EditorGUILayout.Slider(GetLabel("Lake Chance"), m_manager.m_genChanceOfLakes, 0f, 1f); m_manager.m_genChanceOfMesas = EditorGUILayout.Slider(GetLabel("Mesa Chance"), m_manager.m_genChanceOfMesas, 0f, 1f); m_manager.m_genChanceOfMountains = EditorGUILayout.Slider(GetLabel("Mountain Chance"), m_manager.m_genChanceOfMountains, 0f, 1f); m_manager.m_genChanceOfPlains = EditorGUILayout.Slider(GetLabel("Plains Chance"), m_manager.m_genChanceOfPlains, 0f, 1f); m_manager.m_genChanceOfRivers = EditorGUILayout.Slider(GetLabel("River Chance"), m_manager.m_genChanceOfRivers, 0f, 1f); m_manager.m_genChanceOfValleys = EditorGUILayout.Slider(GetLabel("Valley Chance"), m_manager.m_genChanceOfValleys, 0f, 1f); m_manager.m_genChanceOfVillages = EditorGUILayout.Slider(GetLabel("Village Chance"), m_manager.m_genChanceOfVillages, 0f, 1f); m_manager.m_genChanceOfWaterfalls = EditorGUILayout.Slider(GetLabel("Waterfall Chance"), m_manager.m_genChanceOfWaterfalls, 0f, 1f); GUILayout.BeginHorizontal(); if (GUILayout.Button(GetLabel("Reset Session"))) { if (EditorUtility.DisplayDialog("Reset Session ?", "Are you sure you want to reset your session - this can not be undone ?", "Yes", "No")) { m_manager.ResetSession(); } } if (GUILayout.Button(GetLabel("Add Stamps"))) { m_manager.RandomiseStamps(); } GUILayout.EndHorizontal(); } EditorGUILayout.EndToggleGroup(); GUILayout.EndVertical(); } //Create a nice text intro GUILayout.BeginVertical(m_boxStyle); m_manager.m_genShowTerrainHelper = EditorGUILayout.BeginToggleGroup(GetLabel(" Terrain Helper"), m_manager.m_genShowTerrainHelper); if (m_manager.m_genShowTerrainHelper) { GUILayout.BeginHorizontal(); if (GUILayout.Button(GetLabel("Flatten Terrain"))) { if (EditorUtility.DisplayDialog("Flatten Terrain?", "Are you sure you want to flatten your terrain - this can not be undone ?", "Yes", "No")) { GaiaWorldManager wm = new GaiaWorldManager(Terrain.activeTerrains); wm.FlattenWorld(); } } if (GUILayout.Button(GetLabel("Smooth Terrain"))) { if (EditorUtility.DisplayDialog("Smooth Terrain?", "Are you sure you want to smooth your terrain - this can not be undone ?", "Yes", "No")) { GaiaWorldManager wm = new GaiaWorldManager(Terrain.activeTerrains); wm.SmoothWorld(); } } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button(GetLabel("Clear Trees"))) { if (EditorUtility.DisplayDialog("Clear Trees?", "Are you sure you want to clear your trees - this can not be undone ?", "Yes", "No")) { TerrainHelper.ClearTrees(); } } if (GUILayout.Button(GetLabel("Clear Details"))) { if (EditorUtility.DisplayDialog("Clear Details?", "Are you sure you want to clear your details / grass - this can not be undone ?", "Yes", "No")) { TerrainHelper.ClearDetails(); } } GUILayout.EndHorizontal(); } EditorGUILayout.EndToggleGroup(); GUILayout.EndVertical(); //Check for changes, make undo record, make changes and let editor know we are dirty if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(m_manager, "Made changes"); m_manager.m_session.m_name = name; m_manager.m_session.m_description = description; m_manager.m_session.m_isLocked = locked; m_manager.m_session.m_previewImage = previewImage; EditorUtility.SetDirty(m_manager.m_session); EditorUtility.SetDirty(m_manager); } GUILayout.BeginVertical("Session Controller", m_boxStyle); GUILayout.Space(20); GUILayout.BeginHorizontal(); if (m_manager.m_updateSessionCoroutine == null && m_manager.m_updateOperationCoroutine == null) { if (GUILayout.Button(GetLabel("Play Session"))) { if (EditorUtility.DisplayDialog("Playback Session ?", "Are you sure you want to playback your session - this can not be undone ?", "Yes", "No")) { m_manager.PlaySession(); } } if (GUILayout.Button(GetLabel("Export Resources"))) { m_manager.ExportSessionResources(); } } else { if (GUILayout.Button(GetLabel("Cancel"))) { m_manager.CancelPlayback(); } } GUILayout.EndHorizontal(); GUILayout.Space(5); //Debug.Log(m_manager.m_lastUpdateDateTime); //Draw the various spawner progress bars if (m_manager.m_currentStamper != null) { if (m_manager.m_currentStamper.IsStamping()) { ProgressBar(string.Format("{0}:{1} ({2:0.0}%)", m_manager.m_currentStamper.gameObject.name, m_manager.m_currentStamper.m_stampPreviewImage.name, m_manager.m_currentStamper.m_stampProgress * 100f), m_manager.m_currentStamper.m_stampProgress); } } if (m_manager.m_currentSpawner != null) { if (m_manager.m_currentSpawner.IsSpawning()) { ProgressBar(string.Format("{0} ({1:0.0}%)", m_manager.m_currentSpawner.gameObject.name, m_manager.m_currentSpawner.m_spawnProgress * 100f), m_manager.m_currentSpawner.m_spawnProgress); } } GUILayout.EndVertical(); GUILayout.EndVertical(); //End scroll GUILayout.EndScrollView(); }
private void DrawSummary(bool helpEnabled) { m_manager.m_session = (GaiaSession)m_editorUtils.ObjectField("SessionData", m_manager.m_session, typeof(GaiaSession), helpEnabled); m_editorUtils.InlineHelp("SessionData", helpEnabled); if (m_manager.m_session == null) { if (m_editorUtils.Button("CreateSessionButton")) { m_manager.CreateSession(); } } if (m_manager.m_session == null) { return; } EditorGUI.BeginChangeCheck(); m_manager.m_session.m_name = m_editorUtils.DelayedTextField("Name", m_manager.m_session.m_name, helpEnabled); if (EditorGUI.EndChangeCheck()) { //Get the old path string oldSessionDataPath = GaiaDirectories.GetSessionSubFolderPath(m_manager.m_session); //Rename the session asset AssetDatabase.RenameAsset(AssetDatabase.GetAssetPath(m_manager.m_session), m_manager.m_session.m_name + ".asset"); //rename the session data path as well string newSessionDataPath = GaiaDirectories.GetSessionSubFolderPath(m_manager.m_session, false); AssetDatabase.MoveAsset(oldSessionDataPath, newSessionDataPath); //if we have terrain scenes stored in the Terrain Loader, we need to update the paths in there as well foreach (TerrainScene terrainScene in TerrainLoaderManager.TerrainScenes) { terrainScene.m_scenePath = terrainScene.m_scenePath.Replace(oldSessionDataPath, newSessionDataPath); terrainScene.m_impostorScenePath = terrainScene.m_impostorScenePath.Replace(oldSessionDataPath, newSessionDataPath); terrainScene.m_backupScenePath = terrainScene.m_backupScenePath.Replace(oldSessionDataPath, newSessionDataPath); terrainScene.m_colliderScenePath = terrainScene.m_colliderScenePath.Replace(oldSessionDataPath, newSessionDataPath); } TerrainLoaderManager.Instance.SaveStorageData(); AssetDatabase.DeleteAsset(oldSessionDataPath); AssetDatabase.SaveAssets(); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(m_editorUtils.GetContent("Description"), GUILayout.MaxWidth(EditorGUIUtility.labelWidth)); m_manager.m_session.m_description = EditorGUILayout.TextArea(m_manager.m_session.m_description, GUILayout.MinHeight(100)); EditorGUILayout.EndHorizontal(); m_editorUtils.InlineHelp("Description", helpEnabled); m_manager.m_session.m_previewImage = (Texture2D)m_editorUtils.ObjectField("PreviewImage", m_manager.m_session.m_previewImage, typeof(Texture2D), helpEnabled); GUILayout.BeginHorizontal(); Rect rect = EditorGUILayout.GetControlRect(); GUILayout.Space(rect.width - 20); if (GUILayout.Button("Generate Image")) { string textureFileName = GaiaDirectories.GetSessionSubFolderPath(m_manager.m_session) + Path.DirectorySeparatorChar + m_manager.m_session + "_Preview"; var originalLODBias = QualitySettings.lodBias; QualitySettings.lodBias = 100; OrthographicBake.BakeTerrain(Terrain.activeTerrain, 2048, 2048, Camera.main.cullingMask, textureFileName); OrthographicBake.RemoveOrthoCam(); QualitySettings.lodBias = originalLODBias; textureFileName += ".png"; AssetDatabase.ImportAsset(textureFileName); var importer = AssetImporter.GetAtPath(textureFileName) as TextureImporter; if (importer != null) { importer.sRGBTexture = false; importer.alphaIsTransparency = false; importer.alphaSource = TextureImporterAlphaSource.None; importer.mipmapEnabled = false; } AssetDatabase.ImportAsset(textureFileName); m_manager.m_session.m_previewImage = (Texture2D)AssetDatabase.LoadAssetAtPath(textureFileName, typeof(Texture2D)); } GUILayout.EndHorizontal(); m_editorUtils.InlineHelp("PreviewImage", helpEnabled); m_editorUtils.LabelField("Created", new GUIContent(m_manager.m_session.m_dateCreated), helpEnabled); m_manager.m_session.m_isLocked = m_editorUtils.Toggle("Locked", m_manager.m_session.m_isLocked, helpEnabled); float maxSeaLevel = 2000f; if (Terrain.activeTerrain != null) { maxSeaLevel = Terrain.activeTerrain.terrainData.size.y + Terrain.activeTerrain.transform.position.y; } else { maxSeaLevel = m_manager.GetSeaLevel(false) + 500f; } float oldSeaLevel = m_manager.GetSeaLevel(false); float newSeaLEvel = oldSeaLevel; newSeaLEvel = m_editorUtils.Slider("SeaLevel", newSeaLEvel, 0, maxSeaLevel, helpEnabled); if (newSeaLEvel != oldSeaLevel) { //Do we have a water instance? If yes, update it & it will update the sea level in the session as well if (PWS_WaterSystem.Instance != null) { PWS_WaterSystem.Instance.SeaLevel = newSeaLEvel; } else { //no water instance yet, just update the sea level in the session m_manager.SetSeaLevel(newSeaLEvel, false); SceneView.RepaintAll(); } } m_manager.m_session.m_spawnDensity = m_editorUtils.FloatField("SpawnDensity", Mathf.Max(0.01f, m_manager.m_session.m_spawnDensity), helpEnabled); GUILayout.BeginHorizontal(); if (m_editorUtils.Button("DeleteAllOperations")) { if (EditorUtility.DisplayDialog(m_editorUtils.GetTextValue("PopupDeleteAllTitle"), m_editorUtils.GetTextValue("PopupDeleteAllMessage"), m_editorUtils.GetTextValue("Continue"), m_editorUtils.GetTextValue("Cancel"))) { foreach (GaiaOperation op in m_manager.m_session.m_operations) { try { if (!String.IsNullOrEmpty(op.scriptableObjectAssetGUID)) { AssetDatabase.DeleteAsset(AssetDatabase.GUIDToAssetPath(op.scriptableObjectAssetGUID)); } } catch (Exception ex) { Debug.LogError("Error while deleting one of the operation data files: " + ex.Message + " Stack Trace:" + ex.StackTrace); } } m_manager.m_session.m_operations.Clear(); } } if (m_editorUtils.Button("PlaySession")) { GaiaLighting.SetDefaultAmbientLight(GaiaUtils.GetGaiaSettings().m_gaiaLightingProfile); GaiaSessionManager.PlaySession(); } GUILayout.EndHorizontal(); }