]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
Add a few explicit typecasts to help fix C++ compilation
[xonotic/darkplaces.git] / cl_screen.c
index 4cdbcf238ae37e9083ef2a759746511441224f1f..66c50058b4397fc2c4a7cb024a7539c640107ded 100644 (file)
@@ -690,7 +690,9 @@ static void SCR_SetUpToDrawConsole (void)
                framecounter = 0;
 #endif
 
-       if (scr_conforcewhiledisconnected.integer && key_dest == key_game && cls.signon != SIGNONS)
+       if (scr_conforcewhiledisconnected.integer >= 2 && key_dest == key_game && cls.signon != SIGNONS)
+               key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
+       else if (scr_conforcewhiledisconnected.integer >= 1 && key_dest == key_game && cls.signon != SIGNONS && !sv.active)
                key_consoleactive |= KEY_CONSOLEACTIVE_FORCED;
        else
                key_consoleactive &= ~KEY_CONSOLEACTIVE_FORCED;
@@ -723,6 +725,8 @@ void SCR_DrawConsole (void)
                con_vislines = 0;
 }
 
+qboolean scr_loading = false;
+
 /*
 ===============
 SCR_BeginLoadingPlaque
@@ -731,13 +735,15 @@ SCR_BeginLoadingPlaque
 */
 void SCR_BeginLoadingPlaque (qboolean startup)
 {
-       // save console log up to this point to log_file if it was set by configs
-       Log_Start();
-
-       Host_StartVideo();
+       scr_loading = true;
        SCR_UpdateLoadingScreen(false, startup);
 }
 
+void SCR_EndLoadingPlaque(void)
+{
+       scr_loading = false;
+}
+
 //=============================================================================
 
 const char *r_stat_name[r_stat_count] =
@@ -1483,7 +1489,7 @@ void SCR_ScreenShot_f(cmd_state_t *cmd)
                Con_Printf("Wrote %s\n", filename);
        else
        {
-               Con_Printf("Unable to write %s\n", filename);
+               Con_Errorf("Unable to write %s\n", filename);
                if(jpeg || png)
                {
                        if(SCR_ScreenShot (filename, buffer1, buffer2, 0, 0, vid.width, vid.height, false, false, false, false, false, true, scr_screenshot_alpha.integer != 0))
@@ -1814,6 +1820,11 @@ static void R_Envmap_f(cmd_state_t *cmd)
                return;
        }
 
+       if(cls.state != ca_connected) {
+               Con_Printf("envmap: No map loaded\n");
+               return;
+       }
+
        strlcpy (basename, Cmd_Argv(cmd, 1), sizeof (basename));
        size = atoi(Cmd_Argv(cmd, 2));
        if (size != 128 && size != 256 && size != 512 && size != 1024)
@@ -2061,6 +2072,25 @@ int r_stereo_side;
 extern cvar_t v_isometric;
 extern cvar_t v_isometric_verticalfov;
 
+typedef struct loadingscreenstack_s
+{
+       struct loadingscreenstack_s *prev;
+       char msg[MAX_QPATH];
+       float absolute_loading_amount_min; // this corresponds to relative completion 0 of this item
+       float absolute_loading_amount_len; // this corresponds to relative completion 1 of this item
+       float relative_completion; // 0 .. 1
+}
+loadingscreenstack_t;
+static loadingscreenstack_t *loadingscreenstack = NULL;
+static qboolean loadingscreendone = false;
+static qboolean loadingscreencleared = false;
+static float loadingscreenheight = 0;
+rtexture_t *loadingscreentexture = NULL;
+static float loadingscreentexture_vertex3f[12];
+static float loadingscreentexture_texcoord2f[8];
+static int loadingscreenpic_number = 0;
+
+static void SCR_DrawLoadingScreen(void);
 static void SCR_DrawScreen (void)
 {
        Draw_Frame();
@@ -2150,10 +2180,26 @@ static void SCR_DrawScreen (void)
                        CL_VM_UpdateView(r_stereo_side ? 0.0 : max(0.0, cl.time - cl.oldtime));
                else
                {
+                       // Prepare the scene mesh for rendering - this is lightning beams and other effects rendered as normal surfaces
+                       CL_MeshEntities_Scene_FinalizeRenderEntity();
+
                        CL_UpdateEntityShading();
                        R_RenderView(0, NULL, NULL, r_refdef.view.x, r_refdef.view.y, r_refdef.view.width, r_refdef.view.height);
                }
        }
+       else if (key_dest == key_game && key_consoleactive == 0 && (cls.state == ca_connected || cls.connect_trying))
+       {
+               // draw the loading screen for a while if we're still connecting and not forcing the console or menu to show up
+               char temp[64];
+               if (cls.signon > 0)
+                       SCR_PushLoadingScreen(va(temp, sizeof(temp), "Connect: Signon stage %i of %i", cls.signon, SIGNONS), 1.0);
+               else if (cls.connect_remainingtries > 0)
+                       SCR_PushLoadingScreen(va(temp, sizeof(temp), "Connect: Trying...  %i", cls.connect_remainingtries), 1.0);
+               else
+                       SCR_PushLoadingScreen(va(temp, sizeof(temp), "Connect: Waiting %i seconds for reply", 10 + cls.connect_remainingtries), 1.0);
+               SCR_DrawLoadingScreen();
+               SCR_PopLoadingScreen(false);
+       }
 
        // Don't apply debugging stuff like r_showsurfaces to the UI
        r_refdef.view.showdebug = false;
@@ -2202,8 +2248,13 @@ static void SCR_DrawScreen (void)
        }
 
        // draw 2D stuff
+
+       // Don't flicker when starting a local server.
+       if(scr_loading && !loadingscreenstack && ((!cls.signon && !sv.active) || (cls.signon == SIGNONS)))
+               SCR_EndLoadingPlaque();
+
        if(!scr_con_current && !(key_consoleactive & KEY_CONSOLEACTIVE_FORCED))
-               if ((key_dest == key_game || key_dest == key_message) && !r_letterbox.value)
+               if ((key_dest == key_game || key_dest == key_message) && !r_letterbox.value && !scr_loading)
                        Con_DrawNotify ();      // only draw notify in game
 
        if (cls.signon == SIGNONS)
@@ -2218,25 +2269,28 @@ static void SCR_DrawScreen (void)
        }
        SCR_DrawNetGraph ();
 #ifdef CONFIG_MENU
-       MR_Draw();
+       if(!scr_loading)
+               MR_Draw();
 #endif
        CL_DrawVideo();
        R_Shadow_EditLights_DrawSelectedLightProperties();
+       if(!scr_loading) {
+               SCR_DrawConsole();
 
-       SCR_DrawConsole();
-
-       SCR_DrawBrand();
-
-       SCR_DrawInfobar();
+               SCR_DrawBrand();
 
-       SCR_DrawTouchscreenOverlay();
+               SCR_DrawInfobar();
 
+               SCR_DrawTouchscreenOverlay();
+       }
        if (r_timereport_active)
                R_TimeReport("2d");
 
        R_TimeReport_EndFrame();
        R_TimeReport_BeginFrame();
-       Sbar_ShowFPS();
+       
+       if(!scr_loading)
+               Sbar_ShowFPS();
 
        DrawQ_Finish();
 
@@ -2244,24 +2298,6 @@ static void SCR_DrawScreen (void)
        R_RenderTarget_FreeUnused(false);
 }
 
-typedef struct loadingscreenstack_s
-{
-       struct loadingscreenstack_s *prev;
-       char msg[MAX_QPATH];
-       float absolute_loading_amount_min; // this corresponds to relative completion 0 of this item
-       float absolute_loading_amount_len; // this corresponds to relative completion 1 of this item
-       float relative_completion; // 0 .. 1
-}
-loadingscreenstack_t;
-static loadingscreenstack_t *loadingscreenstack = NULL;
-static qboolean loadingscreendone = false;
-static qboolean loadingscreencleared = false;
-static float loadingscreenheight = 0;
-rtexture_t *loadingscreentexture = NULL;
-static float loadingscreentexture_vertex3f[12];
-static float loadingscreentexture_texcoord2f[8];
-static int loadingscreenpic_number = 0;
-
 static void SCR_ClearLoadingScreenTexture(void)
 {
        if(loadingscreentexture)
@@ -2301,7 +2337,7 @@ void SCR_UpdateLoadingScreenIfShown(void)
                SCR_UpdateLoadingScreen(loadingscreencleared, false);
 }
 
-void SCR_PushLoadingScreen (qboolean redraw, const char *msg, float len_in_parent)
+void SCR_PushLoadingScreen (const char *msg, float len_in_parent)
 {
        loadingscreenstack_t *s = (loadingscreenstack_t *) Z_Malloc(sizeof(loadingscreenstack_t));
        s->prev = loadingscreenstack;
@@ -2323,7 +2359,6 @@ void SCR_PushLoadingScreen (qboolean redraw, const char *msg, float len_in_paren
                s->absolute_loading_amount_len = 1;
        }
 
-       if(redraw)
                SCR_UpdateLoadingScreenIfShown();
 }
 
@@ -2508,7 +2543,7 @@ static void SCR_DrawLoadingScreen_SharedSetup (qboolean clear)
        loadingscreenpic_texcoord2f[6] = 0;loadingscreenpic_texcoord2f[7] = 1;
 }
 
-static void SCR_DrawLoadingScreen (qboolean clear)
+static void SCR_DrawLoadingScreen (void)
 {
        // we only need to draw the image if it isn't already there
        GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -2529,13 +2564,6 @@ static void SCR_DrawLoadingScreen (qboolean clear)
        SCR_DrawLoadingStack();
 }
 
-static void SCR_DrawLoadingScreen_SharedFinish (qboolean clear)
-{
-       R_Mesh_Finish();
-       // refresh
-       VID_Finish();
-}
-
 static double loadingscreen_lastupdate;
 
 static void SCR_UpdateVars(void);
@@ -2558,10 +2586,7 @@ void SCR_UpdateLoadingScreen (qboolean clear, qboolean startup)
                loadingscreen_lastupdate = t;
        }
 
-       SCR_UpdateVars();
-
        // set up the r_texture_gammaramps texture which we need for rendering the loadingscreenpic
-       VID_UpdateGamma();
        R_UpdateVariables();
 
        if(!scr_loadingscreen_background.integer)
@@ -2599,22 +2624,25 @@ void SCR_UpdateLoadingScreen (qboolean clear, qboolean startup)
        SCR_DrawLoadingScreen_SharedSetup(clear);
        SCR_DrawLoadingScreen(clear);
 #else
-       qglDrawBuffer(GL_BACK);
        SCR_DrawLoadingScreen_SharedSetup(clear);
        if (vid.stereobuffer)
        {
                qglDrawBuffer(GL_BACK_LEFT);
-               SCR_DrawLoadingScreen(clear);
+               SCR_DrawLoadingScreen();
                qglDrawBuffer(GL_BACK_RIGHT);
-               SCR_DrawLoadingScreen(clear);
+               SCR_DrawLoadingScreen();
        }
        else
        {
                qglDrawBuffer(GL_BACK);
-               SCR_DrawLoadingScreen(clear);
+               SCR_DrawLoadingScreen();
        }
 #endif
-       SCR_DrawLoadingScreen_SharedFinish(clear);
+
+       DrawQ_Finish();
+       R_Mesh_Finish();
+       // refresh
+       VID_Finish();
 
        // this goes into the event loop, and should prevent unresponsive cursor on vista
        old_key_dest = key_dest;