private void CreateShadowHandler(List <MeshRenderer> renderers, int tag)
        {
            bool inNeed  = false;
            var  count   = renderers.Count;
            var  handler = _shadowPool.Get();

            for (int i = 0; i < count; i++)
            {
                var val = renderers[i].shadowCastingMode == ShadowCastingMode.On;
                inNeed = inNeed || val;

                if (val)
                {
                    handler.Add(renderers[i]);
                }
            }

            if (inNeed)
            {
                OverwriteHead(handler);

                if (MultiTagHelper.InDoor(tag))
                {
                    handler.Category = DistCullingCat.Detail;
                }
                else
                {
                    handler.Category = DistCullingCat.Median;
                }
            }
            else
            {
                handler.Free();
            }
        }
        public static GameObject FindParentWithTag(this Transform t, string stag)
        {
            while (t != null)
            {
                if (MultiTagHelper.HasTag(t, stag))
                {
                    return(t.gameObject);
                }
                t = t.parent;
            }

            return(null);
        }
        public static IEnumerable <GameObject> FindAllWithMultiTag(this GameObject go, string tag)
        {
            if (MultiTagHelper.HasTag(go))
            {
                yield return(go);
            }

            foreach (var child in go.transform.IterateAllChildren())
            {
                if (MultiTagHelper.HasTag(child.gameObject, tag))
                {
                    yield return(child.gameObject);
                }
            }
        }
        public static GameObject FindWithMultiTag(this GameObject go, string tag)
        {
            if (MultiTagHelper.HasTag(go, tag))
            {
                return(go);
            }

            foreach (var child in go.transform.IterateAllChildren())
            {
                if (MultiTagHelper.HasTag(child.gameObject, tag))
                {
                    return(child.gameObject);
                }
            }

            return(null);
        }
        private void CreateProbeHandler(List <MeshRenderer> renderers, int tag)
        {
            bool inNeed  = false;
            var  count   = renderers.Count;
            var  handler = _probePool.Get();

            for (int i = 0; i < count; i++)
            {
                var val = renderers[i].lightProbeUsage == LightProbeUsage.BlendProbes;
                inNeed = inNeed || val;

                if (val)
                {
                    handler.AddLightprobe(renderers[i]);
                }

                val    = renderers[i].reflectionProbeUsage == ReflectionProbeUsage.BlendProbes;
                inNeed = inNeed || val;

                if (val)
                {
                    handler.AddReflectionProbe(renderers[i]);
                }
            }

            if (inNeed)
            {
                OverwriteHead(handler);

                if (MultiTagHelper.InDoor(tag))
                {
                    handler.Category = DistCullingCat.Detail;
                }
                else
                {
                    handler.Category = DistCullingCat.Near;
                }
            }
            else
            {
                handler.Free();
            }
        }
        public static GameObject FindTrueRoot(this Component c)
        {
            if (c == null)
            {
                return(null);
            }

            var t = c.transform;

            while (t != null)
            {
                if (MultiTagHelper.HasTag(t, SPConstants.TAG_ROOT))
                {
                    return(t.gameObject);
                }
                t = t.parent;
            }
            return(null);
        }
        /**
         * HasTrueRoot
         */

        /// <summary>
        /// Returns true if
        /// </summary>
        /// <param name="go"></param>
        /// <returns></returns>
        public static bool HasTrueRoot(this GameObject go)
        {
            if (go == null)
            {
                return(false);
            }

            var t = go.transform;

            while (t != null)
            {
                if (MultiTagHelper.HasTag(t.gameObject, SPConstants.TAG_ROOT))
                {
                    return(true);
                }
            }

            return(false);
        }