diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp index 6442f755e..d00082c8b 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_R_render.cpp @@ -19,7 +19,6 @@ constexpr float PUDDLES_RENDER_RANGE_SQR{_sqr(150.f)}; constexpr float BASE_FOV{67.f}; // Aproximate, adjusted by fov, distance from camera to position (For right work when looking though binoculars and scopes) - IC float GetDistFromCamera(const Fvector& from_position) { const float distance = Device.vCameraPosition.distance_to(from_position); @@ -280,6 +279,58 @@ void CRender::Render() Target->u_setrt(cmd_list, Target->GetRenderWidth(), Target->GetRenderHeight(), nullptr, nullptr, nullptr, nullptr); rmNormal(cmd_list); + bool _menu_pp = g_pGamePersistent ? g_pGamePersistent->OnRenderPPUI_query() : false; + if (_menu_pp) + { + PIX_EVENT(MENU_RENDER); + // Globals + cmd_list.set_CullMode(CULL_CCW); + cmd_list.set_Stencil(FALSE); + cmd_list.set_ColorWriteEnable(); + + // Main Render + { + Target->u_setrt(cmd_list, Target->rt_Generic_0, 0, 0, Target->rt_Base_Depth); // LDR RT + g_pGamePersistent->OnRenderPPUI_main(); // PP-UI + } + + // Distort + { + const Fcolor ColorRGBA = {127.0f / 255.0f, 127.0f / 255.0f, 0.0f, 127.0f / 255.0f}; + Target->u_setrt(cmd_list, Target->rt_Generic_1, 0, 0, Target->rt_Base_Depth); // Now RT is a distortion mask + cmd_list.ClearRT(Target->rt_Generic_1, ColorRGBA); + g_pGamePersistent->OnRenderPPUI_PP(); // PP-UI + } + + // Actual Display + Target->u_setrt(cmd_list, Device.dwWidth, Device.dwHeight, Target->get_base_rt(), nullptr, nullptr, Target->get_base_zb()); + cmd_list.set_Shader(Target->s_menu); + cmd_list.set_Geometry(Target->g_menu); + + Fvector2 p0, p1; + u32 Offset; + constexpr u32 C = color_rgba(255, 255, 255, 255); + float _w = float(Device.dwWidth); + float _h = float(Device.dwHeight); + constexpr float d_Z = EPS_S; + constexpr float d_W = 1.f; + p0.set(.5f / _w, .5f / _h); + p1.set((_w + .5f) / _w, (_h + .5f) / _h); + + FVF::TL* pv = (FVF::TL*)Vertex.Lock(4, Target->g_menu->vb_stride, Offset); + pv->set(EPS, float(_h + EPS), d_Z, d_W, C, p0.x, p1.y); + pv++; + pv->set(EPS, EPS, d_Z, d_W, C, p0.x, p0.y); + pv++; + pv->set(float(_w + EPS), float(_h + EPS), d_Z, d_W, C, p1.x, p1.y); + pv++; + pv->set(float(_w + EPS), EPS, d_Z, d_W, C, p1.x, p0.y); + pv++; + Vertex.Unlock(4, Target->g_menu->vb_stride); + cmd_list.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2); + return; + } + if (ShouldSkipRender()) { Target->ResetTemporalHistory(); @@ -494,15 +545,9 @@ void CRender::Render() { if (nullptr == it) continue; - // try - //{ + for (int id = 0; id < R__NUM_CONTEXTS; ++id) it->svis[id].flush(); - /*} - catch (...) - { - Msg("! Failed to flush-OCCq on light [%d] %X", it, *(u32*)(&Lights_LastFrame[it])); - }*/ } Lights_LastFrame.clear(); } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp index c7006cde0..9a7a79c52 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.cpp @@ -543,6 +543,11 @@ CRenderTarget::CRenderTarget() TriangleGeom.create(FVF::F_TL, TriangleVB, TriangleIB); } + // Menu + s_menu.create("distort"); + g_menu.create(FVF::F_TL, RImplementation.Vertex.Buffer(), RImplementation.QuadIB); + + // Reset reset_target_dimensions(); } @@ -563,8 +568,6 @@ CRenderTarget::~CRenderTarget() if (pSurf) pSurf->Release(); _SHOW_REF("t_envmap_1 - #small", pSurf); - //_SHOW_REF("t_envmap_0 - #small",t_envmap_0->pSurface); - //_SHOW_REF("t_envmap_1 - #small",t_envmap_1->pSurface); #endif // DEBUG t_envmap_0->surface_set(nullptr); @@ -572,9 +575,6 @@ CRenderTarget::~CRenderTarget() t_envmap_0.destroy(); t_envmap_1.destroy(); - // TODO: DX10: Check if we need old style SMAPs - // _RELEASE (rt_smap_ZB); - // Jitter for (int it = 0; it < TEX_jitter_count; it++) { @@ -631,7 +631,6 @@ void CRenderTarget::increment_light_marker(CBackend& cmd_list) { dwLightMarkerID += 2; - // if (dwLightMarkerID>10) const u32 iMaxMarkerValue = 255; if (dwLightMarkerID > iMaxMarkerValue) @@ -643,10 +642,11 @@ bool CRenderTarget::need_to_render_sunshafts() if (!ps_r_sun_shafts) return false; - const CEnvDescriptor& E = *g_pGamePersistent->Environment().CurrentEnv; - const Fcolor sun_color= ((light*)RImplementation.Lights.sun_adapted._get())->color; - const float fValue = E.m_fSunShaftsIntensity * u_diffuse2s(sun_color.r,sun_color.g,sun_color.b); - if (fValueEnvironment().CurrentEnv; + const Fcolor sun_color = ((light*)RImplementation.Lights.sun_adapted._get())->color; + const float fValue = E.m_fSunShaftsIntensity * u_diffuse2s(sun_color.r, sun_color.g, sun_color.b); + if (fValue < EPS) + return false; return true; } diff --git a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h index 95fbb6632..98ec3645b 100644 --- a/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h +++ b/ogsr_engine/Layers/xrRenderPC_R4/r4_rendertarget.h @@ -4,7 +4,7 @@ class light; -static void dummy(){} +static void dummy() {} class CRenderTarget : public IRender_Target { @@ -38,7 +38,6 @@ class CRenderTarget : public IRender_Target ref_rt rt_Base_Depth; // MRT-path - ref_rt rt_Position; // 64bit, fat (x,y,z,?) (eye-space) ref_rt rt_Color; // 64/32bit,fat (r,g,b,specular-gloss) (or decompressed MET-8-8-8-8) ref_rt rt_Velocity; // r2_RT_velocity @@ -112,7 +111,6 @@ class CRenderTarget : public IRender_Target private: // OCCq - ref_shader s_occq; // Accum @@ -190,6 +188,8 @@ class CRenderTarget : public IRender_Target ref_shader s_postprocess; ref_geom g_postprocess; + ref_shader s_menu; + ref_geom g_menu; private: float im_noise_time; @@ -230,13 +230,14 @@ class CRenderTarget : public IRender_Target void u_compute_texgen_screen(CBackend& cmd_list, Fmatrix& dest); - ID3DRenderTargetView* get_base_rt() const { return rt_base[0/*HW.CurrentBackBuffer*/]->pRT; } + ID3DRenderTargetView* get_base_rt() const { return rt_base[0]->pRT; } ID3DDepthStencilView* get_base_zb() const { return rt_Base_Depth->pZRT[CHW::IMM_CTX_ID]; } void u_setrt(CBackend& cmd_list, const ref_rt& _1, const ref_rt& _2, const ref_rt& _3, const ref_rt& _4, ID3DDepthStencilView* zb); void u_setrt(CBackend& cmd_list, const ref_rt& _1, const ref_rt& _2, const ref_rt& _3, ID3DDepthStencilView* zb); void u_setrt(CBackend& cmd_list, const ref_rt& _1, const ref_rt& _2, ID3DDepthStencilView* zb); void u_setrt(CBackend& cmd_list, u32 W, u32 H, ID3DRenderTargetView* _1, ID3DRenderTargetView* _2, ID3DRenderTargetView* _3, ID3DDepthStencilView* zb); + void u_setrt(CBackend& cmd_list, const ref_rt& _1, const ref_rt& _2, const ref_rt& _3, const ref_rt& _zb) { u_setrt(cmd_list, _1, _2, _3, _zb ? _zb->pZRT[cmd_list.context_id] : nullptr); } void u_calc_tc_noise(CBackend& cmd_list, Fvector2& p0, Fvector2& p1); void u_calc_tc_duality_ss(Fvector2& r0, Fvector2& r1, Fvector2& l0, Fvector2& l1); @@ -383,5 +384,4 @@ class CRenderTarget : public IRender_Target public: ID3D11Texture2D* m_ImguiTex{}; ID3D11ShaderResourceView* m_ImguiSRV{}; - }; diff --git a/ogsr_engine/xrGame/MainMenu.cpp b/ogsr_engine/xrGame/MainMenu.cpp index bbd668c3b..adfb600fc 100644 --- a/ogsr_engine/xrGame/MainMenu.cpp +++ b/ogsr_engine/xrGame/MainMenu.cpp @@ -15,18 +15,9 @@ #include "..\xr_3da\DiscordRPC.hpp" #include "object_broker.h" -string128 ErrMsgBoxTemplate[] = {"message_box_session_full", "msg_box_error_loading"}; - extern bool b_shniaganeed_pp; CMainMenu* MainMenu() { return (CMainMenu*)g_pGamePersistent->m_pMainMenu; }; -//---------------------------------------------------------------------------------- -#define INIT_MSGBOX(_box, _template) \ - { \ - _box = xr_new(); \ - _box->Init(_template); \ - } -//---------------------------------------------------------------------------------- CMainMenu::CMainMenu() { @@ -34,6 +25,7 @@ CMainMenu::CMainMenu() m_startDialog = NULL; m_screenshotFrame = u32(-1); g_pGamePersistent->m_pMainMenu = this; + if (Device.b_is_Ready) OnDeviceCreate(); @@ -44,17 +36,7 @@ CMainMenu::CMainMenu() m_deactivated_frame = 0; languageChanged = false; - m_NeedErrDialog = ErrNoError; - m_start_time = 0; - g_btnHint = xr_new(); - - for (u32 i = 0; i < u32(ErrMax); i++) - { - CUIMessageBoxEx* pNewErrDlg; - INIT_MSGBOX(pNewErrDlg, ErrMsgBoxTemplate[i]); - m_pMB_ErrDlgs.push_back(pNewErrDlg); - } } CMainMenu::~CMainMenu() @@ -62,7 +44,6 @@ CMainMenu::~CMainMenu() xr_delete(g_btnHint); xr_delete(m_startDialog); g_pGamePersistent->m_pMainMenu = NULL; - delete_data(m_pMB_ErrDlgs); CurrentSound.destroy(); } @@ -100,8 +81,6 @@ void CMainMenu::ReadTextureInfo() xr_strcat(fn1, fn3); xr_strcat(fn1, ".xml"); - //xr_string fn1 = (*fit).name; - CUITextureMaster::ParseShTexInfo(fn1); } } @@ -161,6 +140,7 @@ void CMainMenu::Activate(bool bActivate) Device.seqRender.Remove(g_pGameLevel); CCameraManager::ResetPP(); } + Device.seqRender.Add(this, 5); // 1-console 2-cursor 3-tutorial if (!g_pGameLevel) @@ -215,7 +195,7 @@ void CMainMenu::Activate(bool bActivate) if (m_Flags.test(flNeedVidRestart)) { m_Flags.set(flNeedVidRestart, FALSE); - Device.PreCache(20, false, false); // Console->Execute("vid_restart"); + Device.PreCache(20, false, false); } } } @@ -225,6 +205,7 @@ bool CMainMenu::IsActive() { return !!m_Flags.test(flActive); } bool CMainMenu::CanSkipSceneRendering() { return IsActive() && !m_Flags.test(flGameSaveScreenshot); } bool CMainMenu::IsLanguageChanged() const { return languageChanged; } + void CMainMenu::SetLanguageChanged(bool status) { languageChanged = status; } // IInputReceiver @@ -319,14 +300,14 @@ void CMainMenu::OnRender() if (m_Flags.test(flGameSaveScreenshot)) return; - // if (g_pGameLevel) + if (g_pGameLevel) Render->Calculate(); Render->Render(); ::Render->ui_is_rendering = true; - // if (!OnRenderPPUI_query()) + if (!OnRenderPPUI_query()) { DoRenderDialogs(); UI()->RenderFont(); @@ -338,7 +319,6 @@ void CMainMenu::OnRender() void CMainMenu::OnRenderPPUI_main() { -/* if (!IsActive()) return; @@ -354,12 +334,10 @@ void CMainMenu::OnRenderPPUI_main() } UI()->pp_stop(); -*/ } void CMainMenu::OnRenderPPUI_PP() { -/* if (!IsActive()) return; @@ -374,7 +352,6 @@ void CMainMenu::OnRenderPPUI_PP() (*it)->Draw(); } UI()->pp_stop(); -*/ } void CMainMenu::StartStopMenu(CUIDialogWnd* pDialog, bool bDoHideIndicators) @@ -394,6 +371,7 @@ void CMainMenu::OnFrame() else IR_Release(); } + CDialogHolder::OnFrame(); // screenshot stuff @@ -413,9 +391,6 @@ void CMainMenu::OnFrame() Console->Show(); } - if (IsActive()) - CheckForErrorDlg(); - if (languageChanged) { languageChanged = false; @@ -453,34 +428,13 @@ void CMainMenu::RegisterPPDraw(CUIWindow* w) void CMainMenu::UnregisterPPDraw(CUIWindow* w) { m_pp_draw_wnds.erase(std::remove(m_pp_draw_wnds.begin(), m_pp_draw_wnds.end(), w), m_pp_draw_wnds.end()); } -void CMainMenu::SetErrorDialog(EErrorDlg ErrDlg) { m_NeedErrDialog = ErrDlg; }; - -void CMainMenu::CheckForErrorDlg() -{ - if (m_NeedErrDialog == ErrNoError) - return; - StartStopMenu(m_pMB_ErrDlgs[m_NeedErrDialog], false); - m_NeedErrDialog = ErrNoError; -}; - void CMainMenu::DestroyInternal(bool bForce) { if (m_startDialog && ((m_deactivated_frame < Device.dwFrame + 4) || bForce)) xr_delete(m_startDialog); } -void CMainMenu::OnSessionTerminate(LPCSTR reason) -{ - if (m_NeedErrDialog == SessionTerminate && (Device.dwTimeGlobal - m_start_time) < 8000) - return; - - m_start_time = Device.dwTimeGlobal; - string1024 Text; - strcpy_s(Text, sizeof(Text), "Client disconnected. "); - strcat_s(Text, sizeof(Text), reason); - m_pMB_ErrDlgs[SessionTerminate]->SetText(Text); - SetErrorDialog(CMainMenu::SessionTerminate); -} +void CMainMenu::OnSessionTerminate(LPCSTR reason) {} void CMainMenu::SetNeedVidRestart() { m_Flags.set(flNeedVidRestart, TRUE); } diff --git a/ogsr_engine/xrGame/MainMenu.h b/ogsr_engine/xrGame/MainMenu.h index 56fdc5db3..02ab745c4 100644 --- a/ogsr_engine/xrGame/MainMenu.h +++ b/ogsr_engine/xrGame/MainMenu.h @@ -4,6 +4,7 @@ class CUIWindow; class CUIDialogWnd; class CUICursor; class CUIMessageBoxEx; + #include "..\xr_3da\iinputreceiver.h" #include "..\xr_3da\IGame_Persistent.h" #include "UIDialogHolder.h" @@ -11,7 +12,6 @@ class CUIMessageBoxEx; #include "ui_base.h" class CMainMenu : public IMainMenu, public IInputReceiver, public pureRender, public CDialogHolder, public CUIWndCallback, public CDeviceResetNotifier - { CUIDialogWnd* m_startDialog; @@ -37,20 +37,6 @@ class CMainMenu : public IMainMenu, public IInputReceiver, public pureRender, pu ref_sound CurrentSound; bool languageChanged; -public: - enum EErrorDlg - { - SessionTerminate, - ErrMax, - ErrNoError = ErrMax, - }; - -protected: - EErrorDlg m_NeedErrDialog; - u32 m_start_time; - - xr_vector m_pMB_ErrDlgs; - public: u32 m_deactivated_frame; virtual void DestroyInternal(bool bForce); @@ -91,9 +77,6 @@ class CMainMenu : public IMainMenu, public IInputReceiver, public pureRender, pu void RegisterPPDraw(CUIWindow* w); void UnregisterPPDraw(CUIWindow* w); - void SetErrorDialog(EErrorDlg ErrDlg); - EErrorDlg GetErrorDialogType() const { return m_NeedErrDialog; }; - void CheckForErrorDlg(); void OnSessionTerminate(LPCSTR reason); void SetNeedVidRestart(); virtual void OnDeviceReset(); diff --git a/ogsr_engine/xr_3da/IGame_Persistent.h b/ogsr_engine/xr_3da/IGame_Persistent.h index aadd9ebf9..042e370c3 100644 --- a/ogsr_engine/xr_3da/IGame_Persistent.h +++ b/ogsr_engine/xr_3da/IGame_Persistent.h @@ -92,6 +92,10 @@ class ENGINE_API IGame_Persistent : public DLL_Pure, public pureAppStart, public CEnvironment& Environment() const { return *pEnvironment; }; + virtual bool OnRenderPPUI_query() { return false; }; // should return true if we want to have second function called + virtual void OnRenderPPUI_main() {}; + virtual void OnRenderPPUI_PP() {}; + virtual void OnAppStart(); virtual void OnAppEnd(); virtual void OnAppActivate();