public void CullScene(Common.IBoundingVolumeHierarchy<Entity> quadTree) { if ((DateTime.Now - lastEntityCull).TotalSeconds >= Renderer.Settings.CullSceneInterval || ForceCull) { ForceCull = false; lastEntityCull = DateTime.Now; if (firstEntityCull) { firstEntityCull = false; lastShadowEntityCull = DateTime.Now.Subtract(new TimeSpan(0, 0, 0, 0, (int)(Renderer.Settings.CullSceneInterval / 2f * 1000f))); } if (quadTree != null) cachedEntities = quadTree.Cull(FrustumWithMargin(scene.Camera, scene.Viewport)); else cachedEntities = new List<Entity>(scene.AllEntities); } else if ((DateTime.Now - lastShadowEntityCull).TotalSeconds >= Renderer.Settings.CullSceneInterval || ForceShadowCull) { ForceShadowCull = false; lastShadowEntityCull = DateTime.Now; if (Renderer.Settings.ShadowQuality != Settings.ShadowQualities.NoShadows) { if (quadTree != null) cachedShadowEntities = quadTree.Cull(Camera.Frustum(Renderer.ShadowMapCamera)); // TODO: make frustum bigger? else cachedShadowEntities = new List<Entity>(scene.AllEntities); } } Renderer.Frame++; if (Renderer.Settings.ShadowQuality != Settings.ShadowQualities.NoShadows) foreach (Entity e in new List<Entity>(cachedShadowEntities)) { if (e.IsVisible && !e.IsRemoved) { e.ActiveInShadowMap = Renderer.Frame; e.EnsureConstructed(); } } foreach (Entity e in new List<Entity>(cachedEntities)) { if (e.IsVisible && !e.IsRemoved) { e.ActiveInMain = Renderer.Frame; if (Renderer.Settings.ShadowQuality == Settings.ShadowQualities.NoShadows) e.EnsureConstructed(); } } //if (i % 40 == 0) //{ //if (i % 400 == 0) // Console.Clear(); //Console.WriteLine("ShadowEntities: " + cachedShadowEntities.Count); //Console.WriteLine("Entities: " + cachedEntities.Count); //} //i++; }