diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 466efe01ba2b53df454c221fcad1dee555fda694..1ec605a4c362d4f253fda62159e1c411e95093e7 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3129,19 +3129,26 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) baseWallVerts[0].t = baseWallVerts[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; } - // Let dispoffset work first since this adjust each vertex - HWR_RotateSpritePolyToAim(spr, baseWallVerts, false); + // push it toward the camera to mitigate floor-clipping sprites - float sprdist = sqrtf((spr->x1 - gl_viewx)*(spr->x1 - gl_viewx) + (spr->z1 - gl_viewy)*(spr->z1 - gl_viewy) + (spr->gzt - gl_viewz)*(spr->gzt - gl_viewz)); - float distfact = ((2.0f*spr->dispoffset) + 20.0f) / sprdist; - for (i = 0; i < 4; i++) + if (!R_ThingIsPaperSprite(spr->mobj)) // but not for papersprites { - baseWallVerts[i].x += (gl_viewx - baseWallVerts[i].x)*distfact; - baseWallVerts[i].z += (gl_viewy - baseWallVerts[i].z)*distfact; - baseWallVerts[i].y += (gl_viewz - baseWallVerts[i].y)*distfact; + // Let dispoffset work first since this adjust each vertex + HWR_RotateSpritePolyToAim(spr, baseWallVerts, false); + + // push it toward the camera to mitigate floor-clipping sprites + float sprdist = sqrtf((spr->x1 - gl_viewx)*(spr->x1 - gl_viewx) + (spr->z1 - gl_viewy)*(spr->z1 - gl_viewy) + (spr->gzt - gl_viewz)*(spr->gzt - gl_viewz)); + float distfact = ((2.0f*spr->dispoffset) + 20.0f) / sprdist; + for (i = 0; i < 4; i++) + { + baseWallVerts[i].x += (gl_viewx - baseWallVerts[i].x)*distfact; + baseWallVerts[i].z += (gl_viewy - baseWallVerts[i].z)*distfact; + baseWallVerts[i].y += (gl_viewz - baseWallVerts[i].y)*distfact; + } } + realtop = top = baseWallVerts[3].y; realbot = bot = baseWallVerts[0].y; ttop = baseWallVerts[3].t; @@ -3596,23 +3603,40 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) wallVerts[0].t = wallVerts[1].t = ((GLPatch_t *)gpatch->hardware)->max_t; } - if (!splat) + float sprdist = 0.0f, distfact = 0.0f; + size_t i; + + if (!splat && !R_ThingIsPaperSprite(spr->mobj)) { // Let dispoffset work first since this adjust each vertex - // ...nah HWR_RotateSpritePolyToAim(spr, wallVerts, false); - + // push it toward the camera to mitigate floor-clipping sprites - float sprdist = sqrtf((spr->x1 - gl_viewx)*(spr->x1 - gl_viewx) + (spr->z1 - gl_viewy)*(spr->z1 - gl_viewy) + (spr->gzt - gl_viewz)*(spr->gzt - gl_viewz)); - float distfact = ((2.0f*spr->dispoffset) + 20.0f) / sprdist; - size_t i; + sprdist = sqrtf((spr->x1 - gl_viewx)*(spr->x1 - gl_viewx) + (spr->z1 - gl_viewy)*(spr->z1 -gl_viewy)+ (spr->gzt - gl_viewz)*(spr->gzt - gl_viewz)); + distfact = ((2.0f* spr->dispoffset) + 20.0f) / sprdist; for (i = 0; i < 4; i++) { - wallVerts[i].x += (gl_viewx - wallVerts[i].x)*distfact; - wallVerts[i].z += (gl_viewy - wallVerts[i].z)*distfact; - wallVerts[i].y += (gl_viewz - wallVerts[i].y)*distfact; + wallVerts[i].x += (gl_viewx - wallVerts[i].x)*distfact; + wallVerts[i].z += (gl_viewy - wallVerts[i].z)*distfact; + wallVerts[i].y += (gl_viewz - wallVerts[i].y)*distfact; } } + else if (R_ThingIsFloorSprite(spr->mobj)) + { + sprdist = sqrtf((spr->x1 - gl_viewx)*(spr->x1 - gl_viewx) + (spr->z1 - gl_viewy)*(spr->z1 - gl_viewy)); + distfact = (2.0f + 20.0f) / sprdist; + + // pull splats out of the floor + for (i = 0; i < 4; i++) + { + wallVerts[i].x += (gl_viewx - wallVerts[i].x)*distfact; + wallVerts[i].z += (gl_viewy - wallVerts[i].z)*distfact; + wallVerts[i].y += (gl_viewz - wallVerts[i].y)*distfact; + } + } + + + // This needs to be AFTER the shadows so that the regular sprites aren't drawn completely black. // sprite lighting by modulating the RGB components