Files
2026-03-04 10:03:45 +08:00

133 lines
4.3 KiB
C#

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<MeshFilter>().mesh = CreateMesh();
Material[] sharedMaterials = GetComponent<Renderer>().sharedMaterials;
base.gameObject.AddComponent<SkinnedMeshRenderer>();
GetComponent<SkinnedMeshRenderer>().localBounds = new Bounds(Vector3.zero, new Vector3(1E+09f, 1E+09f, 1E+09f));
GetComponent<SkinnedMeshRenderer>().sharedMaterials = sharedMaterials;
GetComponent<MeshFilter>().sharedMesh.bounds = new Bounds(new Vector3(0f, 0f, 0f), new Vector3(1E+09f, 1E+09f, 1E+09f));
GetComponent<AQUAS_Reflection>().overrideWaterLevel = true;
GetComponent<AQUAS_Reflection>().waterLevel = base.transform.position.y;
mainCamera.AddComponent<AQUAS_ProjectedGrid>();
mainCamera.GetComponent<AQUAS_ProjectedGrid>().hideFlags = HideFlags.HideInInspector;
mainCamera.GetComponent<AQUAS_ProjectedGrid>().waterplane = base.gameObject;
}
else
{
if (mainCamera == null)
{
mainCamera = Camera.main.transform.gameObject;
}
if (scaleToFrustum)
{
base.transform.localScale = new Vector3(mainCamera.GetComponent<Camera>().farClipPlane * 2f / 10f, 1f, mainCamera.GetComponent<Camera>().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<AQUAS_ProjectedGrid>() == null && camera.transform.parent == null)
{
camera.gameObject.AddComponent<AQUAS_ProjectedGrid>();
camera.gameObject.GetComponent<AQUAS_ProjectedGrid>().waterplane = base.gameObject;
camera.gameObject.GetComponent<AQUAS_ProjectedGrid>().hideFlags = HideFlags.HideInInspector;
}
}
}
private void HookUpSceneCameras()
{
Camera[] array = sceneCameras;
foreach (Camera camera in array)
{
if (camera.gameObject.GetComponent<AQUAS_ProjectedGrid>() == null)
{
camera.gameObject.AddComponent<AQUAS_ProjectedGrid>();
camera.gameObject.GetComponent<AQUAS_ProjectedGrid>().waterplane = base.gameObject;
camera.gameObject.GetComponent<AQUAS_ProjectedGrid>().hideFlags = HideFlags.HideAndDontSave;
}
}
}
}
}