Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- class DiscountLodGroup : MonoBehaviour
- {
- [SerializeField] private LODGroup targetLodGroup;
- private Vector3 rendererBoundsSize, rendererBoundsCenter;
- private Renderer[][] renderers;
- private float[] lodweights;
- //https://forum.unity.com/threads/how-lod-group-component-works-internaly-i-want-to-optimize-it.522353/
- void OnEnable()
- {
- renderers = new Renderer[targetLodGroup.lodCount][];
- lodweights = new float[targetLodGroup.lodCount];
- var lods = targetLodGroup.GetLODs();
- for (int i = 0; i < lods.Length; i++)
- {
- renderers[i] = lods[i].renderers;
- lodweights[i] = lods[i].screenRelativeTransitionHeight;
- }
- RecalculateBounds();
- targetLodGroup.enabled = false;
- }
- public void RecalculateBounds()
- {
- var bnds = renderers[0][0].bounds;
- for (int i = 0; i < renderers.Length; i++)
- for (int j = 0; j < renderers[i].Length; j++)
- bnds.Encapsulate(renderers[i][j].bounds);
- rendererBoundsCenter = bnds.center;
- rendererBoundsSize = bnds.size;
- }
- void OnDrawGizmosSelected()
- {
- Gizmos.DrawWireCube(rendererBoundsCenter, rendererBoundsSize);
- }
- void OnDisable()
- {
- targetLodGroup.enabled = true;
- for (int i = 0; i < renderers.Length; i++)
- {
- for (int j = 0; j < renderers[i].Length; j++)
- {
- renderers[i][j].forceRenderingOff = false;
- }
- }
- }
- void LateUpdate()
- {
- var cam = Camera.main;
- float size = Mathf.Max(rendererBoundsSize.x, rendererBoundsSize.y, rendererBoundsSize.z);
- float distance = Vector3.Distance(cam.transform.position, rendererBoundsCenter);
- float screenSpaceHeight = Mathf.Abs(Mathf.Atan2(size, distance) * Mathf.Rad2Deg * QualitySettings.lodBias) / cam.fieldOfView;
- Debug.Log($"{screenSpaceHeight}");
- int currentLodLevel = renderers.Length - 1;
- //todo: figure out a way not to loop twice.
- for (int i = 0; i < lodweights.Length; i++)
- {
- if (screenSpaceHeight > lodweights[i])
- {
- currentLodLevel = i;
- break;
- }
- }
- for (int i = 0; i < renderers.Length; i++)
- {
- for (int j = 0; j < renderers[i].Length; j++)
- {
- renderers[i][j].forceRenderingOff = i != currentLodLevel; //dont render if we are not current lod level
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement