68 lines
2.0 KiB
C#
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);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
} |