private void SetupLight(RenderDrawContext context, RenderLightShaft lightShaft, LightShadowMapTexture shadowMapTexture, ParameterCollection lightParameterCollection) { BoundingBoxExt box = new BoundingBoxExt(new Vector3(-float.MaxValue), new Vector3(float.MaxValue)); // TODO LightShaftRenderData data; if (!renderData.TryGetValue(lightShaft.Light2, out data)) { data = new LightShaftRenderData(); renderData.Add(lightShaft.Light2, data); UpdateRenderData(context, data, lightShaft, shadowMapTexture); } if (shadowMapTexture != null && data.ShadowMapRenderer != null) { // Detect changed shadow map renderer or type if (data.ShadowMapRenderer != shadowMapTexture.Renderer || data.ShadowType != shadowMapTexture.ShadowType) { UpdateRenderData(context, data, lightShaft, shadowMapTexture); } } else if (shadowMapTexture?.Renderer != data.ShadowMapRenderer) // Change from no shadows to shadows { UpdateRenderData(context, data, lightShaft, shadowMapTexture); } data.RenderViews[0] = context.RenderContext.RenderView; data.ShaderGroup.Reset(); data.ShaderGroup.SetViews(data.RenderViews); data.ShaderGroup.AddView(0, context.RenderContext.RenderView, 1); data.ShaderGroup.AddLight(lightShaft.Light, shadowMapTexture); data.ShaderGroup.UpdateLayout("lightGroup"); lightParameterCollection.Set(LightShaftsEffectKeys.LightGroup, data.ShaderGroup.ShaderSource); // Update the effect here so the layout is correct lightShaftsEffectShader.EffectInstance.UpdateEffect(GraphicsDevice); data.ShaderGroup.ApplyViewParameters(context, 0, lightParameterCollection); data.ShaderGroup.ApplyDrawParameters(context, 0, lightParameterCollection, ref box); data.UsageCounter = usageCounter; }
private void DrawLightShaft(RenderDrawContext context, RenderLightShaft lightShaft) { lightShaftsEffectShader.Parameters.Set(LightShaftsShaderKeys.DensityFactor, lightShaft.DensityFactor); lightShaftsEffectShader.Draw(context, "Light shaft"); }
private void UpdateRenderData(RenderDrawContext context, LightShaftRenderData data, RenderLightShaft lightShaft, LightShadowMapTexture shadowMapTexture) { if (lightShaft.Light2 is LightPoint) { data.GroupRenderer = new LightPointGroupRenderer(); } else if (lightShaft.Light2 is LightSpot) { data.GroupRenderer = new LightSpotGroupRenderer(); } else if (lightShaft.Light2 is LightDirectional) { data.GroupRenderer = new LightDirectionalGroupRenderer(); } else { throw new InvalidOperationException("Unsupported light type"); } ILightShadowMapShaderGroupData shadowGroup = null; if (shadowMapTexture != null) { data.ShadowType = shadowMapTexture.ShadowType; data.ShadowMapRenderer = shadowMapTexture.Renderer; shadowGroup = data.ShadowMapRenderer.CreateShaderGroupData(data.ShadowType); } else { data.ShadowType = 0; data.ShadowMapRenderer = null; } data.ShaderGroup = data.GroupRenderer.CreateLightShaderGroup(context, shadowGroup); // TODO: Implement support for texture projection and attenuation? }