/* ================ R_RenderScene RI.refdef must be set before the first call ================ */ void R_RenderScene( const ref_params_t *fd ) { RI.refdef = *fd; if( !cl.worldmodel && RI.drawWorld ) Host_Error( "R_RenderScene: NULL worldmodel\n" ); R_PushDlights(); R_SetupFrame(); R_SetupFrustum(); R_SetupGL(); R_Clear( ~0 ); R_MarkLeaves(); R_CheckFog(); R_DrawWorld(); CL_ExtraUpdate (); // don't let sound get messed up if going slow R_DrawEntitiesOnList(); R_DrawWaterSurfaces(); R_EndGL(); }
/* ================ R_RenderView r_refdef must be set before the first call ================ */ void R_RenderView (void) { double time1 = 0.0; double time2; GLfloat colors[4] = {(GLfloat) 0.0, (GLfloat) 0.0, (GLfloat) 1, (GLfloat) 0.20}; if (r_norefresh.value) return; if (!r_worldentity.model || !cl.worldmodel) Sys_Error ("R_RenderView: NULL worldmodel"); if (r_speeds.value) { glFinish (); time1 = Sys_FloatTime (); c_brush_polys = 0; c_alias_polys = 0; } mirror = false; if (gl_finish.value) glFinish (); R_Clear (); // render normal view /***** Experimental silly looking fog ****** ****** Use r_fullbright if you enable ****** glFogi(GL_FOG_MODE, GL_LINEAR); glFogfv(GL_FOG_COLOR, colors); glFogf(GL_FOG_END, 512.0); glEnable(GL_FOG); ********************************************/ R_RenderScene (); R_DrawViewModel (); R_DrawWaterSurfaces (); // More fog right here :) // glDisable(GL_FOG); // End of all fog code... // render mirror view R_Mirror (); R_PolyBlend (); if (r_speeds.value) { // glFinish (); time2 = Sys_FloatTime (); Con_Printf ("%3i ms %4i wpoly %4i epoly\n", (int)((time2-time1)*1000), c_brush_polys, c_alias_polys); } }
/* =============== R_SetupView -- johnfitz -- this is the stuff that needs to be done once per frame, even in stereo mode =============== */ void R_SetupView (void) { Fog_SetupFrame (); //johnfitz // build the transformation matrix for the given view angles VectorCopy (r_refdef.vieworg, r_origin); AngleVectors (r_refdef.viewangles, vpn, vright, vup); // current viewleaf r_oldviewleaf = r_viewleaf; r_viewleaf = Mod_PointInLeaf (r_origin, cl.worldmodel); V_SetContentsColor (r_viewleaf->contents); V_CalcBlend (); r_cache_thrash = false; //johnfitz -- calculate r_fovx and r_fovy here r_fovx = r_refdef.fov_x; r_fovy = r_refdef.fov_y; if (r_waterwarp.value) { int contents = r_viewleaf->contents; if (contents == CONTENTS_WATER || contents == CONTENTS_SLIME || contents == CONTENTS_LAVA) { //variance is a percentage of width, where width = 2 * tan(fov / 2) otherwise the effect is too dramatic at high FOV and too subtle at low FOV. what a mess! r_fovx = atan(tan(DEG2RAD(r_refdef.fov_x) / 2) * (0.97 + sin(cl.time * 1.5) * 0.03)) * 2 / M_PI_DIV_180; r_fovy = atan(tan(DEG2RAD(r_refdef.fov_y) / 2) * (1.03 - sin(cl.time * 1.5) * 0.03)) * 2 / M_PI_DIV_180; } } //johnfitz R_SetFrustum (r_fovx, r_fovy); //johnfitz -- use r_fov* vars R_MarkSurfaces (); //johnfitz -- create texture chains from PVS R_CullSurfaces (); //johnfitz -- do after R_SetFrustum and R_MarkSurfaces R_UpdateWarpTextures (); //johnfitz -- do this before R_Clear R_Clear (); //johnfitz -- cheat-protect some draw modes r_drawflat_cheatsafe = r_fullbright_cheatsafe = r_lightmap_cheatsafe = false; r_drawworld_cheatsafe = true; if (cl.maxclients == 1) { if (!r_drawworld.value) r_drawworld_cheatsafe = false; if (r_drawflat.value) r_drawflat_cheatsafe = true; else if (r_fullbright.value || !cl.worldmodel->lightdata) r_fullbright_cheatsafe = true; else if (r_lightmap.value) r_lightmap_cheatsafe = true; } //johnfitz }
void mdlviewer_display( StudioModel &tempmodel ) { R_Clear( ); tempmodel.SetBlending( 0, 0.0 ); tempmodel.SetBlending( 1, 0.0 ); float curr = glutGet(GLUT_ELAPSED_TIME)/1000.0;//GetTickCount( ) / 1000.0; tempmodel.AdvanceFrame( curr - tempmodel.GetPrev() ); tempmodel.SetPrev( curr ); glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_TEXTURE_BIT ); tempmodel.DrawModel(); glPopAttrib(); }
/* * @brief */ void R_BeginFrame(void) { // draw buffer stuff if (r_draw_buffer->modified) { if (!strcasecmp(r_draw_buffer->string, "GL_FRONT")) glDrawBuffer(GL_FRONT); else glDrawBuffer(GL_BACK); r_draw_buffer->modified = false; } // render mode stuff if (r_render_mode->modified) { R_RenderMode(r_render_mode->string); r_render_mode->modified = false; } R_Clear(); }
/* * @brief */ void R_BeginFrame(void) { // draw buffer stuff if (r_draw_buffer->modified) { if (!g_ascii_strcasecmp(r_draw_buffer->string, "GL_FRONT")) glDrawBuffer(GL_FRONT); else glDrawBuffer(GL_BACK); r_draw_buffer->modified = false; } // render plugin stuff if (r_render_plugin->modified) { R_RenderPlugin(r_render_plugin->string); r_render_plugin->modified = false; } R_Clear(); }
/* ================ R_RenderView r_refdef must be set before the first call ================ */ void R_RenderView (void) { double time1 = 0, time2; if (r_norefresh.value) return; if (!r_worldentity.model || !cl.worldmodel) Sys_Error ("R_RenderView: NULL worldmodel"); if (r_speeds.value) { glFinish (); time1 = Sys_DoubleTime (); c_brush_polys = 0; c_alias_polys = 0; } mirror = false; if (gl_finish.value) glFinish (); R_Clear (); // render normal view R_RenderScene (); R_DrawViewModel (); R_DrawWaterSurfaces (); // render mirror view // R_Mirror (); R_PolyBlend (); if (r_speeds.value) { // glFinish (); time2 = Sys_DoubleTime (); Con_Printf ("%3i ms %4i wpoly %4i epoly\n", (int)((time2-time1)*1000), c_brush_polys, c_alias_polys); } }
void OVR_Present(qboolean loading) { int fade = vr_ovr_distortion_fade->value != 0.0f; float desaturate = 0.0; if (positionTracked && trackingState.StatusFlags & ovrStatus_PositionConnected && vr_ovr_trackingloss->value > 0) { if (hasPositionLock) { float yawDiff = (fabsf(cameraYaw) - 105.0f) * 0.04; float xBound,yBound,zBound; vec_t temp[4][4], fin[4][4]; int i = 0; vec3_t euler; vec4_t pos = {0.0,0.0,0.0,1.0}; vec4_t out = {0,0,0,0}; ovrPosef camera, head; vec4_t quat; camera = trackingState.CameraPose; head = trackingState.HeadPose.ThePose; pos[0] = -(head.Position.x - camera.Position.x); pos[1] = head.Position.y - camera.Position.y; pos[2] = -(head.Position.z - camera.Position.z); VR_OVR_QuatToEuler(camera.Orientation,euler); EulerToQuat(euler,quat); QuatToRotation(quat,temp); MatrixMultiply (cameraFrustum,temp,fin); for (i=0; i<4; i++) { out[i] = fin[i][0]*pos[0] + fin[i][1]*pos[1] + fin[i][2]*pos[2] + fin[i][3]*pos[3]; } xBound = (fabsf(out[0]) - 0.6f) * 6.25f; yBound = (fabsf(out[1]) - 0.45f) * 6.25f; zBound = (fabsf(out[2] - 0.5f) - 0.5f) * 10.0f; yawDiff = clamp(yawDiff,0.0,1.0); xBound = clamp(xBound,0.0,1.0); yBound = clamp(yBound,0.0,1.0); zBound = clamp(zBound,0.0,1.0); desaturate = max(max(max(xBound,yBound),zBound),yawDiff); } else { desaturate = 1.0; } } GL_ClearColor(0.0, 0.0, 0.0, 1.0); R_Clear(); GL_SetDefaultClearColor(); { int i = 0; r_ovr_shader_t *currentShader; qboolean warp =(qboolean) (!loading && withinFrame && vr_ovr_timewarp->value); if (warp) { currentShader = &ovr_timewarp_shaders[useChroma]; ovr_WaitTillTime(frameTime.TimewarpPointSeconds); } else { currentShader = &ovr_distortion_shaders[useChroma]; } glDisableClientState (GL_COLOR_ARRAY); glDisableClientState (GL_TEXTURE_COORD_ARRAY); glDisableClientState (GL_VERTEX_ARRAY); glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); glEnableVertexAttribArray (2); glEnableVertexAttribArray (3); glEnableVertexAttribArray (4); glUseProgram(currentShader->shader->program); if (hmd->Type >= ovrHmd_DK2 && vr_ovr_lumoverdrive->value) { int lastFrame = (currentFrame ? 0 : 1); static float overdriveScaleRegularRise = 0.1f; static float overdriveScaleRegularFall = 0.05f; // falling issues are hardly visible GL_MBind(1,offscreen[lastFrame].texture); glUniform2f(currentShader->uniform.OverdriveScales,overdriveScaleRegularRise, overdriveScaleRegularFall); } else { glUniform2f(currentShader->uniform.OverdriveScales,0,0); } glUniform2f(currentShader->uniform.InverseResolution,1.0/glState.currentFBO->width,1.0/glState.currentFBO->height); glUniform1i(currentShader->uniform.VignetteFade,fade); glUniform1f(currentShader->uniform.Desaturate, desaturate); for (i = 0; i < 2; i++) { // hook for rendering in different order int eye = i; GL_MBind(0,renderInfo[eye].eyeFBO.texture); R_BindIVBO(&renderInfo[eye].eye,distortion_attribs,5); glUniform2f(currentShader->uniform.EyeToSourceUVScale, renderInfo[eye].UVScaleOffset[0].x, renderInfo[eye].UVScaleOffset[0].y); glUniform2f(currentShader->uniform.EyeToSourceUVOffset, renderInfo[eye].UVScaleOffset[1].x, renderInfo[eye].UVScaleOffset[1].y); if (warp) { ovrPosef framePose = trackingState.HeadPose.ThePose; ovrMatrix4f timeWarpMatrices[2]; ovrHmd_GetEyeTimewarpMatrices(hmd, (ovrEyeType)eye, framePose, timeWarpMatrices); glUniformMatrix4fv(currentShader->uniform.EyeRotationStart,1,GL_TRUE,(GLfloat *) timeWarpMatrices[0].M); glUniformMatrix4fv(currentShader->uniform.EyeRotationEnd,1,GL_TRUE,(GLfloat *) timeWarpMatrices[1].M); } R_DrawIVBO(&renderInfo[eye].eye); R_ReleaseIVBO(); } if (vr_ovr_lumoverdrive->value) { GL_MBind(1,0); currentFrame = (currentFrame ? 0 : 1); } GL_MBind(0,0); glUseProgram(0); glDisableVertexAttribArray (0); glDisableVertexAttribArray (1); glDisableVertexAttribArray (2); glDisableVertexAttribArray (3); glDisableVertexAttribArray (4); glEnableClientState (GL_COLOR_ARRAY); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glEnableClientState (GL_VERTEX_ARRAY); // glTexCoordPointer (2, GL_FLOAT, sizeof(texCoordArray[0][0]), texCoordArray[0][0]); // glVertexPointer (3, GL_FLOAT, sizeof(vertexArray[0]), vertexArray[0]); } }
void R_VR_StartFrame() { qboolean resolutionChanged = 0; qboolean hudChanged = 0; extern int32_t scr_draw_loading; if (!hmd || !hmd->frameStart || !hmd->getState) return; R_AntialiasSetFBOSize(vrState.offscreen); if (vrState.offscreen->width != screen.width || vrState.offscreen->height != screen.height) { screen.height = vrState.offscreen->height; screen.width = vrState.offscreen->width; resolutionChanged = true; } hmd->frameStart(resolutionChanged); hmd->getState(&vrState); if (vr_hud_width->modified || vr_hud_height->modified) { int width, height; width = vr_hud_width->value; height = vr_hud_height->value; if (width < 640) width = 640; if (height < 480) height = 480; Cvar_SetInteger("vr_hud_width",width); Cvar_SetInteger("vr_hud_height",height); vr_hud_width->modified = false; vr_hud_height->modified = false; Com_Printf("VR: New HUD resolution %ix%i\n",width,height); if (hud.width != width || hud.height != height) R_ResizeFBO(width,height,1,GL_RGBA8,&hud); } if (vr_hud_segments->modified) { // clamp value from 30-90 degrees if (vr_hud_segments->value < 0) Cvar_SetInteger("vr_hud_segments", 1); else if (vr_hud_segments->value > MAX_SEGMENTS) Cvar_SetValue("vr_hud_segments", MAX_SEGMENTS); vr_hud_segments->modified = false; hudChanged = true; } if (vr_hud_depth->modified) { if (vr_hud_depth->value < 0.25f) Cvar_SetValue("vr_hud_depth", 0.25); else if (vr_hud_depth->value > 250) Cvar_SetValue("vr_hud_depth", 250); vr_hud_depth->modified = false; hudChanged = true; } if (vr_hud_fov->modified) { // clamp value from 30-90 degrees if (vr_hud_fov->value < 30) Cvar_SetValue("vr_hud_fov", 30.0f); else if (vr_hud_fov->value > vrState.viewFovY * 2.0) Cvar_SetValue("vr_hud_fov", vrState.viewFovY * 2.0); vr_hud_fov->modified = false; hudChanged = true; } if (hudChanged) R_VR_GenerateHud(); if (resolutionChanged) { Com_Printf("VR: Calculated %.2f FOV\n", vrState.viewFovY); } GL_ClearColor(0.0, 0.0, 0.0, 0.0); R_BindFBO(vrState.eyeFBO[0]); R_Clear(); R_BindFBO(vrState.eyeFBO[1]); R_Clear(); R_BindFBO(&hud); R_Clear(); R_BindFBO(&screenFBO); GL_SetDefaultClearColor(); hudStale = 1; loadingScreen = (qboolean) (scr_draw_loading > 0 ? 1 : 0); }
/** * @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(); }