Example #1
0
        void InitFrustumCullPasses(MyCullQuery cullQuery, MyCpuFrustumCullPasses cullPasses)
        {
            cullPasses.Clear();
            for (int i = 0; i < cullQuery.Size; i++)
            {
                MyRenderingPass    renderingPass    = cullQuery.RenderingPasses[i];
                MyFrustumCullQuery frustumCullQuery = cullQuery.FrustumCullQueries[i];

                if (renderingPass is VRageRender.MyGBufferPass)
                {
                    MyCpuFrustumCullPass cpuFrustumCullPass = cullPasses.Allocate();
                    cpuFrustumCullPass.Frustum = frustumCullQuery.Frustum;
                    cpuFrustumCullPass.IsInsideList.Clear();
                    cpuFrustumCullPass.List.Clear();
                    cpuFrustumCullPass.PassId = GetPassId((VRageRender.MyGBufferPass)renderingPass);
                }

                if (renderingPass is VRageRender.MyDepthPass)
                {
                    MyCpuFrustumCullPass cpuFrustumCullPass = cullPasses.Allocate();
                    cpuFrustumCullPass.Frustum = frustumCullQuery.Frustum;
                    cpuFrustumCullPass.IsInsideList.Clear();
                    cpuFrustumCullPass.List.Clear();
                    cpuFrustumCullPass.PassId = GetPassId((VRageRender.MyDepthPass)renderingPass);
                }
            }
        }
Example #2
0
        void AllocateInternal()
        {
            m_gbufferPass     = new MyGBufferPass();
            m_depthPassesPool = new MyObjectsPool <MyDepthPass>(1);

            m_tmpCullingWork  = new List <MyCpuFrustumCullingWork>();
            m_tmpCullPasses   = new MyCpuFrustumCullPasses();
            m_tmpRenderPasses = new List <MyRenderPass>();

            m_tmpVisibleInstances = new List <MyInstanceComponent> [MyPassIdResolver.AllPassesCount];
            for (int i = 0; i < m_tmpVisibleInstances.Length; i++)
            {
                m_tmpVisibleInstances[i] = new List <MyInstanceComponent>();
            }
        }
Example #3
0
        public void DispatchCullPasses(MyCpuFrustumCullPasses cpuFrustumCullPasses, List <MyInstanceComponent>[] out_visibleInstances)
        {
            for (int frustumQueryIndex = 1; frustumQueryIndex < cpuFrustumCullPasses.Count; ++frustumQueryIndex)
            {
                var cullWork = MyObjectPoolManager.Allocate <MyCpuFrustumCullingWork>();
                m_tmpCullingWork.Add(cullWork);
                int passId = cpuFrustumCullPasses.At(frustumQueryIndex).PassId;
                cullWork.Init(cpuFrustumCullPasses.At(frustumQueryIndex), MyManagers.HierarchicalCulledEntities.AabbTree,
                              out_visibleInstances[passId]);
                m_tmpParallelTasks.Add(Parallel.Start(cullWork));
            }

            if (cpuFrustumCullPasses.Count != 0)
            {
                ProfilerShort.Begin("Culling in the render thread");
                var cullWork = MyObjectPoolManager.Allocate <MyCpuFrustumCullingWork>();
                m_tmpCullingWork.Add(cullWork);
                int passId = cpuFrustumCullPasses.At(0).PassId;
                cullWork.Init(cpuFrustumCullPasses.At(0), MyManagers.HierarchicalCulledEntities.AabbTree,
                              out_visibleInstances[passId]);
                cullWork.DoWork();
                ProfilerShort.End();
            }

            ProfilerShort.Begin("WaitingForOtherTasks");
            foreach (Task cullingTask in m_tmpParallelTasks)
            {
                cullingTask.Wait();
            }
            m_tmpParallelTasks.Clear();
            ProfilerShort.End();

            foreach (MyCpuFrustumCullingWork cullWork in m_tmpCullingWork)
            {
                MyObjectPoolManager.Deallocate(cullWork);
            }
            m_tmpCullingWork.Clear();
        }