using System.Collections.Generic; using System.Linq; using UnityEditor.VersionControl; using UnityEngine; using UnityEngine.Assertions; using UnityEngine.TerrainTools; using static Unity.VisualScripting.Member; namespace UnityEditor.TerrainTools { #if UNITY_EDITOR public class MyTerrainToolTest : TerrainPaintTool { public GrasField2 grassField; public GrasFieldManager grasFieldManager; //Grassorten bool grassortenSichtbar = false; public List grassorten; public GrassortenScriptableObject aktuelleGrassorte; public int aktuelleGrassorteInt = 0; public bool isInChunckSelectorMode = false; override public void OnEnable() { AssemblyReloadEvents.beforeAssemblyReload += OnBeforeAssemblyReload; AssemblyReloadEvents.afterAssemblyReload += OnAfterAssemblyReload; } override public void OnDisable() { AssemblyReloadEvents.beforeAssemblyReload -= OnBeforeAssemblyReload; AssemblyReloadEvents.afterAssemblyReload -= OnAfterAssemblyReload; } public override string GetName() { return "Grass Paint Tool"; } public override string GetDescription() { return "Left click to raise.\n\nHold shift and left click to lower."; } public override void OnRenderBrushPreview(Terrain terrain, IOnSceneGUI editContext) { //if (isInChunckSelectorMode) return; TerrainPaintUtilityEditor.ShowDefaultPreviewBrush(terrain, editContext.brushTexture, editContext.brushSize); } public override bool OnPaint(Terrain terrain, IOnPaint editContext) { Material mat = TerrainPaintUtility.GetBuiltinPaintMaterial(); if (grasFieldManager == null) return false; //Normalen Paint Context callen, weil sonst der brush in die Textur gezeichnet wird float rotationDegrees = 0.0f; BrushTransform brushXform = TerrainPaintUtility.CalculateBrushTransform(terrain, editContext.uv, editContext.brushSize, rotationDegrees); PaintContext paintContext = TerrainPaintUtility.BeginPaintTexture(terrain, brushXform.GetBrushXYBounds(), terrain.terrainData.terrainLayers[0]); grasFieldManager.BrushGras(terrain, aktuelleGrassorte, editContext.uv, editContext.brushSize, Event.current.shift); //grassField.brushGrass(Event.current.shift, editContext.uv * new Vector2(terrain.terrainData.size.x, terrain.terrainData.size.z), editContext.brushSize); //Der Context wird immer released, weil wir in der anderen Funtion das malen übernemen TerrainPaintUtility.ReleaseContextResources(paintContext); return false; } public void OnBeforeAssemblyReload() { //if(grassField != null) grassField.SaveChuncks(); } public void OnAfterAssemblyReload() { } public override void OnSceneGUI(Terrain terrain, IOnSceneGUI editContext) { base.OnSceneGUI(terrain, editContext); if (Event.current.type == EventType.MouseUp && Event.current.button == 0 && grassField != null) { //grassField.ClearActiveChuncks(); //grassField.UpdateChuncks(); //grassField.SaveChuncks(); } } public override void OnInspectorGUI(Terrain terrain, IOnInspectorGUI editContext) { base.OnInspectorGUI(terrain, editContext); editContext.ShowBrushesGUI(1, BrushGUIEditFlags.All); if (grasFieldManager == null) { GameObject grasManagerObject = GameObject.Find("GrasManagment"); if (grasManagerObject == null) { Debug.LogError("Kein GrasMangager Gefunden"); GameObject grasMangerPrefab = (GameObject)Resources.Load("GrasManagment"); grasManagerObject = Instantiate(grasMangerPrefab); grasManagerObject.name = "GrasManagment"; Debug.Log("Neuer Gras Manager Gespawned"); } grasFieldManager = grasManagerObject.GetComponent(); } GrassortenAuswahlZeichnen(); if (GUILayout.Button("UpdateGras")) { AssetDatabase.Refresh(); if (grassField != null) { //grassField.UpdateAllMeshes(); } } if (GUILayout.Button("Clear Grass Chuncks")) { AssetDatabase.Refresh(); if(grasFieldManager != null) { grasFieldManager.ClearChunks(); } } } private void GrassortenAuswahlZeichnen() { bool warenDieSortenSichtbar = grassortenSichtbar; grassortenSichtbar = EditorGUILayout.BeginFoldoutHeaderGroup(grassortenSichtbar, "Grassorten"); if (warenDieSortenSichtbar == false && grassortenSichtbar == true) { if (grassorten == null) grassorten = new List(); grassorten.Clear(); var allAssets = AssetDatabase.FindAssets($"t:{typeof(GrassortenScriptableObject).Name}").ToList().Select(AssetDatabase.GUIDToAssetPath); foreach (var asset in allAssets) { grassorten.Add(AssetDatabase.LoadAssetAtPath(asset)); } } if (grassortenSichtbar) { var grassortenNamen = new List(); var grassTubnails = new List(); foreach (var sorte in grassorten) { grassortenNamen.Add(sorte.name); grassTubnails.Add(AssetPreview.GetAssetPreview(sorte)); } int alteSorte = aktuelleGrassorteInt; aktuelleGrassorteInt = GUILayout.SelectionGrid(aktuelleGrassorteInt, grassTubnails.ToArray(), 4); if (aktuelleGrassorteInt != alteSorte) aktuelleGrassorte = grassorten[aktuelleGrassorteInt]; } EditorGUILayout.EndFoldoutHeaderGroup(); } } #endif }