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); } } }
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>(); } }
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(); }