]> git.mxchange.org Git - flightgear.git/commitdiff
Restore trRenderFrame (which used to be in main.cxx before the
authordavid <david>
Sat, 2 Oct 2004 22:35:39 +0000 (22:35 +0000)
committerdavid <david>
Sat, 2 Oct 2004 22:35:39 +0000 (22:35 +0000)
split).  If SimGear is configured --with-jpeg-factory, then FlightGear
will fail to build unless this function is present.

FIXME: this is very messy architecturally -- find a better solution,
like passing this explicitly as a callback to the libJPEG class
(SimGear should not have a dependency on FlightGear).

src/Main/renderer.cxx

index e03ae8d260312ddb08483f92e9f655ba02fc04d1..7f1e76474c8b8596281161b28c042f91663e3a28 100644 (file)
@@ -920,5 +920,125 @@ FGRenderer::resize( int width, int height ) {
 
 }
 
+// For HiRes screen Dumps using Brian Pauls TR Library
+void trRenderFrame( void ) {
+#ifdef FG_ENABLE_MULTIPASS_CLOUDS
+    bool multi_pass_clouds = fgGetBool("/sim/rendering/multi-pass-clouds") &&
+                            !SGCloudLayer::enable_bump_mapping; // ugly artefact now
+#else
+    bool multi_pass_clouds = false;
+#endif
+    bool draw_clouds = fgGetBool("/environment/clouds/status");
+
+    if ( fgPanelVisible() ) {
+        GLfloat height = fgGetInt("/sim/startup/ysize");
+        GLfloat view_h =
+            (globals->get_current_panel()->getViewHeight() - globals->get_current_panel()->getYOffset())
+            * (height / 768.0) + 1;
+        glTranslatef( 0.0, view_h, 0.0 );
+    }
+
+    static GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
+    static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
+
+    FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
+
+    glClearColor(l->adj_fog_color()[0], l->adj_fog_color()[1], 
+                 l->adj_fog_color()[2], l->adj_fog_color()[3]);
+
+    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+    // set the opengl state to known default values
+    default_state->force();
+
+    glEnable( GL_FOG );
+    glFogf  ( GL_FOG_DENSITY, fog_exp2_density);
+    glFogi  ( GL_FOG_MODE,    GL_EXP2 );
+    glFogfv ( GL_FOG_COLOR,   l->adj_fog_color() );
+
+    // GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
+    // we only update GL_AMBIENT for our lights we will never get
+    // a completely dark scene.  So, we set GL_LIGHT_MODEL_AMBIENT
+    // explicitely to black.
+    glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
+    glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE );
+
+    ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient() );
+
+    // texture parameters
+    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
+    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
+
+    // we need a white diffuse light for the phase of the moon
+    ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, white );
+    thesky->preDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
+                     fog_exp2_density );
+
+    // draw the ssg scene
+    // return to the desired diffuse color
+    ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
+    glEnable( GL_DEPTH_TEST );
+    ssgSetNearFar( scene_nearplane, scene_farplane );
+    if ( draw_clouds ) {
+        // Draw the terrain
+        FGTileMgr::set_tile_filter( true );
+        sgSetModelFilter( false );
+        globals->get_aircraft_model()->select( false );
+        ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+        // Disable depth buffer update, draw the clouds
+        glDepthMask( GL_FALSE );
+        thesky->drawUpperClouds();
+        if ( multi_pass_clouds ) {
+            thesky->drawLowerClouds();
+        }
+        glDepthMask( GL_TRUE );
+        if ( multi_pass_clouds ) {
+            // Draw the objects except the aircraft
+            //  and update the stencil buffer with 1
+            glEnable( GL_STENCIL_TEST );
+            glStencilFunc( GL_ALWAYS, 1, 1 );
+            glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE );
+        }
+        FGTileMgr::set_tile_filter( false );
+        sgSetModelFilter( true );
+        ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+    } else {
+        FGTileMgr::set_tile_filter( true );
+        sgSetModelFilter( true );
+        globals->get_aircraft_model()->select( false );
+        ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+    }
+
+    // draw the lights
+    glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
+    ssgSetNearFar( scene_nearplane, scene_farplane );
+    ssgCullAndDraw( globals->get_scenery()->get_vasi_lights_root() );
+    ssgCullAndDraw( globals->get_scenery()->get_rwy_lights_root() );
+
+    ssgCullAndDraw( globals->get_scenery()->get_gnd_lights_root() );
+
+    if ( draw_clouds ) {
+        if ( multi_pass_clouds ) {
+            // Disable depth buffer update, draw the clouds where the
+            //  objects overwrite the already drawn clouds, by testing
+            //  the stencil buffer against 1
+            glDepthMask( GL_FALSE );
+            glStencilFunc( GL_EQUAL, 1, 1 );
+            glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
+            thesky->drawUpperClouds();
+            thesky->drawLowerClouds();
+            glDepthMask( GL_TRUE );
+            glDisable( GL_STENCIL_TEST );
+        } else {
+            glDepthMask( GL_FALSE );
+            thesky->drawLowerClouds();
+            glDepthMask( GL_TRUE );
+        }
+    }
+
+    globals->get_aircraft_model()->select( true );
+    globals->get_model_mgr()->draw();
+    globals->get_aircraft_model()->draw();
+}
 
 // end of renderer.cxx