187 lines
6.4 KiB
C#
187 lines
6.4 KiB
C#
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<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, 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 (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<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
|
||
} |