private void CollectShadowMaps(RenderView renderView, ForwardLightingRenderFeature.RenderViewLightData renderViewLightData) { // TODO GRAPHICS REFACTOR Only lights of current scene! var sceneCameraRenderer = renderView.SceneCameraRenderer; var viewport = sceneCameraRenderer.ComputedViewport; foreach (var lightComponent in renderViewLightData.VisibleLightsWithShadows) { var light = lightComponent.Type as IDirectLight; if (light == null) { continue; } var shadowMap = light.Shadow; if (!shadowMap.Enabled) { continue; } // Check if the light has a shadow map renderer var lightType = light.GetType(); ILightShadowMapRenderer renderer; if (!Renderers.TryGetValue(lightType, out renderer)) { continue; } var direction = lightComponent.Direction; var position = lightComponent.Position; // Compute the coverage of this light on the screen var size = light.ComputeScreenCoverage(renderView.Camera, position, direction, viewport.Width, viewport.Height); // Converts the importance into a shadow size factor var sizeFactor = ComputeSizeFactor(shadowMap.Size); // Compute the size of the final shadow map // TODO: Handle GraphicsProfile var shadowMapSize = (int)Math.Min(ReferenceShadowSize * sizeFactor, MathUtil.NextPowerOfTwo(size * sizeFactor)); if (shadowMapSize <= 0) // TODO: Validate < 0 earlier in the setters { continue; } // Get or allocate a ShadowMapTexture var shadowMapTexture = shadowMapTextures.Add(); shadowMapTexture.Initialize(lightComponent, light, shadowMap, shadowMapSize, renderer); renderViewLightData.LightComponentsWithShadows.Add(lightComponent, shadowMapTexture); } }
private void CollectShadowMaps(RenderView renderView, ForwardLightingRenderFeature.RenderViewLightData renderViewLightData) { // TODO GRAPHICS REFACTOR Only lights of current scene! foreach (var renderLight in renderViewLightData.VisibleLightsWithShadows) { var light = renderLight.Type as IDirectLight; if (light == null) { continue; } var shadowMap = light.Shadow; if (!shadowMap.Enabled) { continue; } // Check if the light has a shadow map renderer var renderer = FindRenderer(light); if (renderer == null) { continue; } var direction = renderLight.Direction; var position = renderLight.Position; // Compute the coverage of this light on the screen var size = light.ComputeScreenCoverage(renderView, position, direction); // Converts the importance into a shadow size factor var sizeFactor = ComputeSizeFactor(shadowMap.Size); // Compute the size of the final shadow map // TODO: Handle GraphicsProfile var shadowMapSize = (int)Math.Min(ReferenceShadowSize * sizeFactor, MathUtil.NextPowerOfTwo(size * sizeFactor)); if (shadowMapSize <= 0) // TODO: Validate < 0 earlier in the setters { continue; } var shadowMapTexture = renderer.CreateShadowMapTexture(renderView, renderLight, light, shadowMapSize); // Assign rectangles for shadowmap AssignRectangle(shadowMapTexture); renderViewLightData.RenderLightsWithShadows.Add(renderLight, shadowMapTexture); shadowMaps.Add(shadowMapTexture); } }