using System; using UnityEngine; namespace Assets.ThoMagic.Renderer { public class RendererUtility { public static GameObject GetPrototypeToRender(DetailPrototype prototype) => prototype.prototype == null ? null : prototype.prototype.transform.root.gameObject; public static bool SupportsProceduralInstancing(GameObject gameObject) { foreach (var componentsInChild in gameObject.GetComponentsInChildren()) { foreach (var sharedMaterial in componentsInChild.sharedMaterials) { if (sharedMaterial != null && sharedMaterial.shader != null && !RendererUtility.SupportsProceduralInstancing(sharedMaterial)) return false; } } return true; } public static bool SupportsProceduralInstancing(Material material) { if (material == null) throw new ArgumentNullException(nameof(material)); if (material.shader == null) throw new ArgumentNullException("material.shader"); return true; } public static bool IsSupportedByUnity(DetailPrototype prototype) => !prototype.usePrototypeMesh || prototype.prototype == null || prototype.prototype.GetComponent() == null; public static GameObject GetSupportedPlaceholder(DetailPrototype prototype) => IsSupportedByUnity(prototype) ? prototype.prototype : GetSupportedPlaceholder(prototype.prototype); public static GameObject GetSupportedPlaceholder(GameObject prototype) { if (prototype == null) return prototype; LODGroup component = prototype.GetComponent(); if (component == null) return prototype; foreach (LOD loD in component.GetLODs()) { foreach (UnityEngine.Renderer renderer in loD.renderers) { if (renderer != null) return renderer.gameObject; } } return null; } } }