void FLightSceneInfo::AddToScene() { const FLightSceneInfoCompact& LightSceneInfoCompact = Scene->Lights[Id]; // Only need to create light interactions for lights that can cast a shadow, // As deferred shading doesn't need to know anything about the primitives that a light affects if (Proxy->CastsDynamicShadow() || Proxy->CastsStaticShadow() // Lights that should be baked need to check for interactions to track unbuilt state correctly || Proxy->HasStaticLighting() // ES2 path supports dynamic point lights in the base pass using forward rendering, so we need to know the primitives || (Scene->GetFeatureLevel() < ERHIFeatureLevel::SM4 && Proxy->GetLightType() == LightType_Point && Proxy->IsMovable())) { // Add the light to the scene's light octree. Scene->LightOctree.AddElement(LightSceneInfoCompact); // TODO: Special case directional lights, no need to traverse the octree. // Find primitives that the light affects in the primitive octree. FMemMark MemStackMark(FMemStack::Get()); for(FScenePrimitiveOctree::TConstElementBoxIterator<SceneRenderingAllocator> PrimitiveIt( Scene->PrimitiveOctree, GetBoundingBox() ); PrimitiveIt.HasPendingElements(); PrimitiveIt.Advance()) { CreateLightPrimitiveInteraction(LightSceneInfoCompact, PrimitiveIt.GetCurrentElement()); } } }
void FSceneViewState::TrimOcclusionHistory(FRHICommandListImmediate& RHICmdList, float CurrentTime, float MinHistoryTime, float MinQueryTime, int32 FrameNumber) { // Only trim every few frames, since stale entries won't cause problems if (FrameNumber % 6 == 0) { int32 NumBufferedFrames = FOcclusionQueryHelpers::GetNumBufferedFrames(); for(TSet<FPrimitiveOcclusionHistory,FPrimitiveOcclusionHistoryKeyFuncs>::TIterator PrimitiveIt(PrimitiveOcclusionHistorySet); PrimitiveIt; ++PrimitiveIt ) { // If the primitive has an old pending occlusion query, release it. if(PrimitiveIt->LastConsideredTime < MinQueryTime) { PrimitiveIt->ReleaseQueries(RHICmdList, OcclusionQueryPool, NumBufferedFrames); } // If the primitive hasn't been considered for visibility recently, remove its history from the set. if (PrimitiveIt->LastConsideredTime < MinHistoryTime || PrimitiveIt->LastConsideredTime > CurrentTime) { PrimitiveIt.RemoveCurrent(); } } } }