From 93c6b802169151a0a4f97da191bbe7430dd608f1 Mon Sep 17 00:00:00 2001 From: CobaltBW Date: Tue, 29 Jun 2021 18:10:52 -0700 Subject: [PATCH] - Added debug hitbox viewer for OpenGL - - Enabled when devmode flags is set to DBG_GAMELOGIC (128) --- src/hardware/hw_main.c | 146 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index d413e3bbe..bf26957b8 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4823,6 +4823,149 @@ static void HWR_CreateDrawNodes(void) Z_Free(sortindex); } +// HWR_DrawCollisionBox +// Modified from HWR_DrawDropShadow +static void HWR_DrawCollisionBox(mobj_t *thing) +{ + fixed_t scale = thing->scale; + patch_t *gpatch; + FOutVector sideA[4]; + FOutVector sideB[4]; + FOutVector sideC[4]; + FOutVector sideD[4]; + FOutVector sideE[4]; //Top + //FOutVector sideF[4]; //Bottom. Doesn't look very nice against shadows, so I decided against it. + FSurfaceInfo sSurf; + float fscale; float fx; float fy; float offset; + extracolormap_t *colormap = NULL; + + INT32 light; + fixed_t scalemul; + UINT16 alpha = 64; + UINT16 alpha2 = 128; + UINT16 alpha3 = 192; + + gpatch = (patch_t *)W_CachePatchName("~103", PU_SPRITE); + if (!(gpatch && ((GLPatch_t *)gpatch->hardware)->mipmap->format)) return; + HWR_GetPatch(gpatch); + + scalemul = FixedMul(scale, (thing->radius*2) / gpatch->height); + + fscale = FIXED_TO_FLOAT(scalemul); + fx = FIXED_TO_FLOAT(thing->x); + fy = FIXED_TO_FLOAT(thing->y); + + if (thing && fabsf(fscale - 1.0f) > 1.0E-36f) + offset = ((gpatch->height)/2) * fscale; + else + offset = (float)((gpatch->height)/2); + + // 3--2 + // | /| + // |/ | + // 0--1 + sideA[2].x = sideA[3].x = fx + offset; + sideB[2].x = sideB[3].x = fx + offset; + sideC[2].x = sideC[1].x = fx + offset; //Side X+ + sideD[2].x = sideD[1].x = fx - offset; //Side X- + sideE[2].x = sideE[3].x = fx + offset; + //sideF[2].x = sideF[3].x = fx + offset; + + sideA[1].x = sideA[0].x = fx - offset; + sideB[1].x = sideB[0].x = fx - offset; + sideC[3].x = sideC[0].x = fx + offset; //Side X+ + sideD[3].x = sideD[0].x = fx - offset; //Side X- + sideE[1].x = sideE[0].x = fx - offset; + //sideF[1].x = sideF[0].x = fx - offset; + + sideA[1].z = sideA[2].z = fy + offset; //Side Y+ + sideB[1].z = sideB[2].z = fy - offset; + sideC[3].z = sideC[2].z = fy - offset; //Side X+ + sideD[3].z = sideD[2].z = fy - offset; //Side X- + sideE[1].z = sideE[2].z = fy - offset; + //sideF[1].z = sideF[2].z = fy - offset; + + sideA[0].z = sideA[3].z = fy + offset; + sideB[0].z = sideB[3].z = fy - offset; //Side Y- + sideC[0].z = sideC[1].z = fy + offset; //Side X+ + sideD[0].z = sideD[1].z = fy + offset; //Side X- + sideE[0].z = sideE[3].z = fy + offset; + //sideF[0].z = sideF[3].z = fy + offset; + + sideA[0].y = sideA[3].y = FIXED_TO_FLOAT(thing->z); + sideB[0].y = sideB[3].y = FIXED_TO_FLOAT(thing->z); + sideC[0].y = sideC[3].y = FIXED_TO_FLOAT(thing->z); + sideD[0].y = sideD[3].y = FIXED_TO_FLOAT(thing->z); + sideE[0].y = sideE[3].y = FIXED_TO_FLOAT(thing->z + thing->height); //Top side + //sideF[0].y = sideF[3].y = FIXED_TO_FLOAT(thing->z); + + sideA[1].y = sideA[2].y = FIXED_TO_FLOAT(thing->z + thing->height); + sideB[1].y = sideB[2].y = FIXED_TO_FLOAT(thing->z + thing->height); + sideC[1].y = sideC[2].y = FIXED_TO_FLOAT(thing->z + thing->height); + sideD[1].y = sideD[2].y = FIXED_TO_FLOAT(thing->z + thing->height); + sideE[1].y = sideE[2].y = FIXED_TO_FLOAT(thing->z + thing->height); + //sideF[1].y = sideF[2].y = FIXED_TO_FLOAT(thing->z); //Bottom side + + //UV Coords + sideA[0].s = sideA[3].s = 0; + sideB[0].s = sideB[3].s = 0; + sideC[0].s = sideC[3].s = 0; + sideD[0].s = sideD[3].s = 0; + sideE[0].s = sideE[3].s = 0; + //sideF[0].s = sideF[3].s = 0; + + sideA[2].s = sideA[1].s = ((GLPatch_t *)gpatch->hardware)->max_s; + sideB[2].s = sideB[1].s = ((GLPatch_t *)gpatch->hardware)->max_s; + sideC[2].s = sideC[1].s = ((GLPatch_t *)gpatch->hardware)->max_s; + sideD[2].s = sideD[1].s = ((GLPatch_t *)gpatch->hardware)->max_s; + sideE[2].s = sideE[1].s = ((GLPatch_t *)gpatch->hardware)->max_s; + //sideF[2].s = sideF[1].s = ((GLPatch_t *)gpatch->hardware)->max_s; + + sideA[3].t = sideA[2].t = 0; + sideB[3].t = sideB[2].t = 0; + sideC[3].t = sideC[2].t = 0; + sideD[3].t = sideD[2].t = 0; + sideE[3].t = sideE[2].t = 0; + //sideF[3].t = sideF[2].t = 0; + + sideA[0].t = sideA[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; + sideB[0].t = sideB[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; + sideC[0].t = sideC[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; + sideD[0].t = sideD[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; + sideE[0].t = sideE[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; + //sideF[0].t = sideF[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; + + + //Lighting stuff. + //Again, pulled from shadows. Don't know if everything here is necessary, but someone smarter than me could probably curate it. + if (!(thing->renderflags & RF_NOCOLORMAPS)) + { + if (thing->subsector->sector->numlights) + { + // Always use the light at the top instead of whatever I was doing before + light = R_GetPlaneLight(thing->subsector->sector, thing->z, false); + + if (*thing->subsector->sector->lightlist[light].extra_colormap) + colormap = *thing->subsector->sector->lightlist[light].extra_colormap; + } + else if (thing->subsector->sector->extra_colormap) + colormap = thing->subsector->sector->extra_colormap; + } + + HWR_Lighting(&sSurf, 0, colormap); + + //Process + sSurf.PolyColor.s.alpha = alpha; //Lightest shade + HWR_ProcessPolygon(&sSurf, sideA, 4, PF_Translucent|PF_Modulated, SHADER_SPRITE, false); + HWR_ProcessPolygon(&sSurf, sideE, 4, PF_Translucent|PF_Modulated, SHADER_SPRITE, false); + sSurf.PolyColor.s.alpha = alpha2; + HWR_ProcessPolygon(&sSurf, sideC, 4, PF_Translucent|PF_Modulated, SHADER_SPRITE, false); + HWR_ProcessPolygon(&sSurf, sideD, 4, PF_Translucent|PF_Modulated, SHADER_SPRITE, false); + sSurf.PolyColor.s.alpha = alpha3; //Darkest Shade + HWR_ProcessPolygon(&sSurf, sideB, 4, PF_Translucent|PF_Modulated, SHADER_SPRITE, false); + //HWR_ProcessPolygon(&sSurf, sideF, 4, PF_Translucent|PF_Modulated, SHADER_SPRITE, false); +} + // -------------------------------------------------------------------------- // Draw all vissprites // -------------------------------------------------------------------------- @@ -4888,6 +5031,9 @@ static void HWR_DrawSprites(void) HWR_DrawSprite(spr); } } + //Draw debug collision box + if (cv_debug & DBG_GAMELOGIC) + HWR_DrawCollisionBox(spr->mobj); } } HWD.pfnSetSpecialState(HWD_SET_MODEL_LIGHTING, 0);