diff --git a/src/d_main.cpp b/src/d_main.cpp index 861318c66..668dcf1ce 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2730,6 +2730,7 @@ void D_DoomMain (void) ST_Clear(); D_ErrorCleanup (); DThinker::DestroyThinkersInList(STAT_STATIC); + E_Shutdown(false); P_FreeLevelData(); P_FreeExtraLevelData(); @@ -2775,6 +2776,8 @@ void D_DoomMain (void) restart++; PClass::bShutdown = false; PClass::bVMOperational = false; + + gamestate = GS_STARTUP; } while (1); } diff --git a/src/gl/scene/gl_portal.cpp b/src/gl/scene/gl_portal.cpp index 25b2ff236..3f8ede410 100644 --- a/src/gl/scene/gl_portal.cpp +++ b/src/gl/scene/gl_portal.cpp @@ -606,10 +606,7 @@ void GLSkyboxPortal::DrawContents(FDrawInfo *di) di->SetViewArea(); ClearClipper(di); - int mapsection = R_PointInSubsector(r_viewpoint.Pos)->mapsection; - - di->CurrentMapSections.Zero(); - di->CurrentMapSections.Set(mapsection); + di->UpdateCurrentMapSection(); drawer->DrawScene(di, DM_SKYPORTAL); portal->mFlags &= ~PORTSF_INSKYBOX; @@ -770,6 +767,8 @@ void GLPlaneMirrorPortal::DrawContents(FDrawInfo *di) drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); ClearClipper(di); + di->UpdateCurrentMapSection(); + gl_RenderState.SetClipHeight(planez, PlaneMirrorMode < 0 ? -1.f : 1.f); drawer->DrawScene(di, DM_PORTAL); gl_RenderState.SetClipHeight(0.f, 0.f); @@ -875,6 +874,8 @@ void GLMirrorPortal::DrawContents(FDrawInfo *di) return; } + di->UpdateCurrentMapSection(); + di->mClipPortal = this; DAngle StartAngle = r_viewpoint.Angles.Yaw; DVector3 StartPos = r_viewpoint.Pos; diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index f2e0301fb..91d4e4235 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -739,6 +739,8 @@ void GLSceneDrawer::WriteSavePic (player_t *player, FileWriter *file, int width, GLRenderer->CopyToBackbuffer(&bounds, false); glFlush(); + screen->SetOutputViewport(nullptr); + uint8_t * scr = (uint8_t *)M_Malloc(width * height * 3); glReadPixels(0,0,width, height,GL_RGB,GL_UNSIGNED_BYTE,scr); M_CreatePNG (file, scr + ((height-1) * width * 3), NULL, SS_RGB, width, height, -width * 3, Gamma); diff --git a/src/gl/scene/gl_scenedrawer.h b/src/gl/scene/gl_scenedrawer.h index d075e1418..3396c269c 100644 --- a/src/gl/scene/gl_scenedrawer.h +++ b/src/gl/scene/gl_scenedrawer.h @@ -32,7 +32,6 @@ public: angle_t FrustumAngle(); void SetViewMatrix(float vx, float vy, float vz, bool mirror, bool planemirror); - void SetViewArea(); void SetupView(float vx, float vy, float vz, DAngle va, bool mirror, bool planemirror); void SetViewAngle(DAngle viewangle); void SetProjection(VSMatrix matrix); diff --git a/src/hwrenderer/scene/hw_drawinfo.h b/src/hwrenderer/scene/hw_drawinfo.h index e9db60a09..8bec0df27 100644 --- a/src/hwrenderer/scene/hw_drawinfo.h +++ b/src/hwrenderer/scene/hw_drawinfo.h @@ -175,6 +175,8 @@ public: void PreparePlayerSprites(sector_t * viewsector, area_t in_area); void PrepareTargeterSprites(); + void UpdateCurrentMapSection(); + virtual void DrawWall(GLWall *wall, int pass) = 0; virtual void DrawFlat(GLFlat *flat, int pass, bool trans) = 0; virtual void DrawSprite(GLSprite *sprite, int pass) = 0; diff --git a/src/hwrenderer/scene/hw_renderhacks.cpp b/src/hwrenderer/scene/hw_renderhacks.cpp index 57fef57e0..74c5b3f0e 100644 --- a/src/hwrenderer/scene/hw_renderhacks.cpp +++ b/src/hwrenderer/scene/hw_renderhacks.cpp @@ -86,6 +86,12 @@ void HWDrawInfo::ClearBuffers() mClipPortal = nullptr; } +void HWDrawInfo::UpdateCurrentMapSection() +{ + const int mapsection = R_PointInSubsector(r_viewpoint.Pos)->mapsection; + CurrentMapSections.Set(mapsection); +} + //========================================================================== // // Adds a subsector plane to a sector's render list diff --git a/src/serializer.cpp b/src/serializer.cpp index aa1c9a49e..58d5658d4 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -989,6 +989,11 @@ void FSerializer::ReadObjects(bool hubtravel) { DThinker::bSerialOverride = true; r->mDObjects.Resize(ArraySize()); + for (auto &p : r->mDObjects) + { + p = nullptr; + } + // First iteration: create all the objects but do nothing with them yet. for (unsigned i = 0; i < r->mDObjects.Size(); i++) { @@ -1060,7 +1065,7 @@ void FSerializer::ReadObjects(bool hubtravel) // nuke all objects we created here. for (auto obj : r->mDObjects) { - if (!(obj->ObjectFlags & OF_EuthanizeMe)) obj->Destroy(); + if (obj != nullptr && !(obj->ObjectFlags & OF_EuthanizeMe)) obj->Destroy(); } r->mDObjects.Clear();