Skip to content

Commit 21e6e35

Browse files
ShokerStlkXottab-DUTY
authored andcommitted
SWM: Ported main "Second Viewport" code ("Real" 3D scopes)
1 parent fe7cf48 commit 21e6e35

25 files changed

+206
-3
lines changed

src/Layers/xrRenderPC_R1/FStaticRender.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,22 @@ void CRender::OnFrame()
149149
Models->DeleteQueue();
150150
}
151151

152+
// Перед началом рендера мира --#SM+#-- +SecondVP+
152153
void CRender::BeforeWorldRender() {}
153-
void CRender::AfterWorldRender() {}
154+
155+
// После рендера мира и пост-эффектов --#SM+#-- +SecondVP+
156+
void CRender::AfterWorldRender()
157+
{
158+
if (Device.m_SecondViewport.IsSVPFrame())
159+
{
160+
// Делает копию бэкбуфера (текущего экрана) в рендер-таргет второго вьюпорта
161+
IRender_Target* T = getTarget();
162+
IDirect3DSurface9* pBackBuffer = nullptr;
163+
HW.pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer); // Получаем ссылку на бэкбуфер
164+
D3DXLoadSurfaceFromSurface(Target->RT_SecondVP->pRT, 0, 0, pBackBuffer, 0, 0, D3DX_DEFAULT, 0);
165+
pBackBuffer->Release(); // Корректно очищаем ссылку на бэкбуфер (иначе игра зависнет в опциях)
166+
}
167+
}
154168

155169
// Implementation
156170
IRender_ObjectSpecific* CRender::ros_create(IRenderable* parent) { return new CROS_impl(); }

src/Layers/xrRenderPC_R1/FStaticRender_RenderTarget.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
static LPCSTR RTname = "$user$rendertarget";
66
static LPCSTR RTname_color_map = "$user$rendertarget_color_map";
77
static LPCSTR RTname_distort = "$user$distort";
8+
static LPCSTR RTname_SecondVP = "$user$viewport2"; //--#SM+#-- +SecondVP+
89

910
CRenderTarget::CRenderTarget()
1011
{
1112
bAvailable = FALSE;
1213
RT = nullptr;
1314
RT_color_map = nullptr;
15+
RT_SecondVP = nullptr; //--#SM+# +SecondVP+
1416
pTempZB = nullptr;
1517
ZB = nullptr;
1618
pFB = nullptr;
@@ -64,6 +66,8 @@ BOOL CRenderTarget::Create()
6466
}
6567
// RImplementation.o.color_mapping = RT_color_map->valid();
6668

69+
RT_SecondVP.create(RTname_SecondVP, rtWidth, rtHeight, HW.Caps.fTarget); //--#SM+#-- +SecondVP+
70+
6771
if ((rtHeight != Device.dwHeight) || (rtWidth != Device.dwWidth))
6872
{
6973
R_CHK(HW.pDevice->CreateDepthStencilSurface(
@@ -111,6 +115,7 @@ CRenderTarget::~CRenderTarget()
111115
s_postprocess_D[0].destroy();
112116
s_postprocess[1].destroy();
113117
g_postprocess.destroy();
118+
RT_SecondVP.destroy(); //--#SM+#-- +SecondVP+
114119
RT_distort.destroy();
115120
RT_color_map.destroy();
116121
RT.destroy();

src/Layers/xrRenderPC_R1/FStaticRender_RenderTarget.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
class CRenderTarget : public IRender_Target
66
{
7+
public:
8+
ref_rt RT_SecondVP; //--#SM+#-- +SecondVP+
9+
710
private:
811
BOOL bAvailable;
912
u32 rtWidth;

src/Layers/xrRenderPC_R2/r2_R_render.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,3 +513,19 @@ void CRender::render_forward()
513513

514514
RImplementation.o.distortion = FALSE; // disable distorion
515515
}
516+
517+
// Перед началом рендера мира --#SM+#-- +SecondVP+
518+
void CRender::BeforeWorldRender() {}
519+
520+
// После рендера мира и пост-эффектов --#SM+#-- +SecondVP+
521+
void CRender::AfterWorldRender()
522+
{
523+
if (Device.m_SecondViewport.IsSVPFrame())
524+
{
525+
// Делает копию бэкбуфера (текущего экрана) в рендер-таргет второго вьюпорта
526+
IDirect3DSurface9* pBackBuffer = NULL;
527+
HW.pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer); // Получаем ссылку на бэкбуфер
528+
D3DXLoadSurfaceFromSurface(Target->rt_secondVP->pRT, 0, 0, pBackBuffer, 0, 0, D3DX_DEFAULT, 0);
529+
pBackBuffer->Release(); // Корректно очищаем ссылку на бэкбуфер (иначе игра зависнет в опциях)
530+
}
531+
}

src/Layers/xrRenderPC_R2/r2_rendertarget.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,8 @@ CRenderTarget::CRenderTarget()
258258
// generic(LDR) RTs
259259
rt_Generic_0.create(r2_RT_generic0, w, h, D3DFMT_A8R8G8B8);
260260
rt_Generic_1.create(r2_RT_generic1, w, h, D3DFMT_A8R8G8B8);
261+
rt_secondVP.create (r2_RT_secondVP, w, h, D3DFMT_A8R8G8B8); //--#SM+#-- +SecondVP+
262+
261263
// Igor: for volumetric lights
262264
// rt_Generic_2.create (r2_RT_generic2,w,h,D3DFMT_A8R8G8B8 );
263265
// temp: for higher quality blends

src/Layers/xrRenderPC_R2/r2_rendertarget.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ class CRenderTarget : public IRender_Target
6262
ref_rt rt_LUM_64; // 64bit, 64x64, log-average in all components
6363
ref_rt rt_LUM_8; // 64bit, 8x8, log-average in all components
6464

65+
// Second viewport
66+
ref_rt rt_secondVP; // 32bit (r,g,b,a) --//#SM+#-- +SecondVP+
67+
6568
// Igor: for async screenshots
6669
IDirect3DSurface9* pFB; // 32bit (r,g,b,a) is situated in the system memory
6770

src/Layers/xrRenderPC_R2/r2_rendertarget_phase_combine.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ void CRenderTarget::phase_combine()
3737

3838
//*** exposure-pipeline
3939
u32 gpu_id = Device.dwFrame % HW.Caps.iGPUNum;
40+
41+
if (Device.m_SecondViewport.IsSVPActive()) //--#SM+#-- +SecondVP+ Fix for screen flickering
42+
{
43+
// clang-format off
44+
gpu_id = (Device.dwFrame - 1) % HW.Caps.iGPUNum; // Фикс "мерцания" tonemapping (HDR) после выключения двойного рендера.
45+
// Побочный эффект - при работе двойного рендера скорость изменения tonemapping (HDR) падает в два раза
46+
// Мерцание связано с тем, что HDR для своей работы хранит уменьшенние копии "прошлых кадров"
47+
// Эти кадры относительно похожи друг на друга, однако при включЄнном двойном рендере
48+
// в половине кадров оказывается картинка из второго рендера, и поскольку она часто может отличатся по цвету\яркости
49+
// то при попытке создания "плавного" перехода между ними получается эффект мерцания
50+
// clang-format on
51+
}
4052
{
4153
t_LUM_src->surface_set(rt_LUM_pool[gpu_id * 2 + 0]->pSurface);
4254
t_LUM_dest->surface_set(rt_LUM_pool[gpu_id * 2 + 1]->pSurface);

src/Layers/xrRenderPC_R2/r2_types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
#define r2_jitter_mipped "$user$jitter_mipped" // --- dither
4444
#define r2_sunmask "sunmask"
4545

46+
#define r2_RT_secondVP "$user$viewport2" // --#SM+#-- +SecondVP+ Хранит картинку со второго вьюпорта
47+
4648
#define JITTER(a) r2_jitter #a
4749

4850
const float SMAP_near_plane = .1f;

src/Layers/xrRenderPC_R3/r2_types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
#define r2_jitter_mipped "$user$jitter_mipped" // --- dither
4949
#define r2_sunmask "sunmask"
5050

51+
#define r2_RT_secondVP "$user$viewport2" // --#SM+#-- +SecondVP+ Хранит картинку со второго вьюпорта
52+
5153
#define JITTER(a) r2_jitter #a
5254

5355
const float SMAP_near_plane = .1f;

src/Layers/xrRenderPC_R3/r3.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,8 @@ class CRender : public D3DXRenderBase
350350
virtual void ScreenshotAsyncBegin();
351351
virtual void ScreenshotAsyncEnd(CMemoryWriter& memory_writer);
352352
virtual void OnFrame();
353+
virtual void BeforeWorldRender(); //--#SM+#-- +SecondVP+ Вызывается перед началом рендера мира и пост-эффектов
354+
virtual void AfterWorldRender(); //--#SM+#-- +SecondVP+ Вызывается после рендера мира и перед UI
353355

354356
void BeforeWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается перед началом рендера мира и пост-эффектов
355357
void AfterWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается после рендера мира и перед UI

0 commit comments

Comments
 (0)