private void ReloadEffect()
        {
            // FIXME: We shouldn't be casting IAssetContentManager like this!
            var assetContentManager = _assetContentManager as AssetContentManager;

            if (assetContentManager == null)
            {
                throw new NoAssetContentManagerException();
            }

            var serviceProvider        = assetContentManager.ServiceProvider;
            var graphicsDeviceProvider =
                (IGraphicsDeviceService)serviceProvider.GetService(typeof(IGraphicsDeviceService));

            if (graphicsDeviceProvider != null && graphicsDeviceProvider.GraphicsDevice != null)
            {
                var graphicsDevice = graphicsDeviceProvider.GraphicsDevice;

                var compiledUnifiedShaderReader = new CompiledUnifiedShaderReader(this.PlatformData.Data);

                // Use the new EffectWithSemantics class that allows for extensible semantics.
                var availableSemantics = _kernel.GetAll <IEffectSemantic>();
                this.Effect = new ProtogameEffect(graphicsDevice, compiledUnifiedShaderReader, Name, availableSemantics);
            }
        }
        private void ReloadEffect()
        {
            // FIXME: We shouldn't be casting IAssetContentManager like this!
            var assetContentManager = _assetContentManager as AssetContentManager;

            if (assetContentManager == null)
            {
                throw new NoAssetContentManagerException();
            }

            var serviceProvider        = assetContentManager.ServiceProvider;
            var graphicsDeviceProvider =
                (IGraphicsDeviceService)serviceProvider.GetService(typeof(IGraphicsDeviceService));

            if (graphicsDeviceProvider != null && graphicsDeviceProvider.GraphicsDevice != null)
            {
                var graphicsDevice = graphicsDeviceProvider.GraphicsDevice;

                var compiledUnifiedShaderReader = new CompiledUnifiedShaderReader(this.PlatformData.Data);

                // Load the effect for the first time.
                var effect = new Effect(graphicsDevice, compiledUnifiedShaderReader);

                // Determine what kind of effect class we should use.
                var hasSeperatedMatrixes = effect.Parameters["World"] != null && effect.Parameters["View"] != null && effect.Parameters["Projection"] != null;
                var hasMatrix            = effect.Parameters["WorldViewProj"] != null || hasSeperatedMatrixes;
                var hasTexture           = effect.Parameters["Texture"] != null;
                var hasBones             = effect.Parameters["Bones"] != null;
                if (hasMatrix && hasTexture && hasBones)
                {
                    this.Effect = new EffectWithMatricesAndTextureAndBones(graphicsDevice, this.PlatformData.Data, hasSeperatedMatrixes);
                }
                else if (hasMatrix && hasTexture)
                {
                    this.Effect = new EffectWithMatricesAndTexture(graphicsDevice, this.PlatformData.Data, hasSeperatedMatrixes);
                }
                else if (hasMatrix)
                {
                    this.Effect = new EffectWithMatrices(graphicsDevice, this.PlatformData.Data, hasSeperatedMatrixes);
                }
                else if (hasTexture)
                {
                    this.Effect = new EffectWithTexture(graphicsDevice, this.PlatformData.Data);
                }
                else
                {
                    this.Effect = effect;
                }

                // Assign the asset name so we can trace it back.
                this.Effect.Name = this.Name;
            }
        }