1#include "ProcessTask.h"
3#include "Rendering/IContext.h"
5#include "Foundation/Logging/Logger.h"
9#include "Renderer/Renderer.h"
10#include "Renderer/RenderBuffer.h"
11#include "Renderer/RenderTexture.h"
12#include "Renderer/RenderTarget.h"
13#include "Renderer/RenderList.h"
14#include "Resources/BasicBlueNoiseManager.h"
15#include "Services/Variables.h"
16#include "Systems/Core/EnvironmentSystem.h"
17#include "Systems/Appearance/BasicOceanSystem.h"
18#include "Utilities/ValueVariant.h"
27 const RenderSettings& renderSettings = context->renderer->getSettings();
29 EffectDescription desc{};
31 if (context->context->variables->get(
"renderer.reverseDepth",
false)) {
32 desc.definitions.push_back({
"COGS_REVERSE_DEPTH",
"1" });
36 switch (renderSettings.sRGBConversion) {
37 case RenderSettings::SRGBConversion::Fast:
38 desc.definitions.push_back({
"COGS_SRGB_CONVERSION_FAST",
"1" });
40 case RenderSettings::SRGBConversion::Approx:
41 desc.definitions.push_back({
"COGS_SRGB_CONVERSION_APPROX",
"1" });
43 case RenderSettings::SRGBConversion::Exact:
44 desc.definitions.push_back({
"COGS_SRGB_CONVERSION_EXACT",
"1" });
47 assert(
false &&
"Invalid enum");
52 switch (renderSettings.tonemapper) {
53 case RenderSettings::Tonemapper::Reinhard:
54 desc.definitions.push_back({
"COGS_TONEMAP_REINHARD",
"1" });
56 case RenderSettings::Tonemapper::Filmic:
57 desc.definitions.push_back({
"COGS_TONEMAP_FILMIC",
"1" });
59 case RenderSettings::Tonemapper::ACESLuminance:
60 desc.definitions.push_back({
"COGS_TONEMAP_ACES_LUMINANCE",
"1" });
62 case RenderSettings::Tonemapper::PBRNeutral:
63 desc.definitions.push_back({
"COGS_TONEMAP_PBR_NEUTRAL",
"1" });
66 assert(
false &&
"Invalid enum");
74void Cogs::Core::ProcessTask::cleanup(RenderTaskContext * context)
76 if (effect) context->renderer->getEffectCache().release(context, effect);
77 for (
auto & prop : properties) {
81 prop.expressions.clear();
85void Cogs::Core::ProcessTask::setProperties(RenderTaskContext * renderTaskContext,
Cogs::Core::RenderTexture* targetSource)
88 auto * context = renderTaskContext->context;
89 auto * deviceContext = renderTaskContext->device->getImmediateContext();
91 deviceContext->setBlendState(renderTaskContext->states->blendStates[
size_t(blendMode)].handle);
107 for (
auto & p : properties) {
109 switch (p.definition->type) {
110 case ParsedDataType::Float:
111 case ParsedDataType::Float2:
112 case ParsedDataType::Float3:
113 case ParsedDataType::Float4:
114 case ParsedDataType::Float4x4:
115 for (
auto & q : p.expressions) {
116 (&p.floatValue)[q.first] = scope->update(q.second, (&p.definition->floatValue)[q.first]);
119 case ParsedDataType::Int:
120 case ParsedDataType::Int2:
121 case ParsedDataType::Int3:
122 case ParsedDataType::Int4:
123 case ParsedDataType::UInt:
124 case ParsedDataType::UInt2:
125 case ParsedDataType::UInt3:
126 case ParsedDataType::UInt4:
127 for (
auto & q : p.expressions) {
128 (&p.intValue)[q.first] = scope->update(q.second, (&p.definition->intValue)[q.first]);
136 auto basicOceanSystem = context->basicOceanSystem;
137 if (basicOceanSystem && !basicOceanSystem->pool.size()) {
138 basicOceanSystem =
nullptr;
141 auto renderList = input.get(RenderResourceType::RenderList);
142 const EnvironmentComponent * envComp =
nullptr;
144 envComp = renderList->renderList->viewportData->environment.resolveComponent<EnvironmentComponent>();
147 auto binding = renderTaskContext->device->getEffects()->getTextureBinding(effect->handle,
"blueNoise_LDR_RGBA", 0);
149 auto& blueNoiseManager = renderTaskContext->context->blueNoiseManager;
150 blueNoiseManager->enable();
151 TextureHandle blueNoise = blueNoiseManager->getBlueNoiseHandle(
false)->texture;
152 RenderTexture * blueNoiseTexture = renderTaskContext->renderer->getRenderResources().getRenderTexture(blueNoise);
153 if (blueNoiseTexture) {
154 deviceContext->setTexture(binding, blueNoiseTexture->textureHandle);
160 for (
auto & p : properties) {
161 bool setSampler =
true;
162 switch (p.definition->type)
164 case ParsedDataType::Texture2D:
166 switch (p.definition->valueHash)
168 case Cogs::hash(
"Cogs.EnvironmentRadiance.NoSampler"):
171 case
Cogs::
hash(
"Cogs.EnvironmentRadiance.SetSampler"):
173 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(envComp->radiance);
175 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
177 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
183 case Cogs::hash(
"Cogs.SubseaRadiance.NoSampler"):
186 case
Cogs::hash(
"Cogs.SubseaRadiance.SetSampler"):
188 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(envComp->subseaRadiance);
190 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
192 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
198 case Cogs::hash(
"Cogs.BasicOceanSystem.Real"):
199 if (basicOceanSystem) {
200 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(basicOceanSystem->getRealTex());
202 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
203 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
208 case Cogs::hash(
"Cogs.BasicOceanSystem.Imag"):
209 if (basicOceanSystem) {
210 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(basicOceanSystem->getImagTex());
212 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
213 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
218 case Cogs::hash(
"Cogs.BasicOceanSystem.Tangent"):
219 if (basicOceanSystem) {
220 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(basicOceanSystem->getTangentTex());
222 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
223 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
229 auto inputSource = input.get(p.definition->value);
231 RenderTexture* tex =
nullptr;
232 if (inputSource->type == RenderResourceType::RenderTexture) {
233 tex = inputSource->renderTexure;
234 }
else if (inputSource->type == RenderResourceType::RenderTarget) {
235 tex = inputSource->renderTarget->textures[0];
238 if (tex ==
nullptr) {
241 else if (tex == targetSource) {
245 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
246 deviceContext->setSamplerState(p.texture.samplerName, texUnit, p.texture.samplerState);
252 case ParsedDataType::Buffer:
254 auto inputSource = input.get(p.definition->value);
257 auto outputSource = output.get(p.definition->value);
259 deviceContext->setBuffer(p.definition->key, outputSource->renderBuffer->buffer);
261 deviceContext->setBuffer(p.definition->key, inputSource->renderBuffer->buffer);
265 case ParsedDataType::ConstantBuffer:
266 switch (StringView(p.definition->value).hash()) {
268 deviceContext->setConstantBuffer(p.definition->key, renderTaskContext->engineBuffers->sceneBufferHandle);
271 deviceContext->setConstantBuffer(p.definition->key, renderTaskContext->engineBuffers->lightBufferHandle);
275 case ParsedDataType::Float4x4:
276 switch (StringView(p.definition->value).hash())
279 if (renderList && renderList->renderList->viewportData) {
280 deviceContext->setMatrixVariable(p.definition->key, glm::value_ptr(renderList->renderList->viewportData->inverseViewMatrix));
284 if (renderList && renderList->renderList->viewportData) {
285 deviceContext->setMatrixVariable(p.definition->key, glm::value_ptr(renderList->renderList->viewportData->inverseProjectionMatrix));
289 if (renderList && renderList->renderList->viewportData) {
290 deviceContext->setMatrixVariable(p.definition->key, glm::value_ptr(renderList->renderList->viewportData->projectionMatrix));
293 case Cogs::hash(
"inverseViewProjectionMatrix"):
294 if (renderList && renderList->renderList->viewportData) {
295 deviceContext->setMatrixVariable(p.definition->key, glm::value_ptr(renderList->renderList->viewportData->inverseViewProjectionMatrix));
299 deviceContext->setMatrixVariable(p.definition->key, glm::value_ptr(p.float4x4Value));
303 case ParsedDataType::Float:
304 switch (p.definition->valueHash)
306 case Cogs::hash(
"Cogs.BasicOceanSystem.SignificantWaveHeight"):
307 deviceContext->setScalarVariable(p.definition->key, context->basicOceanSystem->getSignificantWaveHeight());
309 case Cogs::hash(
"Cogs.BasicOceanSystem.TileScale"):
310 deviceContext->setScalarVariable(p.definition->key, context->basicOceanSystem->getTileScale());
313 if (renderList && renderList->renderList->viewportData) {
314 deviceContext->setScalarVariable(p.definition->key, renderList->renderList->viewportData->exposure);
318 deviceContext->setScalarVariable(p.definition->key, p.floatValue);
322 case ParsedDataType::Float2:
323 switch (p.definition->valueHash)
326 if (renderList && renderList->renderList->viewportData) {
327 deviceContext->setVector2Variable(p.definition->key, glm::value_ptr(renderList->renderList->viewportData->viewportSize));
331 if (renderList && renderList->renderList->viewportData) {
332 const glm::vec2 viewSizeRcp = 1.f / renderList->renderList->viewportData->viewportSize;
333 deviceContext->setVector2Variable(p.definition->key, glm::value_ptr(viewSizeRcp));
337 deviceContext->setVector2Variable(p.definition->key, glm::value_ptr(p.float2Value));
340 case ParsedDataType::Float3:
341 deviceContext->setVector3Variable(p.definition->key, glm::value_ptr(p.float3Value));
343 case ParsedDataType::Float4:
344 deviceContext->setVector4Variable(p.definition->key, glm::value_ptr(p.float4Value));
346 case ParsedDataType::UInt:
347 deviceContext->setScalarVariable(p.definition->key, (
int)p.uintValue);
349 case ParsedDataType::Int:
350 deviceContext->setScalarVariable(p.definition->key, p.intValue);
Log implementation class.
bool HandleIsValid(const ResourceHandle_t< T > &handle)
Check if the given resource is valid, that is not equal to NoHandle or InvalidHandle.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Contains all Cogs related functionality.
constexpr size_t hash() noexcept
Simple getter function that returns the initial value for fnv1a hashing.