mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-02 14:32:22 +00:00
Correct model positional & rotational offsets for mobj->pitch & mobj->roll
This commit is contained in:
parent
350d94b4e0
commit
3c9a05e1b8
3 changed files with 29 additions and 21 deletions
|
@ -108,6 +108,7 @@ typedef struct
|
||||||
#else
|
#else
|
||||||
FLOAT anglex,angley; // aimingangle / viewangle
|
FLOAT anglex,angley; // aimingangle / viewangle
|
||||||
#endif
|
#endif
|
||||||
|
FLOAT facing; // angle based on spritedef
|
||||||
FLOAT scalex,scaley,scalez;
|
FLOAT scalex,scaley,scalez;
|
||||||
FLOAT fovxangle, fovyangle;
|
FLOAT fovxangle, fovyangle;
|
||||||
UINT8 splitscreen;
|
UINT8 splitscreen;
|
||||||
|
|
|
@ -1577,16 +1577,13 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
|
|
||||||
sprframe = &sprdef->spriteframes[spr->mobj->frame & FF_FRAMEMASK];
|
sprframe = &sprdef->spriteframes[spr->mobj->frame & FF_FRAMEMASK];
|
||||||
|
|
||||||
|
p.angley = FIXED_TO_FLOAT(AngleFixed(mobjangle));
|
||||||
if (sprframe->rotate || papersprite)
|
if (sprframe->rotate || papersprite)
|
||||||
{
|
p.facing = p.angley;
|
||||||
fixed_t anglef = AngleFixed(mobjangle);
|
|
||||||
|
|
||||||
p.angley = FIXED_TO_FLOAT(anglef);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const fixed_t anglef = AngleFixed((R_PointToAngle(spr->mobj->x, spr->mobj->y))-ANGLE_180);
|
const fixed_t anglef = AngleFixed((R_PointToAngle(spr->mobj->x, spr->mobj->y))-ANGLE_180);
|
||||||
p.angley = FIXED_TO_FLOAT(anglef);
|
p.facing = FIXED_TO_FLOAT(anglef);
|
||||||
}
|
}
|
||||||
|
|
||||||
p.rollangle = 0.0f;
|
p.rollangle = 0.0f;
|
||||||
|
@ -1598,10 +1595,6 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
p.rollangle = FIXED_TO_FLOAT(anglef);
|
p.rollangle = FIXED_TO_FLOAT(anglef);
|
||||||
p.roll = true;
|
p.roll = true;
|
||||||
|
|
||||||
// rotation pivot
|
|
||||||
p.centerx = FIXED_TO_FLOAT(spr->mobj->radius/2);
|
|
||||||
p.centery = FIXED_TO_FLOAT(spr->mobj->height/(flip ? -2 : 2));
|
|
||||||
|
|
||||||
// rotation axis
|
// rotation axis
|
||||||
if (sprinfo->available)
|
if (sprinfo->available)
|
||||||
p.rotaxis = (UINT8)(sprinfo->pivot[(spr->mobj->frame & FF_FRAMEMASK)].rotaxis);
|
p.rotaxis = (UINT8)(sprinfo->pivot[(spr->mobj->frame & FF_FRAMEMASK)].rotaxis);
|
||||||
|
@ -1617,8 +1610,11 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
p.rollflip *= -1;
|
p.rollflip *= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.anglex = 0.0f;
|
// rotation pivot
|
||||||
|
p.centerx = FIXED_TO_FLOAT(spr->mobj->radius/2);
|
||||||
|
p.centery = FIXED_TO_FLOAT(spr->mobj->height/(flip ? -2 : 2));
|
||||||
|
|
||||||
|
p.anglex = 0.0f;
|
||||||
#ifdef USE_FTRANSFORM_ANGLEZ
|
#ifdef USE_FTRANSFORM_ANGLEZ
|
||||||
p.anglez = 0.0f;
|
p.anglez = 0.0f;
|
||||||
#ifdef STANDINGSLOPE_MODEL_ROTATION
|
#ifdef STANDINGSLOPE_MODEL_ROTATION
|
||||||
|
@ -1633,13 +1629,17 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
||||||
p.anglez = FIXED_TO_FLOAT(tempangle);
|
p.anglez = FIXED_TO_FLOAT(tempangle);
|
||||||
tempangle = -AngleFixed(R_PointToAngle2(0, 0, tempz, tempy));
|
tempangle = -AngleFixed(R_PointToAngle2(0, 0, tempz, tempy));
|
||||||
p.anglex = FIXED_TO_FLOAT(tempangle);
|
p.anglex = FIXED_TO_FLOAT(tempangle);
|
||||||
|
p.roll = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // STANDINGSLOPE_MODEL_ROTATION
|
||||||
if (spr->mobj->roll)
|
if (spr->mobj->roll || spr->mobj->pitch)
|
||||||
p.anglex += FIXED_TO_FLOAT(AngleFixed(spr->mobj->roll));
|
{
|
||||||
if (spr->mobj->pitch)
|
SINT8 flipfactor = flip ? -1 : 1;
|
||||||
p.anglez -= FIXED_TO_FLOAT(AngleFixed(spr->mobj->pitch));
|
p.anglex += flipfactor*FIXED_TO_FLOAT(AngleFixed(spr->mobj->roll));
|
||||||
#endif
|
p.anglez -= flipfactor*FIXED_TO_FLOAT(AngleFixed(spr->mobj->pitch));
|
||||||
|
p.roll = true;
|
||||||
|
}
|
||||||
|
#endif // USE_FTRANSFORM_ANGLEZ
|
||||||
|
|
||||||
// SRB2CBTODO: MD2 scaling support
|
// SRB2CBTODO: MD2 scaling support
|
||||||
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
|
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
|
||||||
|
|
|
@ -2800,24 +2800,31 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
|
||||||
scalez = -scalez;
|
scalez = -scalez;
|
||||||
|
|
||||||
pglRotatef(pos->angley, 0.0f, -1.0f, 0.0f);
|
pglRotatef(pos->angley, 0.0f, -1.0f, 0.0f);
|
||||||
pglRotatef(pos->anglex, 1.0f, 0.0f, 0.0f);
|
|
||||||
#ifdef USE_FTRANSFORM_ANGLEZ
|
|
||||||
pglRotatef(pos->anglez, 0.0f, 0.0f, -1.0f); // rotate by slope from Kart
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pos->roll)
|
if (pos->roll)
|
||||||
{
|
{
|
||||||
float roll = (1.0f * pos->rollflip);
|
float roll = (1.0f * pos->rollflip);
|
||||||
pglTranslatef(pos->centerx, pos->centery, 0);
|
pglTranslatef(pos->centerx, pos->centery, 0);
|
||||||
|
|
||||||
|
// rotate model for pitch and roll
|
||||||
|
pglRotatef(pos->anglex, 1.0f, 0.0f, 0.0f);
|
||||||
|
#ifdef USE_FTRANSFORM_ANGLEZ
|
||||||
|
pglRotatef(pos->anglez, 0.0f, 0.0f, -1.0f); // rotate by slope from Kart
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// rotate model for rollangle
|
||||||
if (pos->rotaxis == 2) // Z
|
if (pos->rotaxis == 2) // Z
|
||||||
pglRotatef(pos->rollangle, 0.0f, 0.0f, roll);
|
pglRotatef(pos->rollangle, 0.0f, 0.0f, roll);
|
||||||
else if (pos->rotaxis == 1) // Y
|
else if (pos->rotaxis == 1) // Y
|
||||||
pglRotatef(pos->rollangle, 0.0f, roll, 0.0f);
|
pglRotatef(pos->rollangle, 0.0f, roll, 0.0f);
|
||||||
else // X
|
else // X
|
||||||
pglRotatef(pos->rollangle, roll, 0.0f, 0.0f);
|
pglRotatef(pos->rollangle, roll, 0.0f, 0.0f);
|
||||||
|
|
||||||
pglTranslatef(-pos->centerx, -pos->centery, 0);
|
pglTranslatef(-pos->centerx, -pos->centery, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pglRotatef(pos->facing - pos->angley, 0.0f, -1.0f, 0.0f);
|
||||||
|
|
||||||
pglScalef(scalex, scaley, scalez);
|
pglScalef(scalex, scaley, scalez);
|
||||||
|
|
||||||
useTinyFrames = model->meshes[0].tinyframes != NULL;
|
useTinyFrames = model->meshes[0].tinyframes != NULL;
|
||||||
|
|
Loading…
Reference in a new issue