196 lines
7.6 KiB
C#
196 lines
7.6 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace LOS
|
|
{
|
|
// Token: 0x02000106 RID: 262
|
|
public static class LOSHelper
|
|
{
|
|
// Token: 0x060015F1 RID: 5617 RVA: 0x0019C6A0 File Offset: 0x0019A8A0
|
|
public static void ExtractFrustumPlanes(Plane[] planes, Camera camera)
|
|
{
|
|
Matrix4x4 matrix4x = camera.projectionMatrix * camera.worldToCameraMatrix;
|
|
Vector3 vector = new Vector3(matrix4x[3, 0] + matrix4x[0, 0], matrix4x[3, 1] + matrix4x[0, 1], matrix4x[3, 2] + matrix4x[0, 2]);
|
|
float num = vector.magnitude;
|
|
planes[0].normal = vector.normalized;
|
|
planes[0].distance = (matrix4x[3, 3] + matrix4x[0, 3]) / num;
|
|
vector = new Vector3(matrix4x[3, 0] - matrix4x[0, 0], matrix4x[3, 1] - matrix4x[0, 1], matrix4x[3, 2] - matrix4x[0, 2]);
|
|
num = vector.magnitude;
|
|
planes[1].normal = vector.normalized;
|
|
planes[1].distance = (matrix4x[3, 3] - matrix4x[0, 3]) / num;
|
|
vector = new Vector3(matrix4x[3, 0] + matrix4x[1, 0], matrix4x[3, 1] + matrix4x[1, 1], matrix4x[3, 2] + matrix4x[1, 2]);
|
|
num = vector.magnitude;
|
|
planes[2].normal = vector.normalized;
|
|
planes[2].distance = (matrix4x[3, 3] + matrix4x[1, 3]) / num;
|
|
vector = new Vector3(matrix4x[3, 0] - matrix4x[1, 0], matrix4x[3, 1] - matrix4x[1, 1], matrix4x[3, 2] - matrix4x[1, 2]);
|
|
num = vector.magnitude;
|
|
planes[3].normal = vector.normalized;
|
|
planes[3].distance = (matrix4x[3, 3] - matrix4x[1, 3]) / num;
|
|
vector = new Vector3(matrix4x[3, 0] + matrix4x[2, 0], matrix4x[3, 1] + matrix4x[2, 1], matrix4x[3, 2] + matrix4x[2, 2]);
|
|
num = vector.magnitude;
|
|
planes[4].normal = vector.normalized;
|
|
planes[4].distance = (matrix4x[3, 3] + matrix4x[2, 3]) / num;
|
|
vector = new Vector3(matrix4x[3, 0] - matrix4x[2, 0], matrix4x[3, 1] - matrix4x[2, 1], matrix4x[3, 2] - matrix4x[2, 2]);
|
|
num = vector.magnitude;
|
|
planes[5].normal = vector.normalized;
|
|
planes[5].distance = (matrix4x[3, 3] - matrix4x[2, 3]) / num;
|
|
}
|
|
|
|
// Token: 0x060015F2 RID: 5618 RVA: 0x0019C9A8 File Offset: 0x0019ABA8
|
|
public static Matrix4x4 CalculatePerspectiveCorners(Camera currentCamera)
|
|
{
|
|
float farClipPlane = currentCamera.farClipPlane;
|
|
float fieldOfView = currentCamera.fieldOfView;
|
|
float aspect = currentCamera.aspect;
|
|
Matrix4x4 zero = Matrix4x4.zero;
|
|
float num = fieldOfView * 0.5f * 0.017453292f;
|
|
float num2 = Mathf.Tan(num) * farClipPlane;
|
|
float num3 = Mathf.Tan(num) * aspect * farClipPlane;
|
|
Vector3 vector = currentCamera.transform.up * num2;
|
|
Vector3 vector2 = currentCamera.transform.right * num3;
|
|
Vector3 vector3 = currentCamera.transform.forward * farClipPlane;
|
|
Vector3 vector4 = vector3 + vector - vector2;
|
|
Vector3 vector5 = vector3 + vector + vector2;
|
|
Vector3 vector6 = vector3 - vector + vector2;
|
|
Vector3 vector7 = vector3 - vector - vector2;
|
|
zero.SetRow(0, vector4);
|
|
zero.SetRow(1, vector5);
|
|
zero.SetRow(2, vector6);
|
|
zero.SetRow(3, vector7);
|
|
return zero;
|
|
}
|
|
|
|
// Token: 0x060015F3 RID: 5619 RVA: 0x0019CAA8 File Offset: 0x0019ACA8
|
|
public static void CalculateViewVectors(Camera currentCamera, out Matrix4x4 rays, out Matrix4x4 origins)
|
|
{
|
|
Matrix4x4 inverse = currentCamera.projectionMatrix.inverse;
|
|
rays = Matrix4x4.zero;
|
|
origins = Matrix4x4.zero;
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
Vector4 vector = inverse * LOSHelper.m_NearHomogenousCorners[i];
|
|
Vector4 vector2 = inverse * LOSHelper.m_FarHomogenousCorners[i];
|
|
vector /= vector.w;
|
|
Vector4 vector3 = vector2 / vector2.w - vector;
|
|
vector3 /= vector3.z;
|
|
Vector4 vector4 = vector - vector3 * vector.z;
|
|
vector4.w = 1f;
|
|
vector4 = currentCamera.cameraToWorldMatrix * vector4;
|
|
vector3 *= -1f;
|
|
vector3.w = 0f;
|
|
vector3 = currentCamera.cameraToWorldMatrix * vector3;
|
|
rays.SetRow(i, vector3);
|
|
origins.SetRow(i, vector4);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060015F4 RID: 5620 RVA: 0x0019CBAC File Offset: 0x0019ADAC
|
|
public static Bounds CalculateSourceBounds(Camera sourceCamera)
|
|
{
|
|
Matrix4x4 matrix4x = LOSHelper.CalculatePerspectiveCorners(sourceCamera);
|
|
Vector3 position = sourceCamera.transform.position;
|
|
Vector3 vector = LOSHelper.GetFrustumMin(matrix4x);
|
|
vector = Vector3.Min(vector + position, position);
|
|
Vector3 vector2 = LOSHelper.GetFrustumMax(matrix4x);
|
|
vector2 = Vector3.Max(vector2 + position, position);
|
|
Bounds bounds = default(Bounds);
|
|
bounds.SetMinMax(vector, vector2);
|
|
return bounds;
|
|
}
|
|
|
|
// Token: 0x060015F5 RID: 5621 RVA: 0x0019CC08 File Offset: 0x0019AE08
|
|
private static Vector3 GetFrustumMin(Matrix4x4 frustumCorners)
|
|
{
|
|
Vector3 vector = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
vector = Vector3.Min(vector, frustumCorners.GetRow(i));
|
|
}
|
|
return vector;
|
|
}
|
|
|
|
// Token: 0x060015F6 RID: 5622 RVA: 0x0019CC4C File Offset: 0x0019AE4C
|
|
private static Vector3 GetFrustumMax(Matrix4x4 frustumCorners)
|
|
{
|
|
Vector3 vector = new Vector3(float.MinValue, float.MinValue, float.MinValue);
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
vector = Vector3.Max(vector, frustumCorners.GetRow(i));
|
|
}
|
|
return vector;
|
|
}
|
|
|
|
// Token: 0x060015F7 RID: 5623 RVA: 0x0019CC90 File Offset: 0x0019AE90
|
|
public static int NearestPowerOfTwo(int value)
|
|
{
|
|
return (int)Mathf.Pow(2f, (float)Mathf.CeilToInt(Mathf.Log((float)value) / Mathf.Log(2f)));
|
|
}
|
|
|
|
// Token: 0x060015F8 RID: 5624 RVA: 0x0019CCB5 File Offset: 0x0019AEB5
|
|
public static void InitSourceCamera(Camera sourceCamera)
|
|
{
|
|
sourceCamera.enabled = false;
|
|
sourceCamera.orthographic = false;
|
|
sourceCamera.renderingPath = RenderingPath.VertexLit;
|
|
sourceCamera.clearFlags = CameraClearFlags.Skybox;
|
|
sourceCamera.allowHDR = false;
|
|
sourceCamera.depthTextureMode = DepthTextureMode.None;
|
|
}
|
|
|
|
// Token: 0x060015F9 RID: 5625 RVA: 0x0019CCE4 File Offset: 0x0019AEE4
|
|
public static bool CheckBoundsVisibility(LOSSource losSource, Bounds meshBounds, int layerMask)
|
|
{
|
|
Camera sourceCamera = losSource.SourceCamera;
|
|
return losSource.IsVisible && sourceCamera != null && GeometryUtility.TestPlanesAABB(losSource.FrustumPlanes, meshBounds) && LOSHelper.CheckRayCast(sourceCamera, meshBounds, losSource.SourceInfo.w, layerMask);
|
|
}
|
|
|
|
// Token: 0x060015FA RID: 5626 RVA: 0x0019CD30 File Offset: 0x0019AF30
|
|
private static bool CheckRayCast(Camera currentCamera, Bounds meshBounds, float maxDistance, int layerMask)
|
|
{
|
|
bool flag = false;
|
|
Vector3 position = currentCamera.transform.position;
|
|
if (LOSHelper.CheckRayConnect(meshBounds.center, position, maxDistance, layerMask) || LOSHelper.CheckRayConnect(meshBounds.max, position, maxDistance, layerMask) || LOSHelper.CheckRayConnect(meshBounds.min, position, maxDistance, layerMask))
|
|
{
|
|
flag = true;
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
// Token: 0x060015FB RID: 5627 RVA: 0x0019CD84 File Offset: 0x0019AF84
|
|
private static bool CheckRayConnect(Vector3 origin, Vector3 cameraPosition, float maxDistance, int layerMask)
|
|
{
|
|
bool flag = false;
|
|
Vector3 vector = origin - cameraPosition;
|
|
if (vector.sqrMagnitude < maxDistance * maxDistance)
|
|
{
|
|
Ray ray = new Ray(cameraPosition, vector);
|
|
float num = vector.magnitude - 0.1f;
|
|
num = Mathf.Max(1E-05f, num);
|
|
if (!Physics.Raycast(ray, num, layerMask))
|
|
{
|
|
flag = true;
|
|
}
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
// Token: 0x04002618 RID: 9752
|
|
private static readonly Vector4[] m_NearHomogenousCorners = new Vector4[]
|
|
{
|
|
new Vector4(-1f, 1f, -1f, 1f),
|
|
new Vector4(1f, 1f, -1f, 1f),
|
|
new Vector4(1f, -1f, -1f, 1f),
|
|
new Vector4(-1f, -1f, -1f, 1f)
|
|
};
|
|
|
|
// Token: 0x04002619 RID: 9753
|
|
private static readonly Vector4[] m_FarHomogenousCorners = new Vector4[]
|
|
{
|
|
new Vector4(-1f, 1f, 1f, 1f),
|
|
new Vector4(1f, 1f, 1f, 1f),
|
|
new Vector4(1f, -1f, 1f, 1f),
|
|
new Vector4(-1f, -1f, 1f, 1f)
|
|
};
|
|
}
|
|
}
|