Esempio n. 1
0
        void SetupEntity(Entity entity)
        {
            var cPostProcess = entity.GetComponent <PostProcessComponent>();

            cPostProcess.CommandManager.Clear();
            var postProcessor = new PostProcessor(Services, cPostProcess.OutputWidth, cPostProcess.OutputHeight);
            var techniques    = cPostProcess.Techniques.ToDictionary(t => t.Name, t => t);
            var actions       = cPostProcess.Actions.ToArray();

            foreach (PostProcessAction ppAction in actions)
            {
                if (ppAction.AssetName == Param.Engine)
                {
                    switch (ppAction.Technique)
                    {
                    case Param.EngineActions.RenderSceneToTexture:
                        postProcessor.ProcessAction(ppAction, sceneCommands, cPostProcess.TagFilter);
                        break;
                    }
                }
                else
                {
                    var       cModel = entity.GetComponent <ModelComponent>();
                    Technique effect = techniques[string.Format("{0}.{1}", ppAction.AssetName, ppAction.Technique)];
                    postProcessor.ProcessAction(ppAction, cModel.Model, effect, entity);
                }
            }

            var commandManager = cPostProcess.CommandManager;

            commandManager.AddLast(postProcessor.Result());
            if (cPostProcess.Target == TargetOutput.Backbuffer)
            {
                var lastCommand = commandManager.Last();
                commandManager.AddBefore(lastCommand, new ChangeTargetsCommand(Services)
                {
                    Target = Services.GetService <IGraphicsDeviceService>().DirectXDevice
                });
            }
            commandManager.Initialize();

            var postProcessCommands = commandManager.OfType <IPostProcessCommand>().ToArray();

            for (int i = 1; i < postProcessCommands.Length; i++)
            {
                var ppAction = actions[i];
                postProcessCommands[i].SetInputs(ppAction.InputIndices.Select(idx => postProcessCommands[idx].Output));
            }
        }