SpiritQuaddicted / reQuiem

reQuiem is a custom OpenGL Quake engine for Windows and Linux. It's designed for maximum compatibility with all things Quake - past, present and future. It's fast, reliable, and easy to configure. In short: it fixes what was broken, improves what needed improving, and leaves the rest alone. It was developed by jdhack.
GNU General Public License v2.0
17 stars 2 forks source link

don't put duplicate entries into cl_visedicts #37

Closed neogeographica closed 10 years ago

neogeographica commented 10 years ago

Resolves issue #9.

Summary:

skychain is a linked list (through texturechain pointers) of surfaces. Surfaces are appended to skychain while processing cl_visedicts. If there are duplicates in cl_visedicts then loops can be formed in the skychain. If there are loops in the skychain then R_DrawSky will never terminate. (This is all contingent on certain cvars used to choose the sky style, but this is the default behavior.)

Solution:

Dups in cl_visedicts are generally bad, so let's eliminate those. This will also fix the skychain issue.

Things other than R_StoreEfrags that modify cl_visedicts all happen under _Host_Frame:

_Host_Frame
  CL_ReadFromServer (if connected)
    CL_RelinkEntities resets cl_numvisedicts and then adds to cl_visedicts
    CL_LinkProjectiles (if qw) adds to cl_visedicts
    CL_UpdateStreams (if hexen2) adds to cl_visedicts
  CL_UpdateEffects (if hexen2 and connected) adds to cl_visedicts

That's all cool!

Then there's R_StoreEfrags. It is down the callstack from SCR_UpdateScreen.

SCR_UpdateScreen is called from: _Host_Frame, Con_Keydown, Con_Print, Movie_TestFPS, SCR_BeginLoadingPlaque, and SCR_ModalMessage.

The only time we actually want R_StoreEfrags to add to cl_visedicts is in the case where SCR_UpdateScreen is called from _Host_Frame. So let's enforce that with a global flag.

This change fixes the specific reported issue with czg07. Giving it some burn-in testing now to see if it causes (or solves?) other issues.