Files
FueraDeEscala/Assets/Game Kit Controller/Integrations/NaughtyWaterBuoyancy/Scripts/Editor/WaterMeshGenerator.cs

91 lines
3.1 KiB
C#
Raw Normal View History

2026-03-29 23:03:14 -07:00
using UnityEngine;
namespace NaughtyWaterBuoyancy.Editor
{
public class WaterMeshGenerator
{
private static int rows;
private static int columns;
private static float quadSegmentSize;
public static Mesh GenerateMesh(int _rows, int _columns, float _quadSegmentSize)
{
if (_rows < 0f || _columns < 0 || _quadSegmentSize < 0f)
{
throw new System.ArgumentException("Invalid water mesh data");
}
rows = _rows + 1; // There are 2 rows between 3 points, so we need to add 1
columns = _columns + 1; // Same here
quadSegmentSize = _quadSegmentSize;
var mesh = new Mesh();
mesh.name = "Water Mesh";
MeshData meshData = new MeshData();
meshData.Vertices = new Vector3[rows * columns];
meshData.Normals = new Vector3[rows * columns];
meshData.UVs = new Vector2[rows * columns];
meshData.TriangleIndices = new int[rows * columns * 6];
int triangleIndex = 0;
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < columns; c++)
{
int index = GetIndex(r, c);
// Set vertices, normals and UVs
meshData.Vertices[index] = new Vector3(c * quadSegmentSize, 0f, r * quadSegmentSize);
meshData.Normals[index] = Vector3.up;
meshData.UVs[index] = new Vector2((float)c / columns, (float)r / rows);
// Set triangles
if (r < rows - 1 && c < columns - 1)
{
meshData.TriangleIndices[triangleIndex + 0] = GetIndex(r, c);
meshData.TriangleIndices[triangleIndex + 1] = GetIndex(r + 1, c);
meshData.TriangleIndices[triangleIndex + 2] = GetIndex(r, c + 1);
meshData.TriangleIndices[triangleIndex + 3] = GetIndex(r + 1, c);
meshData.TriangleIndices[triangleIndex + 4] = GetIndex(r + 1, c + 1);
meshData.TriangleIndices[triangleIndex + 5] = GetIndex(r, c + 1);
triangleIndex += 6;
}
}
}
mesh.vertices = meshData.Vertices;
mesh.normals = meshData.Normals;
mesh.uv = meshData.UVs;
mesh.triangles = meshData.TriangleIndices;
return mesh;
}
private static int GetIndex(int row, int column)
{
return row * columns + column;
}
private static int GetRow(int vertexIndex)
{
return vertexIndex / columns;
}
private static int GetColumn(int vertexIndex)
{
return vertexIndex % columns;
}
private struct MeshData
{
public Vector3[] Vertices { get; set; }
public Vector3[] Normals { get; set; }
public Vector2[] UVs { get; set; }
public int[] TriangleIndices { get; set; }
}
}
}