- expose animatesprite set of functions to new renderer as a callback.

This commit is contained in:
Christoph Oelckers 2021-03-26 01:35:23 +01:00
parent 0b1e81023f
commit be7bca8e9e
10 changed files with 33 additions and 18 deletions

View file

@ -102,7 +102,7 @@ struct GameInterface
virtual int chaseCamX(binangle ang) { return 0; } virtual int chaseCamX(binangle ang) { return 0; }
virtual int chaseCamY(binangle ang) { return 0; } virtual int chaseCamY(binangle ang) { return 0; }
virtual int chaseCamZ(fixedhoriz horiz) { return 0; } virtual int chaseCamZ(fixedhoriz horiz) { return 0; }
virtual void processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio) {} virtual void processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio) = 0;
virtual FString statFPS() virtual FString statFPS()
{ {

View file

@ -441,9 +441,10 @@ void BunchDrawer::ProcessSector(int sectnum)
int sx = spr->x - iview.x, sy = spr->y - int(iview.y); int sx = spr->x - iview.x, sy = spr->y - int(iview.y);
if ((spr->cstat & CSTAT_SPRITE_ALIGNMENT_MASK) || (hw_models && tile2model[spr->picnum].modelid >= 0) || ((sx * gcosang) + (sy * gsinang) > 0)) // is it behind the camera? (fixme!) // this checks if the sprite is it behind the camera, which will not work if the pitch is high enough to necessitate a FOV of more than 180°.
//if ((spr->cstat & CSTAT_SPRITE_ALIGNMENT_MASK) || (hw_models && tile2model[spr->picnum].modelid >= 0) || ((sx * gcosang) + (sy * gsinang) > 0))
{ {
if ((spr->cstat & (CSTAT_SPRITE_ONE_SIDED | CSTAT_SPRITE_ALIGNMENT_MASK)) != (CSTAT_SPRITE_ONE_SIDED | CSTAT_SPRITE_ALIGNMENT_WALL + 16) || if ((spr->cstat & (CSTAT_SPRITE_ONE_SIDED | CSTAT_SPRITE_ALIGNMENT_MASK)) != (CSTAT_SPRITE_ONE_SIDED | CSTAT_SPRITE_ALIGNMENT_WALL) ||
(r_voxels && tiletovox[spr->picnum] >= 0 && voxmodels[tiletovox[spr->picnum]]) || (r_voxels && tiletovox[spr->picnum] >= 0 && voxmodels[tiletovox[spr->picnum]]) ||
DMulScale(bcos(spr->ang), -sx, bsin(spr->ang), -sy, 6) > 0) DMulScale(bcos(spr->ang), -sx, bsin(spr->ang), -sy, 6) > 0)
if (renderAddTsprite(z, sectnum)) if (renderAddTsprite(z, sectnum))

View file

@ -65,6 +65,7 @@ struct GameInterface : public ::GameInterface
int chaseCamX(binangle ang) { return -ang.bcos(-4); } int chaseCamX(binangle ang) { return -ang.bcos(-4); }
int chaseCamY(binangle ang) { return -ang.bsin(-4); } int chaseCamY(binangle ang) { return -ang.bsin(-4); }
int chaseCamZ(fixedhoriz horiz) { return horiz.asq16() >> 9; } int chaseCamZ(fixedhoriz horiz) { return horiz.asq16() >> 9; }
void processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio) override;
}; };

View file

@ -414,6 +414,10 @@ bool GameInterface::GenerateSavePic()
return true; return true;
} }
void GameInterface::processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio)
{
fi.animatesprites(viewx, viewy, viewz, int(smoothRatio));
}
END_DUKE_NS END_DUKE_NS

View file

@ -255,6 +255,7 @@ struct GameInterface : ::GameInterface
int chaseCamX(binangle ang) { return -ang.bcos() / 12; } int chaseCamX(binangle ang) { return -ang.bcos() / 12; }
int chaseCamY(binangle ang) { return -ang.bsin() / 12; } int chaseCamY(binangle ang) { return -ang.bsin() / 12; }
int chaseCamZ(fixedhoriz horiz) { return horiz.asq16() / 384; } int chaseCamZ(fixedhoriz horiz) { return horiz.asq16() / 384; }
void processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio) override;
::GameStats getStats() override; ::GameStats getStats() override;
}; };

View file

@ -66,7 +66,7 @@ short enemy;
short nEnemyPal = 0; short nEnemyPal = 0;
// NOTE - not to be confused with Ken's analyzesprites() // NOTE - not to be confused with Ken's analyzesprites()
static void analyzesprites(double const smoothratio) static void analyzesprites(int x, int y, int z, double const smoothratio)
{ {
tspritetype *pTSprite; tspritetype *pTSprite;
@ -90,11 +90,6 @@ static void analyzesprites(double const smoothratio)
besttarget = -1; besttarget = -1;
int x = pPlayerSprite->x;
int y = pPlayerSprite->y;
int z = pPlayerSprite->z - (GetSpriteHeight(nPlayerSprite) / 2);
short nSector = pPlayerSprite->sectnum; short nSector = pPlayerSprite->sectnum;
int nAngle = (2048 - pPlayerSprite->ang) & kAngleMask; int nAngle = (2048 - pPlayerSprite->ang) & kAngleMask;
@ -362,7 +357,7 @@ void DrawView(double smoothRatio, bool sceneonly)
{ {
renderSetRollAngle(rotscrnang.asbuildf()); renderSetRollAngle(rotscrnang.asbuildf());
renderDrawRoomsQ16(nCamerax, nCameray, viewz, nCameraa.asq16(), nCamerapan.asq16(), nSector); renderDrawRoomsQ16(nCamerax, nCameray, viewz, nCameraa.asq16(), nCamerapan.asq16(), nSector);
analyzesprites(smoothRatio); analyzesprites(nCamerax, nCameray, viewz, smoothRatio);
renderDrawMasks(); renderDrawMasks();
} }
else else
@ -467,6 +462,12 @@ bool GameInterface::GenerateSavePic()
return true; return true;
} }
void GameInterface::processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio)
{
analyzesprites(viewx, viewy, viewz, smoothRatio);
}
void NoClip() void NoClip()
{ {
} }

View file

@ -177,7 +177,7 @@ void polymost_drawscreen(PLAYERp pp, int tx, int ty, int tz, binangle tang, fixe
if (!FAF_DebugView) if (!FAF_DebugView)
FAF_DrawRooms(tx, ty, tz, tang.asq16(), thoriz.asq16(), tsectnum); FAF_DrawRooms(tx, ty, tz, tang.asq16(), thoriz.asq16(), tsectnum);
analyzesprites(tx, ty, tz, false); analyzesprites(tx, ty, tz, tang.asbuild());
post_analyzesprites(); post_analyzesprites();
renderDrawMasks(); renderDrawMasks();
@ -323,7 +323,7 @@ void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, fixed_t tpq16ang, fixed
renderDrawRoomsQ16(tposx, tposy, tz, (tang), tpq16horiz, mirror[cnt].mirrorsector + MAXSECTORS); renderDrawRoomsQ16(tposx, tposy, tz, (tang), tpq16horiz, mirror[cnt].mirrorsector + MAXSECTORS);
analyzesprites(tposx, tposy, tz, true); analyzesprites(tposx, tposy, tz, tang >> 16);
renderDrawMasks(); renderDrawMasks();
renderCompleteMirror(); // Reverse screen x-wise in this renderCompleteMirror(); // Reverse screen x-wise in this

View file

@ -265,7 +265,7 @@ DoShadowFindGroundPoint(tspriteptr_t sp)
} }
void void
DoShadows(tspriteptr_t tsp, int viewz, bool mirror) DoShadows(tspriteptr_t tsp, int viewz, int camang)
{ {
tspriteptr_t New = &tsprite[spritesortcnt]; tspriteptr_t New = &tsprite[spritesortcnt];
USERp tu = User[tsp->owner]; USERp tu = User[tsp->owner];
@ -553,7 +553,7 @@ void DoStarView(tspriteptr_t tsp, USERp tu, int viewz)
} }
void void
analyzesprites(int viewx, int viewy, int viewz, bool mirror) analyzesprites(int viewx, int viewy, int viewz, int camang)
{ {
int tSpriteNum; int tSpriteNum;
short SpriteNum; short SpriteNum;
@ -645,7 +645,7 @@ analyzesprites(int viewx, int viewy, int viewz, bool mirror)
if (r_shadows && TEST(tu->Flags, SPR_SHADOW)) if (r_shadows && TEST(tu->Flags, SPR_SHADOW))
{ {
DoShadows(tsp, viewz, mirror); DoShadows(tsp, viewz, camang);
} }
//#define UK_VERSION 1 //#define UK_VERSION 1
@ -1869,6 +1869,12 @@ bool GameInterface::DrawAutomapPlayer(int cposx, int cposy, int czoom, int cang,
return true; return true;
} }
void GameInterface::processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio)
{
analyzesprites(viewx, viewy, viewz, viewang.asbuild());
post_analyzesprites();
}
END_SW_NS END_SW_NS

View file

@ -1967,7 +1967,7 @@ int DoPickTarget(SPRITEp sp, uint32_t max_delta_ang, int skip_targets);
void change_sprite_stat(short, short); void change_sprite_stat(short, short);
void SetOwner(short, short); void SetOwner(short, short);
void SetAttach(short, short); void SetAttach(short, short);
void analyzesprites(int,int,int,bool); void analyzesprites(int,int,int,int);
void ChangeState(short SpriteNum, STATEp statep); void ChangeState(short SpriteNum, STATEp statep);
void CollectPortals(); void CollectPortals();
@ -2248,7 +2248,8 @@ struct GameInterface : ::GameInterface
int chaseCamX(binangle ang) { return -ang.bcos(-3); } int chaseCamX(binangle ang) { return -ang.bcos(-3); }
int chaseCamY(binangle ang) { return -ang.bsin(-3); } int chaseCamY(binangle ang) { return -ang.bsin(-3); }
int chaseCamZ(fixedhoriz horiz) { return horiz.asq16() >> 8; } int chaseCamZ(fixedhoriz horiz) { return horiz.asq16() >> 8; }
void processSprites(int viewx, int viewy, int viewz, binangle viewang, double smoothRatio) override;
GameStats getStats() override; GameStats getStats() override;
}; };

View file

@ -476,7 +476,7 @@ void drawroomstotile(int daposx, int daposy, int daposz,
if (!testnewrenderer) if (!testnewrenderer)
{ {
renderDrawRoomsQ16(daposx, daposy, daposz, ang.asq16(), horiz.asq16(), dacursectnum); renderDrawRoomsQ16(daposx, daposy, daposz, ang.asq16(), horiz.asq16(), dacursectnum);
analyzesprites(daposx, daposy, daposz, false); analyzesprites(daposx, daposy, daposz, ang.asbuild());
renderDrawMasks(); renderDrawMasks();
} }
else else