/// <summary> /// Prepare the EffectParameterUpdater for the effect instance. /// </summary> /// <param name="effectInstance">The effect instance.</param> private void PrepareUpdater(DynamicEffectInstance effectInstance) { parameterCollections.Clear(true); parameterCollections.Add(effectInstance.Effect.CompilationParameters); effectInstance.FillParameterCollections(parameterCollections); parameterCollections.Add(GraphicsDevice.Parameters); updater.Update(effectInstance.UpdaterDefinition, parameterCollections.Items, parameterCollections.Count); }
/// <summary> /// Update a dynamic effect instance based on its parameters. /// </summary> /// <param name="effectInstance">A dynmaic effect instance</param> /// <returns><c>true</c> if the effect was recomiled on the effect instance, <c>false</c> otherwise.</returns> public bool Update(DynamicEffectInstance effectInstance) { bool effectChanged = false; if (effectInstance.Effect == null || !EffectSystem.IsValid(effectInstance.Effect) || HasCollectionChanged(effectInstance)) { CreateEffect(effectInstance); effectChanged = true; } return(effectChanged); }
private void CreateEffect(DynamicEffectInstance effectInstance) { var compilerParameters = new CompilerParameters(); parameterCollections.Clear(true); effectInstance.FillParameterCollections(parameterCollections); foreach (var parameterCollection in parameterCollections) { if (parameterCollection != null) { foreach (var parameter in parameterCollection.InternalValues) { compilerParameters.SetObject(parameter.Key, parameter.Value.Object); } } } foreach (var parameter in GraphicsDevice.Parameters.InternalValues) { compilerParameters.SetObject(parameter.Key, parameter.Value.Object); } // Compile shader // possible exception in LoadEffect var effect = EffectSystem.LoadEffect(EffectName, compilerParameters); if (!ReferenceEquals(effect, effectInstance.Effect)) { // Copy back parameters set on previous effect to new effect if (effectInstance.Effect != null) { foreach (var parameter in effectInstance.Effect.Parameters.InternalValues) { effect.Parameters.SetObject(parameter.Key, parameter.Value.Object); } } effectInstance.Effect = effect; effectInstance.UpdaterDefinition = new EffectParameterUpdaterDefinition(effect); } else { // Same effect than previous one effectInstance.UpdaterDefinition.UpdateCounter(effect.CompilationParameters); } UpdateLevels(effectInstance); updater.UpdateCounters(effectInstance.UpdaterDefinition); }
/// <summary> /// Update a dynamic effect instance based on its parameters. /// </summary> /// <param name="effectInstance">A dynmaic effect instance</param> /// <returns><c>true</c> if the effect was recomiled on the effect instance, <c>false</c> otherwise.</returns> public bool Update(DynamicEffectInstance effectInstance) { bool effectChanged = false; if (effectInstance.Effect != null && effectInstance.Effect.Changed) { effectInstance.UpdaterDefinition.Initialize(effectInstance.Effect); UpdateLevels(effectInstance); effectChanged = true; } if (effectInstance.Effect == null || HasCollectionChanged(effectInstance)) { CreateEffect(effectInstance); effectChanged = true; } return(effectChanged); }
private void UpdateLevels(DynamicEffectInstance effectInstance) { PrepareUpdater(effectInstance); updater.ComputeLevels(effectInstance.UpdaterDefinition); }
private bool HasCollectionChanged(DynamicEffectInstance effectInstance) { PrepareUpdater(effectInstance); return(updater.HasChanged(effectInstance.UpdaterDefinition)); }