From d1a92437f6623d5ab9985492318c67b514d18d70 Mon Sep 17 00:00:00 2001
From: James R <justsomejames2@gmail.com>
Date: Tue, 25 Oct 2022 02:36:35 -0700
Subject: [PATCH] Support spritexoffset/spriteyoffset for 3D models

---
 src/hardware/hw_main.c |  2 +-
 src/hardware/hw_main.h |  1 +
 src/hardware/hw_md2.c  | 22 ++++++++++++++--------
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 9ff4039cf3..ba2f4bca01 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -137,7 +137,7 @@ static fixed_t dup_viewx, dup_viewy, dup_viewz;
 static angle_t dup_viewangle;
 
 static float gl_viewx, gl_viewy, gl_viewz;
-static float gl_viewsin, gl_viewcos;
+float gl_viewsin, gl_viewcos;
 
 // Maybe not necessary with the new T&L code (needs to be checked!)
 static float gl_viewludsin, gl_viewludcos; // look up down kik test
diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h
index cd822c0c15..2b4699b7ec 100644
--- a/src/hardware/hw_main.h
+++ b/src/hardware/hw_main.h
@@ -115,6 +115,7 @@ extern float gl_viewwindowx, gl_basewindowcentery;
 // BP: big hack for a test in lighting ref : 1249753487AB
 extern fixed_t *hwbbox;
 extern FTransform atransform;
+extern float gl_viewsin, gl_viewcos;
 
 
 // Render stats
diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c
index 403edd7dd6..1cced9b9aa 100644
--- a/src/hardware/hw_md2.c
+++ b/src/hardware/hw_md2.c
@@ -1346,7 +1346,6 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
 		spritedef_t *sprdef;
 		spriteframe_t *sprframe;
 		INT32 mod;
-		float finalscale;
 
 		// Apparently people don't like jump frames like that, so back it goes
 		//if (tics > durs)
@@ -1440,7 +1439,6 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
 		}
 
 		//HWD.pfnSetBlend(blend); // This seems to actually break translucency?
-		finalscale = md2->scale;
 		//Hurdler: arf, I don't like that implementation at all... too much crappy
 
 		if (gpatch && hwrPatch && hwrPatch->mipmap->format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
@@ -1623,17 +1621,25 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
 		p.anglez = FIXED_TO_FLOAT(AngleFixed(spr->mobj->pitch));
 		p.anglex = FIXED_TO_FLOAT(AngleFixed(spr->mobj->roll));
 
-		// SRB2CBTODO: MD2 scaling support
-		finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
-
 		p.flip = atransform.flip;
 		p.mirror = atransform.mirror;
 
 		HWD.pfnSetShader(SHADER_MODEL);	// model shader
 		{
-			float xs = finalscale * FIXED_TO_FLOAT(spr->mobj->spritexscale);
-			float ys = finalscale * FIXED_TO_FLOAT(spr->mobj->spriteyscale);
-			HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, xs, ys, flip, hflip, &Surf);
+			float this_scale = FIXED_TO_FLOAT(spr->mobj->scale);
+
+			float xs = this_scale * FIXED_TO_FLOAT(spr->mobj->spritexscale);
+			float ys = this_scale * FIXED_TO_FLOAT(spr->mobj->spriteyscale);
+
+			float ox = xs * FIXED_TO_FLOAT(spr->mobj->spritexoffset);
+			float oy = ys * FIXED_TO_FLOAT(spr->mobj->spriteyoffset);
+
+			// offset perpendicular to the camera angle
+			p.x -= ox * gl_viewsin;
+			p.y += ox * gl_viewcos;
+			p.z += oy;
+
+			HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, md2->scale * xs, md2->scale * ys, flip, hflip, &Surf);
 		}
 	}
 
-- 
GitLab