Files
BepInEx/Projects/BanquetForFools/Source/Assembly-CSharp/LOS/LOSHelper.cs
2025-05-21 20:40:04 +02:00

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)
};
}
}