示例#1
0
    void DoAddPersistentStorage(VegetationSystem _vegetationSystem)
    {
        _vegetationSystem.AutomaticWakeup = true;
        // NB seems redundant to recurse into parent object - but this is needed to get the terrain name
        GameObject parentTerrainGo = _vegetationSystem.gameObject.transform.parent.gameObject;
        PersistentVegetationStorage _persistentVegetationStorage = parentTerrainGo.GetComponentInChildren <PersistentVegetationStorage>();

        PersistentVegetationStoragePackage newPersistentVegetationStoragePackage = ScriptableObject.CreateInstance <PersistentVegetationStoragePackage>();

        AssetDatabase.CreateAsset(newPersistentVegetationStoragePackage, _assetsPath + "/" + parentTerrainGo.name + _DEFAULT_SUFFIX + ".asset");
        _persistentVegetationStorage.PersistentVegetationStoragePackage = newPersistentVegetationStoragePackage;

        // initialize
        _persistentVegetationStorage.InitializePersistentStorage();

        if (_debugToLog)
        {
            Debug.Log("Added storage asset for " + parentTerrainGo.name);
        }

        if (_autoBake)
        {
            if (_debugToLog)
            {
                Debug.Log("Auto Baking " + parentTerrainGo.name);
            }
            //if (_vegetationSystem.GetSleepMode())
            //{
            _vegetationSystem.SetSleepMode(false);     // wake up VegetationSystem, needed for prefab
            //}
            // now bake
            List <string> vegetationItemIdList =
                VegetationPackageEditorTools.CreateVegetationInfoIdList(_persistentVegetationStorage.VegetationSystem.CurrentVegetationPackage);


            for (int i = 0; i <= vegetationItemIdList.Count - 1; i++)
            {
                _persistentVegetationStorage.BakeVegetationItem(vegetationItemIdList[i]);
            }
            _persistentVegetationStorage.VegetationSystem.DelayedClearVegetationCellCache();
            EditorUtility.SetDirty(_persistentVegetationStorage.PersistentVegetationStoragePackage);
            EditorUtility.SetDirty(_persistentVegetationStorage.VegetationSystem.CurrentVegetationPackage);
            if (_debugToLog)
            {
                Debug.Log("Finished Baking for " + parentTerrainGo.name);
            }
        }
    }
        public override void OnInspectorGUI()
        {
            _vegetationPackagePro = (VegetationPackagePro)target;

            base.OnInspectorGUI();
            //EditorUtility.SetDirty(target);
            for (int i = 0; i <= _vegetationPackagePro.VegetationInfoList.Count - 1; i++)
            {
                bool changed = false;
                VegetationItemInfoPro vegetationItemInfo = _vegetationPackagePro.VegetationInfoList[i];
                if (vegetationItemInfo.VegetationItemID == "")
                {
                    vegetationItemInfo.VegetationItemID = System.Guid.NewGuid().ToString();
                    changed = true;
                }

                if (changed)
                {
                    EditorUtility.SetDirty(_vegetationPackagePro);
                }
            }


            GUILayout.BeginVertical("box");
            EditorGUILayout.HelpBox(
                "To edit an vegetation package add it to a vegetation system pro component",
                MessageType.Info);
            GUILayout.EndVertical();

            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Biome", LabelStyle);
            EditorGUI.BeginDisabledGroup(true);
            _vegetationPackagePro.BiomeType =
                (BiomeType)EditorGUILayout.EnumPopup("Select biome", _vegetationPackagePro.BiomeType);
            EditorGUI.EndDisabledGroup();
            GUILayout.EndVertical();


            if (_vegetationPackagePro.VegetationInfoList.Count > 0)
            {
                List <string> vegetationItemIdList =
                    VegetationPackageEditorTools.CreateVegetationInfoIdList(_vegetationPackagePro);
                VegetationPackageEditorTools.DrawVegetationItemSelector(_vegetationPackagePro, vegetationItemIdList, 60,
                                                                        ref _selectedVegetationItem);

                VegetationItemInfoPro vegetationItemInfoPro =
                    _vegetationPackagePro.GetVegetationInfo(_selectedVegetationItem);

                GUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("VegetationItemID", LabelStyle);
                EditorGUILayout.SelectableLabel(vegetationItemInfoPro.VegetationItemID);
                GUILayout.EndHorizontal();
            }
            else
            {
                GUILayout.BeginVertical("box");
                EditorGUILayout.HelpBox(
                    "Vegetation package has no vegetation items configured",
                    MessageType.Info);
                GUILayout.EndVertical();
            }



            if (_vegetationPackagePro.TerrainTextureCount > 0)
            {
                EditorGUILayout.LabelField("Terrain textures", LabelStyle);
                GUIContent[] textureImageButtons = new GUIContent[_vegetationPackagePro.TerrainTextureList.Count];
                for (int i = 0; i <= _vegetationPackagePro.TerrainTextureList.Count - 1; i++)
                {
                    var       textureItemTexture = AssetPreview.GetAssetPreview(_vegetationPackagePro.TerrainTextureList[i].Texture);
                    Texture2D convertedTexture   = new Texture2D(2, 2, TextureFormat.ARGB32, true, true);
                    if (textureItemTexture)
                    {
                        convertedTexture.LoadImage(textureItemTexture.EncodeToPNG());
                    }

                    textureImageButtons[i] = new GUIContent {
                        image = convertedTexture
                    };
                }
                int imageWidth = 60;
                int columns    = Mathf.FloorToInt((EditorGUIUtility.currentViewWidth - imageWidth / 2f) / imageWidth);
                int rows       = Mathf.CeilToInt((float)textureImageButtons.Length / columns);
                int gridHeight = (rows) * imageWidth;
                _currentTextureItem = GUILayout.SelectionGrid(_currentTextureItem, textureImageButtons, columns, GUILayout.MaxWidth(columns * imageWidth), GUILayout.MaxHeight(gridHeight));

                GUIStyle variantStyle = new GUIStyle(EditorStyles.helpBox);

                GUILayout.BeginVertical("box");
                EditorGUILayout.LabelField("Terrain layer: " + (_currentTextureItem + 1).ToString(), LabelStyle);
                EditorGUI.BeginDisabledGroup(true);
                _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].Enabled = EditorGUILayout.Toggle("Enable", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].Enabled);

                EditorGUILayout.BeginHorizontal(variantStyle);
                EditorGUILayout.LabelField("Texture " + (_currentTextureItem + 1).ToString() + " Height", LabelStyle, GUILayout.Width(150));
                _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureHeightCurve = EditorGUILayout.CurveField(_vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureHeightCurve, Color.green, new Rect(0, 0, 1, 1), GUILayout.Height(75));
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal(variantStyle);
                EditorGUILayout.LabelField("Texture " + (_currentTextureItem + 1).ToString() + " Steepness", LabelStyle, GUILayout.Width(150));
                _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureSteepnessCurve = EditorGUILayout.CurveField(_vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureSteepnessCurve, Color.green, new Rect(0, 0, 1, 1), GUILayout.Height(75));
                EditorGUILayout.EndHorizontal();

                _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].UseNoise = EditorGUILayout.Toggle("Use perlin noise", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].UseNoise);

                if (_vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].UseNoise)
                {
                    _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].InverseNoise = EditorGUILayout.Toggle("Inverse noise", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].InverseNoise);
                    _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseScale   = EditorGUILayout.Slider("Noise scale", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseScale, 1, 50f);
                    _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseOffset  = EditorGUILayout.Vector2Field("Noise offset", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseOffset);
                }
                _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureWeight = EditorGUILayout.Slider("Texture weight", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureWeight, 0, 5f);

                EditorGUI.EndDisabledGroup();
                GUILayout.EndVertical();
            }
            else
            {
                GUILayout.BeginVertical("box");
                EditorGUILayout.HelpBox(
                    "Vegetation package has no textures configured",
                    MessageType.Info);
                GUILayout.EndVertical();
            }
        }
        private void DrawSettingsInspector()
        {
            VegetationSystemPro vegetationSystemPro = _runtimePrefabSpawner.VegetationSystemPro;

            if (vegetationSystemPro.VegetationPackageProList.Count == 0)
            {
                EditorGUILayout.HelpBox(
                    "There is no vegetation package/biome in the vegetation system",
                    MessageType.Warning);
                return;
            }



            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Select biome/vegetation package", LabelStyle);
            string[] packageNameList = new string[vegetationSystemPro.VegetationPackageProList.Count];
            for (int i = 0; i <= vegetationSystemPro.VegetationPackageProList.Count - 1; i++)
            {
                if (vegetationSystemPro.VegetationPackageProList[i])
                {
                    packageNameList[i] = (i + 1).ToString() + " " +
                                         vegetationSystemPro.VegetationPackageProList[i].PackageName;
                }
                else
                {
                    packageNameList[i] = "Not found";
                }
            }

            EditorGUI.BeginChangeCheck();
            _runtimePrefabSpawner.VegetationPackageIndex = EditorGUILayout.Popup("Selected vegetation package",
                                                                                 _runtimePrefabSpawner.VegetationPackageIndex, packageNameList);
            if (EditorGUI.EndChangeCheck())
            {
                SetSceneDirty();
            }

            GUILayout.EndVertical();

            VegetationPackagePro vegetationPackagePro =
                vegetationSystemPro.VegetationPackageProList[_runtimePrefabSpawner.VegetationPackageIndex];

            if (vegetationPackagePro == null)
            {
                return;
            }
            if (vegetationPackagePro.VegetationInfoList.Count == 0)
            {
                return;
            }


            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Select Vegetation Item", LabelStyle);

            EditorGUI.BeginChangeCheck();
            _selectedVegetationTypeIndex = GUILayout.SelectionGrid(_selectedVegetationTypeIndex, VegetationTypeNames, 3,
                                                                   EditorStyles.toolbarButton);
            if (EditorGUI.EndChangeCheck())
            {
                _selectedGridIndex = 0;
            }

            VegetationPackageEditorTools.VegetationItemTypeSelection vegetationItemTypeSelection =
                VegetationPackageEditorTools.GetVegetationItemTypeSelection(_selectedVegetationTypeIndex);

            int selectionCount = 0;

            VegetationPackageEditorTools.DrawVegetationItemSelector(vegetationSystemPro, vegetationPackagePro,
                                                                    ref _selectedGridIndex, ref _vegIndex, ref selectionCount, vegetationItemTypeSelection, 70);

            if (_lastVegIndex != _vegIndex)
            {
                GUI.FocusControl(null);
            }
            _lastVegIndex = _vegIndex;

            GUILayout.EndVertical();

            VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[_vegIndex];

            if (vegetationItemInfoPro == null)
            {
                return;
            }

            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Selected item", vegetationItemInfoPro.Name);


            if (GUILayout.Button("Add run-time prefab rule"))
            {
                RuntimePrefabRule newRuntimePrefabRule = new RuntimePrefabRule();
                newRuntimePrefabRule.SetSeed();

                vegetationItemInfoPro.RuntimePrefabRuleList.Add(newRuntimePrefabRule);
                _runtimePrefabSpawner.RefreshRuntimePrefabs();
                EditorUtility.SetDirty(vegetationPackagePro);
                SetSceneDirty();
            }
            GUILayout.EndVertical();

            for (int i = 0; i <= vegetationItemInfoPro.RuntimePrefabRuleList.Count - 1; i++)
            {
                RuntimePrefabRule runtimePrefabRule = vegetationItemInfoPro.RuntimePrefabRuleList[i];
                EditorGUI.BeginChangeCheck();
                GUILayout.BeginVertical("box");

                runtimePrefabRule.RuntimePrefab = EditorGUILayout.ObjectField("Runtime prefab", runtimePrefabRule.RuntimePrefab, typeof(GameObject), true) as GameObject;

                var       prefabTexture          = AssetPreview.GetAssetPreview(runtimePrefabRule.RuntimePrefab);
                Texture2D convertedPrefabTexture = new Texture2D(2, 2, TextureFormat.ARGB32, true, true);
                if (Application.isPlaying)
                {
                    convertedPrefabTexture = prefabTexture;
                }
                else
                {
                    if (prefabTexture)
                    {
                        convertedPrefabTexture.LoadImage(prefabTexture.EncodeToPNG());
                    }
                }

                if (convertedPrefabTexture)
                {
                    Rect  space = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Height(convertedPrefabTexture.height));
                    float width = space.width;

                    space.xMin = (width - convertedPrefabTexture.width);
                    if (space.xMin < 0)
                    {
                        space.xMin = 0;
                    }

                    space.width  = convertedPrefabTexture.width;
                    space.height = convertedPrefabTexture.height;
                    EditorGUI.DrawPreviewTexture(space, convertedPrefabTexture);
                }
                runtimePrefabRule.SpawnFrequency         = EditorGUILayout.Slider("Spawn frequency", runtimePrefabRule.SpawnFrequency, 0, 1f);
                runtimePrefabRule.PrefabScale            = EditorGUILayout.Vector3Field("Scale", runtimePrefabRule.PrefabScale);
                runtimePrefabRule.UseVegetationItemScale = EditorGUILayout.Toggle("Add vegetation item scale", runtimePrefabRule.UseVegetationItemScale);
                runtimePrefabRule.PrefabRotation         = EditorGUILayout.Vector3Field("Rotation", runtimePrefabRule.PrefabRotation);
                runtimePrefabRule.PrefabOffset           = EditorGUILayout.Vector3Field("Offset", runtimePrefabRule.PrefabOffset);
                runtimePrefabRule.PrefabLayer            = EditorGUILayout.LayerField("Prefab layer", runtimePrefabRule.PrefabLayer);
                runtimePrefabRule.Seed    = EditorGUILayout.IntSlider("Seed", runtimePrefabRule.Seed, 0, 99);
                runtimePrefabRule.UsePool = EditorGUILayout.Toggle("Use pooling system", runtimePrefabRule.UsePool);

                runtimePrefabRule.DistanceFactor = EditorGUILayout.Slider("Distance factor", runtimePrefabRule.DistanceFactor, 0, 1f);
                float currentDistance = vegetationSystemPro.VegetationSettings.GetVegetationDistance() * runtimePrefabRule.DistanceFactor;
                EditorGUILayout.LabelField("Current distance: " + currentDistance.ToString("F2") + " meters", LabelStyle);

                EditorGUILayout.HelpBox(
                    "The distance from the camera where prefabs are instantiated. Distance is a factor of the current vegetation item draw distance.",
                    MessageType.Info);

                if (EditorGUI.EndChangeCheck())
                {
                    EditorUtility.SetDirty(vegetationPackagePro);
                    _runtimePrefabSpawner.RefreshRuntimePrefabs();
                    SetSceneDirty();
                }

                if (GUILayout.Button("Remove run-time prefab rule"))
                {
                    vegetationItemInfoPro.RuntimePrefabRuleList.Remove(runtimePrefabRule);
                    _runtimePrefabSpawner.RefreshRuntimePrefabs();
                    GUILayout.EndVertical();
                    return;
                }

                GUILayout.EndVertical();
            }
        }
示例#4
0
        private void DrawEditBiomeSplatmapsInspector()
        {
            VegetationSystemPro vegetationSystemPro = _terrainSystemPro.VegetationSystemPro;

            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Select biome/vegetation package", LabelStyle);

            if (vegetationSystemPro.VegetationPackageProList.Count == 0)
            {
                EditorGUILayout.HelpBox("You need to add a biome/vegetation package in order to edit splatmap rules.", MessageType.Warning);
                GUILayout.EndVertical();
                return;
            }



            string[] packageNameList = new string[vegetationSystemPro.VegetationPackageProList.Count];
            for (int i = 0; i <= vegetationSystemPro.VegetationPackageProList.Count - 1; i++)
            {
                if (vegetationSystemPro.VegetationPackageProList[i])
                {
                    packageNameList[i] = (i + 1).ToString() + " " +
                                         vegetationSystemPro.VegetationPackageProList[i].PackageName;
                }
                else
                {
                    packageNameList[i] = "Not found";
                }
            }

            EditorGUI.BeginChangeCheck();
            _terrainSystemPro.VegetationPackageIndex = EditorGUILayout.Popup("Selected vegetation package",
                                                                             _terrainSystemPro.VegetationPackageIndex, packageNameList);
            if (EditorGUI.EndChangeCheck())
            {
            }

            EditorGUILayout.HelpBox(
                "Select the biome to edit. Press the Generate Splatmap button to apply settings to the terrains. Only unity terrains are affected by this.",
                MessageType.Info);
            GUILayout.EndVertical();

            GUILayout.BeginVertical("box");
            if (GUILayout.Button("Generate biome splatmaps"))
            {
                _terrainSystemPro.GenerateSplatMap(false);
                _terrainSystemPro.ShowTerrainHeatmap(false);
                SetAllVegetationPackagesDirty();
                SetSceneDirty();
            }
            EditorGUILayout.HelpBox(
                "You can lock textures. These will not be not be removed when generating the splat.",
                MessageType.Info);

            if (GUILayout.Button("Generate biome splatmaps - clear locked textures"))
            {
                _terrainSystemPro.GenerateSplatMap(true);
                _terrainSystemPro.ShowTerrainHeatmap(false);
                SetAllVegetationPackagesDirty();
                SetSceneDirty();
            }

            GUILayout.EndVertical();

            GUILayout.BeginVertical("box");

            EditorGUI.BeginChangeCheck();
            _terrainSystemPro.VegetationSystemPro.ShowHeatMap = EditorGUILayout.Toggle("Show heatmap", _terrainSystemPro.VegetationSystemPro.ShowHeatMap);
            if (EditorGUI.EndChangeCheck())
            {
                _terrainSystemPro.ShowTerrainHeatmap(_terrainSystemPro.VegetationSystemPro.ShowHeatMap);
                SceneView.RepaintAll();
            }

            EditorGUILayout.HelpBox(
                "Enable to show the terrain distribution for the selected texture. Noise is an estimate and will not be the same as when generated.",
                MessageType.Info);
            GUILayout.EndVertical();

            VegetationPackagePro vegetationPackagePro =
                _terrainSystemPro.VegetationSystemPro.VegetationPackageProList[
                    _terrainSystemPro.VegetationPackageIndex];

            GUILayout.BeginVertical("box");
            EditorGUILayout.HelpBox("Automatic terrain texture distribution is done based on the curve settings for height over water level and steepness(angle) of the terrain", MessageType.Info);
            GUILayout.EndVertical();

            GUILayout.BeginVertical("box");
            _terrainSystemPro.VegetationSystemPro.ShowTerrainTextures = EditorGUILayout.Toggle("Show terrain textures", _terrainSystemPro.VegetationSystemPro.ShowTerrainTextures);
            EditorGUILayout.HelpBox("The textures on the first terrain, not in the package will show in the list below. These are the actual textures used.", MessageType.Info);
            GUILayout.EndVertical();
            //GUILayout.BeginVertical("box");
            //EditorGUILayout.LabelField("Terrain height", LabelStyle);

            //_terrainSystem.GetVegetationPackage().AutomaticMaxCurveHeight =
            //    EditorGUILayout.Toggle("Use max height in terrain", _terrainSystem.GetVegetationPackage().AutomaticMaxCurveHeight);

            //if (!_terrainSystem.GetVegetationPackage().AutomaticMaxCurveHeight)
            //{
            //    _terrainSystem.GetVegetationPackage().MaxCurveHeight = EditorGUILayout.FloatField("Max curve height", _terrainSystem.GetVegetationPackage().MaxCurveHeight);
            //    EditorGUILayout.LabelField("Max possible terrain height: " + _terrainSystem.VegetationSystem.UnityTerrainData.size.y.ToString(CultureInfo.InvariantCulture) + " meters", LabelStyle);

            //    if (GUILayout.Button("Calculate max height in terrain."))
            //    {
            //        _terrainSystem.GetVegetationPackage().MaxCurveHeight = _terrainSystem.VegetationSystem.UnityTerrainData.MaxTerrainHeight;
            //        EditorUtility.SetDirty(_terrainSystem.GetVegetationPackage());
            //    }

            //    if (_terrainSystem.GetVegetationPackage().MaxCurveHeight < 1)
            //    {
            //        EditorGUILayout.HelpBox("You need to set or calculate terrain max height in order to set the max height value for the curves.", MessageType.Error);
            //    }
            //}
            //EditorGUILayout.HelpBox("Max curve height sets the height at max curve value. For easiest control of the curves it should be set to just above max height in current terrain.", MessageType.Info);
            //GUILayout.EndVertical();

            if (vegetationPackagePro.TerrainTextureCount > 0)
            {
                if (_terrainSystemPro.VegetationPackageTextureIndex > vegetationPackagePro.TerrainTextureCount)
                {
                    _terrainSystemPro.VegetationPackageTextureIndex = 0;
                }
                EditorGUI.BeginChangeCheck();

                GUILayout.BeginVertical("box");
                EditorGUILayout.LabelField("Select terrain texture", LabelStyle);
                GUIContent[] textureImageButtons = new GUIContent[vegetationPackagePro.TerrainTextureSettingsList.Count];

                for (int i = 0; i <= vegetationPackagePro.TerrainTextureSettingsList.Count - 1; i++)
                {
                    if (_terrainSystemPro.VegetationSystemPro.ShowTerrainTextures)
                    {
                        textureImageButtons[i] = new GUIContent
                        {
                            image = AssetPreviewCache.GetAssetPreview(_terrainSystemPro.GetTerrainTexture(i))
                        };
                    }
                    else
                    {
                        textureImageButtons[i] = new GUIContent
                        {
                            image = AssetPreviewCache.GetAssetPreview(vegetationPackagePro.TerrainTextureList[i].Texture)
                        };
                    }
                }

                int imageWidth = 80;
                int columns    = Mathf.FloorToInt((EditorGUIUtility.currentViewWidth - 50) / imageWidth);
                int rows       = Mathf.CeilToInt((float)textureImageButtons.Length / columns);
                int gridHeight = (rows) * imageWidth;

                _terrainSystemPro.VegetationPackageTextureIndex = GUILayout.SelectionGrid(_terrainSystemPro.VegetationPackageTextureIndex, textureImageButtons, columns, GUILayout.MaxWidth(columns * imageWidth), GUILayout.MaxHeight(gridHeight));
                GUILayout.EndVertical();

                if (EditorGUI.EndChangeCheck())
                {
                    _terrainSystemPro.UpdateTerrainHeatmap();
                }

                //if (_terrainSystem.VegetationSystem)
                //{
                //    GUILayout.BeginVertical("box");
                //    EditorGUILayout.LabelField("Visualize height/steepness in terrain", LabelStyle);
                //    EditorGUI.BeginChangeCheck();
                //    bool overrideMaterial = EditorGUILayout.Toggle("Show heatmap", _terrainSystem.VegetationSystem.TerrainMaterialOverridden);
                //    EditorGUILayout.HelpBox("Enabling heatmap will show the spawn area of the selected texture based on the current height and steepness curves.", MessageType.Info);

                //    if (EditorGUI.EndChangeCheck())
                //    {
                //        if (overrideMaterial)
                //        {
                //            _terrainSystem.UpdateHeatmapMaterial(_currentTextureItem);
                //            _terrainSystem.VegetationSystem.OverrideTerrainMaterial(_terrainSystem.TerrainHeatMapMaterial);
                //            EditorUtility.SetDirty(_terrainSystem.VegetationSystem);
                //        }
                //        else
                //        {
                //            _terrainSystem.VegetationSystem.RestoreTerrainMaterial();
                //        }
                //    }
                //    GUILayout.EndVertical();

                //    _terrainSystem.UpdateHeatmapMaterial(_currentTextureItem);
                //}

                GUILayout.BeginVertical("box");

                TerrainTextureSettings terrainTextureSettings =
                    vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex];

                EditorGUI.BeginChangeCheck();
                vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].Enabled = EditorGUILayout.Toggle("Use with auto splat generation", vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].Enabled);

                EditorGUI.BeginDisabledGroup(
                    vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].Enabled);

                vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].LockTexture = EditorGUILayout.Toggle("Lock texture", vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].LockTexture);
                EditorGUI.EndDisabledGroup();

                EditorGUILayout.HelpBox("Locked textures are kept while generating splatmaps", MessageType.Info);

                _terrainSystemPro.ShowCurvesMenu =
                    VegetationPackageEditorTools.DrawHeader("Height/Steepness rules", _terrainSystemPro.ShowCurvesMenu);
                if (_terrainSystemPro.ShowCurvesMenu)
                {
                    EditorGUILayout.LabelField("Texture " + (_terrainSystemPro.VegetationPackageTextureIndex + 1).ToString() + " Height", LabelStyle, GUILayout.Width(150));
                    float height = vegetationSystemPro.VegetationSystemBounds.size.y - vegetationSystemPro.SeaLevel;

                    _heightCurveEditor.MaxValue = height;

                    if (_heightCurveEditor.EditCurve(vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].TextureHeightCurve, this))
                    {
                        _terrainSystemPro.UpdateTerrainHeatmap();
                        EditorUtility.SetDirty(vegetationPackagePro);
                    }
                    EditorGUILayout.LabelField("Texture " + (_terrainSystemPro.VegetationPackageTextureIndex + 1).ToString() + " Steepness", LabelStyle, GUILayout.Width(150));


                    if (_steepnessCurveEditor.EditCurve(vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].TextureSteepnessCurve, this))
                    {
                        _terrainSystemPro.UpdateTerrainHeatmap();
                        EditorUtility.SetDirty(vegetationPackagePro);
                    }
                }
                ;

                _terrainSystemPro.ShowNoiseMenu =
                    VegetationPackageEditorTools.DrawHeader("Noise/Concave/convex rules", _terrainSystemPro.ShowNoiseMenu);
                if (_terrainSystemPro.ShowNoiseMenu)
                {
                    vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                    .UseNoise = EditorGUILayout.Toggle("Use perlin noise",
                                                       vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                                                       .UseNoise);
                    if (vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                        .UseNoise)
                    {
                        vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                        .InverseNoise = EditorGUILayout.Toggle("Inverse noise",
                                                               vegetationPackagePro
                                                               .TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                                                               .InverseNoise);
                        vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                        .NoiseScale = EditorGUILayout.Slider("Noise scale",
                                                             vegetationPackagePro
                                                             .TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].NoiseScale,
                                                             1, 200f);
                        vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                        .NoiseOffset = EditorGUILayout.Vector2Field("Noise offset",
                                                                    vegetationPackagePro
                                                                    .TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                                                                    .NoiseOffset);
                    }

                    vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                    .TextureWeight = EditorGUILayout.Slider("Texture weight",
                                                            vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]
                                                            .TextureWeight, 0, 5f);

                    terrainTextureSettings.ConcaveEnable =
                        EditorGUILayout.Toggle("Use concave rules", terrainTextureSettings.ConcaveEnable);
                    terrainTextureSettings.ConvexEnable =
                        EditorGUILayout.Toggle("Use convex rules", terrainTextureSettings.ConvexEnable);

                    if (terrainTextureSettings.ConcaveEnable || terrainTextureSettings.ConvexEnable)
                    {
                        terrainTextureSettings.ConcaveMode =
                            (ConcaveMode)EditorGUILayout.EnumPopup("Blend mode", terrainTextureSettings.ConcaveMode);
                        EditorGUILayout.HelpBox(
                            "Additive will add convex/concave areas in additon to areas selected by heigh/streepness. Blend will show areas that have all characteristics.",
                            MessageType.Info);
                        terrainTextureSettings.ConcaveAverage =
                            EditorGUILayout.Toggle("Average samples", terrainTextureSettings.ConcaveAverage);
                        terrainTextureSettings.ConcaveMinHeightDifference = EditorGUILayout.Slider(
                            "Min height difference", terrainTextureSettings.ConcaveMinHeightDifference, 0.1f, 10f);
                        terrainTextureSettings.ConcaveDistance = EditorGUILayout.Slider("Distance",
                                                                                        terrainTextureSettings.ConcaveDistance, 0f, 20f);
                    }
                }

                if (EditorGUI.EndChangeCheck())
                {
                    _terrainSystemPro.UpdateTerrainHeatmap();
                    EditorUtility.SetDirty(vegetationPackagePro);
                }
                GUILayout.EndVertical();
            }
            else
            {
                GUILayout.BeginVertical("box");
                EditorGUILayout.HelpBox(
                    "Vegetation package has no textures",
                    MessageType.Warning);
                GUILayout.EndVertical();
            }
        }
示例#5
0
        public override void OnInspectorGUI()
        {
            HelpTopic             = "scene-vegetation-baker";
            _sceneVegetationBaker = (SceneVegetationBaker)target;

            ShowLogo = false;

            base.OnInspectorGUI();

            if (!_sceneVegetationBaker.VegetationSystemPro)
            {
                EditorGUILayout.HelpBox(
                    "The SceneVegetationBaker Component needs to be added to a GameObject with a VegetationSystemPro Component.",
                    MessageType.Error);
                return;
            }


            VegetationSystemPro vegetationSystemPro = _sceneVegetationBaker.VegetationSystemPro;

            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Select biome/vegetation package", LabelStyle);
            string[] packageNameList = new string[vegetationSystemPro.VegetationPackageProList.Count];
            for (int i = 0; i <= vegetationSystemPro.VegetationPackageProList.Count - 1; i++)
            {
                if (vegetationSystemPro.VegetationPackageProList[i])
                {
                    packageNameList[i] = (i + 1).ToString() + " " +
                                         vegetationSystemPro.VegetationPackageProList[i].PackageName + " (" + vegetationSystemPro.VegetationPackageProList[i].BiomeType.ToString() + ")";;
                }
                else
                {
                    packageNameList[i] = "Not found";
                }
            }

            EditorGUI.BeginChangeCheck();
            _sceneVegetationBaker.VegetationPackageIndex = EditorGUILayout.Popup("Selected vegetation package",
                                                                                 _sceneVegetationBaker.VegetationPackageIndex, packageNameList);
            if (EditorGUI.EndChangeCheck())
            {
                SetSceneDirty();
            }

            GUILayout.EndVertical();

            VegetationPackagePro vegetationPackagePro =
                vegetationSystemPro.VegetationPackageProList[_sceneVegetationBaker.VegetationPackageIndex];

            if (vegetationPackagePro == null)
            {
                return;
            }
            if (vegetationPackagePro.VegetationInfoList.Count == 0)
            {
                return;
            }


            GUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Select Vegetation Item", LabelStyle);

            EditorGUI.BeginChangeCheck();
            _selectedVegetationTypeIndex = GUILayout.SelectionGrid(_selectedVegetationTypeIndex, VegetationTypeNames, 3,
                                                                   EditorStyles.toolbarButton);
            if (EditorGUI.EndChangeCheck())
            {
                _selectedGridIndex = 0;
            }

            VegetationPackageEditorTools.VegetationItemTypeSelection vegetationItemTypeSelection =
                VegetationPackageEditorTools.GetVegetationItemTypeSelection(_selectedVegetationTypeIndex);

            int selectionCount = 0;

            VegetationPackageEditorTools.DrawVegetationItemSelector(vegetationSystemPro, vegetationPackagePro,
                                                                    ref _selectedGridIndex, ref _vegIndex, ref selectionCount, vegetationItemTypeSelection, 70);

            if (_lastVegIndex != _vegIndex)
            {
                GUI.FocusControl(null);
            }
            _lastVegIndex = _vegIndex;

            GUILayout.EndVertical();

            VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[_vegIndex];

            if (vegetationItemInfoPro == null)
            {
                return;
            }

            GUILayout.BeginVertical("box");
            _sceneVegetationBaker.ExportStatic = EditorGUILayout.Toggle("Export as static objects", _sceneVegetationBaker.ExportStatic);
            GUILayout.EndVertical();

            GUILayout.BeginVertical("box");

            if (GUILayout.Button("Bake VegetationItem to scene"))
            {
                BakeVegetationToScene(vegetationItemInfoPro);
            }

            GUILayout.EndVertical();
        }