diff --git a/source/core/mainloop.cpp b/source/core/mainloop.cpp index 35abb5499..ee7554a9f 100644 --- a/source/core/mainloop.cpp +++ b/source/core/mainloop.cpp @@ -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(); } //========================================================================== diff --git a/source/core/rendering/hw_entrypoint.cpp b/source/core/rendering/hw_entrypoint.cpp index d5907242e..c855b5d69 100644 --- a/source/core/rendering/hw_entrypoint.cpp +++ b/source/core/rendering/hw_entrypoint.cpp @@ -57,6 +57,7 @@ EXTERN_CVAR(Bool, cl_capfps) PalEntry GlobalMapFog; float GlobalFogDensity = 350.f; TArray 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(); diff --git a/source/games/blood/src/hudsprites.cpp b/source/games/blood/src/hudsprites.cpp index 8cbd5035b..d1b595f25 100644 --- a/source/games/blood/src/hudsprites.cpp +++ b/source/games/blood/src/hudsprites.cpp @@ -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 diff --git a/source/games/blood/src/view.cpp b/source/games/blood/src/view.cpp index f74c49d11..f1463f2aa 100644 --- a/source/games/blood/src/view.cpp +++ b/source/games/blood/src/view.cpp @@ -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) diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index 8431d2819..ef2e8ba29 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -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(); diff --git a/source/games/duke/src/game_misc.cpp b/source/games/duke/src/game_misc.cpp index bde0c3bbf..14d4f2b9b 100644 --- a/source/games/duke/src/game_misc.cpp +++ b/source/games/duke/src/game_misc.cpp @@ -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.); diff --git a/source/games/duke/src/gameloop.cpp b/source/games/duke/src/gameloop.cpp index cb2be5f9a..4166fe83f 100644 --- a/source/games/duke/src/gameloop.cpp +++ b/source/games/duke/src/gameloop.cpp @@ -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(); } diff --git a/source/games/duke/src/render.cpp b/source/games/duke/src/render.cpp index d9c436cf2..e50840e72 100644 --- a/source/games/duke/src/render.cpp +++ b/source/games/duke/src/render.cpp @@ -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; } diff --git a/source/games/exhumed/src/exhumed.h b/source/games/exhumed/src/exhumed.h index d08ee030e..06046282d 100644 --- a/source/games/exhumed/src/exhumed.h +++ b/source/games/exhumed/src/exhumed.h @@ -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; diff --git a/source/games/exhumed/src/view.cpp b/source/games/exhumed/src/view.cpp index b279e72ce..93ba52474 100644 --- a/source/games/exhumed/src/view.cpp +++ b/source/games/exhumed/src/view.cpp @@ -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 diff --git a/source/games/sw/src/_polymost.cpp b/source/games/sw/src/_polymost.cpp index 01647ea4d..8b109beab 100644 --- a/source/games/sw/src/_polymost.cpp +++ b/source/games/sw/src/_polymost.cpp @@ -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()); diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp index ccb7be48e..934c607c4 100644 --- a/source/games/sw/src/draw.cpp +++ b/source/games/sw/src/draw.cpp @@ -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; } diff --git a/source/games/sw/src/game.cpp b/source/games/sw/src/game.cpp index 2b76d6a20..6feaf5455 100644 --- a/source/games/sw/src/game.cpp +++ b/source/games/sw/src/game.cpp @@ -713,7 +713,7 @@ void GameInterface::Render() drawtime.Reset(); drawtime.Clock(); - drawscreen(Player + screenpeek, smoothratio); + drawscreen(Player + screenpeek, smoothratio, false); drawtime.Unclock(); } diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index bf7426197..d0b658a0e 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -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; diff --git a/source/glbackend/glbackend.cpp b/source/glbackend/glbackend.cpp index 225c3ffcf..5b35bb658 100644 --- a/source/glbackend/glbackend.cpp +++ b/source/glbackend/glbackend.cpp @@ -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) {