Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        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());
        }