mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-11 16:16:39 +00:00
Remove modeltilt, use roll & pitch instead
Broken currently, about half of the slopes you can go into have the wrong tilt
This commit is contained in:
parent
1aef75bff3
commit
9dd43d4e4e
11 changed files with 51 additions and 62 deletions
|
|
@ -102,8 +102,7 @@ typedef struct
|
|||
//BP: transform order : scale(rotation_x(rotation_y(translation(v))))
|
||||
|
||||
// Kart features
|
||||
//#define USE_FTRANSFORM_ANGLEZ
|
||||
//#define USE_FTRANSFORM_MIRROR
|
||||
#define USE_FTRANSFORM_MIRROR
|
||||
|
||||
// Vanilla features
|
||||
#define USE_MODEL_NEXTFRAME
|
||||
|
|
@ -111,11 +110,7 @@ typedef struct
|
|||
typedef struct
|
||||
{
|
||||
FLOAT x,y,z; // position
|
||||
#ifdef USE_FTRANSFORM_ANGLEZ
|
||||
FLOAT anglex,angley,anglez; // aimingangle / viewangle
|
||||
#else
|
||||
FLOAT anglex,angley; // aimingangle / viewangle
|
||||
#endif
|
||||
FLOAT scalex,scaley,scalez;
|
||||
FLOAT fovxangle, fovyangle;
|
||||
UINT8 splitscreen;
|
||||
|
|
|
|||
|
|
@ -1605,22 +1605,18 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
|
|||
p.rollflip *= -1;
|
||||
}
|
||||
|
||||
p.anglez = 0.0f;
|
||||
p.anglex = 0.0f;
|
||||
|
||||
#ifdef USE_FTRANSFORM_ANGLEZ
|
||||
// Slope rotation from Kart
|
||||
p.anglez = 0.0f;
|
||||
if (spr->mobj->standingslope)
|
||||
if (spr->mobj->pitch)
|
||||
{
|
||||
fixed_t tempz = spr->mobj->standingslope->normal.z;
|
||||
fixed_t tempy = spr->mobj->standingslope->normal.y;
|
||||
fixed_t tempx = spr->mobj->standingslope->normal.x;
|
||||
fixed_t tempangle = AngleFixed(R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx));
|
||||
p.anglez = FIXED_TO_FLOAT(tempangle);
|
||||
tempangle = -AngleFixed(R_PointToAngle2(0, 0, tempz, tempy));
|
||||
p.anglex = FIXED_TO_FLOAT(tempangle);
|
||||
p.anglez = FIXED_TO_FLOAT(-AngleFixed(spr->mobj->pitch));
|
||||
}
|
||||
|
||||
if (spr->mobj->roll)
|
||||
{
|
||||
p.anglex = FIXED_TO_FLOAT(AngleFixed(spr->mobj->roll));
|
||||
}
|
||||
#endif
|
||||
|
||||
// SRB2CBTODO: MD2 scaling support
|
||||
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
|
||||
|
|
|
|||
|
|
@ -2643,9 +2643,7 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
|
|||
if (hflipped)
|
||||
scalez = -scalez;
|
||||
|
||||
#ifdef USE_FTRANSFORM_ANGLEZ
|
||||
pglRotatef(pos->anglez, 0.0f, 0.0f, -1.0f); // rotate by slope from Kart
|
||||
#endif
|
||||
pglRotatef(pos->angley, 0.0f, -1.0f, 0.0f);
|
||||
pglRotatef(pos->anglex, 1.0f, 0.0f, 0.0f);
|
||||
|
||||
|
|
|
|||
12
src/k_kart.c
12
src/k_kart.c
|
|
@ -4576,10 +4576,7 @@ static void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z
|
|||
}
|
||||
|
||||
//mobj->standingslope = slope;
|
||||
|
||||
#ifdef HWRENDER
|
||||
mobj->modeltilt = slope;
|
||||
#endif
|
||||
P_SetPitchRollFromSlope(mobj, slope);
|
||||
}
|
||||
|
||||
// Move the hnext chain!
|
||||
|
|
@ -4872,9 +4869,10 @@ static void K_MoveHeldObjects(player_t *player)
|
|||
|
||||
P_TeleportMove(cur, targx, targy, targz);
|
||||
K_FlipFromObject(cur, player->mo); // Update graviflip in real time thanks.
|
||||
#ifdef HWRENDER
|
||||
cur->modeltilt = player->mo->modeltilt;
|
||||
#endif
|
||||
|
||||
cur->roll = player->mo->roll;
|
||||
cur->pitch = player->mo->pitch;
|
||||
|
||||
num = (num+1) % 2;
|
||||
cur = cur->hnext;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -517,5 +517,6 @@ boolean P_CheckMissileSpawn(mobj_t *th);
|
|||
void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move);
|
||||
void P_ExplodeMissile(mobj_t *mo);
|
||||
void P_CheckGravity(mobj_t *mo, boolean affect);
|
||||
void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope);
|
||||
|
||||
#endif // __P_LOCAL__
|
||||
|
|
|
|||
|
|
@ -2633,9 +2633,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
|||
if (thing->momz <= 0)
|
||||
{
|
||||
thing->standingslope = tmfloorslope;
|
||||
#ifdef HWRENDER
|
||||
thing->modeltilt = thing->standingslope;
|
||||
#endif
|
||||
P_SetPitchRollFromSlope(thing, thing->standingslope);
|
||||
|
||||
if (thing->momz == 0 && thing->player && !startingonground)
|
||||
P_PlayerHitFloor(thing->player, true);
|
||||
|
|
@ -2648,9 +2646,7 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
|||
if (thing->momz >= 0)
|
||||
{
|
||||
thing->standingslope = tmceilingslope;
|
||||
#ifdef HWRENDER
|
||||
thing->modeltilt = thing->standingslope;
|
||||
#endif
|
||||
P_SetPitchRollFromSlope(thing, thing->standingslope);
|
||||
|
||||
if (thing->momz == 0 && thing->player && !startingonground)
|
||||
P_PlayerHitFloor(thing->player, true);
|
||||
|
|
|
|||
40
src/p_mobj.c
40
src/p_mobj.c
|
|
@ -1216,6 +1216,26 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// P_SetPitchRollFromSlope
|
||||
//
|
||||
void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope)
|
||||
{
|
||||
if (slope)
|
||||
{
|
||||
fixed_t tempz = slope->normal.z;
|
||||
fixed_t tempy = slope->normal.y;
|
||||
fixed_t tempx = slope->normal.x;
|
||||
|
||||
mo->pitch = -R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx);
|
||||
mo->roll = -R_PointToAngle2(0, 0, tempz, tempy);
|
||||
}
|
||||
else
|
||||
{
|
||||
mo->pitch = mo->roll = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#define STOPSPEED (FRACUNIT)
|
||||
|
||||
//
|
||||
|
|
@ -1708,9 +1728,7 @@ void P_XYMovement(mobj_t *mo)
|
|||
// Now compare the Zs of the different quantizations
|
||||
if (oldangle-newangle > ANG30 && oldangle-newangle < ANGLE_180) { // Allow for a bit of sticking - this value can be adjusted later
|
||||
mo->standingslope = oldslope;
|
||||
#ifdef HWRENDER
|
||||
mo->modeltilt = mo->standingslope;
|
||||
#endif
|
||||
P_SetPitchRollFromSlope(mo, mo->standingslope);
|
||||
P_SlopeLaunch(mo);
|
||||
|
||||
//CONS_Printf("launched off of slope - ");
|
||||
|
|
@ -2228,9 +2246,7 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
if (((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) && (mo->type != MT_STEAM))
|
||||
{
|
||||
mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope;
|
||||
#ifdef HWRENDER
|
||||
mo->modeltilt = mo->standingslope;
|
||||
#endif
|
||||
P_SetPitchRollFromSlope(mo, mo->standingslope);
|
||||
P_ReverseQuantizeMomentumToSlope(&mom, mo->standingslope);
|
||||
}
|
||||
|
||||
|
|
@ -6426,9 +6442,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
mobj->target->z);
|
||||
}
|
||||
P_SetScale(mobj, mobj->target->scale);
|
||||
#ifdef HWRENDER
|
||||
mobj->modeltilt = mobj->target->modeltilt;
|
||||
#endif
|
||||
|
||||
mobj->roll = mobj->target->roll;
|
||||
mobj->pitch = mobj->target->pitch;
|
||||
|
||||
if (mobj->fuse <= 16)
|
||||
{
|
||||
|
|
@ -6490,9 +6506,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
P_TeleportMove(mobj, mobj->target->x + P_ReturnThrustX(mobj, mobj->angle+ANGLE_180, mobj->target->radius),
|
||||
mobj->target->y + P_ReturnThrustY(mobj, mobj->angle+ANGLE_180, mobj->target->radius), mobj->target->z);
|
||||
P_SetScale(mobj, mobj->target->scale);
|
||||
#ifdef HWRENDER
|
||||
mobj->modeltilt = mobj->target->modeltilt;
|
||||
#endif
|
||||
|
||||
mobj->roll = mobj->target->roll;
|
||||
mobj->pitch = mobj->target->pitch;
|
||||
|
||||
{
|
||||
player_t *p = NULL;
|
||||
|
|
|
|||
|
|
@ -408,9 +408,6 @@ typedef struct mobj_s
|
|||
INT32 cvmem;
|
||||
|
||||
struct pslope_s *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?)
|
||||
#ifdef HWRENDER
|
||||
struct pslope_s *modeltilt; // Slope used for model tilting. Also is not synched, this is totally visual.
|
||||
#endif
|
||||
|
||||
boolean colorized; // Whether the mobj uses the rainbow colormap
|
||||
boolean mirrored; // The object's rotations will be mirrored left to right, e.g., see frame AL from the right and AR from the left
|
||||
|
|
|
|||
|
|
@ -2795,12 +2795,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
|||
if (diff2 & MD2_ITNEXT)
|
||||
mobj->itnext = (mobj_t *)(size_t)READUINT32(save_p);
|
||||
if (diff2 & MD2_SLOPE)
|
||||
{
|
||||
mobj->standingslope = P_SlopeById(READUINT16(save_p));
|
||||
#ifdef HWRENDER
|
||||
mobj->modeltilt = mobj->standingslope;
|
||||
#endif
|
||||
}
|
||||
if (diff2 & MD2_COLORIZED)
|
||||
mobj->colorized = READUINT8(save_p);
|
||||
if (diff2 & MD2_MIRRORED)
|
||||
|
|
|
|||
|
|
@ -897,9 +897,8 @@ void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
|
|||
if (P_MobjFlip(thing)*(thing->momz) < 0) // falling, land on slope
|
||||
{
|
||||
thing->standingslope = slope;
|
||||
#ifdef HWRENDER
|
||||
thing->modeltilt = thing->standingslope;
|
||||
#endif
|
||||
P_SetPitchRollFromSlope(thing, slope);
|
||||
|
||||
if (!thing->player || !(thing->player->pflags & PF_BOUNCING))
|
||||
thing->momz = -P_MobjFlip(thing);
|
||||
}
|
||||
|
|
@ -916,9 +915,7 @@ void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
|
|||
thing->momx = mom.x;
|
||||
thing->momy = mom.y;
|
||||
thing->standingslope = slope;
|
||||
#ifdef HWRENDER
|
||||
thing->modeltilt = thing->standingslope;
|
||||
#endif
|
||||
P_SetPitchRollFromSlope(thing, slope);
|
||||
if (!thing->player || !(thing->player->pflags & PF_BOUNCING))
|
||||
thing->momz = -P_MobjFlip(thing);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1290,6 +1290,8 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
|||
ghost->colorized = mobj->colorized; // Kart: they should also be colorized if their origin is
|
||||
|
||||
ghost->angle = (mobj->player ? mobj->player->drawangle : mobj->angle);
|
||||
ghost->roll = mobj->roll;
|
||||
ghost->pitch = mobj->pitch;
|
||||
ghost->sprite = mobj->sprite;
|
||||
ghost->sprite2 = mobj->sprite2;
|
||||
ghost->frame = mobj->frame;
|
||||
|
|
@ -1298,13 +1300,11 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
|||
ghost->fuse = ghost->info->damage;
|
||||
ghost->skin = mobj->skin;
|
||||
ghost->standingslope = mobj->standingslope;
|
||||
#ifdef HWRENDER
|
||||
ghost->modeltilt = mobj->modeltilt;
|
||||
#endif
|
||||
|
||||
ghost->sprxoff = mobj->sprxoff;
|
||||
ghost->spryoff = mobj->spryoff;
|
||||
ghost->sprzoff = mobj->sprzoff;
|
||||
ghost->rollangle = mobj->rollangle;
|
||||
|
||||
if (mobj->flags2 & MF2_OBJECTFLIP)
|
||||
ghost->flags |= MF2_OBJECTFLIP;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue