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