Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

LODGroupRenderingUtils.cs 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Unity.Mathematics;
  4. using UnityEngine;
  5. namespace UnityEngine.Rendering
  6. {
  7. // All this is just a copy of C++ LODGroupManager code.
  8. internal static class LODGroupRenderingUtils
  9. {
  10. public static float CalculateFOVHalfAngle(float fieldOfView)
  11. {
  12. return Mathf.Tan(Mathf.Deg2Rad * fieldOfView * 0.5f);
  13. }
  14. public static float CalculateScreenRelativeMetric(LODParameters lodParams)
  15. {
  16. float screenRelativeMetric;
  17. if (lodParams.isOrthographic)
  18. {
  19. screenRelativeMetric = 2.0F * lodParams.orthoSize;
  20. }
  21. else
  22. {
  23. // Half angle at 90 degrees is 1.0 (So we skip halfAngle / 1.0 calculation)
  24. float halfAngle = CalculateFOVHalfAngle(lodParams.fieldOfView);
  25. screenRelativeMetric = 2.0f * halfAngle;
  26. }
  27. return screenRelativeMetric / QualitySettings.lodBias;
  28. }
  29. public static float CalculatePerspectiveDistance(Vector3 objPosition, Vector3 camPosition, float sqrScreenRelativeMetric)
  30. {
  31. return Mathf.Sqrt(CalculateSqrPerspectiveDistance(objPosition, camPosition, sqrScreenRelativeMetric));
  32. }
  33. public static float CalculateSqrPerspectiveDistance(Vector3 objPosition, Vector3 camPosition, float sqrScreenRelativeMetric)
  34. {
  35. return (objPosition - camPosition).sqrMagnitude * sqrScreenRelativeMetric;
  36. }
  37. public static Vector3 GetWorldReferencePoint(this LODGroup lodGroup)
  38. {
  39. return lodGroup.transform.TransformPoint(lodGroup.localReferencePoint);
  40. }
  41. public static float GetWorldSpaceScale(this LODGroup lodGroup)
  42. {
  43. Vector3 scale = lodGroup.transform.lossyScale;
  44. float largestAxis = Mathf.Abs(scale.x);
  45. largestAxis = Mathf.Max(largestAxis, Mathf.Abs(scale.y));
  46. largestAxis = Mathf.Max(largestAxis, Mathf.Abs(scale.z));
  47. return largestAxis;
  48. }
  49. public static float GetWorldSpaceSize(this LODGroup lodGroup)
  50. {
  51. return lodGroup.GetWorldSpaceScale() * lodGroup.size;
  52. }
  53. public static float CalculateLODDistance(float relativeScreenHeight, float size)
  54. {
  55. return size / relativeScreenHeight;
  56. }
  57. }
  58. }