From b8f9bdb7c11fe5baf5d98aaf9be75aaf611c2cb3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 21 Apr 2021 22:07:49 +0200 Subject: [PATCH] - made savepic work with new renderer. --- .../rendering/hwrenderer/data/hw_vrmodes.cpp | 4 -- source/core/rendering/hw_entrypoint.cpp | 60 +++++++++++++++---- source/glbackend/glbackend.cpp | 6 +- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/source/common/rendering/hwrenderer/data/hw_vrmodes.cpp b/source/common/rendering/hwrenderer/data/hw_vrmodes.cpp index caf11f947..59f215e02 100644 --- a/source/common/rendering/hwrenderer/data/hw_vrmodes.cpp +++ b/source/common/rendering/hwrenderer/data/hw_vrmodes.cpp @@ -60,7 +60,6 @@ static VRMode vrmi_checker = { 2, isqrt2, isqrt2, 1.f,{ { -.5f, 1.f },{ .5f, 1.f const VRMode *VRMode::GetVRMode(bool toscreen) { -#ifdef VR3D_ENABLED int mode = !toscreen || (sysCallbacks.DisableTextureFilter && sysCallbacks.DisableTextureFilter()) ? 0 : vr_mode; switch (mode) @@ -96,9 +95,6 @@ const VRMode *VRMode::GetVRMode(bool toscreen) case VR_CHECKERINTERLEAVED: return &vrmi_checker; } -#else - return &vrmi_mono; -#endif } void VRMode::AdjustViewport(DFrameBuffer *screen) const diff --git a/source/core/rendering/hw_entrypoint.cpp b/source/core/rendering/hw_entrypoint.cpp index 2496a1f42..548a3a171 100644 --- a/source/core/rendering/hw_entrypoint.cpp +++ b/source/core/rendering/hw_entrypoint.cpp @@ -50,6 +50,7 @@ #include "gamecvars.h" #include "render.h" #include "gamestruct.h" +#include "gamehud.h" EXTERN_CVAR(Bool, cl_capfps) @@ -198,7 +199,7 @@ FRenderViewpoint SetupViewpoint(spritetype* cam, const vec3_t& position, int sec void DoWriteSavePic(FileWriter* file, uint8_t* scr, int width, int height, bool upsidedown) { - int pixelsize = 1; + int pixelsize = 3; int pitch = width * pixelsize; if (upsidedown) @@ -214,10 +215,44 @@ void DoWriteSavePic(FileWriter* file, uint8_t* scr, int width, int height, bool // // Render the view to a savegame picture // +// Currently a bit messy because the game side still needs to be able to +// handle Polymost. +// //=========================================================================== +bool writingsavepic; +FileWriter* savefile; +int savewidth, saveheight; +void PM_WriteSavePic(FileWriter* file, int width, int height); +EXTERN_CVAR(Bool, testnewrenderer); -#if 0 -void WriteSavePic(player_t* player, FileWriter* file, int width, int height) +void WriteSavePic(FileWriter* file, int width, int height) +{ + if (!testnewrenderer) + { + PM_WriteSavePic(file, width, height); + return; + } + int oldx = xdim; + int oldy = ydim; + auto oldwindowxy1 = windowxy1; + auto oldwindowxy2 = windowxy2; + + xdim = width; + ydim = height; + videoSetViewableArea(0, 0, width - 1, height - 1); + + writingsavepic = true; + savefile = file; + savewidth = width; + saveheight = height; + bool didit = gi->GenerateSavePic(); + writingsavepic = false; + xdim = oldx; + ydim = oldy; + videoSetViewableArea(oldwindowxy1.x, oldwindowxy1.y, oldwindowxy2.x, oldwindowxy2.y); +} + +void RenderToSavePic(FRenderViewpoint& vp, FileWriter* file, int width, int height) { IntRect bounds; bounds.left = 0; @@ -233,30 +268,27 @@ void WriteSavePic(player_t* player, FileWriter* file, int width, int height) screen->SetSaveBuffers(true); screen->ImageTransitionScene(true); - hw_ClearFakeFlat(); RenderState.SetVertexBuffer(screen->mVertexData); screen->mVertexData->Reset(); screen->mLights->Clear(); screen->mViewpoints->Clear(); - // This shouldn't overwrite the global viewpoint even for a short time. - FRenderViewpoint savevp; - sector_t* viewsector = RenderViewpoint(savevp, players[consoleplayer].camera, &bounds, r_viewpoint.FieldOfView.Degrees, 1.6f, 1.6f, true, false); - RenderState.EnableStencil(false); - RenderState.SetNoSoftLightLevel(); + twodpsp.Clear(); + + RenderViewpoint(vp, &bounds, vp.FieldOfView.Degrees, 1.333f, 1.333f, true, false); + int numpixels = width * height; uint8_t* scr = (uint8_t*)M_Malloc(numpixels * 3); screen->CopyScreenToBuffer(width, height, scr); - DoWriteSavePic(file, SS_RGB, scr, width, height, viewsector, screen->FlipSavePic()); + DoWriteSavePic(file, scr, width, height, screen->FlipSavePic()); M_Free(scr); // Switch back the screen render buffers screen->SetViewportRects(nullptr); screen->SetSaveBuffers(false); } -#endif //=========================================================================== // @@ -301,6 +333,12 @@ void render_drawrooms(spritetype* playersprite, const vec3_t& position, int sect screen->mViewpoints->Clear(); screen->mVertexData->Reset(); + if (writingsavepic) // hack alert! The save code should not go through render_drawrooms, but we can only clean up the game side when Polymost is gone for good. + { + RenderToSavePic(r_viewpoint, savefile, savewidth, saveheight); + return; + } + // Shader start time does not need to be handled per level. Just use the one from the camera to render from. auto RenderState = screen->RenderState(); CheckTimer(*RenderState, 0/*ShaderStartTime*/); diff --git a/source/glbackend/glbackend.cpp b/source/glbackend/glbackend.cpp index 62f9980d7..e594f97c1 100644 --- a/source/glbackend/glbackend.cpp +++ b/source/glbackend/glbackend.cpp @@ -268,7 +268,7 @@ bool PolymostRenderState::Apply(FRenderState& state, GLState& oldState) return true; } -void DoWriteSavePic(FileWriter* file, ESSType ssformat, uint8_t* scr, int width, int height, bool upsidedown) +static void PM_DoWriteSavePic(FileWriter* file, ESSType ssformat, uint8_t* scr, int width, int height, bool upsidedown) { int pixelsize = 3; int pitch = width * pixelsize; @@ -287,7 +287,7 @@ void DoWriteSavePic(FileWriter* file, ESSType ssformat, uint8_t* scr, int width, // //=========================================================================== -void WriteSavePic(FileWriter* file, int width, int height) +void PM_WriteSavePic(FileWriter* file, int width, int height) { IntRect bounds; bounds.left = 0; @@ -344,7 +344,7 @@ void WriteSavePic(FileWriter* file, int width, int height) uint8_t* scr = (uint8_t*)M_Malloc(numpixels * 3); screen->CopyScreenToBuffer(width, height, scr); - DoWriteSavePic(file, SS_RGB, scr, width, height, screen->FlipSavePic()); + PM_DoWriteSavePic(file, SS_RGB, scr, width, height, screen->FlipSavePic()); M_Free(scr); // Switch back the screen render buffers