From b8a25ae53c5db7017adf2411ebae254ac2ed85c1 Mon Sep 17 00:00:00 2001 From: sphere Date: Tue, 13 Jun 2023 00:05:58 +0000 Subject: [PATCH] Add interpolation to hitbox viewer, tweak hitbox colors --- src/d_netcmd.c | 1 + src/hardware/hw_main.c | 19 ++++++++++++++++--- src/r_bbox.c | 14 ++++++++++++-- src/r_things.c | 22 ++++++++++++++++++---- src/screen.h | 2 +- 5 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 420621a77..0f859a569 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -873,6 +873,7 @@ void D_RegisterClientCommands(void) // screen.c CV_RegisterVar(&cv_fullscreen); CV_RegisterVar(&cv_renderview); + CV_RegisterVar(&cv_renderhitboxinterpolation); CV_RegisterVar(&cv_renderhitbox); CV_RegisterVar(&cv_renderer); CV_RegisterVar(&cv_scr_depth); diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 09235ce62..e7550fd6e 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5686,9 +5686,22 @@ static void HWR_ProjectBoundingBox(mobj_t *thing) if (!R_ThingBoundingBoxVisible(thing)) return; + // uncapped/interpolation + boolean interpolate = cv_renderhitboxinterpolation.value; + interpmobjstate_t interp = {0}; + + if (R_UsingFrameInterpolation() && !paused && interpolate) + { + R_InterpolateMobjState(thing, rendertimefrac, &interp); + } + else + { + R_InterpolateMobjState(thing, FRACUNIT, &interp); + } + // transform the origin point - tr_x = FIXED_TO_FLOAT(thing->x) - gl_viewx; - tr_y = FIXED_TO_FLOAT(thing->y) - gl_viewy; + tr_x = FIXED_TO_FLOAT(interp.x) - gl_viewx; + tr_y = FIXED_TO_FLOAT(interp.y) - gl_viewy; // rotation around vertical axis tz = (tr_x * gl_viewcos) + (tr_y * gl_viewsin); @@ -5707,7 +5720,7 @@ static void HWR_ProjectBoundingBox(mobj_t *thing) vis->x2 = tr_x + rad; vis->z1 = tr_y - rad; vis->z2 = tr_y + rad; - vis->gz = FIXED_TO_FLOAT(thing->z); + vis->gz = FIXED_TO_FLOAT(interp.z); vis->gzt = vis->gz + FIXED_TO_FLOAT(thing->height); vis->mobj = thing; diff --git a/src/r_bbox.c b/src/r_bbox.c index b45007bb2..7ed693fd0 100644 --- a/src/r_bbox.c +++ b/src/r_bbox.c @@ -35,6 +35,7 @@ static CV_PossibleValue_t renderhitbox_cons_t[] = { {0}}; consvar_t cv_renderhitbox = CVAR_INIT ("renderhitbox", "Off", 0, renderhitbox_cons_t, NULL); +consvar_t cv_renderhitboxinterpolation = CVAR_INIT ("renderhitbox_interpolation", "On", CV_SAVE, CV_OnOff, NULL); struct bbox_col { INT32 x; @@ -179,12 +180,21 @@ UINT8 R_GetBoundingBoxColor(mobj_t *thing) if (flags & (MF_NOCLIPTHING)) return 7; // BFBFBF - if (flags & (MF_BOSS|MF_MISSILE|MF_ENEMY|MF_PAIN)) + if (flags & (MF_BOSS|MF_ENEMY)) return 35; // F00 + if (flags & (MF_MISSILE|MF_PAIN)) + return 54; // F70 + if (flags & (MF_SPECIAL|MF_MONITOR)) return 73; // FF0 + if (flags & MF_PUSHABLE) + return 112; // 0F0 + + if (flags & (MF_SPRING)) + return 181; // F0F + if (flags & (MF_NOCLIP)) return 152; // 00F @@ -299,7 +309,7 @@ boolean R_ThingBoundingBoxVisible(mobj_t *thing) return is_tangible(thing); case RENDERHITBOX_RINGS: - return (thing->type == MT_RING); + return (thing->type == MT_RING || thing->type == MT_BLUESPHERE); default: return false; diff --git a/src/r_things.c b/src/r_things.c index 7eecb041e..38237e5b3 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1436,19 +1436,33 @@ static void R_ProjectBoundingBox(mobj_t *thing, vissprite_t *vis) return; } + // uncapped/interpolation + boolean interpolate = cv_renderhitboxinterpolation.value; + interpmobjstate_t interp = {0}; + + // do interpolation + if (R_UsingFrameInterpolation() && !paused && interpolate) + { + R_InterpolateMobjState(thing, rendertimefrac, &interp); + } + else + { + R_InterpolateMobjState(thing, FRACUNIT, &interp); + } + // 1--3 // | | // 0--2 // start in the (0) corner - gx = thing->x - thing->radius - viewx; - gy = thing->y - thing->radius - viewy; + gx = interp.x - thing->radius - viewx; + gy = interp.y - thing->radius - viewy; tz = FixedMul(gx, viewcos) + FixedMul(gy, viewsin); // thing is behind view plane? // if parent vis is visible, ignore this - if (!vis && (tz < FixedMul(MINZ, thing->scale))) + if (!vis && (tz < FixedMul(MINZ, interp.scale))) { return; } @@ -1473,7 +1487,7 @@ static void R_ProjectBoundingBox(mobj_t *thing, vissprite_t *vis) box->scale = 2 * FixedMul(thing->radius, viewsin); box->xscale = 2 * FixedMul(thing->radius, viewcos); - box->pz = thing->z; + box->pz = interp.z; box->pzt = box->pz + box->thingheight; box->gzt = box->pzt; diff --git a/src/screen.h b/src/screen.h index a0e04f85e..b021a419d 100644 --- a/src/screen.h +++ b/src/screen.h @@ -199,7 +199,7 @@ extern CV_PossibleValue_t cv_renderer_t[]; extern INT32 scr_bpp; extern UINT8 *scr_borderpatch; // patch used to fill the view borders -extern consvar_t cv_scr_width, cv_scr_height, cv_scr_depth, cv_renderview, cv_renderer, cv_renderhitbox, cv_fullscreen; +extern consvar_t cv_scr_width, cv_scr_height, cv_scr_depth, cv_renderview, cv_renderer, cv_renderhitbox, cv_renderhitboxinterpolation, cv_fullscreen; // wait for page flipping to end or not extern consvar_t cv_vidwait; extern consvar_t cv_timescale;