diff --git a/src/Main/renderer.cxx b/src/Main/renderer.cxx index fa780f36c..22dca5d6a 100644 --- a/src/Main/renderer.cxx +++ b/src/Main/renderer.cxx @@ -45,6 +45,9 @@ #include <simgear/math/sg_random.h> #include <simgear/scene/model/modellib.hxx> #include <simgear/scene/model/model.hxx> +#ifdef FG_JPEG_SERVER +#include <simgear/screen/jpgfactory.hxx> +#endif #ifdef FG_USE_CLOUDS_3D # include <simgear/scene/sky/clouds3d/SkySceneLoader.hpp> @@ -121,6 +124,20 @@ ssgSimpleState *default_state; ssgSimpleState *hud_and_panel; ssgSimpleState *menus; +FGRenderer::FGRenderer() +{ +#ifdef FG_JPEG_SERVER + jpgRenderFrame = FGRenderer::update; +#endif +} + +FGRenderer::~FGRenderer() +{ +#ifdef FG_JPEG_SERVER + jpgRenderFrame = NULL; +#endif +} + void FGRenderer::build_states( void ) { @@ -792,141 +809,4 @@ FGRenderer::resize( int width, int height ) { } -// For HiRes screen Dumps using Brian Pauls TR Library -// -// Curt writes: Unfortunately, if the jpeg image server code is -// compiled into simgear and flightgear, this function get's called -// from simgear which is not the direction we want our dependencies to -// go, but it's the way things are right now. -// -// If I had to guess, I would speculate that this code probably -// doesn't work, at least not 100% correctly, but I don't have time -// right now to sort this one out. Also the jpeg server was very -// experimental and was extremely limited in the resolution images it -// could serve out for some never debugged reason. It's a novel -// feature, but I wouldn't be entirely opposed to seeing it go away -// unless someone wants to fix it so it works right and robustly and -// can serve full resolution images without crashing ourselves. - -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 diff --git a/src/Main/renderer.hxx b/src/Main/renderer.hxx index 62f3f2053..b19ae79eb 100644 --- a/src/Main/renderer.hxx +++ b/src/Main/renderer.hxx @@ -18,8 +18,8 @@ extern bool glPointParameterIsSupported; class FGRenderer { public: - FGRenderer() {} - ~FGRenderer() {} + FGRenderer(); + ~FGRenderer(); void init();