/// <summary> /// Retrieve LOD Children given Distance /// </summary> /// <param name="node"></param> /// <param name="dist"></param> /// <returns></returns> public static IEnumerable <NiNode> GetChildrenFromLOD(this NiLODNode node, float dist) { var lods = node.GetChildren().OfType <NiNode>().ToArray(); var lodlevels = node.LODLevels; if (lodlevels == null && node.LODLevelData.IsValid() && node.LODLevelData.Object != null) { var lodData = node.LODLevelData.Object as NiRangeLODData; if (lodData != null) { lodlevels = lodData.LODLevels; } } if (lodlevels == null) { // Default to first LOD Level for other LOD mechanisms var result = lods.FirstOrDefault(); if (result != null) { yield return(result); } yield break; } foreach (var match in lodlevels .Select((l, i) => new { Ind = i, Lod = l }) .Where(o => dist >= o.Lod.NearExtent && dist < o.Lod.FarExtent && o.Ind < lods.Length)) { yield return(lods.ElementAt(match.Ind)); } yield break; }
private static void BuildLevelsOfDetail(NiLODNode lodNode, GameObject holder) { var data = (NiRangeLODData)lodNode.Data; var lod = holder.AddComponent <LODGroup>(); lod.SetLODs(data.Ranges.Select(l => new LOD(1f / l.Far, null)).ToArray()); }