private void UpdateShaders(GraphicsDevice graphicsDevice) { if (ComputeColor != null && ComputeScalar != null) { var shaderGeneratorContext = new ShaderGeneratorContext(graphicsDevice) { Parameters = Parameters, ColorSpace = graphicsDevice.ColorSpace }; // Don't forget to set the proper color space! shaderGeneratorContext.ColorSpace = graphicsDevice.ColorSpace; var newShaderBaseColor = ComputeColor.GenerateShaderSource(shaderGeneratorContext, new MaterialComputeColorKeys(ParticleCustomShaderKeys.EmissiveMap, ParticleCustomShaderKeys.EmissiveValue, Color.White)); var newShaderBaseScalar = ComputeScalar.GenerateShaderSource(shaderGeneratorContext, new MaterialComputeColorKeys(ParticleCustomShaderKeys.IntensityMap, ParticleCustomShaderKeys.IntensityValue, Color.White)); // Check if shader code has changed if (!newShaderBaseColor.Equals(shaderBaseColor) || !newShaderBaseScalar.Equals(shaderBaseScalar)) { shaderBaseColor = newShaderBaseColor; shaderBaseScalar = newShaderBaseScalar; Parameters.Set(ParticleCustomShaderKeys.BaseColor, shaderBaseColor); Parameters.Set(ParticleCustomShaderKeys.BaseIntensity, shaderBaseScalar); // TODO: Is this necessary? HasVertexLayoutChanged = true; } } }
/// <summary> /// Polls the shader generator if the shader code has changed and has to be reloaded /// </summary> /// <param name="graphicsDevice">The current <see cref="GraphicsDevice"/></param> private void UpdateShaders(GraphicsDevice graphicsDevice) { // TODO Part of the graphics improvement XK-3052 // Don't do this every frame, we have to propagate changes better if (--shadersUpdateCounter > 0) return; shadersUpdateCounter = 10; if (ComputeColor != null) { if (ComputeColor.HasChanged) { var shaderGeneratorContext = new ShaderGeneratorContext(graphicsDevice) { Parameters = Parameters, ColorSpace = graphicsDevice.ColorSpace }; shaderSource = ComputeColor.GenerateShaderSource(shaderGeneratorContext, new MaterialComputeColorKeys(ParticleBaseKeys.EmissiveMap, ParticleBaseKeys.EmissiveValue, Color.White)); if (Parameters.Get(ParticleBaseKeys.BaseColor)?.Equals(shaderSource) ?? false) { shaderSource = Parameters.Get(ParticleBaseKeys.BaseColor); } else { Parameters.Set(ParticleBaseKeys.BaseColor, shaderSource); } HasVertexLayoutChanged = true; } } }