/* * @brief This is called every frame, and can also be called explicitly to flush * text to the screen. */ void Cl_UpdateScreen(void) { R_BeginFrame(); if (cls.state == CL_ACTIVE && !cls.loading) { Cl_UpdateView(); R_Setup3D(); R_DrawView(); R_Setup2D(); if (cls.key_state.dest != KEY_CONSOLE && cls.key_state.dest != KEY_UI) { Cl_DrawNetGraph(); Cl_DrawCounters(); Cl_DrawNotify(); Cl_DrawRendererStats(); Cl_DrawSoundStats(); cls.cgame->DrawFrame(&cl.frame); } } else { R_Setup2D(); } Cl_DrawConsole(); R_Draw2D(); // draw all 2D geometry for the frame Ui_Draw(); Cl_DrawCursor(); R_EndFrame(); }
/** * @sa R_BeginFrame * @sa R_EndFrame */ void R_RenderFrame (void) { R_Setup3D(); /* activate wire mode */ if (r_wire->integer) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if (!(refdef.rendererFlags & RDF_NOWORLDMODEL)) { int tile; if (r_threads->integer) { while (r_threadstate.state != THREAD_RENDERER) Sys_Sleep(0); r_threadstate.state = THREAD_CLIENT; } else { R_SetupFrustum(); /* draw brushes on current worldlevel */ R_GetLevelSurfaceLists(); } R_UpdateSustainedLights(); R_CheckError(); for (tile = 0; tile < r_numMapTiles; tile++) { const model_t *mapTile = r_mapTiles[tile]; const mBspModel_t *bsp = &mapTile->bsp; R_AddBspRRef(bsp, vec3_origin, vec3_origin, false); } R_GetEntityLists(); R_EnableFog(true); R_RenderOpaqueBspRRefs(); R_RenderOpaqueWarpBspRRefs(); R_DrawOpaqueMeshEntities(r_opaque_mesh_entities); R_RenderAlphaTestBspRRefs(); R_EnableBlend(true); R_RenderMaterialBspRRefs(); R_EnableFog(false); R_RenderBlendBspRRefs(); R_RenderBlendWarpBspRRefs(); R_DrawBlendMeshEntities(r_blend_mesh_entities); R_EnableFog(true); R_RenderFlareBspRRefs(); R_EnableFog(false); if (r_debug_lights->integer) { int i; for (i = 0; i < refdef.numStaticLights; i++) { const light_t *l = &refdef.staticLights[i]; R_AddCorona(l->origin, l->radius, l->color); } for (i = 0; i < refdef.numDynamicLights; i++) { const light_t *l = &refdef.dynamicLights[i]; R_AddCorona(l->origin, l->radius, l->color); } } R_DrawCoronas(); R_EnableBlend(false); for (tile = 0; tile < r_numMapTiles; tile++) { R_DrawBspNormals(tile); } R_Color(NULL); R_DrawSpecialEntities(r_special_entities); R_DrawNullEntities(r_null_entities); R_DrawEntityEffects(); } else { glClear(GL_DEPTH_BUFFER_BIT); R_GetEntityLists(); R_RenderOpaqueBspRRefs(); R_RenderOpaqueWarpBspRRefs(); R_DrawOpaqueMeshEntities(r_opaque_mesh_entities); R_RenderAlphaTestBspRRefs(); R_EnableBlend(true); R_RenderMaterialBspRRefs(); R_RenderBlendBspRRefs(); R_RenderBlendWarpBspRRefs(); R_DrawBlendMeshEntities(r_blend_mesh_entities); R_RenderFlareBspRRefs(); R_EnableBlend(false); R_Color(NULL); R_DrawSpecialEntities(r_special_entities); R_DrawNullEntities(r_null_entities); R_DrawEntityEffects(); } R_EnableBlend(true); R_DrawParticles(); R_EnableBlend(false); /* leave wire mode again */ if (r_wire->integer) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); R_DrawBloom(); R_DrawBoundingBoxes(); R_ResetArrayState(); /* go back into 2D mode for hud and the like */ R_Setup2D(); R_CheckError(); }
/** * @sa R_RenderFrame * @sa R_EndFrame */ void R_BeginFrame (void) { r_locals.frame++; /* avoid overflows, negatives and zero are reserved */ if (r_locals.frame > 0xffff) r_locals.frame = 1; if (Com_IsRenderModified()) { Com_Printf("Modified render related cvars\n"); if (Cvar_PendingCvars(CVAR_R_PROGRAMS)) R_RestartPrograms_f(); /* prevent reloading of some rendering cvars */ Cvar_ClearVars(CVAR_R_MASK); Com_SetRenderModified(false); } if (r_anisotropic->modified) { if (r_anisotropic->integer > r_config.maxAnisotropic) { Com_Printf("...max GL_EXT_texture_filter_anisotropic value is %i\n", r_config.maxAnisotropic); Cvar_SetValue("r_anisotropic", r_config.maxAnisotropic); } /*R_UpdateAnisotropy();*/ r_anisotropic->modified = false; } /* draw buffer stuff */ if (r_drawbuffer->modified) { r_drawbuffer->modified = false; if (Q_strcasecmp(r_drawbuffer->string, "GL_FRONT") == 0) glDrawBuffer(GL_FRONT); else glDrawBuffer(GL_BACK); R_CheckError(); } /* texturemode stuff */ /* Realtime set level of anisotropy filtering and change texture lod bias */ if (r_texturemode->modified) { R_TextureMode(r_texturemode->string); r_texturemode->modified = false; } if (r_texturealphamode->modified) { R_TextureAlphaMode(r_texturealphamode->string); r_texturealphamode->modified = false; } if (r_texturesolidmode->modified) { R_TextureSolidMode(r_texturesolidmode->string); r_texturesolidmode->modified = false; } /* threads */ if (r_threads->modified) { if (r_threads->integer) R_InitThreads(); else R_ShutdownThreads(); r_threads->modified = false; } R_Setup2D(); /* clear screen if desired */ R_Clear(); }