From 94e0e7fb70303903c30f961188a92b5eaf61be43 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 17:28:22 +0100 Subject: [PATCH 1/8] use shader to mitigate sprite clipping unless its shadows and papersprites also moved stuff into its own function to not make shit look like hell --- src/hardware/hw_defs.h | 1 + src/hardware/hw_main.c | 70 ++++++++++++++++++++++++++++----------- src/hardware/hw_shaders.c | 3 ++ src/hardware/hw_shaders.h | 10 ++++++ 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 85261c859..30333986f 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -174,6 +174,7 @@ enum SHADER_SHADOW, SHADER_WALL, SHADER_SPRITE, + SHADER_SPRITECLIPHACK, SHADER_MODEL, SHADER_WATER, SHADER_FOG, diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 8c10f1eec..dc86a4121 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3455,6 +3455,53 @@ static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts } } +static void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean papersprite) +{ + // dont push papersprites near the cam + if (papersprite && !spr->dispoffset) + { + HWR_RotateSpritePolyToAim(spr, wallVerts, false); + return; + } + + // yes shadows need this crap applied since they dont work well enough with just the shader + if ((HWR_UseShader() && spr->mobj->type == MT_SHADOW) || !HWR_UseShader()) + { + if (!papersprite) // dont push papersprites near the cam + { + // Let dispoffset work first since this adjust each vertex + HWR_RotateSpritePolyToAim(spr, wallVerts, false); + + 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 (size_t 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; + } + } + else // unless they have a dispoffset + { + if (spr->dispoffset) + { + // if it has a dispoffset, push it a little towards the camera + float co = -gl_viewcos*(0.05f*spr->dispoffset); + float si = -gl_viewsin*(0.05f*spr->dispoffset); + wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si; + wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si; + wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co; + wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; + } + + // Let dispoffset work first since this adjust each vertex + HWR_RotateSpritePolyToAim(spr, wallVerts, false); + } + + } +} + static void HWR_SplitSprite(gl_vissprite_t *spr) { FOutVector wallVerts[4]; @@ -3539,14 +3586,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) 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; - } + HWR_ApplyDispoffset(spr, baseWallVerts, papersprite); realtop = top = baseWallVerts[3].y; realbot = bot = baseWallVerts[0].y; @@ -3586,7 +3626,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) if (HWR_UseShader()) { - shader = SHADER_SPRITE; + shader = (papersprite || spr->mobj->type == MT_SHADOW) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; blend |= PF_ColorMapped; } @@ -3813,15 +3853,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) 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; - 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; - } + HWR_ApplyDispoffset(spr, wallVerts, papersprite); // This needs to be AFTER the shadows so that the regular sprites aren't drawn completely black. // sprite lighting by modulating the RGB components @@ -3861,7 +3893,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) if (HWR_UseShader()) { - shader = SHADER_SPRITE; + shader = (papersprite || spr->mobj->type == MT_SHADOW) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; blend |= PF_ColorMapped; } diff --git a/src/hardware/hw_shaders.c b/src/hardware/hw_shaders.c index 3046b902e..bd808e070 100644 --- a/src/hardware/hw_shaders.c +++ b/src/hardware/hw_shaders.c @@ -38,6 +38,9 @@ static struct { // Sprite shader {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, + // Sprite clipping hack shader (for pulling things out of the floor) + {GLSL_SPRITECLIP_HACK_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, + // Model shader {GLSL_DEFAULT_VERTEX_SHADER, GLSL_WALL_FRAGMENT_SHADER}, diff --git a/src/hardware/hw_shaders.h b/src/hardware/hw_shaders.h index 77a93eb2e..f952609d5 100644 --- a/src/hardware/hw_shaders.h +++ b/src/hardware/hw_shaders.h @@ -31,6 +31,16 @@ "gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;\n" \ "}\0" +// Sprite clipping makes me want to McFucking Die +#define GLSL_SPRITECLIP_HACK_VERTEX_SHADER \ + "void main(void) {\n" \ + "gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;\n" \ + "gl_FrontColor = gl_Color;\n" \ + "gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;\n" \ + "gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;\n" \ + "gl_Position.z -= 160.0 / gl_Position.z;\n" \ + "}\0" + // ================== // Fragment shaders // ================== -- 2.54.0 From ac2ba6e4bf99a5fb02818af2d6fa850999a0a84c Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 17:03:37 +0100 Subject: [PATCH 2/8] optimize this a bit no need to constantly recheck this, just pass it around as a bool also inline dispoffset function since it used to be a nested thing --- src/hardware/hw_main.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index dc86a4121..728a2cc9f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3455,7 +3455,7 @@ static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts } } -static void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean papersprite) +static inline void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean papersprite, const boolean shadow) { // dont push papersprites near the cam if (papersprite && !spr->dispoffset) @@ -3465,7 +3465,7 @@ static void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, cons } // yes shadows need this crap applied since they dont work well enough with just the shader - if ((HWR_UseShader() && spr->mobj->type == MT_SHADOW) || !HWR_UseShader()) + if ((HWR_UseShader() && shadow) || !HWR_UseShader()) { if (!papersprite) // dont push papersprites near the cam { @@ -3502,7 +3502,7 @@ static void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, cons } } -static void HWR_SplitSprite(gl_vissprite_t *spr) +static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite, const boolean shadow) { FOutVector wallVerts[4]; FOutVector baseWallVerts[4]; // This is what the verts should end up as @@ -3586,7 +3586,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) HWR_RotateSpritePolyToAim(spr, baseWallVerts, false); // push it toward the camera to mitigate floor-clipping sprites - HWR_ApplyDispoffset(spr, baseWallVerts, papersprite); + HWR_ApplyDispoffset(spr, baseWallVerts, papersprite, shadow); realtop = top = baseWallVerts[3].y; realbot = bot = baseWallVerts[0].y; @@ -3626,7 +3626,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) if (HWR_UseShader()) { - shader = (papersprite || spr->mobj->type == MT_SHADOW) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; + shader = (papersprite || shadow) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; blend |= PF_ColorMapped; } @@ -3704,7 +3704,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) wallVerts[1].y = endbot; // The x and y only need to be adjusted in the case that it's not a papersprite - if (cv_glspritebillboarding.value && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE)) + if (cv_glspritebillboarding.value && spr->mobj && !papersprite) { // Get the x and z of the vertices so billboarding draws correctly realheight = realbot - realtop; @@ -3780,9 +3780,12 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) if (!spr->mobj->subsector) return; + const boolean papersprite = (spr->mobj->frame & FF_PAPERSPRITE); + const boolean shadow = (spr->mobj->type == MT_SHADOW); + if (spr->mobj->subsector->sector->numlights) { - HWR_SplitSprite(spr); + HWR_SplitSprite(spr, papersprite, shadow); return; } @@ -3853,7 +3856,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) HWR_RotateSpritePolyToAim(spr, wallVerts, false); // push it toward the camera to mitigate floor-clipping sprites - HWR_ApplyDispoffset(spr, wallVerts, papersprite); + HWR_ApplyDispoffset(spr, wallVerts, papersprite, shadow); // This needs to be AFTER the shadows so that the regular sprites aren't drawn completely black. // sprite lighting by modulating the RGB components @@ -3893,7 +3896,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) if (HWR_UseShader()) { - shader = (papersprite || spr->mobj->type == MT_SHADOW) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; + shader = (papersprite || shadow) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; blend |= PF_ColorMapped; } -- 2.54.0 From 014d61b373029abd2870ec2f8aec1ae71fdb8a29 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 17:23:01 +0100 Subject: [PATCH 3/8] restructure this again and let shadows use shader --- src/hardware/hw_main.c | 75 +++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 44 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 728a2cc9f..06214a87f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3455,54 +3455,42 @@ static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts } } -static inline void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean papersprite, const boolean shadow) +static inline void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean papersprite) { - // dont push papersprites near the cam - if (papersprite && !spr->dispoffset) + // dont push papersprites near the cam unless they have a dispoffset + if (papersprite && spr->dispoffset) { + float co = -gl_viewcos*(0.05f*spr->dispoffset); + float si = -gl_viewsin*(0.05f*spr->dispoffset); + wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si; + wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si; + wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co; + wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; + HWR_RotateSpritePolyToAim(spr, wallVerts, false); return; } - // yes shadows need this crap applied since they dont work well enough with just the shader - if ((HWR_UseShader() && shadow) || !HWR_UseShader()) + // Let dispoffset work first since this adjust each vertex + HWR_RotateSpritePolyToAim(spr, wallVerts, false); + + // we do a shader based approach so can just ignore stuff + if (HWR_UseShader() || papersprite) + return; + + 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; + + #pragma omp simd + for (size_t i = 0; i < 4; i++) { - if (!papersprite) // dont push papersprites near the cam - { - // Let dispoffset work first since this adjust each vertex - HWR_RotateSpritePolyToAim(spr, wallVerts, false); - - 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 (size_t 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; - } - } - else // unless they have a dispoffset - { - if (spr->dispoffset) - { - // if it has a dispoffset, push it a little towards the camera - float co = -gl_viewcos*(0.05f*spr->dispoffset); - float si = -gl_viewsin*(0.05f*spr->dispoffset); - wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si; - wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si; - wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co; - wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; - } - - // Let dispoffset work first since this adjust each vertex - HWR_RotateSpritePolyToAim(spr, wallVerts, false); - } - + 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; } } -static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite, const boolean shadow) +static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite) { FOutVector wallVerts[4]; FOutVector baseWallVerts[4]; // This is what the verts should end up as @@ -3586,7 +3574,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite, cons HWR_RotateSpritePolyToAim(spr, baseWallVerts, false); // push it toward the camera to mitigate floor-clipping sprites - HWR_ApplyDispoffset(spr, baseWallVerts, papersprite, shadow); + HWR_ApplyDispoffset(spr, baseWallVerts, papersprite); realtop = top = baseWallVerts[3].y; realbot = bot = baseWallVerts[0].y; @@ -3626,7 +3614,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite, cons if (HWR_UseShader()) { - shader = (papersprite || shadow) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; + shader = (papersprite ? SHADER_SPRITE : SHADER_SPRITECLIPHACK); blend |= PF_ColorMapped; } @@ -3781,11 +3769,10 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) return; const boolean papersprite = (spr->mobj->frame & FF_PAPERSPRITE); - const boolean shadow = (spr->mobj->type == MT_SHADOW); if (spr->mobj->subsector->sector->numlights) { - HWR_SplitSprite(spr, papersprite, shadow); + HWR_SplitSprite(spr, papersprite); return; } @@ -3856,7 +3843,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) HWR_RotateSpritePolyToAim(spr, wallVerts, false); // push it toward the camera to mitigate floor-clipping sprites - HWR_ApplyDispoffset(spr, wallVerts, papersprite, shadow); + HWR_ApplyDispoffset(spr, wallVerts, papersprite); // This needs to be AFTER the shadows so that the regular sprites aren't drawn completely black. // sprite lighting by modulating the RGB components @@ -3896,7 +3883,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) if (HWR_UseShader()) { - shader = (papersprite || shadow) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; + shader = (papersprite ? SHADER_SPRITE : SHADER_SPRITECLIPHACK); blend |= PF_ColorMapped; } -- 2.54.0 From b22b4d7f8400f4a82b8087fd7fd7ead06e45168a Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 17:26:57 +0100 Subject: [PATCH 4/8] ugh logic issue --- src/hardware/hw_main.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 06214a87f..45ff83e9d 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3458,30 +3458,26 @@ static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts static inline void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean papersprite) { // dont push papersprites near the cam unless they have a dispoffset - if (papersprite && spr->dispoffset) + if (papersprite || HWR_UseShader()) { - float co = -gl_viewcos*(0.05f*spr->dispoffset); - float si = -gl_viewsin*(0.05f*spr->dispoffset); - wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si; - wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si; - wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co; - wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; + // if it has a dispoffset, push it a little towards the camera + if (spr->dispoffset) + { + float co = -gl_viewcos*(0.05f*spr->dispoffset); + float si = -gl_viewsin*(0.05f*spr->dispoffset); + wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si; + wallVerts[1].z = wallVerts[2].z = wallVerts[1].z+si; + wallVerts[0].x = wallVerts[3].x = wallVerts[0].x+co; + wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; + } HWR_RotateSpritePolyToAim(spr, wallVerts, false); return; } - // Let dispoffset work first since this adjust each vertex - HWR_RotateSpritePolyToAim(spr, wallVerts, false); - - // we do a shader based approach so can just ignore stuff - if (HWR_UseShader() || papersprite) - return; - 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; - #pragma omp simd for (size_t i = 0; i < 4; i++) { wallVerts[i].x += (gl_viewx - wallVerts[i].x)*distfact; -- 2.54.0 From 8b21048387eba174e9951eb6a98a5b1b9fa1af22 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 17:29:47 +0100 Subject: [PATCH 5/8] conflict fix --- src/hardware/hw_main.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 45ff83e9d..bf8a7465e 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3566,9 +3566,6 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite) baseWallVerts[0].t = baseWallVerts[1].t = gpatch->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 HWR_ApplyDispoffset(spr, baseWallVerts, papersprite); @@ -3834,10 +3831,6 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) HWR_DrawSpriteShadow(spr, gpatch); } - // 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 HWR_ApplyDispoffset(spr, wallVerts, papersprite); -- 2.54.0 From bab83386d4818f9ee47bac828c515509ba68215d Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 17:31:39 +0100 Subject: [PATCH 6/8] also pass papersprite to HWR_RotateSpritePolyToAim --- src/hardware/hw_main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index bf8a7465e..348e272cf 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3388,9 +3388,9 @@ static void HWR_DrawSpriteShadow(gl_vissprite_t *spr, GLPatch_t *gpatch) } // This is expecting a pointer to an array containing 4 wallVerts for a sprite -static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean precip) +static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean precip, const boolean papersprite) { - if (cv_glspritebillboarding.value && spr && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE) && wallVerts) + if (cv_glspritebillboarding.value && spr && spr->mobj && !papersprite && wallVerts) { // uncapped/interpolation interpmobjstate_t interp = {0}; @@ -3471,10 +3471,12 @@ static inline void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVert wallVerts[1].x = wallVerts[2].x = wallVerts[1].x+co; } - HWR_RotateSpritePolyToAim(spr, wallVerts, false); + HWR_RotateSpritePolyToAim(spr, wallVerts, false, papersprite); return; } + HWR_RotateSpritePolyToAim(spr, wallVerts, false, papersprite); + 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; -- 2.54.0 From c989aa3fcfc048665670437b4529032ae8342c42 Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 17:32:20 +0100 Subject: [PATCH 7/8] oop --- src/hardware/hw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 348e272cf..388a7e3dc 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3917,7 +3917,7 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) wallVerts[1].z = wallVerts[2].z = spr->z2; // Let dispoffset work first since this adjust each vertex - HWR_RotateSpritePolyToAim(spr, wallVerts, true); + HWR_RotateSpritePolyToAim(spr, wallVerts, true, false); wallVerts[0].s = wallVerts[3].s = 0; wallVerts[2].s = wallVerts[1].s = gpatch->max_s; -- 2.54.0 From 684de4c8d0c007a7b5fc3e2c43589cecc487e87a Mon Sep 17 00:00:00 2001 From: Alug Date: Wed, 20 Nov 2024 23:03:26 +0100 Subject: [PATCH 8/8] me dont like huge ass if block use return instead lol --- src/hardware/hw_main.c | 125 +++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 388a7e3dc..bbd783d09 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3390,69 +3390,71 @@ static void HWR_DrawSpriteShadow(gl_vissprite_t *spr, GLPatch_t *gpatch) // This is expecting a pointer to an array containing 4 wallVerts for a sprite static void HWR_RotateSpritePolyToAim(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean precip, const boolean papersprite) { - if (cv_glspritebillboarding.value && spr && spr->mobj && !papersprite && wallVerts) + if (!cv_glspritebillboarding.value || !spr || !spr->mobj || papersprite || !wallVerts) { - // uncapped/interpolation - interpmobjstate_t interp = {0}; - float basey, lowy; - INT32 dist = -1; - - if (cv_maxinterpdist.value) - dist = R_QuickCamDist(spr->mobj->x, spr->mobj->y); - - // do interpolation - if (R_UsingFrameInterpolation() && !paused && (!cv_maxinterpdist.value || dist < cv_maxinterpdist.value)) - { - if (precip) - { - R_InterpolatePrecipMobjState((precipmobj_t *)spr->mobj, rendertimefrac, &interp); - } - else - { - R_InterpolateMobjState(spr->mobj, rendertimefrac, &interp); - } - } - else - { - if (precip) - { - R_InterpolatePrecipMobjState((precipmobj_t *)spr->mobj, FRACUNIT, &interp); - } - else - { - R_InterpolateMobjState(spr->mobj, FRACUNIT, &interp); - } - } - - if (!precip && P_MobjFlip(spr->mobj) == -1) // precip doesn't have eflags so they can't flip - { - basey = FIXED_TO_FLOAT(interp.z + spr->mobj->height); - } - else - { - basey = FIXED_TO_FLOAT(interp.z); - } - lowy = wallVerts[0].y; - - // Rotate sprites to fully billboard with the camera - // X, Y, AND Z need to be manipulated for the polys to rotate around the - // origin, because of how the origin setting works I believe that should - // be mobj->z or mobj->z + mobj->height - wallVerts[2].y = wallVerts[3].y = (spr->gzt - basey) * gl_viewludsin + basey; - wallVerts[0].y = wallVerts[1].y = (lowy - basey) * gl_viewludsin + basey; - // translate back to be around 0 before translating back - wallVerts[3].x += ((spr->gzt - basey) * gl_viewludcos) * gl_viewcos; - wallVerts[2].x += ((spr->gzt - basey) * gl_viewludcos) * gl_viewcos; - - wallVerts[0].x += ((lowy - basey) * gl_viewludcos) * gl_viewcos; - wallVerts[1].x += ((lowy - basey) * gl_viewludcos) * gl_viewcos; - - wallVerts[3].z += ((spr->gzt - basey) * gl_viewludcos) * gl_viewsin; - wallVerts[2].z += ((spr->gzt - basey) * gl_viewludcos) * gl_viewsin; - - wallVerts[0].z += ((lowy - basey) * gl_viewludcos) * gl_viewsin; - wallVerts[1].z += ((lowy - basey) * gl_viewludcos) * gl_viewsin; + return; } + + // uncapped/interpolation + interpmobjstate_t interp = {0}; + float basey, lowy; + INT32 dist = -1; + + if (cv_maxinterpdist.value) + dist = R_QuickCamDist(spr->mobj->x, spr->mobj->y); + + // do interpolation + if (R_UsingFrameInterpolation() && !paused && (!cv_maxinterpdist.value || dist < cv_maxinterpdist.value)) + { + if (precip) + { + R_InterpolatePrecipMobjState((precipmobj_t *)spr->mobj, rendertimefrac, &interp); + } + else + { + R_InterpolateMobjState(spr->mobj, rendertimefrac, &interp); + } + } + else + { + if (precip) + { + R_InterpolatePrecipMobjState((precipmobj_t *)spr->mobj, FRACUNIT, &interp); + } + else + { + R_InterpolateMobjState(spr->mobj, FRACUNIT, &interp); + } + } + + if (!precip && P_MobjFlip(spr->mobj) == -1) // precip doesn't have eflags so they can't flip + { + basey = FIXED_TO_FLOAT(interp.z + spr->mobj->height); + } + else + { + basey = FIXED_TO_FLOAT(interp.z); + } + lowy = wallVerts[0].y; + + // Rotate sprites to fully billboard with the camera + // X, Y, AND Z need to be manipulated for the polys to rotate around the + // origin, because of how the origin setting works I believe that should + // be mobj->z or mobj->z + mobj->height + wallVerts[2].y = wallVerts[3].y = (spr->gzt - basey) * gl_viewludsin + basey; + wallVerts[0].y = wallVerts[1].y = (lowy - basey) * gl_viewludsin + basey; + // translate back to be around 0 before translating back + wallVerts[3].x += ((spr->gzt - basey) * gl_viewludcos) * gl_viewcos; + wallVerts[2].x += ((spr->gzt - basey) * gl_viewludcos) * gl_viewcos; + + wallVerts[0].x += ((lowy - basey) * gl_viewludcos) * gl_viewcos; + wallVerts[1].x += ((lowy - basey) * gl_viewludcos) * gl_viewcos; + + wallVerts[3].z += ((spr->gzt - basey) * gl_viewludcos) * gl_viewsin; + wallVerts[2].z += ((spr->gzt - basey) * gl_viewludcos) * gl_viewsin; + + wallVerts[0].z += ((lowy - basey) * gl_viewludcos) * gl_viewsin; + wallVerts[1].z += ((lowy - basey) * gl_viewludcos) * gl_viewsin; } static inline void HWR_ApplyDispoffset(gl_vissprite_t *spr, FOutVector *wallVerts, const boolean papersprite) @@ -3916,7 +3918,6 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) wallVerts[0].z = wallVerts[3].z = spr->z1; wallVerts[1].z = wallVerts[2].z = spr->z2; - // Let dispoffset work first since this adjust each vertex HWR_RotateSpritePolyToAim(spr, wallVerts, true, false); wallVerts[0].s = wallVerts[3].s = 0; -- 2.54.0