grass-rendering-prototype/Assets/TerrainTool/MyTerrainToolTest.cs
2025-09-25 15:22:35 +02:00

184 lines
6.3 KiB
C#
Raw Blame History

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.TerrainTools;
namespace UnityEditor.TerrainTools
{
#if UNITY_EDITOR
public class MyTerrainToolTest : TerrainPaintTool<MyTerrainToolTest>
{
public GrasField2 grassField;
public GrasFieldManager grasFieldManager;
//Grassorten
bool grassortenSichtbar = false;
public List<GrassortenScriptableObject> 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 / 2f, 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 <20>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<GrasFieldManager>();
}
GrassortenAuswahlZeichnen();
if (GUILayout.Button("UpdateGras"))
{
AssetDatabase.Refresh();
if (grasFieldManager != null)
{
grasFieldManager.UpdateChunks();
}
}
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<GrassortenScriptableObject>();
grassorten.Clear();
var allAssets = AssetDatabase.FindAssets($"t:{typeof(GrassortenScriptableObject).Name}").ToList().Select(AssetDatabase.GUIDToAssetPath);
foreach (var asset in allAssets)
{
grassorten.Add(AssetDatabase.LoadAssetAtPath<GrassortenScriptableObject>(asset));
}
}
if (grassortenSichtbar)
{
var grassortenNamen = new List<string>();
var grassTubnails = new List<Texture2D>();
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
}