From 41e23a24cc40ab2c472971975c1e3b6092cc9bb2 Mon Sep 17 00:00:00 2001 From: NepDisk <16447892+NepDisk@users.noreply.github.com> Date: Wed, 31 Jul 2024 02:11:05 -0400 Subject: [PATCH] Revert "Merge branch 'bbox' into 'master'" This reverts commit 62dae0d1b6bee9aa92362db189410f8104b8b502. --- src/Sourcefile | 1 - src/d_netcmd.c | 1 - src/p_mobj.h | 2 +- src/r_bbox.c | 298 ------------------------------------------------- src/r_things.c | 158 ++------------------------ src/r_things.h | 8 -- src/screen.h | 2 +- 7 files changed, 13 insertions(+), 457 deletions(-) delete mode 100644 src/r_bbox.c diff --git a/src/Sourcefile b/src/Sourcefile index 3ebe32c16..07b28d815 100644 --- a/src/Sourcefile +++ b/src/Sourcefile @@ -66,7 +66,6 @@ r_skins.c r_sky.c r_splats.c r_things.c -r_bbox.c r_textures.c r_patch.c r_patchrotation.c diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 617480f9c..efeca9d02 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -995,7 +995,6 @@ void D_RegisterClientCommands(void) // screen.c CV_RegisterVar(&cv_fullscreen); CV_RegisterVar(&cv_renderview); - CV_RegisterVar(&cv_renderhitbox); CV_RegisterVar(&cv_vhseffect); CV_RegisterVar(&cv_shittyscreen); CV_RegisterVar(&cv_renderer); diff --git a/src/p_mobj.h b/src/p_mobj.h index 6823f40e9..56241edd7 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -122,7 +122,7 @@ typedef enum MF_AMBIENT = 1<<10, // Slide this object when it hits a wall. MF_SLIDEME = 1<<11, - // Don't collide with walls or solid objects. Two MF_NOCLIP objects can't touch each other at all! + // Player cheat. MF_NOCLIP = 1<<12, // Allow moves to any height, no gravity. For active floaters. MF_FLOAT = 1<<13, diff --git a/src/r_bbox.c b/src/r_bbox.c deleted file mode 100644 index 969aeacff..000000000 --- a/src/r_bbox.c +++ /dev/null @@ -1,298 +0,0 @@ -// SONIC ROBO BLAST 2 -//----------------------------------------------------------------------------- -// Copyright (C) 1993-1996 by id Software, Inc. -// Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2021 by Sonic Team Junior. -// Copyright (C) 2022 by Kart Krew. -// -// This program is free software distributed under the -// terms of the GNU General Public License, version 2. -// See the 'LICENSE' file for more details. -//----------------------------------------------------------------------------- -/// \file r_bbox.c -/// \brief Boundary box (cube) renderer - -#include "doomdef.h" -#include "command.h" -#include "r_local.h" -#include "screen.h" // cv_renderhitbox -#include "v_video.h" // V_DrawFill - -enum { - RENDERHITBOX_OFF, - RENDERHITBOX_TANGIBLE, - RENDERHITBOX_ALL, - RENDERHITBOX_INTANGIBLE, - RENDERHITBOX_RINGS, -}; - -static CV_PossibleValue_t renderhitbox_cons_t[] = { - {RENDERHITBOX_OFF, "Off"}, - {RENDERHITBOX_TANGIBLE, "Tangible"}, - {RENDERHITBOX_ALL, "All"}, - {RENDERHITBOX_INTANGIBLE, "Intangible"}, - {RENDERHITBOX_RINGS, "Rings"}, - {0}}; - -consvar_t cv_renderhitbox = CVAR_INIT ("renderhitbox", "Off", 0, renderhitbox_cons_t, NULL); - -struct bbox_col { - INT32 x; - INT32 y; - INT32 h; -}; - -struct bbox_config { - fixed_t height; - fixed_t tz; - struct bbox_col col[4]; - UINT8 color; -}; - -static inline void -raster_bbox_seg -( INT32 x, - fixed_t y, - fixed_t h, - UINT8 pixel) -{ - y /= FRACUNIT; - - if (y < 0) - y = 0; - - h = y + (FixedCeil(abs(h)) / FRACUNIT); - - if (h >= viewheight) - h = viewheight; - - while (y < h) - { - topleft[x + y * vid.width] = pixel; - y++; - } -} - -static void -draw_bbox_col -( struct bbox_config * bb, - int p, - fixed_t tx, - fixed_t ty) -{ - struct bbox_col *col = &bb->col[p]; - - fixed_t xscale, yscale; - - if (ty < FRACUNIT) // projection breaks down here - ty = FRACUNIT; - - xscale = FixedDiv(projection[viewssnum], ty); - yscale = FixedDiv(projectiony[viewssnum], ty); - - col->x = (centerxfrac + FixedMul(tx, xscale)) / FRACUNIT; - col->y = (centeryfrac - FixedMul(bb->tz, yscale)); - col->h = FixedMul(bb->height, yscale); - - // Using this function is TOO EASY! - V_DrawFill( - viewwindowx + col->x, - viewwindowy + col->y / FRACUNIT, 1, - col->h / FRACUNIT, V_NOSCALESTART | bb->color); -} - -static void -draw_bbox_row -( struct bbox_config * bb, - int p1, - int p2) -{ - struct bbox_col - *a = &bb->col[p1], - *b = &bb->col[p2]; - - INT32 x1, x2; // left, right - INT32 dx; // width - - fixed_t y1, y2; // top, bottom - fixed_t s1, s2; // top and bottom increment - - if (a->x > b->x) - { - struct bbox_col *c = a; - a = b; - b = c; - } - - x1 = a->x; - x2 = b->x; - - if (x2 >= viewwidth) - x2 = viewwidth - 1; - - if (x1 == x2 || x1 >= viewwidth || x2 < 0) - return; - - dx = x2 - x1; - - y1 = a->y; - y2 = b->y; - s1 = (y2 - y1) / dx; - - y2 = y1 + a->h; - s2 = ((b->y + b->h) - y2) / dx; - - // FixedCeil needs a minimum!!! :D :D - - if (s1 == 0) - s1 = 1; - - if (s2 == 0) - s2 = 1; - - if (x1 < 0) - { - y1 -= x1 * s1; - y2 -= x1 * s2; - x1 = 0; - } - - while (x1 < x2) - { - raster_bbox_seg(x1, y1, s1, bb->color); - raster_bbox_seg(x1, y2, s2, bb->color); - - y1 += s1; - y2 += s2; - - x1++; - } -} - -static UINT8 -get_bbox_color (vissprite_t *vis) -{ - UINT32 flags = vis->mobjflags; - - if (vis->mobj->player) - return 255; // 0FF - - if (flags & (MF_NOCLIPTHING)) - return 7; // BFBFBF - - if (flags & (MF_SPECIAL)) - return 73; // FF0 - - if (flags & (MF_BOSS|MF_MISSILE|MF_ENEMY|MF_PAIN)) - return 35; // F00 - - if (flags & (MF_NOCLIP)) - return 152; // 00F - - return 0; // FFF -} - -void R_DrawThingBoundingBox(vissprite_t *vis) -{ - // radius offsets - fixed_t rs = vis->scale; - fixed_t rc = vis->xscale; - - // translated coordinates - fixed_t tx = vis->gx; - fixed_t ty = vis->gy; - - struct bbox_config bb = { - .height = vis->thingheight, - .tz = vis->texturemid, - .color = get_bbox_color(vis), - }; - - // 1--3 - // | | - // 0--2 - - // left - - draw_bbox_col(&bb, 0, tx, ty); // bottom - draw_bbox_col(&bb, 1, tx - rc, ty + rs); // top - - // right - - tx += rs; - ty += rc; - - draw_bbox_col(&bb, 2, tx, ty); // bottom - draw_bbox_col(&bb, 3, tx - rc, ty + rs); // top - - // connect all four columns - - draw_bbox_row(&bb, 0, 1); - draw_bbox_row(&bb, 1, 3); - draw_bbox_row(&bb, 3, 2); - draw_bbox_row(&bb, 2, 0); -} - -static boolean is_tangible (mobj_t *thing) -{ - // These objects can never touch another - if (thing->flags & (MF_NOCLIPTHING)) - { - return false; - } - - // These objects probably do nothing! :D - if ((thing->flags & (MF_SPECIAL|MF_SOLID|MF_SHOOTABLE - |MF_PUSHABLE|MF_BOSS|MF_MISSILE|MF_SPRING - |MF_MONITOR|MF_ENEMY|MF_PAIN|MF_STICKY - |MF_PICKUPFROMBELOW)) == 0U) - { - return false; - } - - return true; -} - -boolean R_ThingBoundingBoxVisible(mobj_t *thing) -{ - INT32 cvmode = cv_renderhitbox.value; - - if (thing->type == MT_WAYPOINT) - { - // Waypoints debugger serves this purpose - return false; - } - - if (thing == r_viewmobj) - { - // Rendering bbox right on top causes anomalies - return false; - } - - switch (cvmode) - { - case RENDERHITBOX_OFF: - return false; - - case RENDERHITBOX_ALL: - return true; - - case RENDERHITBOX_INTANGIBLE: - return !is_tangible(thing); - - case RENDERHITBOX_TANGIBLE: - // Exclude rings from here, lots of them! - if (thing->type == MT_RING) - { - return false; - } - - return is_tangible(thing); - - case RENDERHITBOX_RINGS: - return (thing->type == MT_RING); - - default: - return false; - } -} diff --git a/src/r_things.c b/src/r_things.c index 23c9179c2..177b5bf95 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1436,104 +1436,6 @@ static void R_ProjectDropShadow( objectsdrawn++; } -static void R_ProjectBoundingBox(mobj_t *thing, vissprite_t *vis) -{ - fixed_t gx, gy; - fixed_t tx, tz; - - vissprite_t *box; - - // uncapped/interpolation - interpmobjstate_t interp = {0}; - - if (!R_ThingBoundingBoxVisible(thing)) - { - return; - } - - // do interpolation - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(thing, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(thing, FRACUNIT, &interp); - } - - // 1--3 - // | | - // 0--2 - - // start in the (0) corner - 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, interp.scale))) - { - return; - } - - tx = FixedMul(gx, viewsin) - FixedMul(gy, viewcos); - - // too far off the side? - if (!vis && abs(tx) > FixedMul(tz, fovtan[viewssnum])<<2) - { - return; - } - - box = R_NewVisSprite(); - box->mobj = thing; - box->mobjflags = thing->flags; - box->thingheight = thing->height; - box->cut = SC_BBOX; - - box->gx = tx; - box->gy = tz; - - box->scale = 2 * FixedMul(thing->radius, viewsin); - box->xscale = 2 * FixedMul(thing->radius, viewcos); - - box->pz = interp.z; - box->pzt = box->pz + box->thingheight; - - box->gzt = box->pzt; - box->gz = box->pz; - box->texturemid = box->gzt - viewz; - - if (vis) - { - box->x1 = vis->x1; - box->x2 = vis->x2; - box->szt = vis->szt; - box->sz = vis->sz; - - box->sortscale = vis->sortscale; // link sorting to sprite - box->dispoffset = vis->dispoffset + 5; - - box->cut |= SC_LINKDRAW; - } - else - { - fixed_t xscale = FixedDiv(projection[viewssnum], tz); - fixed_t yscale = FixedDiv(projectiony[viewssnum], tz); - fixed_t top = (centeryfrac - FixedMul(box->texturemid, yscale)); - - box->x1 = (centerxfrac + FixedMul(box->gx, xscale)) / FRACUNIT; - box->x2 = box->x1; - - box->szt = top / FRACUNIT; - box->sz = (top + FixedMul(box->thingheight, yscale)) / FRACUNIT; - - box->sortscale = yscale; - box->dispoffset = 0; - } -} - // // R_ProjectSprite // Generates a vissprite for a thing @@ -2256,8 +2158,6 @@ static void R_ProjectSprite(mobj_t *thing) R_ProjectDropShadow(oldthing, vis, oldthing->shadowscale, basetx, basetz); } - R_ProjectBoundingBox(oldthing, vis); - // Debug ++objectsdrawn; } @@ -2492,26 +2392,8 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) limit_dist = (fixed_t)(cv_drawdist.value) * mapobjectscale; for (thing = sec->thinglist; thing; thing = thing->snext) { - if (R_ThingWithinDist(thing, limit_dist)) - { - const INT32 oldobjectsdrawn = objectsdrawn; - - if (R_ThingVisible(thing)) - { - R_ProjectSprite(thing); - } - - // I'm so smart :^) - if (objectsdrawn == oldobjectsdrawn) - { - /* - Object is invisible OR is off screen but - render its bbox even if the latter because - radius could be bigger than sprite. - */ - R_ProjectBoundingBox(thing, NULL); - } - } + if (R_ThingVisibleWithinDist(thing, limit_dist)) + R_ProjectSprite(thing); } // no, no infinite draw distance for precipitation. this option at zero is supposed to turn it off @@ -2584,10 +2466,6 @@ static void R_SortVisSprites(vissprite_t* vsprsortedhead, UINT32 start, UINT32 e if (dsfirst->cut & SC_SHADOW) continue; - // don't connect to your bounding box! - if (dsfirst->cut & SC_BBOX) - continue; - // don't connect if it's not the tracer if (dsfirst->mobj != ds->mobj) continue; @@ -3031,9 +2909,7 @@ static void R_DrawSprite(vissprite_t *spr) mfloorclip = spr->clipbot; mceilingclip = spr->cliptop; - if (spr->cut & SC_BBOX) - R_DrawThingBoundingBox(spr); - else if (spr->cut & SC_SPLAT) + if (spr->cut & SC_SPLAT) R_DrawFloorSplat(spr); else R_DrawVisSprite(spr); @@ -3332,12 +3208,6 @@ void R_ClipSprites(drawseg_t* dsstart, portal_t* portal) INT32 x1 = (spr->cut & SC_SPLAT) ? 0 : spr->x1; INT32 x2 = (spr->cut & SC_SPLAT) ? viewwidth : spr->x2; - if (spr->cut & SC_BBOX) - { - // Do not clip bounding boxes - continue; - } - if (x2 < cx) { drawsegs_xrange = drawsegs_xranges[1].items; @@ -3376,26 +3246,20 @@ boolean R_ThingVisible (mobj_t *thing) return true; } -boolean R_ThingWithinDist (mobj_t *thing, fixed_t limit_dist) -{ - const fixed_t dist = R_PointToDist(thing->x, thing->y); - - if (limit_dist && dist > limit_dist) - { - return false; - } - - return true; -} - -// For OpenGL, TODO: REMOVE!! boolean R_ThingVisibleWithinDist (mobj_t *thing, fixed_t limit_dist) { + fixed_t approx_dist; + if (! R_ThingVisible(thing)) return false; - return R_ThingWithinDist(thing, limit_dist); + approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); + + if (limit_dist && approx_dist > limit_dist) + return false; + + return true; } /* Check if precipitation may be drawn from our current view. */ diff --git a/src/r_things.h b/src/r_things.h index 085d15512..bd7449d3e 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -66,13 +66,8 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel); void R_InitSprites(void); void R_ClearSprites(void); -boolean R_ThingBoundingBoxVisible(mobj_t *thing); - boolean R_ThingVisible (mobj_t *thing); -boolean R_ThingWithinDist (mobj_t *thing, - fixed_t draw_dist); - boolean R_ThingVisibleWithinDist (mobj_t *thing, fixed_t draw_dist); @@ -139,7 +134,6 @@ typedef enum SC_SPLAT = 1<<11, // srb2kart SC_SEMIBRIGHT = 1<<12, - SC_BBOX = 1<<13, // masks SC_CUTMASK = SC_TOP|SC_BOTTOM, SC_FLAGMASK = ~SC_CUTMASK @@ -226,8 +220,6 @@ extern UINT32 visspritecount; void R_ClipSprites(drawseg_t* dsstart, portal_t* portal); void R_ClipVisSprite(vissprite_t *spr, INT32 x1, INT32 x2, portal_t* portal); -void R_DrawThingBoundingBox(vissprite_t *spr); - UINT8 *R_GetSpriteTranslation(vissprite_t *vis); // ---------- diff --git a/src/screen.h b/src/screen.h index 8abf77224..268b11e95 100644 --- a/src/screen.h +++ b/src/screen.h @@ -201,7 +201,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_fullscreen; extern consvar_t cv_vhseffect, cv_shittyscreen; // wait for page flipping to end or not