68 lines
2.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Unity.HLODSystem.SpaceManager
{
public class QuadTreeSpaceManager : ISpaceManager
{
private float preRelative;
private Vector3 camPosition;
public QuadTreeSpaceManager()
{
}
public void UpdateCamera(Transform hlodTransform, Camera cam)
{
if (cam.orthographic)
{
preRelative = 0.5f / cam.orthographicSize;
}
else
{
float halfAngle = Mathf.Tan(Mathf.Deg2Rad * cam.fieldOfView * 0.5F);
preRelative = 0.5f / halfAngle;
}
preRelative = preRelative * QualitySettings.lodBias;
camPosition = hlodTransform.worldToLocalMatrix.MultiplyPoint(cam.transform.position);
}
public bool IsHigh(float lodDistance, Bounds bounds)
{
//float distance = 1.0f;
//if (cam.orthographic == false)
float distance = GetDistance(bounds.center, camPosition);
float relativeHeight = bounds.size.x * preRelative / distance;
return relativeHeight > lodDistance;
}
public float GetDistanceSqure(Bounds bounds)
{
float x = bounds.center.x - camPosition.x;
float z = bounds.center.z - camPosition.z;
float square = x * x + z * z;
return square;
}
public bool IsCull(float cullDistance, Bounds bounds)
{
float distance = GetDistance(bounds.center, camPosition);
float relativeHeight = bounds.size.x * preRelative / distance;
return relativeHeight < cullDistance;
}
private float GetDistance(Vector3 boundsPos, Vector3 camPos)
{
float x = boundsPos.x - camPos.x;
float z = boundsPos.z - camPos.z;
float square = x * x + z * z;
return Mathf.Sqrt(square);
}
}
}