Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 private void UpdateLevels(DynamicEffectInstance effectInstance)
 {
     PrepareUpdater(effectInstance);
     updater.ComputeLevels(effectInstance.UpdaterDefinition);
 }
Ejemplo n.º 6
0
 private bool HasCollectionChanged(DynamicEffectInstance effectInstance)
 {
     PrepareUpdater(effectInstance);
     return(updater.HasChanged(effectInstance.UpdaterDefinition));
 }