/*
===========================================================================
Copyright (C) 2024 Gian 'myT' Schellenbaum
This file is part of Challenge Quake 3 (CNQ3).
Challenge Quake 3 is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
Challenge Quake 3 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Challenge Quake 3. If not, see .
===========================================================================
*/
// accumulation depth of field: debug overlay
#include "common.hlsli"
#include "fullscreen.hlsli"
#include "dof.hlsli"
#include "scene_view.h.hlsli"
cbuffer RootConstants
{
matrix mvp; // displaced view, to project to CS
matrix invMvp; // main view, to unproject to WS
uint colorTextureIndex;
uint depthTextureIndex;
uint debugMode; // 1: colorized coc, 2: constant intensity far field
int tcScale;
float focusDist;
float maxNearCocCS;
float maxFarCocCS;
};
float4 ps(VOut input) : SV_Target
{
SceneView scene = GetSceneView();
Texture2D colorTexture = ResourceDescriptorHeap[colorTextureIndex];
Texture2D depthTexture = ResourceDescriptorHeap[depthTextureIndex];
int3 tcColor = int3(input.position.xy, 0);
int3 tcDepth = int3(input.position.xy / tcScale, 0);
float3 color = colorTexture.Load(tcColor).rgb;
float depthZW = depthTexture.Load(tcDepth);
float depth = scene.LinearDepth(depthZW);
bool nearField = depth < focusDist;
float4 result;
if(debugMode == 1)
{
float quadPosXCS = input.texCoords.x * 2.0 - 1.0;
float quadPosYCS = (1.0 - input.texCoords.y) * 2.0 - 1.0;
float4 positionWS = mul(invMvp, float4(quadPosXCS, quadPosYCS, depthZW, 1));
float4 positionCS = mul(mvp, float4(positionWS.xyz / positionWS.w, 1));
float coc = distance(positionCS.xy / positionCS.w, float2(quadPosXCS, quadPosYCS));
result = DOF_DebugCoc(color, nearField, saturate(coc / maxNearCocCS), saturate(coc / maxFarCocCS));
}
else if(debugMode == 2)
{
result = DOF_DebugFocusPlane(color, nearField);
}
else
{
result = float4(color, 1);
}
return result;
}