/***** DISPLAY FUNCTION *****/ void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glShadeModel(GL_SMOOTH); glLoadIdentity(); if (animate) { animateRide(); } /* camera view */ gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); /* Camera Speed - extra credit - realistic in terms of gravity u_new = u_current + (delta(t)) * sq(2g(h_max - h))/||dp/du|| h_max = max height anywhere on the rollercoaster + a tiny bit h = current height p = position. | dp/du | = length of position kinetic energy + potential energy = constant */ renderSky(); renderGround(); renderSpline(); /* needed for double buffering*/ glutSwapBuffers(); }
void LensFlareSunDemo::render() { camera.applyCamera(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); renderSky(); glutSwapBuffers(); }
// renderStage0 - Render distant land at beginning of scene 0, after sky void DistantLand::renderStage0() { DECLARE_MWBRIDGE IDirect3DStateBlock9 *stateSaved; UINT passes; // Get Morrowind camera matrices device->GetTransform(D3DTS_VIEW, &mwView); device->GetTransform(D3DTS_PROJECTION, &mwProj); // Set variables derived from current camera configuration setView(&mwView); adjustFog(); setupCommonEffect(&mwView, &mwProj); // Select distant static set selectDistantCell(); isRenderCached &= (Configuration.MGEFlags & USE_MENU_CACHING) && mwBridge->IsMenu(); if(!isRenderCached) { ///LOG::logline("Sky prims: %d", recordSky.size()); if(isDistantCell()) { // Save state block manually since we can change FVF/decl device->CreateStateBlock(D3DSBT_ALL, &stateSaved); effect->BeginPass(PASS_SETUP); effect->EndPass(); // Shadow map early render if(Configuration.MGEFlags & USE_SHADOWS) { if(mwBridge->CellHasWeather() && !mwBridge->IsMenu()) { effectShadow->Begin(&passes, D3DXFX_DONOTSAVESTATE); renderShadowMap(); effectShadow->End(); } } // Distant everything; bias the projection matrix such that // distant land gets drawn behind anything Morrowind would draw D3DXMATRIX distProj = mwProj; distProj._33 += kDistantZBias; effect->SetMatrix(ehProj, &distProj); effect->Begin(&passes, D3DXFX_DONOTSAVESTATE); if(!mwBridge->IsUnderwater(eyePos.z)) { // Draw distant landscape if(mwBridge->IsExterior()) { effect->BeginPass(PASS_RENDERLAND); renderDistantLand(effect, &mwView, &distProj); effect->EndPass(); } // Draw distant statics, with alpha dissolve as they pass the near view boundary DWORD p = mwBridge->CellHasWeather() ? PASS_RENDERSTATICSEXTERIOR : PASS_RENDERSTATICSINTERIOR; effect->SetFloat(ehDissolveRange, 7168.0); effect->BeginPass(p); cullDistantStatics(&mwView, &distProj); renderDistantStatics(); effect->EndPass(); } // Sky scattering and sky objects (should be drawn late as possible) if((Configuration.MGEFlags & USE_ATM_SCATTER) && mwBridge->CellHasWeather()) { effect->BeginPass(PASS_RENDERSKY); renderSky(); effect->EndPass(); } // Update reflection if(mwBridge->CellHasWater()) renderWaterReflection(&mwView, &distProj); // Update water simulation if(Configuration.MGEFlags & DYNAMIC_RIPPLES) simulateDynamicWaves(); effect->End(); // Reset matrices effect->SetMatrix(ehView, &mwView); effect->SetMatrix(ehProj, &mwProj); // Save distant land only frame to texture if(~Configuration.MGEFlags & NO_MW_MGE_BLEND) texDistantBlend = PostShaders::borrowBuffer(1); // Restore render state stateSaved->Apply(); stateSaved->Release(); } else { // Clear water reflection to avoid seeing previous cell environment reflected // Must be done every frame to react to lighting changes clearReflection(); // Update water simulation if(Configuration.MGEFlags & DYNAMIC_RIPPLES) { // Save state block manually since we can change FVF/decl device->CreateStateBlock(D3DSBT_ALL, &stateSaved); effect->Begin(&passes, D3DXFX_DONOTSAVESTATE); simulateDynamicWaves(); effect->End(); // Restore render state stateSaved->Apply(); stateSaved->Release(); } } } // Clear stray recordings recordMW.clear(); recordSky.clear(); }