]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - menu.c
implemented framerate-dependent particle quality reduction to try to
[xonotic/darkplaces.git] / menu.c
diff --git a/menu.c b/menu.c
index 59418bd567b19d8e8a8aefc13aa79a8368a210a4..a48e89aafdb9e0f0c0f8a0daf99f21428055c911 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -277,7 +277,7 @@ void M_ToggleMenu_f (void)
 {
        m_entersound = true;
 
-       if (key_dest != key_menu || m_state != m_main)
+       if ((key_dest != key_menu && key_dest != key_menu_grabbed) || m_state != m_main)
        {
                if(Cmd_Argc() == 2 && !strcmp(Cmd_Argv(1), "1"))
                        return;
@@ -3169,7 +3169,7 @@ void M_Menu_Quit_f (void)
        int n;
        if (m_state == m_quit)
                return;
-       wasInMenus = (key_dest == key_menu);
+       wasInMenus = (key_dest == key_menu || key_dest == key_menu_grabbed);
        key_dest = key_menu;
        m_quit_prevstate = m_state;
        m_state = m_quit;
@@ -4744,7 +4744,7 @@ void M_Init (void)
 
 void M_Draw (void)
 {
-       if (key_dest != key_menu)
+       if (key_dest != key_menu && key_dest != key_menu_grabbed)
                m_state = m_none;
 
        if (m_state == m_none)
@@ -5070,12 +5070,34 @@ void MP_KeyEvent (int key, char ascii, qboolean downevent)
 
 void MP_Draw (void)
 {
+       // declarations that are needed right now
+       extern r_refdef_scene_t menu_scene;
+
+       int oldqualityreduction;
+       static r_refdef_scene_t clientscene;
+       clientscene = r_refdef.scene;
+       r_refdef.scene = menu_scene;
+
+       // reset the temp entities each frame
+       r_refdef.scene.numtempentities = 0;
+
+       // menu scenes do not use reduced rendering quality
+       oldqualityreduction = r_refdef.view.qualityreduction;
+       r_refdef.view.qualityreduction = 0;
+
        PRVM_Begin;
        PRVM_SetProg(PRVM_MENUPROG);
 
+       // FIXME: this really shouldnt error out lest we have a very broken refdef state...?
+       // or does it kill the server too?
        PRVM_ExecuteProgram(prog->funcoffsets.m_draw,"m_draw() required");
 
        PRVM_End;
+
+       r_refdef.view.qualityreduction = oldqualityreduction;
+
+       menu_scene = r_refdef.scene;
+       r_refdef.scene = clientscene;
 }
 
 void MP_ToggleMenu_f (void)