1#include "PostProcessTask.h"
2#include "Resources/VertexFormats.h"
5#include "Renderer/IRenderer.h"
6#include "Renderer/RenderTarget.h"
7#include "Systems/Core/CameraSystem.h"
9#include "Rendering/IGraphicsDevice.h"
10#include "Rendering/IContext.h"
11#include "Rendering/IBuffers.h"
13#include <glm/gtc/type_ptr.hpp>
19 const char * names[] = {
27void Cogs::Core::PostProcessTask::initialize(RenderTaskContext * context)
29 ProcessTask::initialize(context);
31 auto effects = context->device->getEffects();
34 desc.vs =
"Engine/FullscreenV3T2VS.hlsl";
36 for (
auto & p : effectParameter.values) {
37 if (p.key ==
"definitions") {
38 for (
auto & d : p.values) {
39 desc.definitions.push_back({ d.key, d.value });
42 if (p.key ==
"source") {
47 effect = context->renderer->getEffectCache().loadEffect(context, desc);
52 auto * buffers = context->device->getBuffers();
53 inputLayout = buffers->loadInputLayout(&VertexFormats::Pos4f, 1, effect->handle);
55 for (
size_t i = 0; i < 4; ++i) {
56 auto binding = effects->getSamplerStateBinding(effect->handle, names[i], 0);
59 samplerStateBindings[i] = binding;
60 samplerStates[i] = context->states->commonSamplerStates[i];
67void Cogs::Core::PostProcessTask::apply(RenderTaskContext * context)
69 if (scopeName.empty()) {
70 scopeName = std::string(
"PostProcessTask<") + name +
">::apply";
73 DynamicRenderInstrumentationScope(context->device->getImmediateContext(), SCOPE_RENDERING,
"PostProcessTask", scopeName.c_str());
75 RenderTarget* renderTarget = output.get(RenderResourceType::RenderTarget)->renderTarget;
85 auto deviceContext = context->device->getImmediateContext();
86 deviceContext->setEffect(effect->handle);
87 deviceContext->setRenderTarget(renderTarget->renderTargetHandle, renderTarget->depthTargetHandle);
91 deviceContext->clearRenderTarget(glm::value_ptr(context->renderer->getBackgroundColor()));
93 deviceContext->clearRenderTarget(glm::value_ptr(renderTarget->getClearColor()));
97 deviceContext->clearDepth(context->renderer->getClearDepth());
101 if (viewportFromTarget) {
102 deviceContext->setViewport(0.0f, 0.0f,
static_cast<float>(renderTarget->width),
static_cast<float>(renderTarget->height));
106 deviceContext->setViewport(
107 context->cameraData->viewportOrigin.x, context->cameraData->viewportOrigin.y,
108 context->cameraData->viewportSize.x, context->cameraData->viewportSize.y
114 deviceContext->setDepthStencilState(context->states->noTestDepthStencilStateHandle);
116 deviceContext->setDepthStencilState(context->states->noDepthStencilStateHandle);
119 deviceContext->setRasterizerState(context->states->defaultRasterizerStateHandle);
120 deviceContext->setBlendState(context->states->blendStates[
size_t(
BlendMode::None)].handle);
122 for (
size_t i = 0; i < 4; ++i) {
124 deviceContext->setSamplerState(samplerStateBindings[i], samplerStates[i]);
128 setProperties(context);
130 deviceContext->setVertexBuffers(&context->states->fullScreenTriangle, 1);
132 deviceContext->setInputLayout(inputLayout);
bool HandleIsValid(const ResourceHandle_t< T > &handle)
Check if the given resource is valid, that is not equal to NoHandle or InvalidHandle.
@ None
No blending enabled for opaque shapes, defaults to Blend for transparent shapes.
Contains all Cogs related functionality.
Contains an effect description used to load a single effect.
static const Handle_t NoHandle
Represents a handle to nothing.
@ TriangleList
List of triangles.