void R_AntialiasSetFBOSize(fbo_t *fbo) { if ( fbo->width != offscreenBounds.width || fbo->height != offscreenBounds.height) { R_ResizeFBO(offscreenBounds.width, offscreenBounds.height, 1, GL_RGBA8, fbo); } }
void OVR_FrameStart(int32_t changeBackBuffers) { if (vr_ovr_maxfov->modified) { int newValue = vr_ovr_maxfov->value ? 1 : 0; if (newValue != (int)vr_ovr_maxfov->value) Cvar_SetInteger("vr_ovr_maxfov",newValue); changeBackBuffers = 1; vr_ovr_maxfov->modified = (qboolean) false; } if (vr_ovr_supersample->modified) { if (vr_ovr_supersample->value < 1.0) Cvar_Set("vr_ovr_supersample", "1.0"); else if (vr_ovr_supersample->value > 2.0) Cvar_Set("vr_ovr_supersample", "2.0"); changeBackBuffers = 1; vr_ovr_supersample->modified = false; } if (useChroma != (qboolean) !!vr_chromatic->value) { useChroma = (qboolean) !!vr_chromatic->value; } if (vr_ovr_lumoverdrive->modified) { changeBackBuffers = 1; currentFrame = 0; vr_ovr_lumoverdrive->modified = false; } if (changeBackBuffers) { int i; float width, height; float ovrScale; OVR_CalculateState(¤tState); width = glConfig.render_width / (float) hmd->Resolution.w; height = glConfig.render_height / (float) hmd->Resolution.h; ovrScale = (width + height) / 2.0; ovrScale *= R_AntialiasGetScale() * vr_ovr_supersample->value; if (vr_ovr_debug->value) Com_Printf("VR_OVR: Set render target scale to %.2f\n",ovrScale); for (i = 0; i < 2; i++) { ovrRecti viewport = {{0,0}, {0,0}}; renderInfo[i].renderTarget = ovrHmd_GetFovTextureSize(hmd, (ovrEyeType) i, renderInfo[i].eyeFov, ovrScale); viewport.Size.w = renderInfo[i].renderTarget.w; viewport.Size.h = renderInfo[i].renderTarget.h; ovrHmd_GetRenderScaleAndOffset(renderInfo[i].eyeFov, renderInfo[i].renderTarget, viewport, (ovrVector2f*) renderInfo[i].UVScaleOffset); if (renderInfo[i].renderTarget.w != renderInfo[i].eyeFBO.width || renderInfo[i].renderTarget.h != renderInfo[i].eyeFBO.height) { if (vr_ovr_debug->value) Com_Printf("VR_OVR: Set buffer %i to size %i x %i\n",i,renderInfo[i].renderTarget.w, renderInfo[i].renderTarget.h); R_ResizeFBO(renderInfo[i].renderTarget.w, renderInfo[i].renderTarget.h, 1, GL_RGBA8, &renderInfo[i].eyeFBO); R_ClearFBO(&renderInfo[i].eyeFBO); } } } }
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); }