From 90196d89132f308fd91269a037cbf3acbcdc9dfe Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 17 Jan 2024 16:43:45 -0800 Subject: [PATCH] debugrender_freezebsp: freeze culling to your current position, so you can see how much level is being rendered --- src/r_bsp.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++++- src/r_bsp.h | 1 + src/r_debug.cpp | 2 ++ src/r_main.cpp | 26 ++++++++++++++++++-------- 4 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/r_bsp.cpp b/src/r_bsp.cpp index d5a4f62bf..49725201a 100644 --- a/src/r_bsp.cpp +++ b/src/r_bsp.cpp @@ -12,6 +12,7 @@ /// \brief BSP traversal, handling of LineSegs for rendering #include +#include //#include @@ -34,6 +35,7 @@ extern "C" { #include "qs22j.h" } extern "C" consvar_t cv_debugfinishline; +extern "C" consvar_t cv_debugfinishline, cv_debugrender_freezebsp; seg_t *curline; side_t *sidedef; @@ -55,6 +57,9 @@ INT32 doorclosed; // can block off the BSP across that seg. boolean g_walloffscreen; +static std::vector> node_cache; +static std::vector* current_node_cache; + boolean R_NoEncore(sector_t *sector, levelflat_t *flat, boolean ceiling) { const boolean invertEncore = (sector->flags & MSF_INVERTENCORE); @@ -1471,5 +1476,46 @@ void R_RenderBSPNode(INT32 bspnum) portalcullsector = NULL; } - R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); + bspnum = (bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); + R_Subsector(bspnum); + + if (current_node_cache) + { + current_node_cache->push_back(bspnum); + } +} + +static bool render_cache(size_t cachenum) +{ + if (node_cache.empty() && !cv_debugrender_freezebsp.value) + { + current_node_cache = nullptr; + return false; + } + + if (!cv_debugrender_freezebsp.value) + { + // free cache + node_cache = {}; + current_node_cache = nullptr; + return false; + } + + if (node_cache.size() <= cachenum) + { + node_cache.resize(cachenum + 1); + current_node_cache = &node_cache[cachenum]; + return false; + } + + for (INT32 bspnum : node_cache[cachenum]) + R_Subsector(bspnum); + + return true; +} + +void R_RenderFirstBSPNode(size_t cachenum) +{ + if (!render_cache(cachenum)) + R_RenderBSPNode((INT32)numnodes - 1); } diff --git a/src/r_bsp.h b/src/r_bsp.h index d01fa97f0..74ca05f52 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -46,6 +46,7 @@ void R_ClearClipSegs(void); void R_PortalClearClipSegs(INT32 start, INT32 end); void R_ClearDrawSegs(void); void R_RenderBSPNode(INT32 bspnum); +void R_RenderFirstBSPNode(size_t cachenum); // determines when a given sector shouldn't abide by the encoremap's palette. // no longer a static since this is used for encore in hw_main.c as well now: diff --git a/src/r_debug.cpp b/src/r_debug.cpp index dff8fae34..e11739ff0 100644 --- a/src/r_debug.cpp +++ b/src/r_debug.cpp @@ -35,6 +35,8 @@ consvar_t cv_debugrender_contrast = consvar_t cv_debugrender_spriteclip = CVAR_INIT("debugrender_spriteclip", "Off", CV_CHEAT, CV_OnOff, nullptr); consvar_t cv_debugrender_portal = CVAR_INIT("debugrender_portal", "Off", CV_CHEAT, CV_OnOff, nullptr); consvar_t cv_debugrender_visplanes = CVAR_INIT("debugrender_visplanes", "Off", CV_CHEAT, CV_OnOff, nullptr); +consvar_t cv_debugfinishline = CVAR_INIT ("debugfinishline", "Off", CV_CHEAT, CV_OnOff, nullptr); +consvar_t cv_debugrender_freezebsp = CVAR_INIT ("debugrender_freezebsp", "Off", CV_CHEAT, CV_OnOff, nullptr); UINT32 debugrender_highlight; diff --git a/src/r_main.cpp b/src/r_main.cpp index 458db5404..d0b6222a5 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -56,6 +56,7 @@ INT64 mytotal = 0; //profile stuff --------------------------------------------------------- extern consvar_t cv_debugrender_visplanes; +extern consvar_t cv_debugrender_freezebsp; // Fineangles in the SCREENWIDTH wide window. #define FIELDOFVIEW 2048 @@ -190,8 +191,6 @@ consvar_t cv_maxportals = CVAR_INIT ("maxportals", "2", CV_SAVE, maxportals_cons consvar_t cv_renderstats = CVAR_INIT ("renderstats", "Off", 0, CV_OnOff, NULL); -consvar_t cv_debugfinishline = CVAR_INIT ("debugfinishline", "Off", CV_CHEAT, CV_OnOff, NULL); - void SplitScreen_OnChange(void) { UINT8 i; @@ -1480,6 +1479,19 @@ static void Mask_Post (maskcount_t* m) // R_RenderView // ================ +// viewx, viewy, viewangle, all that good stuff must be set +static void R_RenderViewpoint(maskcount_t* mask, INT32 cachenum) +{ + Mask_Pre(mask); + + curdrawsegs = ds_p; + + R_RenderFirstBSPNode(cachenum); + R_AddPrecipitationSprites(); + + Mask_Post(mask); +} + // FAB NOTE FOR WIN32 PORT !! I'm not finished already, // but I suspect network may have problems with the video buffer being locked // for all duration of rendering, and being released only once at the end.. @@ -1531,9 +1543,7 @@ void R_RenderPlayerView(void) srb2::ThreadPool::Sema tp_sema; srb2::g_main_threadpool->begin_sema(); - //R_RenderViewpoint(&masks[nummasks - 1]); - R_RenderBSPNode((INT32)numnodes - 1); - R_AddPrecipitationSprites(); + R_RenderViewpoint(&masks[nummasks - 1], nummasks - 1); ps_bsptime = I_GetPreciseTime() - ps_bsptime; #ifdef TIMING @@ -1593,9 +1603,7 @@ void R_RenderPlayerView(void) // Render the BSP from the new viewpoint, and clip // any sprites with the new clipsegs and window. - //R_RenderViewpoint(&masks[nummasks - 1]); - R_RenderBSPNode((INT32)numnodes - 1); - Mask_Post(&masks[nummasks - 1]); + R_RenderViewpoint(&masks[nummasks - 1], nummasks - 1); //portalskipprecipmobjs = false; @@ -1771,6 +1779,8 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_debugrender_contrast); CV_RegisterVar(&cv_debugrender_spriteclip); CV_RegisterVar(&cv_debugrender_portal); + CV_RegisterVar(&cv_debugrender_visplanes); + CV_RegisterVar(&cv_debugrender_freezebsp); COM_AddCommand("debugrender_highlight", Command_Debugrender_highlight); }