Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • STJr/SRB2
  • Sryder/SRB2
  • wolfy852/SRB2
  • Alpha2244/SRB2
  • Inuyasha/SRB2
  • yoshibot/SRB2
  • TehRealSalt/SRB2
  • PrisimaTF/SRB2
  • Hatninja/SRB2
  • SteelT/SRB2
  • james/SRB2
  • ShaderWraith/SRB2
  • SinnamonLat/SRB2
  • mazmazz_/SRB2
  • filpAM/SRB2
  • chaoloveicemdboy/SRB2
  • Whooa21/SRB2
  • Machturne/SRB2
  • Golden/SRB2
  • Tatsuru/SRB2
  • Snu/SRB2
  • Zwip-Zwap_Zapony/SRB2
  • fickleheart/SRB2
  • alphaRexJames/SRB2
  • JJK/SRB2
  • diskpoppy/SRB2
  • Hannu_Hanhi/SRB2
  • ZipperQR/SRB2
  • kays/SRB2
  • spherallic/SRB2
  • Zippy_Zolton/SRB2
  • namiishere/SRB2
  • Ors/SRB2
  • SMS_Alfredo/SRB2
  • sonic_edge/SRB2
  • lavla/SRB2
  • ashi/SRB2
  • X.organic/SRB2
  • Fafabis/SRB2
  • Meziu/SRB2
  • v-rob/SRB2
  • tertu/SRB2
  • bitten2up/SRB2
  • flarn2006/SRB2
  • Krabs/SRB2
  • clairebun/SRB2
  • Lactozilla/SRB2
  • thehackstack/SRB2
  • Spice/SRB2
  • win8linux/SRB2
  • JohnFrostFox/SRB2
  • talktoneon726/SRB2
  • Wane/SRB2
  • Lamibe/SRB2
  • spectrumuk2/srb-2
  • nerdyminer18/srb-2
  • 256nil/SRB2
  • ARJr/SRB2
  • Alam/SRB2
  • Zenya/srb-2-marathon-demos
  • Acelite/srb-2-archivedmodifications
  • MIDIMan/SRB2
  • Lach/SRB2
  • Frostiikin/bounce-tweaks
  • Jaden/SRB2
  • Tyron/SRB2
  • Astronight/SRB2
  • Mari0shi06/SRB2
  • aiire/SRB2
  • Galactice/SRB2
  • srb2-ports/srb2-dreamcast
  • sdasdas/SRB2
  • chreas/srb-2-vr
  • StarManiaKG/the-story-of-sinically-rocketing-and-botching-the-2nd
  • LoganAir/SRB2
  • NepDisk/srb-2
  • alufolie91/SRB2
  • Felicia.iso/SRB2
  • twi/SRB2
  • BarrelsOFun/SRB2
  • Speed2411/SRB2
  • Leather_Realms/SRB2
  • Ayemar/SRB2
  • Acelite/SRB2
  • VladDoc/SRB2
  • kaldrum/model-features
  • strawberryfox417/SRB2
  • Lugent/SRB2
  • Rem/SRB2
  • Refrag/SRB2
  • Henry_3230/srb-3230
  • TehPuertoRicanSpartan2/tprs-srb2
  • Leminn/srb-2-marathon-stuff
  • chromaticpipe2/SRB2
  • MiguelGustavo15/SRB2
  • Maru/srb-2-tests
  • SilicDev/SRB2
  • UnmatchedBracket/SRB2
  • HybridDog/SRB2
  • xordspar0/SRB2
  • jsjhbewfhh/SRB2
  • Fancy2209/SRB2
  • Lorsoen/SRB2
  • shindoukin/SRB2
  • GamerOfDays/SRB2
  • Craftyawesome/SRB2
  • tenshi-tensai-tennoji/SRB2
  • Scarfdudebalder/SRB2
  • luigi-budd/srb-2-fix-interplag-lockon
  • mskluesner/SRB2
  • johnpetersa19/SRB2
  • Pheazant/SRB2
  • chromaticpipe2/srb2classic
  • romoney5/SRB2
  • PAS/SRB2Classic
  • BlueStaggo/SRB2
  • Jisk/srb-2-beef-jerky
117 results
Select Git revision
Show changes
Commits on Source (10)
...@@ -903,7 +903,7 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame) ...@@ -903,7 +903,7 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame)
else if (fastcmp(word, "YPIVOT")) else if (fastcmp(word, "YPIVOT"))
sprinfo->pivot[frame].y = value; sprinfo->pivot[frame].y = value;
else if (fastcmp(word, "ROTAXIS")) else if (fastcmp(word, "ROTAXIS"))
sprinfo->pivot[frame].rotaxis = value; deh_warning("SpriteInfo: ROTAXIS is deprecated and will be removed.");
else else
{ {
f->curpos = lastline; f->curpos = lastline;
......
...@@ -93,33 +93,22 @@ typedef struct FVector ...@@ -93,33 +93,22 @@ typedef struct FVector
//Hurdler: Transform (coords + angles) //Hurdler: Transform (coords + angles)
//BP: transform order : scale(rotation_x(rotation_y(translation(v)))) //BP: transform order : scale(rotation_x(rotation_y(translation(v))))
// Kart features
//#define USE_FTRANSFORM_ANGLEZ
//#define USE_FTRANSFORM_MIRROR
// Vanilla features // Vanilla features
#define USE_MODEL_NEXTFRAME #define USE_MODEL_NEXTFRAME
typedef struct typedef struct
{ {
FLOAT x,y,z; // position FLOAT x,y,z; // position
#ifdef USE_FTRANSFORM_ANGLEZ
FLOAT anglex,angley,anglez; // aimingangle / viewangle FLOAT anglex,angley,anglez; // aimingangle / viewangle
#else
FLOAT anglex,angley; // aimingangle / viewangle
#endif
FLOAT scalex,scaley,scalez; FLOAT scalex,scaley,scalez;
FLOAT fovxangle, fovyangle; FLOAT fovxangle, fovyangle;
UINT8 splitscreen; UINT8 splitscreen;
boolean flip; // screenflip boolean flip; // screenflip
boolean roll; boolean roll;
SINT8 rollflip;
FLOAT rollangle; // done to not override USE_FTRANSFORM_ANGLEZ FLOAT rollangle; // done to not override USE_FTRANSFORM_ANGLEZ
UINT8 rotaxis;
FLOAT centerx, centery; FLOAT centerx, centery;
#ifdef USE_FTRANSFORM_MIRROR FLOAT rollx, rollz;
boolean mirror; // SRB2Kart: Encore Mode boolean mirror; // SRB2Kart: Encore Mode
#endif
boolean shearing; // 14042019 boolean shearing; // 14042019
float viewaiming; // 17052019 float viewaiming; // 17052019
} FTransform; } FTransform;
......
...@@ -51,7 +51,7 @@ EXPORT void HWRAPI(ClearMipMapCache) (void); ...@@ -51,7 +51,7 @@ EXPORT void HWRAPI(ClearMipMapCache) (void);
EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value); EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value);
//Hurdler: added for new development //Hurdler: added for new development
EXPORT void HWRAPI(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface); EXPORT void HWRAPI(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float hscale, float vscale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface);
EXPORT void HWRAPI(CreateModelVBOs) (model_t *model); EXPORT void HWRAPI(CreateModelVBOs) (model_t *model);
EXPORT void HWRAPI(SetTransform) (FTransform *ptransform); EXPORT void HWRAPI(SetTransform) (FTransform *ptransform);
EXPORT INT32 HWRAPI(GetTextureUsed) (void); EXPORT INT32 HWRAPI(GetTextureUsed) (void);
...@@ -136,4 +136,3 @@ extern struct hwdriver_s hwdriver; ...@@ -136,4 +136,3 @@ extern struct hwdriver_s hwdriver;
#endif //not defined _CREATE_DLL_ #endif //not defined _CREATE_DLL_
#endif //__HWR_DRV_H__ #endif //__HWR_DRV_H__
...@@ -137,7 +137,7 @@ static fixed_t dup_viewx, dup_viewy, dup_viewz; ...@@ -137,7 +137,7 @@ static fixed_t dup_viewx, dup_viewy, dup_viewz;
static angle_t dup_viewangle; static angle_t dup_viewangle;
static float gl_viewx, gl_viewy, gl_viewz; 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!) // Maybe not necessary with the new T&L code (needs to be checked!)
static float gl_viewludsin, gl_viewludcos; // look up down kik test static float gl_viewludsin, gl_viewludcos; // look up down kik test
...@@ -5021,6 +5021,7 @@ static void HWR_ProjectSprite(mobj_t *thing) ...@@ -5021,6 +5021,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
#ifdef ROTSPRITE #ifdef ROTSPRITE
patch_t *rotsprite = NULL; patch_t *rotsprite = NULL;
INT32 rollangle = 0; INT32 rollangle = 0;
angle_t spriterotangle = 0;
#endif #endif
if (!thing) if (!thing)
...@@ -5168,10 +5169,12 @@ static void HWR_ProjectSprite(mobj_t *thing) ...@@ -5168,10 +5169,12 @@ static void HWR_ProjectSprite(mobj_t *thing)
spr_topoffset = spritecachedinfo[lumpoff].topoffset; spr_topoffset = spritecachedinfo[lumpoff].topoffset;
#ifdef ROTSPRITE #ifdef ROTSPRITE
if (thing->rollangle spriterotangle = R_SpriteRotationAngle(thing);
if (spriterotangle != 0
&& !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE))) && !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE)))
{ {
rollangle = R_GetRollAngle(thing->rollangle); rollangle = R_GetRollAngle(spriterotangle);
rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle); rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle);
if (rotsprite != NULL) if (rotsprite != NULL)
...@@ -5720,6 +5723,8 @@ static void HWR_DrawSkyBackground(player_t *player) ...@@ -5720,6 +5723,8 @@ static void HWR_DrawSkyBackground(player_t *player)
fixed_t rol = AngleFixed(player->viewrollangle); fixed_t rol = AngleFixed(player->viewrollangle);
dometransform.rollangle = FIXED_TO_FLOAT(rol); dometransform.rollangle = FIXED_TO_FLOAT(rol);
dometransform.roll = true; dometransform.roll = true;
dometransform.rollx = 1.0f;
dometransform.rollz = 0.0f;
} }
dometransform.splitscreen = splitscreen; dometransform.splitscreen = splitscreen;
...@@ -5998,6 +6003,8 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player) ...@@ -5998,6 +6003,8 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player)
fixed_t rol = AngleFixed(player->viewrollangle); fixed_t rol = AngleFixed(player->viewrollangle);
atransform.rollangle = FIXED_TO_FLOAT(rol); atransform.rollangle = FIXED_TO_FLOAT(rol);
atransform.roll = true; atransform.roll = true;
atransform.rollx = 1.0f;
atransform.rollz = 0.0f;
} }
atransform.splitscreen = splitscreen; atransform.splitscreen = splitscreen;
...@@ -6212,6 +6219,8 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) ...@@ -6212,6 +6219,8 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player)
fixed_t rol = AngleFixed(player->viewrollangle); fixed_t rol = AngleFixed(player->viewrollangle);
atransform.rollangle = FIXED_TO_FLOAT(rol); atransform.rollangle = FIXED_TO_FLOAT(rol);
atransform.roll = true; atransform.roll = true;
atransform.rollx = 1.0f;
atransform.rollz = 0.0f;
} }
atransform.splitscreen = splitscreen; atransform.splitscreen = splitscreen;
......
...@@ -115,6 +115,7 @@ extern float gl_viewwindowx, gl_basewindowcentery; ...@@ -115,6 +115,7 @@ extern float gl_viewwindowx, gl_basewindowcentery;
// BP: big hack for a test in lighting ref : 1249753487AB // BP: big hack for a test in lighting ref : 1249753487AB
extern fixed_t *hwbbox; extern fixed_t *hwbbox;
extern FTransform atransform; extern FTransform atransform;
extern float gl_viewsin, gl_viewcos;
// Render stats // Render stats
......
...@@ -1345,10 +1345,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) ...@@ -1345,10 +1345,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !R_ThingHorizontallyFlipped(spr->mobj)); const UINT8 hflip = (UINT8)(!(spr->mobj->mirrored) != !R_ThingHorizontallyFlipped(spr->mobj));
spritedef_t *sprdef; spritedef_t *sprdef;
spriteframe_t *sprframe; spriteframe_t *sprframe;
spriteinfo_t *sprinfo;
angle_t ang;
INT32 mod; INT32 mod;
float finalscale;
// Apparently people don't like jump frames like that, so back it goes // Apparently people don't like jump frames like that, so back it goes
//if (tics > durs) //if (tics > durs)
...@@ -1377,12 +1374,10 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) ...@@ -1377,12 +1374,10 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
{ {
md2 = &md2_playermodels[(skin_t*)spr->mobj->skin-skins]; md2 = &md2_playermodels[(skin_t*)spr->mobj->skin-skins];
md2->skin = (skin_t*)spr->mobj->skin-skins; md2->skin = (skin_t*)spr->mobj->skin-skins;
sprinfo = &((skin_t *)spr->mobj->skin)->sprinfo[spr->mobj->sprite2];
} }
else else
{ {
md2 = &md2_models[spr->mobj->sprite]; md2 = &md2_models[spr->mobj->sprite];
sprinfo = &spriteinfo[spr->mobj->sprite];
} }
// texture loading before model init, so it knows if sprite graphics are used, which // texture loading before model init, so it knows if sprite graphics are used, which
...@@ -1444,7 +1439,6 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) ...@@ -1444,7 +1439,6 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
} }
//HWD.pfnSetBlend(blend); // This seems to actually break translucency? //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 //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 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
...@@ -1602,61 +1596,56 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) ...@@ -1602,61 +1596,56 @@ boolean HWR_DrawModel(gl_vissprite_t *spr)
p.angley = FIXED_TO_FLOAT(anglef); p.angley = FIXED_TO_FLOAT(anglef);
} }
p.rollangle = 0.0f;
p.rollflip = 1;
p.rotaxis = 0;
if (spr->mobj->rollangle)
{ {
fixed_t anglef = AngleFixed(spr->mobj->rollangle); fixed_t anglef = AngleFixed(R_ModelRotationAngle(spr->mobj));
p.rollangle = FIXED_TO_FLOAT(anglef);
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
if (sprinfo->available)
p.rotaxis = (UINT8)(sprinfo->pivot[(spr->mobj->frame & FF_FRAMEMASK)].rotaxis);
// for NiGHTS specifically but should work everywhere else
ang = R_PointToAngle (spr->mobj->x, spr->mobj->y) - (spr->mobj->player ? spr->mobj->player->drawangle : spr->mobj->angle);
if ((sprframe->rotate & SRF_RIGHT) && (ang < ANGLE_180)) // See from right
p.rollflip = 1;
else if ((sprframe->rotate & SRF_LEFT) && (ang >= ANGLE_180)) // See from left
p.rollflip = -1;
if (flip)
p.rollflip *= -1;
}
p.anglex = 0.0f; p.rollangle = 0.0f;
#ifdef USE_FTRANSFORM_ANGLEZ if (anglef)
// Slope rotation from Kart {
p.anglez = 0.0f; fixed_t camAngleDiff = AngleFixed(viewangle) - FLOAT_TO_FIXED(p.angley); // dumb reconversion back, I know
if (spr->mobj->standingslope)
{ p.rollangle = FIXED_TO_FLOAT(anglef);
fixed_t tempz = spr->mobj->standingslope->normal.z; p.roll = true;
fixed_t tempy = spr->mobj->standingslope->normal.y;
fixed_t tempx = spr->mobj->standingslope->normal.x; // rotation pivot
fixed_t tempangle = AngleFixed(R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx)); p.centerx = FIXED_TO_FLOAT(spr->mobj->radius / 2);
p.anglez = FIXED_TO_FLOAT(tempangle); p.centery = FIXED_TO_FLOAT(spr->mobj->height / 2);
tempangle = -AngleFixed(R_PointToAngle2(0, 0, tempz, tempy));
p.anglex = FIXED_TO_FLOAT(tempangle); // rotation axes relative to camera
p.rollx = FIXED_TO_FLOAT(FINECOSINE(FixedAngle(camAngleDiff) >> ANGLETOFINESHIFT));
p.rollz = FIXED_TO_FLOAT(FINESINE(FixedAngle(camAngleDiff) >> ANGLETOFINESHIFT));
}
} }
#endif
// SRB2CBTODO: MD2 scaling support #if 0
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale); p.anglez = FIXED_TO_FLOAT(AngleFixed(spr->mobj->pitch));
p.anglex = FIXED_TO_FLOAT(AngleFixed(spr->mobj->roll));
#else
p.anglez = 0.f;
p.anglex = 0.f;
#endif
p.flip = atransform.flip; p.flip = atransform.flip;
#ifdef USE_FTRANSFORM_MIRROR p.mirror = atransform.mirror;
p.mirror = atransform.mirror; // from Kart
#endif
HWD.pfnSetShader(SHADER_MODEL); // model shader HWD.pfnSetShader(SHADER_MODEL); // model shader
HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, 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);
}
} }
return true; return true;
......
...@@ -2672,7 +2672,7 @@ EXPORT void HWRAPI(CreateModelVBOs) (model_t *model) ...@@ -2672,7 +2672,7 @@ EXPORT void HWRAPI(CreateModelVBOs) (model_t *model)
#define BUFFER_OFFSET(i) ((void*)(i)) #define BUFFER_OFFSET(i) ((void*)(i))
static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface) static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float hscale, float vscale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface)
{ {
static GLRGBAFloat poly = {0,0,0,0}; static GLRGBAFloat poly = {0,0,0,0};
static GLRGBAFloat tint = {0,0,0,0}; static GLRGBAFloat tint = {0,0,0,0};
...@@ -2696,10 +2696,11 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 ...@@ -2696,10 +2696,11 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
#endif #endif
// Affect input model scaling // Affect input model scaling
scale *= 0.5f; hscale *= 0.5f;
scalex = scale; vscale *= 0.5f;
scaley = scale; scalex = hscale;
scalez = scale; scaley = vscale;
scalez = hscale;
if (duration != 0 && duration != -1 && tics != -1) // don't interpolate if instantaneous or infinite in length if (duration != 0 && duration != -1 && tics != -1) // don't interpolate if instantaneous or infinite in length
{ {
...@@ -2775,7 +2776,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 ...@@ -2775,7 +2776,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
pglEnable(GL_CULL_FACE); pglEnable(GL_CULL_FACE);
pglEnable(GL_NORMALIZE); pglEnable(GL_NORMALIZE);
#ifdef USE_FTRANSFORM_MIRROR
// flipped is if the object is vertically flipped // flipped is if the object is vertically flipped
// hflipped is if the object is horizontally flipped // hflipped is if the object is horizontally flipped
// pos->flip is if the screen is flipped vertically // pos->flip is if the screen is flipped vertically
...@@ -2788,17 +2788,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 ...@@ -2788,17 +2788,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
else else
pglCullFace(GL_BACK); pglCullFace(GL_BACK);
} }
#else
// pos->flip is if the screen is flipped too
if (flipped ^ hflipped ^ pos->flip) // If one or three of these are active, but not two, invert the model's culling
{
pglCullFace(GL_FRONT);
}
else
{
pglCullFace(GL_BACK);
}
#endif
pglPushMatrix(); // should be the same as glLoadIdentity pglPushMatrix(); // should be the same as glLoadIdentity
//Hurdler: now it seems to work //Hurdler: now it seems to work
...@@ -2808,22 +2797,14 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 ...@@ -2808,22 +2797,14 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
if (hflipped) if (hflipped)
scalez = -scalez; scalez = -scalez;
#ifdef USE_FTRANSFORM_ANGLEZ pglRotatef(pos->anglez, 0.0f, 0.0f, -1.0f);
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); pglRotatef(pos->anglex, 1.0f, 0.0f, 0.0f);
pglRotatef(pos->angley, 0.0f, -1.0f, 0.0f);
if (pos->roll) if (pos->roll)
{ {
float roll = (1.0f * pos->rollflip);
pglTranslatef(pos->centerx, pos->centery, 0); pglTranslatef(pos->centerx, pos->centery, 0);
if (pos->rotaxis == 2) // Z pglRotatef(pos->rollangle, pos->rollx, 0.0f, pos->rollz);
pglRotatef(pos->rollangle, 0.0f, 0.0f, roll);
else if (pos->rotaxis == 1) // Y
pglRotatef(pos->rollangle, 0.0f, roll, 0.0f);
else // X
pglRotatef(pos->rollangle, roll, 0.0f, 0.0f);
pglTranslatef(-pos->centerx, -pos->centery, 0); pglTranslatef(-pos->centerx, -pos->centery, 0);
} }
...@@ -2977,9 +2958,9 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 ...@@ -2977,9 +2958,9 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
// -----------------+ // -----------------+
// HWRAPI DrawModel : Draw a model // HWRAPI DrawModel : Draw a model
// -----------------+ // -----------------+
EXPORT void HWRAPI(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface) EXPORT void HWRAPI(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float hscale, float vscale, UINT8 flipped, UINT8 hflipped, FSurfaceInfo *Surface)
{ {
DrawModelEx(model, frameIndex, duration, tics, nextFrameIndex, pos, scale, flipped, hflipped, Surface); DrawModelEx(model, frameIndex, duration, tics, nextFrameIndex, pos, hscale, vscale, flipped, hflipped, Surface);
} }
// -----------------+ // -----------------+
...@@ -2996,13 +2977,9 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform) ...@@ -2996,13 +2977,9 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
if (stransform) if (stransform)
{ {
used_fov = stransform->fovxangle; used_fov = stransform->fovxangle;
#ifdef USE_FTRANSFORM_MIRROR
// mirroring from Kart
if (stransform->mirror) if (stransform->mirror)
pglScalef(-stransform->scalex, stransform->scaley, -stransform->scalez); pglScalef(-stransform->scalex, stransform->scaley, -stransform->scalez);
else else if (stransform->flip)
#endif
if (stransform->flip)
pglScalef(stransform->scalex, -stransform->scaley, -stransform->scalez); pglScalef(stransform->scalex, -stransform->scaley, -stransform->scalez);
else else
pglScalef(stransform->scalex, stransform->scaley, -stransform->scalez); pglScalef(stransform->scalex, stransform->scaley, -stransform->scalez);
......
...@@ -319,7 +319,7 @@ static int PopPivotSubTable(spriteframepivot_t *pivot, lua_State *L, int stk, in ...@@ -319,7 +319,7 @@ static int PopPivotSubTable(spriteframepivot_t *pivot, lua_State *L, int stk, in
else if (ikey == 2 || (key && fastcmp(key, "y"))) else if (ikey == 2 || (key && fastcmp(key, "y")))
pivot[idx].y = (INT32)value; pivot[idx].y = (INT32)value;
else if (ikey == 3 || (key && fastcmp(key, "rotaxis"))) else if (ikey == 3 || (key && fastcmp(key, "rotaxis")))
pivot[idx].rotaxis = (UINT8)value; LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
else if (ikey == -1 && (key != NULL)) else if (ikey == -1 && (key != NULL))
FIELDERROR("pivot key", va("invalid option %s", key)); FIELDERROR("pivot key", va("invalid option %s", key));
okcool = 1; okcool = 1;
...@@ -576,7 +576,10 @@ static int framepivot_get(lua_State *L) ...@@ -576,7 +576,10 @@ static int framepivot_get(lua_State *L)
else if (fastcmp("y", field)) else if (fastcmp("y", field))
lua_pushinteger(L, framepivot->y); lua_pushinteger(L, framepivot->y);
else if (fastcmp("rotaxis", field)) else if (fastcmp("rotaxis", field))
lua_pushinteger(L, (UINT8)framepivot->rotaxis); {
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.");
lua_pushinteger(L, 0);
}
else else
return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field)); return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field));
...@@ -602,7 +605,7 @@ static int framepivot_set(lua_State *L) ...@@ -602,7 +605,7 @@ static int framepivot_set(lua_State *L)
else if (fastcmp("y", field)) else if (fastcmp("y", field))
framepivot->y = luaL_checkinteger(L, 3); framepivot->y = luaL_checkinteger(L, 3);
else if (fastcmp("rotaxis", field)) else if (fastcmp("rotaxis", field))
framepivot->rotaxis = luaL_checkinteger(L, 3); LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
else else
return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field)); return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field));
......
...@@ -532,5 +532,6 @@ void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move); ...@@ -532,5 +532,6 @@ void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move);
void P_DoSuperTransformation(player_t *player, boolean giverings); void P_DoSuperTransformation(player_t *player, boolean giverings);
void P_ExplodeMissile(mobj_t *mo); void P_ExplodeMissile(mobj_t *mo);
void P_CheckGravity(mobj_t *mo, boolean affect); void P_CheckGravity(mobj_t *mo, boolean affect);
void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope);
#endif // __P_LOCAL__ #endif // __P_LOCAL__
...@@ -2888,6 +2888,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) ...@@ -2888,6 +2888,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
if (thing->momz <= 0) if (thing->momz <= 0)
{ {
thing->standingslope = tmfloorslope; thing->standingslope = tmfloorslope;
P_SetPitchRollFromSlope(thing, thing->standingslope);
if (thing->momz == 0 && thing->player && !startingonground) if (thing->momz == 0 && thing->player && !startingonground)
P_PlayerHitFloor(thing->player, true); P_PlayerHitFloor(thing->player, true);
} }
...@@ -2899,6 +2901,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) ...@@ -2899,6 +2901,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
if (thing->momz >= 0) if (thing->momz >= 0)
{ {
thing->standingslope = tmceilingslope; thing->standingslope = tmceilingslope;
P_SetPitchRollFromSlope(thing, thing->standingslope);
if (thing->momz == 0 && thing->player && !startingonground) if (thing->momz == 0 && thing->player && !startingonground)
P_PlayerHitFloor(thing->player, true); P_PlayerHitFloor(thing->player, true);
} }
......
...@@ -1586,6 +1586,31 @@ void P_CheckGravity(mobj_t *mo, boolean affect) ...@@ -1586,6 +1586,31 @@ void P_CheckGravity(mobj_t *mo, boolean affect)
} }
} }
//
// P_SetPitchRollFromSlope
//
void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope)
{
#if 0
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;
}
#else
(void)mo;
(void)slope;
#endif
}
#define STOPSPEED (FRACUNIT) #define STOPSPEED (FRACUNIT)
// //
...@@ -2020,6 +2045,7 @@ void P_XYMovement(mobj_t *mo) ...@@ -2020,6 +2045,7 @@ void P_XYMovement(mobj_t *mo)
// Now compare the Zs of the different quantizations // 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 if (oldangle-newangle > ANG30 && oldangle-newangle < ANGLE_180) { // Allow for a bit of sticking - this value can be adjusted later
mo->standingslope = oldslope; mo->standingslope = oldslope;
P_SetPitchRollFromSlope(mo, mo->standingslope);
P_SlopeLaunch(mo); P_SlopeLaunch(mo);
//CONS_Printf("launched off of slope - "); //CONS_Printf("launched off of slope - ");
...@@ -2587,6 +2613,7 @@ boolean P_ZMovement(mobj_t *mo) ...@@ -2587,6 +2613,7 @@ boolean P_ZMovement(mobj_t *mo)
if (((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) && (mo->type != MT_STEAM)) if (((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) && (mo->type != MT_STEAM))
{ {
mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope; mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope;
P_SetPitchRollFromSlope(mo, mo->standingslope);
P_ReverseQuantizeMomentumToSlope(&mom, mo->standingslope); P_ReverseQuantizeMomentumToSlope(&mom, mo->standingslope);
} }
......
...@@ -893,6 +893,8 @@ void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope) ...@@ -893,6 +893,8 @@ void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
if (P_MobjFlip(thing)*(thing->momz) < 0) // falling, land on slope if (P_MobjFlip(thing)*(thing->momz) < 0) // falling, land on slope
{ {
thing->standingslope = slope; thing->standingslope = slope;
P_SetPitchRollFromSlope(thing, slope);
if (!thing->player || !(thing->player->pflags & PF_BOUNCING)) if (!thing->player || !(thing->player->pflags & PF_BOUNCING))
thing->momz = -P_MobjFlip(thing); thing->momz = -P_MobjFlip(thing);
} }
...@@ -909,6 +911,7 @@ void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope) ...@@ -909,6 +911,7 @@ void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope)
thing->momx = mom.x; thing->momx = mom.x;
thing->momy = mom.y; thing->momy = mom.y;
thing->standingslope = slope; thing->standingslope = slope;
P_SetPitchRollFromSlope(thing, slope);
if (!thing->player || !(thing->player->pflags & PF_BOUNCING)) if (!thing->player || !(thing->player->pflags & PF_BOUNCING))
thing->momz = -P_MobjFlip(thing); thing->momz = -P_MobjFlip(thing);
} }
......
...@@ -1965,6 +1965,8 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ...@@ -1965,6 +1965,8 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost->colorized = mobj->colorized; // alternatively, "true" for sonic advance style colourisation ghost->colorized = mobj->colorized; // alternatively, "true" for sonic advance style colourisation
ghost->angle = (mobj->player ? mobj->player->drawangle : mobj->angle); ghost->angle = (mobj->player ? mobj->player->drawangle : mobj->angle);
ghost->roll = mobj->roll;
ghost->pitch = mobj->pitch;
ghost->rollangle = mobj->rollangle; ghost->rollangle = mobj->rollangle;
ghost->sprite = mobj->sprite; ghost->sprite = mobj->sprite;
...@@ -1984,6 +1986,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ...@@ -1984,6 +1986,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost->fuse = ghost->info->damage; ghost->fuse = ghost->info->damage;
ghost->skin = mobj->skin; ghost->skin = mobj->skin;
ghost->standingslope = mobj->standingslope;
if (mobj->flags2 & MF2_OBJECTFLIP) if (mobj->flags2 & MF2_OBJECTFLIP)
ghost->flags |= MF2_OBJECTFLIP; ghost->flags |= MF2_OBJECTFLIP;
......
...@@ -38,6 +38,8 @@ patch_t *Patch_GetRotatedSprite( ...@@ -38,6 +38,8 @@ patch_t *Patch_GetRotatedSprite(
size_t frame, size_t spriteangle, size_t frame, size_t spriteangle,
boolean flip, boolean adjustfeet, boolean flip, boolean adjustfeet,
void *info, INT32 rotationangle); void *info, INT32 rotationangle);
angle_t R_ModelRotationAngle(mobj_t *mobj);
angle_t R_SpriteRotationAngle(mobj_t *mobj);
INT32 R_GetRollAngle(angle_t rollangle); INT32 R_GetRollAngle(angle_t rollangle);
#endif #endif
......
...@@ -13,11 +13,33 @@ ...@@ -13,11 +13,33 @@
#include "r_things.h" // FEETADJUST #include "r_things.h" // FEETADJUST
#include "z_zone.h" #include "z_zone.h"
#include "w_wad.h" #include "w_wad.h"
#include "r_main.h" // R_PointToAngle
#ifdef ROTSPRITE #ifdef ROTSPRITE
fixed_t rollcosang[ROTANGLES]; fixed_t rollcosang[ROTANGLES];
fixed_t rollsinang[ROTANGLES]; fixed_t rollsinang[ROTANGLES];
angle_t R_ModelRotationAngle(mobj_t *mobj)
{
return mobj->rollangle;
}
angle_t R_SpriteRotationAngle(mobj_t *mobj)
{
#if 0
angle_t viewingAngle = R_PointToAngle(mobj->x, mobj->y);
fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT);
fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT);
angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul);
return (rollOrPitch + R_ModelRotationAngle(mobj));
#else
return R_ModelRotationAngle(mobj);
#endif
}
INT32 R_GetRollAngle(angle_t rollangle) INT32 R_GetRollAngle(angle_t rollangle)
{ {
INT32 ra = AngleFixed(rollangle)>>FRACBITS; INT32 ra = AngleFixed(rollangle)>>FRACBITS;
......
...@@ -1407,7 +1407,6 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info) ...@@ -1407,7 +1407,6 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info)
UINT8 frameFrame = 0xFF; UINT8 frameFrame = 0xFF;
INT16 frameXPivot = 0; INT16 frameXPivot = 0;
INT16 frameYPivot = 0; INT16 frameYPivot = 0;
rotaxis_t frameRotAxis = 0;
// Sprite identifier // Sprite identifier
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
...@@ -1458,12 +1457,6 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info) ...@@ -1458,12 +1457,6 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info)
{ {
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if ((stricmp(sprinfoToken, "X")==0) || (stricmp(sprinfoToken, "XAXIS")==0) || (stricmp(sprinfoToken, "ROLL")==0))
frameRotAxis = ROTAXIS_X;
else if ((stricmp(sprinfoToken, "Y")==0) || (stricmp(sprinfoToken, "YAXIS")==0) || (stricmp(sprinfoToken, "PITCH")==0))
frameRotAxis = ROTAXIS_Y;
else if ((stricmp(sprinfoToken, "Z")==0) || (stricmp(sprinfoToken, "ZAXIS")==0) || (stricmp(sprinfoToken, "YAW")==0))
frameRotAxis = ROTAXIS_Z;
} }
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
...@@ -1480,7 +1473,6 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info) ...@@ -1480,7 +1473,6 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info)
// set fields // set fields
info->pivot[frameFrame].x = frameXPivot; info->pivot[frameFrame].x = frameXPivot;
info->pivot[frameFrame].y = frameYPivot; info->pivot[frameFrame].y = frameYPivot;
info->pivot[frameFrame].rotaxis = frameRotAxis;
} }
// //
......
...@@ -95,7 +95,6 @@ typedef enum ...@@ -95,7 +95,6 @@ typedef enum
typedef struct typedef struct
{ {
INT32 x, y; INT32 x, y;
rotaxis_t rotaxis;
} spriteframepivot_t; } spriteframepivot_t;
typedef struct typedef struct
......
...@@ -1479,6 +1479,7 @@ static void R_ProjectSprite(mobj_t *thing) ...@@ -1479,6 +1479,7 @@ static void R_ProjectSprite(mobj_t *thing)
#ifdef ROTSPRITE #ifdef ROTSPRITE
patch_t *rotsprite = NULL; patch_t *rotsprite = NULL;
INT32 rollangle = 0; INT32 rollangle = 0;
angle_t spriterotangle = 0;
#endif #endif
// transform the origin point // transform the origin point
...@@ -1609,17 +1610,19 @@ static void R_ProjectSprite(mobj_t *thing) ...@@ -1609,17 +1610,19 @@ static void R_ProjectSprite(mobj_t *thing)
patch = W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE); patch = W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE);
#ifdef ROTSPRITE #ifdef ROTSPRITE
if (thing->rollangle spriterotangle = R_SpriteRotationAngle(thing);
if (spriterotangle != 0
&& !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE))) && !(splat && !(thing->renderflags & RF_NOSPLATROLLANGLE)))
{ {
if (papersprite && ang >= ANGLE_180) if (papersprite && ang >= ANGLE_180)
{ {
// Makes Software act much more sane like OpenGL // Makes Software act much more sane like OpenGL
rollangle = R_GetRollAngle(InvAngle(thing->rollangle)); rollangle = R_GetRollAngle(InvAngle(spriterotangle));
} }
else else
{ {
rollangle = R_GetRollAngle(thing->rollangle); rollangle = R_GetRollAngle(spriterotangle);
} }
rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle); rotsprite = Patch_GetRotatedSprite(sprframe, (thing->frame & FF_FRAMEMASK), rot, flip, false, sprinfo, rollangle);
......