internal static void PrepareCullQuery(MyCullQuery cullQuery, ListReader <MyShadowmapQuery> shadowmapQueries, bool updateEnvironmentMap)
        {
            cullQuery.AddMainViewPass(new MyViewport(MyRender11.ViewportResolution), MyGBuffer.Main);

            foreach (var shadowmapQuery in shadowmapQueries)
            {
                bool isCascade = shadowmapQuery.QueryType == MyFrustumEnum.ShadowCascade;
                var  matrix    = shadowmapQuery.ProjectionInfo.WorldToProjection;
                cullQuery.AddDepthPass(ref matrix, shadowmapQuery.ProjectionInfo.CurrentLocalToProjection, shadowmapQuery.Viewport, shadowmapQuery.DepthBuffer, isCascade, ToString(shadowmapQuery.QueryType));

                if (isCascade)
                {
                    var smallCulling = new MyCullingSmallObjects
                    {
                        ProjectionDir    = shadowmapQuery.ProjectionDir,
                        ProjectionFactor = shadowmapQuery.ProjectionFactor,
                        SkipThreshold    = MyRenderProxy.Settings.ShadowCascadeSmallSkipThresholds[shadowmapQuery.CascadeIndex]
                    };
                    cullQuery.FrustumCullQueries[cullQuery.Size - 1].SmallObjects = smallCulling;
                    cullQuery.FrustumCullQueries[cullQuery.Size - 1].CascadeIndex = shadowmapQuery.CascadeIndex;
                }

                cullQuery.FrustumCullQueries[cullQuery.Size - 1].Type    = shadowmapQuery.QueryType;
                cullQuery.FrustumCullQueries[cullQuery.Size - 1].Ignored = shadowmapQuery.IgnoredEntities;
            }

            if (updateEnvironmentMap)
            {
                MyEnvironmentProbe.UpdateEnvironmentProbes(cullQuery);
            }
        }
        internal static void PrepareCulling()
        {
            m_cullQuery.Reset();
            m_wavefront.Clear();

            // add main camera
            AddCamera(ref MyEnvironment.ViewD, ref MyEnvironment.OriginalProjectionD,
                      new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y),
                      MyGBuffer.Main);
            m_cullQuery.FrustumQueries[m_wavefront.Count - 1].Type = MyFrustumEnum.MainFrustum;

            MyShadows.PrepareShadowmaps();
            foreach (var query in MyShadows.ShadowMapQueries)
            {
                bool isCascade = query.QueryType == MyFrustumEnum.ShadowCascade;
                AddShadowCaster(new BoundingFrustumD(query.ProjectionInfo.WorldToProjection), query.ProjectionInfo.CurrentLocalToProjection, query.Viewport, query.DepthBuffer, isCascade, query.QueryType.ToString());

                if (isCascade)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = query.ProjectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.ShadowCascadeSmallSkipThresholds[query.CascadeIndex];
                    m_cullQuery.FrustumQueries[m_wavefront.Count - 1].SmallObjects = smallCulling;
                    m_cullQuery.FrustumQueries[m_wavefront.Count - 1].CascadeIndex = query.CascadeIndex;
                }

                m_cullQuery.FrustumQueries[m_wavefront.Count - 1].Type    = query.QueryType;
                m_cullQuery.FrustumQueries[m_wavefront.Count - 1].Ignored = query.IgnoredEntities;
            }
        }
        internal static void PrepareCulling()
        {
            m_cullQuery.Reset();
            m_wavefront.Clear();

            // add main camera
            AddCamera(ref MyEnvironment.View, ref MyEnvironment.Projection,
                      new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y),
                      MyGBuffer.Main);
            m_cullQuery.FrustumQuery[m_wavefront.Count - 1].Type = MyFrustumEnum.MainFrustum;

            MyShadows.ResetShadowmaps();
            foreach (var query in MyShadows.ShadowmapList)
            {
                bool isCascade = query.QueryType == MyFrustumEnum.Cascade0 || query.QueryType == MyFrustumEnum.Cascade1 || query.QueryType == MyFrustumEnum.Cascade2 || query.QueryType == MyFrustumEnum.Cascade3;
                AddShadowCaster(new BoundingFrustum(query.ProjectionInfo.WorldToProjection), query.ProjectionInfo.CurrentLocalToProjection, query.Viewport, query.DepthBuffer, isCascade, query.QueryType.ToString());

                if (query.QueryType == MyFrustumEnum.Cascade0)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade0SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }
                else if (query.QueryType == MyFrustumEnum.Cascade1)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade1SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }
                else if (query.QueryType == MyFrustumEnum.Cascade2)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade2SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }
                else if (query.QueryType == MyFrustumEnum.Cascade3)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade3SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }

                m_cullQuery.FrustumQuery[m_wavefront.Count - 1].Type    = query.QueryType;
                m_cullQuery.FrustumQuery[m_wavefront.Count - 1].Ignored = query.IgnoredEntities;
            }
        }
        static void AddShadowmapQueryIntoCullQuery(MyCullQuery cullQuery, MyShadowmapQuery shadowmapQuery)
        {
            cullQuery.AddDepthPass(shadowmapQuery);

            if (shadowmapQuery.QueryType == MyFrustumEnum.ShadowCascade)
            {
                var smallCulling = new MyCullingSmallObjects
                {
                    ProjectionFactor = shadowmapQuery.ProjectionFactor, // <- this disables culling of objects depending on the previous cascade
                    SkipThreshold    = MyManagers.Shadow.GetSettingsSmallObjectSkipping(shadowmapQuery.Index),
                };
                cullQuery.FrustumCullQueries[cullQuery.Size - 1].SmallObjects = smallCulling;
            }

            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Type    = shadowmapQuery.QueryType;
            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Index   = shadowmapQuery.Index;
            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Ignored = shadowmapQuery.IgnoredEntities;
        }
        static void AddShadowmapQueryIntoCullQuery(MyCullQuery cullQuery, MyShadowmapQuery shadowmapQuery)
        {
            bool isCascade = shadowmapQuery.QueryType == MyFrustumEnum.ShadowCascade;
            var  matrix    = shadowmapQuery.ProjectionInfo.WorldToProjection;

            cullQuery.AddDepthPass(ref matrix, shadowmapQuery.ProjectionInfo.CurrentLocalToProjection, shadowmapQuery.Viewport, shadowmapQuery.DepthBuffer, isCascade, ToString(shadowmapQuery.QueryType));

            if (isCascade)
            {
                var smallCulling = new MyCullingSmallObjects
                {
                    ProjectionFactor = shadowmapQuery.ProjectionFactor, // <- this disables culling of objects depending on the previous cascade
                    SkipThreshold    = MyManagers.Shadow.GetSettingsSmallObjectSkipping(shadowmapQuery.CascadeIndex),
                };
                cullQuery.FrustumCullQueries[cullQuery.Size - 1].SmallObjects = smallCulling;
                cullQuery.FrustumCullQueries[cullQuery.Size - 1].CascadeIndex = shadowmapQuery.CascadeIndex;
            }

            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Type    = shadowmapQuery.QueryType;
            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Ignored = shadowmapQuery.IgnoredEntities;
        }
        static void AddShadowmapQueryIntoCullQuery(MyCullQuery cullQuery, MyShadowmapQuery shadowmapQuery)
        {
            cullQuery.AddDepthPass(shadowmapQuery);

            if (shadowmapQuery.QueryType == MyFrustumEnum.ShadowCascade)
            {
                var smallCulling = new MyCullingSmallObjects
                {
                    ProjectionFactor = shadowmapQuery.ProjectionFactor, // <- this disables culling of objects depending on the previous cascade
                    SkipThreshold = MyManagers.Shadow.GetSettingsSmallObjectSkipping(shadowmapQuery.Index),
                };
                cullQuery.FrustumCullQueries[cullQuery.Size - 1].SmallObjects = smallCulling;
            }

            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Type = shadowmapQuery.QueryType;
            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Index = shadowmapQuery.Index;
            cullQuery.FrustumCullQueries[cullQuery.Size - 1].Ignored = shadowmapQuery.IgnoredEntities;
        }
        internal static void PrepareCullQuery(MyCullQuery cullQuery, ListReader<MyShadowmapQuery> shadowmapQueries, bool updateEnvironmentMap)
        {
            cullQuery.AddMainViewPass(new MyViewport(MyRender11.ViewportResolution), MyGBuffer.Main);

            foreach (var shadowmapQuery in shadowmapQueries)
            {
                bool isCascade = shadowmapQuery.QueryType == MyFrustumEnum.ShadowCascade;
                var matrix = shadowmapQuery.ProjectionInfo.WorldToProjection;
                cullQuery.AddDepthPass(ref matrix, shadowmapQuery.ProjectionInfo.CurrentLocalToProjection, shadowmapQuery.Viewport, shadowmapQuery.DepthBuffer, isCascade, ToString(shadowmapQuery.QueryType));

                if (isCascade)
                {
                    var smallCulling = new MyCullingSmallObjects
                    {
                        ProjectionDir = shadowmapQuery.ProjectionDir,
                        ProjectionFactor = shadowmapQuery.ProjectionFactor,
                        SkipThreshold = MyRenderProxy.Settings.ShadowCascadeSmallSkipThresholds[shadowmapQuery.CascadeIndex]
                    };
                    cullQuery.FrustumCullQueries[cullQuery.Size - 1].SmallObjects = smallCulling;
                    cullQuery.FrustumCullQueries[cullQuery.Size - 1].CascadeIndex = shadowmapQuery.CascadeIndex;
                }

                cullQuery.FrustumCullQueries[cullQuery.Size - 1].Type = shadowmapQuery.QueryType;
                cullQuery.FrustumCullQueries[cullQuery.Size - 1].Ignored = shadowmapQuery.IgnoredEntities;
            }

            if (updateEnvironmentMap)
                MyEnvironmentProbe.UpdateEnvironmentProbes(cullQuery);
        }