133 lines
4.3 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|