debugrender_freezebsp: freeze culling to your current position, so you can see how much level is being rendered

This commit is contained in:
James R 2024-01-17 16:43:45 -08:00 committed by NepDisk
parent a6aeb1194f
commit 90196d8913
4 changed files with 68 additions and 9 deletions

View file

@ -12,6 +12,7 @@
/// \brief BSP traversal, handling of LineSegs for rendering
#include <algorithm>
#include <vector>
//#include <tracy/tracy/Tracy.hpp>
@ -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<std::vector<INT32>> node_cache;
static std::vector<INT32>* 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);
}

View file

@ -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:

View file

@ -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;

View file

@ -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);
}