using UnityEngine; namespace AQUAS { [AddComponentMenu("AQUAS/Essentials/Camera Lock")] public class AQUAS_CamLock : MonoBehaviour { public GameObject mainCamera; public bool scaleToFrustum; [Header("Settings for dynamic meshes")] public bool useDynamicMesh; [Range(32f, 256f)] public int resolution = 64; [HideInInspector] public Camera[] cameras; [HideInInspector] public Camera[] sceneCameras; private void Start() { if (useDynamicMesh) { base.transform.localScale = new Vector3(1f, 1f, 1f); GetComponent().mesh = CreateMesh(); Material[] sharedMaterials = GetComponent().sharedMaterials; base.gameObject.AddComponent(); GetComponent().localBounds = new Bounds(Vector3.zero, new Vector3(1E+09f, 1E+09f, 1E+09f)); GetComponent().sharedMaterials = sharedMaterials; GetComponent().sharedMesh.bounds = new Bounds(new Vector3(0f, 0f, 0f), new Vector3(1E+09f, 1E+09f, 1E+09f)); GetComponent().overrideWaterLevel = true; GetComponent().waterLevel = base.transform.position.y; mainCamera.AddComponent(); mainCamera.GetComponent().hideFlags = HideFlags.HideInInspector; mainCamera.GetComponent().waterplane = base.gameObject; } else { if (mainCamera == null) { mainCamera = Camera.main.transform.gameObject; } if (scaleToFrustum) { base.transform.localScale = new Vector3(mainCamera.GetComponent().farClipPlane * 2f / 10f, 1f, mainCamera.GetComponent().farClipPlane * 2f / 10f); Vector3 localScale = base.transform.Find("Static Boundary").localScale; base.transform.Find("Static Boundary").localScale = new Vector3(5f, localScale.y, 5f); } } } private void Update() { if (!useDynamicMesh) { base.transform.position = new Vector3(mainCamera.transform.position.x, base.transform.position.y, mainCamera.transform.position.z); } } private Mesh CreateMesh() { Mesh mesh = new Mesh(); Vector3[] array = new Vector3[resolution * resolution]; Vector2[] array2 = new Vector2[resolution * resolution]; int[] array3 = new int[(resolution - 1) * (resolution - 1) * 6]; float num = 1f / (float)(resolution - 1); float num2 = 1f / (float)(resolution - 1); for (int i = 0; i < resolution; i++) { float x = num * (float)i - 0.5f; for (int j = 0; j < resolution; j++) { float num3 = num2 * (float)j - 0.5f; array[i * resolution + j] = new Vector3(x, 0f, num3); array2[i * resolution + j] = new Vector2(x, num3); } } for (int k = 0; k < (resolution - 1) * (resolution - 1); k++) { int num4 = (int)Mathf.Floor(k / (resolution - 1)); array3[k * 6] = num4 * resolution + k % (resolution - 1); array3[k * 6 + 1] = num4 * resolution + k % (resolution - 1) + 1; array3[k * 6 + 2] = (num4 + 1) * resolution + k % (resolution - 1); array3[k * 6 + 3] = (num4 + 1) * resolution + k % (resolution - 1); array3[k * 6 + 4] = num4 * resolution + k % (resolution - 1) + 1; array3[k * 6 + 5] = (num4 + 1) * resolution + k % (resolution - 1) + 1; } mesh.vertices = array; mesh.uv = array2; mesh.triangles = array3; mesh.RecalculateNormals(); return mesh; } private void GetCameras() { cameras = Camera.allCameras; } private void HookUpCameras() { Camera[] array = cameras; foreach (Camera camera in array) { if (camera.gameObject.GetComponent() == null && camera.transform.parent == null) { camera.gameObject.AddComponent(); camera.gameObject.GetComponent().waterplane = base.gameObject; camera.gameObject.GetComponent().hideFlags = HideFlags.HideInInspector; } } } private void HookUpSceneCameras() { Camera[] array = sceneCameras; foreach (Camera camera in array) { if (camera.gameObject.GetComponent() == null) { camera.gameObject.AddComponent(); camera.gameObject.GetComponent().waterplane = base.gameObject; camera.gameObject.GetComponent().hideFlags = HideFlags.HideAndDontSave; } } } } }