Files
beyond/Assets/ThirdParty/Lux URP Essentials/Scripts/Editor/LuxURP_GrassMeshPostprocessor.cs
2024-11-20 15:21:28 +01:00

108 lines
2.9 KiB
C#

// GRASSMESHPOSTPROCESSOR
// Adds vertex color and stores bending in vertex color alpha according to the local position of the given vertex
using System;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace LuxURPEssentials
{
internal class LuxURP_GrassMeshPostprocessor : AssetPostprocessor {
public const string GMSuffix = "_LuxGM";
public const string FMSuffix = "_LuxFM";
public const string Power = "_POW";
private bool isFoliageMesh = false;
public void OnPostprocessModel(GameObject GrassMesh) {
if (assetPath.Contains(GMSuffix) || assetPath.Contains(FMSuffix)) {
string filename = Path.GetFileNameWithoutExtension(assetPath);
Debug.Log("Processing Mesh: " + filename);
if (assetPath.Contains(FMSuffix)) {
isFoliageMesh = true;
}
int index;
string filename_Remainder;
if (isFoliageMesh) {
index = filename.IndexOf(FMSuffix, 0);
filename_Remainder = filename.Substring(index + FMSuffix.Length, 2);
}
else {
index = filename.IndexOf(GMSuffix, 0);
filename_Remainder = filename.Substring(index + GMSuffix.Length, 2);
}
float maxBending = 10.0f;
try {
maxBending = float.Parse(filename_Remainder);
}
catch {
Debug.LogWarning("Max Bending: Invalid numerical Expression.");
}
maxBending *= 0.1f;
maxBending = Mathf.Clamp(maxBending, 0.0f, 1.0f);
float power = 10.0f;
if (assetPath.Contains(Power)) {
index = filename.IndexOf(Power, 0);
filename_Remainder = filename.Substring(index+Power.Length, 2);
try {
power = float.Parse(filename_Remainder);
}
catch {
Debug.LogWarning("Power: Invalid numerical Expression.");
}
}
power *= 0.1f;
Debug.Log("Max Bending: " + maxBending + " / Power: " + power);
Mesh currentMesh = GrassMesh.GetComponent<MeshFilter>().sharedMesh;
if (currentMesh.subMeshCount < 2) {
Vector3[] vertices = currentMesh.vertices;
Color[] colors = currentMesh.colors;
// Create vertex color in case there are no
if (colors.Length == 0) {
colors = new Color[vertices.Length];
for (int i = 0; i < vertices.Length; i++) {
colors[i] = new Color(0.0f,0.0f,0.0f,0.0f);
}
}
Bounds bounds = currentMesh.bounds;
for (int i = 0; i < vertices.Length; i++) {
if (vertices[i].y <= 0.0f) {
if (isFoliageMesh) {
colors[i].a = 0.0f;
}
else {
colors[i].b = 0.0f;
}
}
else {
if (isFoliageMesh) {
colors[i].a = Mathf.Lerp (0.0f, maxBending, Mathf.Pow(vertices[i].y, power)/bounds.size.y );
//Debug.Log("doit" + colors[i].a);
}
else {
colors[i].b = Mathf.Lerp (0.0f, maxBending, Mathf.Pow(vertices[i].y, power)/bounds.size.y );
}
}
}
// Update mesh
currentMesh.colors = colors;
}
}
}
}
}