Skip to content

Commit 239e169

Browse files
committed
* UPD: [xrRender] Various fixes, water SSR works again
1 parent 5ae28ab commit 239e169

15 files changed

+200
-51
lines changed

src/Layers/xrRender/SkeletonX.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ void CSkeletonX::_Render(CBackend& cmd_list, ref_geom& hGeom, u32 vCount, u32 iO
5050
if (CalcVelocity)
5151
{
5252
// Previous WVP
53+
auto tmp = RImplementation.Target->Matrix_HUD_previous;
5354
RCache.set_c("m_WVP_prev", RImplementation.Target->Matrix_HUD_previous);
5455

5556
if (RenderMode > 1 && Device.dwFrame > Parent->CurrentFrame)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "stdafx.h"
2+
3+
#include "blender_lut.h"
4+
5+
CBlender_lut::CBlender_lut() { description.CLS = 0; }
6+
7+
LPCSTR CBlender_lut::getComment()
8+
{
9+
return "INTERNAL: LUT";
10+
}
11+
12+
void CBlender_lut::Compile(CBlender_Compile& C)
13+
{
14+
IBlender::Compile(C);
15+
16+
C.r_Pass("stub_screen_space", "pp_lut", FALSE, FALSE, FALSE);
17+
18+
C.r_dx11Texture("s_image", r2_RT_generic0);// r2_RT_generic0
19+
C.r_dx11Texture("debug_image", r2_RT_ssfx_hud);// r2_RT_generic0
20+
C.r_dx11Texture("debug_noise", "fx\\blue_noise");// r2_RT_generic0
21+
22+
C.r_dx11Texture("s_lut_atlas", "shaders\\lut_atlas");
23+
24+
C.r_dx11Sampler("smp_base");
25+
C.r_dx11Sampler("smp_nofilter");
26+
C.r_dx11Sampler("smp_rtlinear");
27+
C.r_dx11Sampler("smp_linear");
28+
C.r_End();
29+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
class CBlender_lut : public IBlender
4+
{
5+
public:
6+
CBlender_lut();
7+
~CBlender_lut() override = default;
8+
9+
LPCSTR getComment() override;
10+
void Compile(CBlender_Compile& C) override;
11+
};

src/Layers/xrRender/r__dsgraph_render.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -243,19 +243,20 @@ void __fastcall water_node_ssr(u32 context_id, T& item)
243243

244244
dxRender_Visual* V = item.second.pVisual;
245245
VERIFY(V && V->shader._get());
246-
dsgraph.cmd_list.set_Element(item.second.se);
246+
247+
dsgraph.cmd_list.set_Shader(RImplementation.Target->s_ssfx_water_ssr);
248+
247249
dsgraph.cmd_list.set_xform_world(item.second.Matrix);
248250
RImplementation.apply_object(dsgraph.cmd_list, item.second.pObject);
249251
dsgraph.cmd_list.apply_lmaterial();
250-
hud_transform_helper::apply_custom_state(dsgraph.cmd_list);
251252

252253
dsgraph.cmd_list.set_c("cam_pos", RImplementation.Target->Position_previous.x, RImplementation.Target->Position_previous.y, RImplementation.Target->Position_previous.z, 0.0f);
253254

254255
// Previous matrix data
255256
dsgraph.cmd_list.set_c("m_previous", item.second.PrevMatrix);
256257
item.second.PrevMatrix.set(dsgraph.cmd_list.xforms.m_wvp);
257258

258-
V->Render(dsgraph.cmd_list, calcLOD(item.first, V->vis.sphere.R), dsgraph.o.phase == CRender::PHASE_SMAP);
259+
V->Render(dsgraph.cmd_list, calcLOD(item.first, V->vis.sphere.R), false);
259260
#endif
260261
}
261262

@@ -267,24 +268,22 @@ void __fastcall water_node(u32 context_id, T& item)
267268

268269
dxRender_Visual* V = item.second.pVisual;
269270
VERIFY(V && V->shader._get());
270-
dsgraph.cmd_list.set_Element(item.second.se);
271+
272+
if (RImplementation.o.ssfx_water)
273+
{
274+
dsgraph.cmd_list.set_Shader(RImplementation.Target->s_ssfx_water);
275+
}
276+
271277
dsgraph.cmd_list.set_xform_world(item.second.Matrix);
272278
RImplementation.apply_object(dsgraph.cmd_list, item.second.pObject);
273279
dsgraph.cmd_list.apply_lmaterial();
274-
hud_transform_helper::apply_custom_state(dsgraph.cmd_list);
275-
276-
dsgraph.cmd_list.set_c("cam_pos", RImplementation.Target->Position_previous.x, RImplementation.Target->Position_previous.y, RImplementation.Target->Position_previous.z, 0.0f);
277-
278-
// Previous matrix data
279-
dsgraph.cmd_list.set_c("m_previous", item.second.PrevMatrix);
280-
item.second.PrevMatrix.set(dsgraph.cmd_list.xforms.m_wvp);
281280

282281
// Wind settings
283282
float WindDir = g_pGamePersistent->Environment().CurrentEnv.wind_direction;
284283
float WindVel = g_pGamePersistent->Environment().CurrentEnv.wind_velocity;
285284
dsgraph.cmd_list.set_c("wind_setup", WindDir, WindVel, 0.f, 0.f);
286285

287-
V->Render(dsgraph.cmd_list, calcLOD(item.first, V->vis.sphere.R), dsgraph.o.phase == CRender::PHASE_SMAP);
286+
V->Render(dsgraph.cmd_list, calcLOD(item.first, V->vis.sphere.R), false);
288287
#endif
289288
}
290289

@@ -326,22 +325,27 @@ void R_dsgraph_structure::render_hud(bool NoPS)
326325
ZoneScoped;
327326
PIX_EVENT_CTX(cmd_list, dsgraph_render_hud);
328327

328+
if (mapHUD.empty())
329+
{
330+
#if RENDER == R_R1
331+
if (g_pGameLevel->pHUD && g_pGameLevel->pHUD->RenderActiveItemUIQuery())
332+
render_hud_ui(); // hud ui
333+
#endif
334+
return;
335+
}
336+
329337
if (!NoPS)
330338
{
339+
hud_transform_helper helper{ cmd_list };
331340
sort_front_to_back_render_and_clean(context_id, mapHUD);
332341
}
333342
else
334343
{
344+
hud_transform_helper helper{ cmd_list };
335345
HUDMask.traverse_left_right(context_id, hud_node);
336346
HUDMask.clear();
337347
}
338348

339-
if (!mapHUD.empty())
340-
{
341-
hud_transform_helper helper{ cmd_list };
342-
sort_front_to_back_render_and_clean(context_id, mapHUD);
343-
}
344-
345349
#if RENDER == R_R1
346350
if (g_pGameLevel->pHUD && g_pGameLevel->pHUD->RenderActiveItemUIQuery())
347351
render_hud_ui(); // hud ui
@@ -512,7 +516,6 @@ void R_dsgraph_structure::render_R1_box(IRender_Sector::sector_id_t sector_id, F
512516
void R_dsgraph_structure::r_dsgraph_render_water_ssr()
513517
{
514518
mapWater.traverse_left_right(context_id, water_node_ssr);
515-
mapWater.clear();
516519
}
517520

518521
void R_dsgraph_structure::r_dsgraph_render_water()

src/Layers/xrRender/r__dsgraph_render_lods.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,4 @@ void R_dsgraph_structure::render_lods(bool _setup_zb, bool _clear)
152152

153153
if (_clear)
154154
mapLOD.clear();
155-
156-
mapWater.clear();
157155
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include "stdafx.h"
2+
3+
void CRenderTarget::phase_lut()
4+
{
5+
PIX_EVENT(phase_LUT);
6+
7+
//Constants
8+
u32 Offset = 0;
9+
u32 C = color_rgba(0, 0, 0, 255);
10+
11+
float d_Z = EPS_S;
12+
float d_W = 1.0f;
13+
float w = float(Device.dwWidth);
14+
float h = float(Device.dwHeight);
15+
16+
Fvector2 p0, p1;
17+
#if defined(USE_DX10) || defined(USE_DX11)
18+
p0.set(0.0f, 0.0f);
19+
p1.set(1.0f, 1.0f);
20+
#else
21+
p0.set(0.5f / w, 0.5f / h);
22+
p1.set((w + 0.5f) / w, (h + 0.5f) / h);
23+
#endif
24+
25+
//////////////////////////////////////////////////////////////////////////
26+
//Set MSAA/NonMSAA rendertarget
27+
#if defined(USE_DX10) || defined(USE_DX11)
28+
ref_rt& dest_rt = RImplementation.o.msaa ? rt_Generic : rt_Color;
29+
u_setrt(RCache, dest_rt, 0, 0, NULL);
30+
#else
31+
u_setrt(rt_Generic_0, nullptr, nullptr, nullptr);
32+
#endif
33+
34+
RCache.set_CullMode(CULL_NONE);
35+
RCache.set_Stencil(FALSE);
36+
37+
//Fill vertex buffer
38+
FVF::TL* pv = (FVF::TL*)RImplementation.Vertex.Lock(4, g_combine->vb_stride, Offset);
39+
pv->set(0, float(h), d_Z, d_W, C, p0.x, p1.y); pv++;
40+
pv->set(0, 0, d_Z, d_W, C, p0.x, p0.y); pv++;
41+
pv->set(float(w), float(h), d_Z, d_W, C, p1.x, p1.y); pv++;
42+
pv->set(float(w), 0, d_Z, d_W, C, p1.x, p0.y); pv++;
43+
RImplementation.Vertex.Unlock(4, g_combine->vb_stride);
44+
45+
//Set pass
46+
RCache.set_Element(s_lut->E[0]);
47+
48+
//Set geometry
49+
RCache.set_Geometry(g_combine);
50+
RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2);
51+
52+
#if defined(USE_DX10) || defined(USE_DX11)
53+
HW.get_context(CHW::IMM_CTX_ID)->CopyResource(rt_Generic_0->pTexture->surface_get(), dest_rt->pTexture->surface_get());
54+
#endif
55+
};

src/Layers/xrRenderPC_R4/r4_rendertarget.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ class CRenderTarget : public IRender_Target
3131
IBlender* b_accum_volumetric_msaa[8]{};
3232

3333
// [SSS Stuff]
34-
IBlender* b_ssfx_ssr;
35-
IBlender* b_ssfx_volumetric_blur;
36-
IBlender* b_ssfx_ao;
34+
IBlender* b_ssfx_ssr{};
35+
IBlender* b_ssfx_volumetric_blur{};
36+
IBlender* b_ssfx_ao{};
3737

3838
#ifdef DEBUG
3939
struct dbg_line_t
@@ -158,6 +158,7 @@ class CRenderTarget : public IRender_Target
158158
ref_shader s_gasmask_drops;
159159
ref_shader s_gasmask_dudv;
160160
ref_shader s_nightvision;
161+
ref_shader s_lut;
161162

162163
// Screen Space Shaders Stuff
163164
ref_shader s_ssfx_ssr;
@@ -338,6 +339,7 @@ class CRenderTarget : public IRender_Target
338339
void phase_ssfx_ao(); // AO
339340
void phase_ssfx_il(); // IL
340341
void set_viewport_size(ID3DDeviceContext* dev, float w, float h);
342+
void phase_lut();
341343
#endif
342344

343345
// Generates min/max sm

src/Layers/xrRenderPC_R4/r4_rendertarget_phase_combine.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@ void CRenderTarget::phase_combine()
7474
if (!Device.m_SecondViewport.IsSVPFrame())
7575
{
7676
// Clear RT
77-
RCache.ClearRT(rt_ssfx_temp->pRT, {});
78-
RCache.ClearRT(rt_ssfx_temp2->pRT, {});
77+
Fcolor ColorRGBA = { 0.0f, 0.0f, 0.0f, 1.0f };
78+
RCache.ClearRT(rt_ssfx_temp->pRT, ColorRGBA);
79+
RCache.ClearRT(rt_ssfx_temp2->pRT, ColorRGBA);
7980

8081
if (RImplementation.o.ssfx_ao && ps_ssfx_ao.y > 0)
8182
{
@@ -289,8 +290,9 @@ void CRenderTarget::phase_combine()
289290
// [SSFX] - Water SSR rendering
290291
if (RImplementation.o.ssfx_water && !Device.m_SecondViewport.IsSVPFrame())
291292
{
292-
RCache.ClearRT(rt_ssfx_temp->pRT, {});
293-
RCache.ClearRT(rt_ssfx_temp2->pRT, {});
293+
Fcolor ColorRGBA = { 0.0f, 0.0f, 0.0f, 1.0f };
294+
RCache.ClearRT(rt_ssfx_temp->pRT, ColorRGBA);
295+
RCache.ClearRT(rt_ssfx_temp2->pRT, ColorRGBA);
294296

295297
if (!RImplementation.o.msaa)
296298
u_setrt(RCache, rt_ssfx_temp, 0, 0, 0);
@@ -398,6 +400,9 @@ void CRenderTarget::phase_combine()
398400
if (ps_r2_ls_flags.test(R2FLAG_DOF))
399401
phase_dof();
400402

403+
// yohji: commented out for now, doesn't work correctly yet.
404+
//phase_lut();
405+
401406
//(Anomaly) Compute night vision effect
402407
if (ps_r2_nightvision > 0)
403408
phase_nightvision();

src/Layers/xrRenderPC_R4/r4_shaders.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
#include "Layers/xrRender/ShaderResourceTraits.h"
44
#include "xrCore/FileCRC32.h"
55

6+
extern ENGINE_API int ps_ssfx_ssr_quality;
7+
extern ENGINE_API Fvector3 ps_ssfx_water_quality;
8+
extern ENGINE_API int ps_ssfx_il_quality;
9+
extern ENGINE_API int ps_ssfx_ao_quality;
10+
611
void CRender::addShaderOption(const char* name, const char* value)
712
{
813
D3D_SHADER_MACRO macro = {name, value};
@@ -226,6 +231,13 @@ HRESULT CRender::shader_compile(pcstr name, IReader* fs, pcstr pFunctionName,
226231
string32 c_sun_quality;
227232
char c_msaa_samples[2];
228233
char c_msaa_current_sample[2];
234+
235+
// SSS preprocessor stuff
236+
char c_ssfx_il[32];
237+
char c_ssfx_ao[32];
238+
char c_ssfx_water[32];
239+
char c_ssfx_water_parallax[32];
240+
char c_ssr_quality[32];
229241
char c_rain_quality[32];
230242
char c_inter_grass[32];
231243

@@ -437,6 +449,28 @@ HRESULT CRender::shader_compile(pcstr name, IReader* fs, pcstr pFunctionName,
437449
else
438450
sh_name.append(static_cast<u32>(0));
439451

452+
xr_sprintf(c_ssr_quality, "%d", u8(_min(_max(ps_ssfx_ssr_quality, 0), 5)));
453+
options.add("SSFX_SSR_QUALITY", c_ssr_quality);
454+
sh_name.append(c_ssr_quality);
455+
456+
xr_sprintf(c_ssfx_water, "%d", u8(_min(_max(ps_ssfx_water_quality.x, 0.0f), 4.0f)));
457+
options.add("SSFX_WATER_QUALITY", c_ssfx_water);
458+
sh_name.append(c_ssfx_water);
459+
460+
461+
xr_sprintf(c_ssfx_water_parallax, "%d", u8(_min(_max(ps_ssfx_water_quality.y, 0.0f), 3.0f)));
462+
options.add("SSFX_WATER_PARALLAX", c_ssfx_water_parallax);
463+
sh_name.append(c_ssfx_water_parallax);
464+
465+
466+
xr_sprintf(c_ssfx_il, "%d", u8(_min(_max(ps_ssfx_il_quality, 0), 64)));
467+
options.add("SSFX_IL_QUALITY", c_ssfx_il);
468+
sh_name.append(c_ssfx_il);
469+
470+
xr_sprintf(c_ssfx_ao, "%d", u8(_min(_max(ps_ssfx_ao_quality, 2), 8)));
471+
options.add("SSFX_AO_QUALITY", c_ssfx_ao);
472+
sh_name.append(c_ssfx_ao);
473+
440474
appendShaderOption(1, "SSFX_MODEXE", "1");
441475

442476
// Be carefull!!!!! this should be at the end to correctly generate

src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<ClInclude Include="..\xrRender\blenders\blender_dof.h" />
7676
<ClInclude Include="..\xrRender\blenders\blender_gasmask_drops.h" />
7777
<ClInclude Include="..\xrRender\blenders\blender_gasmask_dudv.h" />
78+
<ClInclude Include="..\xrRender\blenders\blender_lut.h" />
7879
<ClInclude Include="..\xrRender\blenders\blender_nightvision.h" />
7980
<ClInclude Include="..\xrRender\blenders\dx11RainBlender.h" />
8081
<ClInclude Include="..\xrRenderDX11\dx11ConstantBuffer.h" />
@@ -246,6 +247,7 @@
246247
<ClCompile Include="..\xrRender\blenders\blender_dof.cpp" />
247248
<ClCompile Include="..\xrRender\blenders\blender_gasmask_drops.cpp" />
248249
<ClCompile Include="..\xrRender\blenders\blender_gasmask_dudv.cpp" />
250+
<ClCompile Include="..\xrRender\blenders\blender_lut.cpp" />
249251
<ClCompile Include="..\xrRender\blenders\Blender_Model_EbB_deferred.cpp" />
250252
<ClCompile Include="..\xrRender\blenders\blender_nightvision.cpp" />
251253
<ClCompile Include="..\xrRender\blenders\Blender_Particle_deferred.cpp" />
@@ -335,6 +337,7 @@
335337
<ClCompile Include="..\xrRender\rendertarget_phase_dof.cpp" />
336338
<ClCompile Include="..\xrRender\rendertarget_phase_gasmask_drops.cpp" />
337339
<ClCompile Include="..\xrRender\rendertarget_phase_gasmask_dudv.cpp" />
340+
<ClCompile Include="..\xrRender\rendertarget_phase_lut.cpp" />
338341
<ClCompile Include="..\xrRender\rendertarget_phase_nightvision.cpp" />
339342
<ClCompile Include="..\xrRender\ResourceManager.cpp" />
340343
<ClCompile Include="..\xrRender\ResourceManager_Loader.cpp" />

src/Layers/xrRenderPC_R4/xrRender_R4.vcxproj.filters

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,9 @@
744744
<ClInclude Include="..\..\utils\xrLC_Light\R_light.h">
745745
<Filter>Lights</Filter>
746746
</ClInclude>
747+
<ClInclude Include="..\xrRender\blenders\blender_lut.h">
748+
<Filter>Shading templates</Filter>
749+
</ClInclude>
747750
</ItemGroup>
748751
<ItemGroup>
749752
<ClCompile Include="stdafx.cpp">
@@ -1376,6 +1379,12 @@
13761379
<ClCompile Include="..\xrRender\rendertarget_phase_gasmask_dudv.cpp">
13771380
<Filter>Core_Target</Filter>
13781381
</ClCompile>
1382+
<ClCompile Include="..\xrRender\blenders\blender_lut.cpp">
1383+
<Filter>Shading templates</Filter>
1384+
</ClCompile>
1385+
<ClCompile Include="..\xrRender\rendertarget_phase_lut.cpp">
1386+
<Filter>Core_Target</Filter>
1387+
</ClCompile>
13791388
</ItemGroup>
13801389
<ItemGroup>
13811390
<None Include="packages.config" />

src/Layers/xrRender_R2/r2.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -689,12 +689,6 @@ void CRender::OnFrame()
689689
ZoneScoped;
690690

691691
Models->DeleteQueue();
692-
693-
if (g_pGamePersistent->MainMenuActiveOrLevelNotExist())
694-
return;
695-
696-
if (Details)
697-
g_pGamePersistent->GrassBendersUpdateAnimations();
698692
}
699693

700694
#ifdef USE_OGL

0 commit comments

Comments
 (0)