using System; using System.Collections.Generic; using UnityEngine; namespace UltimateWater.Internal { [Serializable] public class WaterProjectionGrid : WaterPrimitiveBase { private const string _ProjectionGridKeyword = "_PROJECTION_GRID"; public override Mesh[] GetTransformedMeshes(Camera camera, out Matrix4x4 matrix, int vertexCount, bool volume) { int pixelWidth = camera.pixelWidth; int pixelHeight = camera.pixelHeight; int key = pixelHeight | (pixelWidth << 16); Vector3 position = camera.transform.position; matrix = Matrix4x4.identity; matrix.m03 = position.x; matrix.m13 = 0f; matrix.m23 = position.z; float num = (float)vertexCount / (float)(pixelWidth * pixelHeight); _Water.Renderer.PropertyBlock.SetMatrix("_InvViewMatrix", camera.cameraToWorldMatrix); if (!_Cache.TryGetValue(key, out var value)) { value = (_Cache[key] = new CachedMeshSet(CreateMeshes(Mathf.RoundToInt((float)pixelWidth * num), Mathf.RoundToInt((float)pixelHeight * num)))); } return value.Meshes; } private Mesh[] CreateMeshes(int verticesX, int verticesY) { List list = new List(); List list2 = new List(); List list3 = new List(); int num = 0; int num2 = 0; for (int i = 0; i < verticesY; i++) { float y = (float)i / (float)(verticesY - 1); for (int j = 0; j < verticesX; j++) { float x = (float)j / (float)(verticesX - 1); list2.Add(new Vector3(x, y, 0f)); if (j != 0 && i != 0 && num > verticesX) { list3.Add(num); list3.Add(num - 1); list3.Add(num - verticesX - 1); list3.Add(num - verticesX); } num++; if (num == 65000) { Mesh mesh = CreateMesh(list2.ToArray(), list3.ToArray(), $"Projection Grid {verticesX}x{verticesY} - {num2:00}"); mesh.bounds = new Bounds(Vector3.zero, new Vector3(100000f, 0.2f, 100000f)); list.Add(mesh); j--; i--; y = (float)i / (float)(verticesY - 1); num = 0; list2.Clear(); list3.Clear(); num2++; } } } if (num != 0) { Mesh mesh2 = CreateMesh(list2.ToArray(), list3.ToArray(), $"Projection Grid {verticesX}x{verticesY} - {num2:00}"); mesh2.bounds = new Bounds(Vector3.zero, new Vector3(100000f, 0.2f, 100000f)); list.Add(mesh2); } return list.ToArray(); } protected override Matrix4x4 GetMatrix(Camera camera) { throw new InvalidOperationException(); } protected override Mesh[] CreateMeshes(int vertexCount, bool volume) { throw new InvalidOperationException(); } internal override void OnEnable(Water water) { base.OnEnable(water); _Water = water; } internal override void AddToMaterial(Water water) { water.Materials.SetKeyword("_PROJECTION_GRID", enable: true); } internal override void RemoveFromMaterial(Water water) { water.Materials.SetKeyword("_PROJECTION_GRID", enable: false); } } }