mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-15 08:51:24 +00:00
- fixed: The new renderer still called the Polymost screen finish function.
This led to a second, redundant postprocessing step with incorrect matrix values. It now calls screen->Update() directly without the unneeded stuff, but this required a bit of reordering in the game code to ensure that the renderer receives the weapon data to display.
This commit is contained in:
parent
5759bcc1a6
commit
70087ebc12
15 changed files with 73 additions and 56 deletions
|
@ -394,6 +394,7 @@ static void GameTicker()
|
|||
// Display
|
||||
//
|
||||
//==========================================================================
|
||||
EXTERN_CVAR(Bool, vid_renderer);
|
||||
|
||||
void Display()
|
||||
{
|
||||
|
@ -456,7 +457,8 @@ void Display()
|
|||
}
|
||||
DrawRateStuff();
|
||||
|
||||
videoShowFrame(1);
|
||||
if (vid_renderer == 0) videoShowFrame(1);
|
||||
else screen->Update();
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
|
@ -57,6 +57,7 @@ EXTERN_CVAR(Bool, cl_capfps)
|
|||
PalEntry GlobalMapFog;
|
||||
float GlobalFogDensity = 350.f;
|
||||
TArray<PortalDesc> allPortals;
|
||||
void Draw2D(F2DDrawer* drawer, FRenderState& state);
|
||||
|
||||
|
||||
#if 0
|
||||
|
@ -138,7 +139,7 @@ void RenderViewpoint(FRenderViewpoint& mainvp, IntRect* bounds, float fov, float
|
|||
vp = mainvp;
|
||||
|
||||
di->Set3DViewport(RenderState);
|
||||
float flash = 1.f;
|
||||
float flash = 8.f / (r_scenebrightness + 8.f);
|
||||
di->Viewpoint.FieldOfView = fov; // Set the real FOV for the current scene (it's not necessarily the same as the global setting in r_viewpoint)
|
||||
|
||||
// Stereo mode specific perspective projection
|
||||
|
@ -160,7 +161,9 @@ void RenderViewpoint(FRenderViewpoint& mainvp, IntRect* bounds, float fov, float
|
|||
RenderState.EnableDrawBuffers(1);
|
||||
}
|
||||
|
||||
screen->PostProcessScene(false, CM_DEFAULT, flash, [&]() { });
|
||||
screen->PostProcessScene(false, CM_DEFAULT, flash, []() {
|
||||
Draw2D(&twodpsp, *screen->RenderState()); // draws the weapon sprites
|
||||
});
|
||||
PostProcess.Unclock();
|
||||
}
|
||||
di->EndDrawInfo();
|
||||
|
|
|
@ -108,8 +108,6 @@ void hudDraw(PLAYER* gView, sectortype* pSector, double bobx, double boby, doubl
|
|||
{
|
||||
double look_anghalf = gView->angle.look_anghalf(smoothratio);
|
||||
|
||||
DrawCrosshair(kCrosshairTile, gView->actor->xspr.health >> 4, -look_anghalf, 0, 2);
|
||||
|
||||
if (gViewPos == 0)
|
||||
{
|
||||
double looking_arc = gView->angle.looking_arc(smoothratio);
|
||||
|
@ -174,16 +172,6 @@ void hudDraw(PLAYER* gView, sectortype* pSector, double bobx, double boby, doubl
|
|||
drawElement(0, 237, 2358, 1, 0, 1, -1);
|
||||
drawElement(320, 237, 2358, 1, 1, 1, 1);
|
||||
}
|
||||
|
||||
#if 0 // This currently does not work. May have to be redone as a hardware effect.
|
||||
if (v4 && gNetPlayers > 1)
|
||||
{
|
||||
DoLensEffect();
|
||||
viewingRange = viewingrange;
|
||||
r otatesprite(IntToFixed(280), IntToFixed(35), 53248, 512, 4077, v10, v14, 512 + 6, gViewX0, gViewY0, gViewX1, gViewY1);
|
||||
r otatesprite(IntToFixed(280), IntToFixed(35), 53248, 0, 1683, v10, 0, 512 + 35, gViewX0, gViewY0, gViewX1, gViewY1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
END_BLD_NS
|
||||
|
|
|
@ -768,6 +768,7 @@ void viewDrawScreen(bool sceneonly)
|
|||
|
||||
if (vid_renderer)
|
||||
{
|
||||
if (!sceneonly) hudDraw(gView, pSector, shakeX, shakeY, zDelta, basepal, gInterpolate);
|
||||
fixedhoriz deliriumPitchI = q16horiz(interpolatedvalue(IntToFixed(deliriumPitchO), IntToFixed(deliriumPitch), gInterpolate));
|
||||
auto bakCstat = gView->actor->spr.cstat;
|
||||
gView->actor->spr.cstat |= (gViewPos == 0) ? CSTAT_SPRITE_INVISIBLE : CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP;
|
||||
|
@ -778,6 +779,7 @@ void viewDrawScreen(bool sceneonly)
|
|||
{
|
||||
renderSetRollAngle((float)rotscrnang.asbuildf());
|
||||
render3DViewPolymost(sectnum(pSector), cX, cY, cZ, cA, cH);
|
||||
if (!sceneonly) hudDraw(gView, pSector, shakeX, shakeY, zDelta, basepal, gInterpolate);
|
||||
}
|
||||
bDeliriumOld = bDelirium && gDeliriumBlur;
|
||||
|
||||
|
@ -786,6 +788,18 @@ void viewDrawScreen(bool sceneonly)
|
|||
Collision c1, c2;
|
||||
GetZRange(gView->actor, &vf4, &c1, &vec, &c2, nClipDist, 0);
|
||||
if (sceneonly) return;
|
||||
double look_anghalf = gView->angle.look_anghalf(gInterpolate);
|
||||
DrawCrosshair(kCrosshairTile, gView->actor->xspr.health >> 4, -look_anghalf, 0, 2);
|
||||
#if 0 // This currently does not work. May have to be redone as a hardware effect.
|
||||
if (v4 && gNetPlayers > 1)
|
||||
{
|
||||
DoLensEffect();
|
||||
viewingRange = viewingrange;
|
||||
r otatesprite(IntToFixed(280), IntToFixed(35), 53248, 512, 4077, v10, v14, 512 + 6, gViewX0, gViewY0, gViewX1, gViewY1);
|
||||
r otatesprite(IntToFixed(280), IntToFixed(35), 53248, 0, 1683, v10, 0, 512 + 35, gViewX0, gViewY0, gViewX1, gViewY1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
int tmpSect = nSectnum;
|
||||
if ((vf0 & 0xc000) == 0x4000)
|
||||
|
@ -806,7 +820,6 @@ void viewDrawScreen(bool sceneonly)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
hudDraw(gView, pSector, shakeX, shakeY, zDelta, basepal, gInterpolate);
|
||||
}
|
||||
UpdateDacs(0, true); // keep the view palette active only for the actual 3D view and its overlays.
|
||||
if (automapMode != am_off)
|
||||
|
|
|
@ -218,9 +218,10 @@ void OffBoat(player_struct *pl);
|
|||
void cameratext(DDukeActor* i);
|
||||
void dobonus(int bonusonly, const CompletionFunc& completion);
|
||||
|
||||
void drawweapon(double smoothratio);
|
||||
void drawoverlays(double smoothratio);
|
||||
void drawbackground(void);
|
||||
void displayrooms(int32_t playerNum, double smoothratio);
|
||||
void displayrooms(int32_t playerNum, double smoothratio, bool sceneonly);
|
||||
void setgamepalette(int palid);
|
||||
void resetmys();
|
||||
void resettimevars();
|
||||
|
|
|
@ -207,6 +207,26 @@ void V_AddBlend (float r, float g, float b, float a, float v_blend[4])
|
|||
videoSetPalette(palid);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// draws the weapon sprite and other 2D content that's part of the scene.
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void drawweapon(double smoothratio)
|
||||
{
|
||||
auto pp = &ps[screenpeek];
|
||||
if (!isRR() && pp->newOwner != nullptr)
|
||||
cameratext(pp->newOwner);
|
||||
else
|
||||
{
|
||||
fi.displayweapon(screenpeek, smoothratio);
|
||||
if (pp->over_shoulder_on == 0)
|
||||
fi.displaymasks(screenpeek, pp->GetActor()->spr.pal == 1 || !pp->insector() ? 1 : pp->cursector->floorpal, smoothratio);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// draws everything not part of the 3D scene and its weapon sprite.
|
||||
|
@ -242,20 +262,6 @@ void drawoverlays(double smoothratio)
|
|||
|
||||
if (ud.cameraactor == nullptr)
|
||||
{
|
||||
if (automapMode != am_full)
|
||||
{
|
||||
if (!isRR() && pp->newOwner != nullptr)
|
||||
cameratext(pp->newOwner);
|
||||
else
|
||||
{
|
||||
fi.displayweapon(screenpeek, smoothratio);
|
||||
if (pp->over_shoulder_on == 0)
|
||||
fi.displaymasks(screenpeek, pp->GetActor()->spr.pal == 1 || !pp->insector() ? 1 : pp->cursector->floorpal, smoothratio);
|
||||
}
|
||||
if (!isRR())
|
||||
moveclouds(smoothratio);
|
||||
}
|
||||
|
||||
if (automapMode != am_off)
|
||||
{
|
||||
DoInterpolations(smoothratio / 65536.);
|
||||
|
|
|
@ -127,9 +127,13 @@ void GameInterface::Render()
|
|||
{
|
||||
drawtime.Reset();
|
||||
drawtime.Clock();
|
||||
|
||||
videoSetBrightness(thunder_brightness);
|
||||
double const smoothRatio = !playrunning() || !cl_interpolate || cl_capfps ? MaxSmoothRatio : I_GetTimeFrac() * MaxSmoothRatio;
|
||||
displayrooms(screenpeek, smoothRatio);
|
||||
if (!isRR())
|
||||
moveclouds(smoothRatio);
|
||||
|
||||
displayrooms(screenpeek, smoothRatio, false);
|
||||
drawoverlays(smoothRatio);
|
||||
drawtime.Unclock();
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ BEGIN_DUKE_NS
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void renderView(DDukeActor* playersprite, sectortype* sect, int x, int y, int z, binangle a, fixedhoriz h, binangle rotscrnang, int smoothratio)
|
||||
void renderView(DDukeActor* playersprite, sectortype* sect, int x, int y, int z, binangle a, fixedhoriz h, binangle rotscrnang, double smoothratio, bool sceneonly)
|
||||
{
|
||||
if (!vid_renderer)
|
||||
{
|
||||
|
@ -75,10 +75,12 @@ void renderView(DDukeActor* playersprite, sectortype* sect, int x, int y, int z,
|
|||
renderMirror(x, y, z, a, h, smoothratio);
|
||||
renderDrawRoomsQ16(x, y, z, a.asq16(), h.asq16(), sect, false);
|
||||
fi.animatesprites(pm_tsprite, pm_spritesortcnt, x, y, a.asbuild(), smoothratio);
|
||||
if (!sceneonly) drawweapon(smoothratio);
|
||||
renderDrawMasks();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!sceneonly) drawweapon(smoothratio);
|
||||
render_drawrooms(playersprite, { x, y, z }, sectnum(sect), a, h, rotscrnang, smoothratio);
|
||||
}
|
||||
}
|
||||
|
@ -250,7 +252,7 @@ static int getdrugmode(player_struct *p, int oyrepeat)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void displayrooms(int snum, double smoothratio)
|
||||
void displayrooms(int snum, double smoothratio, bool sceneonly)
|
||||
{
|
||||
int cposx, cposy, cposz, fz, cz;
|
||||
binangle cang, rotscrnang;
|
||||
|
@ -295,7 +297,7 @@ void displayrooms(int snum, double smoothratio)
|
|||
auto bh = buildhoriz(act->spr.yvel);
|
||||
auto cstat = act->spr.cstat;
|
||||
act->spr.cstat = CSTAT_SPRITE_INVISIBLE;
|
||||
renderView(act, act->sector(), act->spr.pos.X, act->spr.pos.Y, act->spr.pos.Z - (4 << 8), cang, bh, buildang(0), (int)smoothratio);
|
||||
renderView(act, act->sector(), act->spr.pos.X, act->spr.pos.Y, act->spr.pos.Z - (4 << 8), cang, bh, buildang(0), smoothratio, sceneonly);
|
||||
act->spr.cstat = cstat;
|
||||
|
||||
}
|
||||
|
@ -419,7 +421,7 @@ void displayrooms(int snum, double smoothratio)
|
|||
}
|
||||
else
|
||||
{
|
||||
renderView(viewer, sect, cposx, cposy, cposz, cang, choriz, rotscrnang, (int)smoothratio);
|
||||
renderView(viewer, sect, cposx, cposy, cposz, cang, choriz, rotscrnang, smoothratio, sceneonly);
|
||||
}
|
||||
viewer->spr.cstat = cstat;
|
||||
}
|
||||
|
@ -439,7 +441,7 @@ void displayrooms(int snum, double smoothratio)
|
|||
|
||||
bool GameInterface::GenerateSavePic()
|
||||
{
|
||||
displayrooms(myconnectindex, MaxSmoothRatio);
|
||||
displayrooms(myconnectindex, MaxSmoothRatio, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -225,6 +225,7 @@ struct GameInterface : public ::GameInterface
|
|||
void Ticker() override;
|
||||
void DrawBackground() override;
|
||||
void Render() override;
|
||||
//void DrawWeapons() override;
|
||||
void GetInput(ControlInfo* const hidInput, double const scaleAdjust, InputPacket* packet = nullptr) override;
|
||||
void Startup() override;
|
||||
const char* GenericCheat(int player, int cheat) override;
|
||||
|
|
|
@ -363,9 +363,13 @@ void DrawView(double smoothRatio, bool sceneonly)
|
|||
renderDrawRoomsQ16(nCamerax, nCameray, viewz, nCameraa.asq16(), nCamerapan.asq16(), sectnum(pSector), false);
|
||||
analyzesprites(pm_tsprite, pm_spritesortcnt, nCamerax, nCameray, viewz, smoothRatio);
|
||||
renderDrawMasks();
|
||||
if (!nFreeze && !sceneonly)
|
||||
DrawWeapons(smoothRatio);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!nFreeze && !sceneonly)
|
||||
DrawWeapons(smoothRatio);
|
||||
render_drawrooms(nullptr, { nCamerax, nCameray, viewz }, sectnum(pSector), nCameraa, nCamerapan, rotscrnang, smoothRatio);
|
||||
}
|
||||
|
||||
|
@ -432,7 +436,6 @@ void DrawView(double smoothRatio, bool sceneonly)
|
|||
{
|
||||
if (nSnakeCam < 0)
|
||||
{
|
||||
DrawWeapons(smoothRatio);
|
||||
DrawMap(smoothRatio);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -148,7 +148,7 @@ void polymost_drawscreen(PLAYER* pp, int tx, int ty, int tz, binangle tang, fixe
|
|||
DrawOverlapRoom(tx, ty, tz, tang.asq16(), thoriz.asq16(), tsect);
|
||||
OverlapDraw = false;
|
||||
|
||||
if (automapMode != am_full)// && !ScreenSavePic)
|
||||
if (automapMode != am_full)
|
||||
{
|
||||
// TEST this! Changed to camerapp
|
||||
//JS_DrawMirrors(camerapp, tx, ty, tz, tang.asq16(), thoriz.asq16());
|
||||
|
|
|
@ -1283,8 +1283,6 @@ void PreDrawStackedWater(void)
|
|||
}
|
||||
|
||||
|
||||
short ScreenSavePic = false;
|
||||
|
||||
void DoPlayerDiveMeter(PLAYER* pp);
|
||||
|
||||
void polymost_drawscreen(PLAYER* pp, int tx, int ty, int tz, binangle tang, fixedhoriz thoriz, sectortype* tsect);
|
||||
|
@ -1372,7 +1370,7 @@ void RestorePortalState()
|
|||
}
|
||||
}
|
||||
|
||||
void drawscreen(PLAYER* pp, double smoothratio)
|
||||
void drawscreen(PLAYER* pp, double smoothratio, bool sceneonly)
|
||||
{
|
||||
extern bool CameraTestMode;
|
||||
int tx, ty, tz;
|
||||
|
@ -1395,7 +1393,7 @@ void drawscreen(PLAYER* pp, double smoothratio)
|
|||
int sr = (int)smoothratio;
|
||||
pm_smoothratio = sr;
|
||||
|
||||
if (!ScreenSavePic)
|
||||
if (!sceneonly)
|
||||
{
|
||||
DoInterpolations(smoothratio / 65536.); // Stick at beginning of drawscreen
|
||||
if (cl_sointerpolation)
|
||||
|
@ -1499,7 +1497,7 @@ void drawscreen(PLAYER* pp, double smoothratio)
|
|||
thoriz = q16horiz(clamp(thoriz.asq16() + interpolatedvalue(pp->recoil_ohorizoff, pp->recoil_horizoff, smoothratio), gi->playerHorizMin(), gi->playerHorizMax()));
|
||||
}
|
||||
|
||||
if (automapMode != am_full)// && !ScreenSavePic)
|
||||
if (automapMode != am_full)
|
||||
{
|
||||
// Cameras must be done before the main loop.
|
||||
if (!vid_renderer) JS_DrawCameras(pp, tx, ty, tz, smoothratio);
|
||||
|
@ -1510,24 +1508,24 @@ void drawscreen(PLAYER* pp, double smoothratio)
|
|||
{
|
||||
renderSetRollAngle((float)trotscrnang.asbuildf());
|
||||
polymost_drawscreen(pp, tx, ty, tz, tang, thoriz, tsect);
|
||||
if (!sceneonly) UpdatePanel(smoothratio);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!sceneonly) UpdatePanel(smoothratio);
|
||||
UpdateWallPortalState();
|
||||
render_drawrooms(pp->actor, { tx, ty, tz }, sectnum(tsect), tang, thoriz, trotscrnang, smoothratio);
|
||||
RestorePortalState();
|
||||
}
|
||||
|
||||
|
||||
if (!ScreenSavePic) UpdatePanel(smoothratio);
|
||||
|
||||
// if doing a screen save don't need to process the rest
|
||||
if (ScreenSavePic)
|
||||
if (sceneonly)
|
||||
{
|
||||
DrawScreen = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// if doing a screen save don't need to process the rest
|
||||
|
||||
|
||||
MarkSectorSeen(pp->cursector);
|
||||
|
||||
|
@ -1601,9 +1599,7 @@ void drawscreen(PLAYER* pp, double smoothratio)
|
|||
|
||||
bool GameInterface::GenerateSavePic()
|
||||
{
|
||||
ScreenSavePic = true;
|
||||
drawscreen(Player + myconnectindex, 65536);
|
||||
ScreenSavePic = false;
|
||||
drawscreen(Player + myconnectindex, 65536, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -713,7 +713,7 @@ void GameInterface::Render()
|
|||
|
||||
drawtime.Reset();
|
||||
drawtime.Clock();
|
||||
drawscreen(Player + screenpeek, smoothratio);
|
||||
drawscreen(Player + screenpeek, smoothratio, false);
|
||||
drawtime.Unclock();
|
||||
}
|
||||
|
||||
|
|
|
@ -1806,7 +1806,6 @@ void DebugWriteString(char *string); // game.c
|
|||
void getsyncstat(void); // sync.c
|
||||
void SyncStatMessage(void); // sync.c
|
||||
|
||||
void drawscreen(PLAYER* pp, double smoothratio); // draw.c
|
||||
int COVERsetgamemode(int mode, int xdim, int ydim, int bpp); // draw.c
|
||||
void ScreenCaptureKeys(void); // draw.c
|
||||
|
||||
|
@ -1908,6 +1907,7 @@ struct GameInterface : public ::GameInterface
|
|||
void DrawBackground(void) override;
|
||||
void Ticker(void) override;
|
||||
void Render() override;
|
||||
//void DrawWeapons() override;
|
||||
void Startup() override;
|
||||
const char *CheckCheatMode() override;
|
||||
const char* GenericCheat(int player, int cheat) override;
|
||||
|
|
|
@ -437,8 +437,6 @@ void videoShowFrame(int32_t w)
|
|||
screen->mVertexData->Reset();
|
||||
screen->mViewpoints->Clear();
|
||||
|
||||
videoSetBrightness(0); // immediately reset this after rendering so that the value doesn't stick around in the backend.
|
||||
|
||||
// After finishing the frame, reset everything for the next frame. This needs to be done better.
|
||||
if (!w)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue