/* Called once per frame before drawing anything else */ void Sky_Draw(void) { int i; // In these special render modes, the sky faces are handled in the normal world/brush renderer if (r_drawflat_cheatsafe || r_lightmap_cheatsafe || !cv_video_drawsky.bValue) return; // Reset sky bounds. for(i = 0; i < 6; i++) { skymins[0][i] = skymins[1][i] = 9999; skymaxs[0][i] = skymaxs[1][i] = -9999; } // Process world and bmodels: draw flat-shaded sky surfs, and update skybounds Fog_DisableGFog(); VideoLayer_Disable(VIDEO_TEXTURE_2D); if(Fog_GetDensity() > 0) glColor3fv(Fog_GetColor()); else glColor3fv(skyflatcolor); Sky_ProcessTextureChains(); Sky_ProcessEntities(); glColor3f(1.0f,1.0f,1.0f); VideoLayer_Enable(VIDEO_TEXTURE_2D); // Render slow sky: cloud layers or skybox if(!r_fastsky.value && !(Fog_GetDensity() > 0 && r_skyfog.value >= 1)) { VideoLayer_Disable(VIDEO_DEPTH_TEST); // By default we use a skybox. if(cSkyBoxName[0]) Sky_DrawSkyBox(); if(cv_video_drawclouds.value && gCloudTexture) { // Draw the scrolling clouds... for(i = 0; i < 6; i++) if(skymins[0][i] < skymaxs[0][i] && skymins[1][i] < skymaxs[1][i]) Sky_DrawFace(i); } VideoLayer_Enable(VIDEO_DEPTH_TEST); } Fog_EnableGFog(); // 3D skybox support. if (cl.worldmodel && (cl.worldmodel->flags & MODEL_FLAG_3DSKY)) Sky_Draw3DWorld(); }
/* ============= Fog_StartAdditive called before drawing stuff that is additive blended -- sets fog color to black ============= */ void Fog_StartAdditive (void) { vec3_t color = {0,0,0}; if (Fog_GetDensity() > 0) glFogfv(GL_FOG_COLOR, color); }
void R_RenderModelSurfsSky (r_modelsurf_t **mslist, int numms) { Fog_DisableGFog (); if (skybox_name[0]) { // we have working skybox cubemap code now Sky_DrawCubeMap (mslist, numms); } // else if (gl_support_shader_objects) // { // R_RenderModelSurfsSkyPass (mslist, numms, SKY_GLSL); // goto glsl_sky; // } else R_RenderModelSurfsSkyPass (mslist, numms, SKY_DEPTHCLIP); // same pass for all sky fog just using the base verts if (Fog_GetDensity () > 0 && r_skyfog.value > 0) R_RenderModelSurfsSkyPass (mslist, numms, SKY_FOG_LAYER); //glsl_sky:; if (r_showtris.value) R_RenderModelSurfsSkyPass (mslist, numms, SKY_SHOWTRIS); Fog_EnableGFog (); }
void Sky_DrawSkyBox (void) { int i; for(i = 0; i < 6; i++) { if (skymins[0][i] >= skymaxs[0][i] || skymins[1][i] >= skymaxs[1][i]) continue; Video_SetTexture(gSkyBoxTexture[skytexorder[i]]); #if 1 //FIXME: this is to avoid tjunctions until i can do it the right way skymins[0][i] = -1; skymins[1][i] = -1; skymaxs[0][i] = 1; skymaxs[1][i] = 1; #endif glBegin(GL_QUADS); Sky_EmitSkyBoxVertex (skymins[0][i], skymins[1][i], i); Sky_EmitSkyBoxVertex (skymins[0][i], skymaxs[1][i], i); Sky_EmitSkyBoxVertex (skymaxs[0][i], skymaxs[1][i], i); Sky_EmitSkyBoxVertex (skymaxs[0][i], skymins[1][i], i); glEnd(); rs_skypolys++; rs_skypasses++; if (Fog_GetDensity() > 0 && r_skyfog.value > 0) { float *c; c = Fog_GetColor(); VideoLayer_Enable(VIDEO_BLEND); VideoLayer_Disable(VIDEO_TEXTURE_2D); glColor4f(c[0], c[1], c[2], Math_Clamp(0, r_skyfog.value, 1.0f)); glBegin(GL_QUADS); Sky_EmitSkyBoxVertex (skymins[0][i], skymins[1][i], i); Sky_EmitSkyBoxVertex (skymins[0][i], skymaxs[1][i], i); Sky_EmitSkyBoxVertex (skymaxs[0][i], skymaxs[1][i], i); Sky_EmitSkyBoxVertex (skymaxs[0][i], skymins[1][i], i); glEnd(); glColor3f(1.0f,1.0f,1.0f); VideoLayer_Enable(VIDEO_TEXTURE_2D); VideoLayer_Disable(VIDEO_BLEND); rs_skypasses++; } } }
void Sky_DrawFaceQuad(glpoly_t *p) { float s,t, *v; int i; glColor3f(1.0f,1.0f,1.0f); Video_SetTexture(gCloudTexture); VideoLayer_Enable(VIDEO_BLEND); VideoLayer_BlendFunc(VIDEO_BLEND_ONE, VIDEO_BLEND_ONE); glBegin(GL_QUADS); for (i = 0, v = p->verts[0]; i < 4; i++, v += VERTEXSIZE) { Sky_GetTexCoord(v,cv_sky_scrollspeed.value,&s,&t); glTexCoord2f(s,t); glVertex3fv(v); } glEnd(); VideoLayer_BlendFunc(VIDEO_BLEND_DEFAULT); rs_skypolys++; rs_skypasses++; if(Fog_GetDensity() > 0 && r_skyfog.value > 0) { float *c = Fog_GetColor(); VideoLayer_Disable(VIDEO_TEXTURE_2D); glColor4f(c[0], c[1], c[2], Math_Clamp(0.0, r_skyfog.value, 1.0)); glBegin(GL_QUADS); for(i = 0,v = p->verts[0]; i < 4; i++,v += VERTEXSIZE) glVertex3fv(v); glEnd(); glColor3f(1.0f,1.0f,1.0f); VideoLayer_Enable(VIDEO_TEXTURE_2D); rs_skypasses++; } VideoLayer_Disable(VIDEO_BLEND); }
/* ============= Fog_StopAdditive called after drawing stuff that is additive blended -- restores fog color ============= */ void Fog_StopAdditive (void) { if (Fog_GetDensity() > 0) glFogfv(GL_FOG_COLOR, Fog_GetColor()); }
/* ============= Fog_DisableGFog called after drawing stuff that should be fogged ============= */ void Fog_DisableGFog (void) { if (Fog_GetDensity() > 0) glDisable(GL_FOG); }
/* ============= Fog_EnableGFog called before drawing stuff that should be fogged ============= */ void Fog_EnableGFog (void) { if (Fog_GetDensity() > 0) glEnable(GL_FOG); }
/* ============= Fog_SetupFrame called at the beginning of each frame ============= */ void Fog_SetupFrame (void) { glFogfv(GL_FOG_COLOR, Fog_GetColor()); glFogf(GL_FOG_DENSITY, Fog_GetDensity() / 64.0); }