Advertisement
Guest User

Untitled

a guest
May 26th, 2021
882
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. using UnityEngine;
  2. class DiscountLodGroup : MonoBehaviour
  3. {
  4. [SerializeField] private LODGroup targetLodGroup;
  5.  
  6. private Vector3 rendererBoundsSize, rendererBoundsCenter;
  7. private Renderer[][] renderers;
  8. private float[] lodweights;
  9.  
  10. //https://forum.unity.com/threads/how-lod-group-component-works-internaly-i-want-to-optimize-it.522353/
  11. void OnEnable()
  12. {
  13. renderers = new Renderer[targetLodGroup.lodCount][];
  14. lodweights = new float[targetLodGroup.lodCount];
  15.  
  16. var lods = targetLodGroup.GetLODs();
  17.  
  18. for (int i = 0; i < lods.Length; i++)
  19. {
  20. renderers[i] = lods[i].renderers;
  21. lodweights[i] = lods[i].screenRelativeTransitionHeight;
  22. }
  23.  
  24. RecalculateBounds();
  25. targetLodGroup.enabled = false;
  26. }
  27.  
  28. public void RecalculateBounds()
  29. {
  30. var bnds = renderers[0][0].bounds;
  31.  
  32. for (int i = 0; i < renderers.Length; i++)
  33. for (int j = 0; j < renderers[i].Length; j++)
  34. bnds.Encapsulate(renderers[i][j].bounds);
  35.  
  36.  
  37. rendererBoundsCenter = bnds.center;
  38. rendererBoundsSize = bnds.size;
  39. }
  40. void OnDrawGizmosSelected()
  41. {
  42. Gizmos.DrawWireCube(rendererBoundsCenter, rendererBoundsSize);
  43. }
  44.  
  45. void OnDisable()
  46. {
  47. targetLodGroup.enabled = true;
  48. for (int i = 0; i < renderers.Length; i++)
  49. {
  50. for (int j = 0; j < renderers[i].Length; j++)
  51. {
  52. renderers[i][j].forceRenderingOff = false;
  53. }
  54. }
  55. }
  56.  
  57. void LateUpdate()
  58. {
  59. var cam = Camera.main;
  60. float size = Mathf.Max(rendererBoundsSize.x, rendererBoundsSize.y, rendererBoundsSize.z);
  61.  
  62. float distance = Vector3.Distance(cam.transform.position, rendererBoundsCenter);
  63. float screenSpaceHeight = Mathf.Abs(Mathf.Atan2(size, distance) * Mathf.Rad2Deg * QualitySettings.lodBias) / cam.fieldOfView;
  64. Debug.Log($"{screenSpaceHeight}");
  65.  
  66. int currentLodLevel = renderers.Length - 1;
  67.  
  68. //todo: figure out a way not to loop twice.
  69. for (int i = 0; i < lodweights.Length; i++)
  70. {
  71. if (screenSpaceHeight > lodweights[i])
  72. {
  73. currentLodLevel = i;
  74. break;
  75. }
  76. }
  77.  
  78. for (int i = 0; i < renderers.Length; i++)
  79. {
  80. for (int j = 0; j < renderers[i].Length; j++)
  81. {
  82. renderers[i][j].forceRenderingOff = i != currentLodLevel; //dont render if we are not current lod level
  83. }
  84. }
  85. }
  86. }
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement