Reverse the declaration order. jpgRenderFrame (form
erly known as trRenderFrame) is now declared as a NULL function pointer and ass ignment of the proper function is now done in FlightGear (jpgRenderFrame=FGRend erer::update).
This commit is contained in:
parent
57971cbd9b
commit
59348bbeb9
2 changed files with 19 additions and 139 deletions
|
@ -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
|
||||
|
|
|
@ -18,8 +18,8 @@ extern bool glPointParameterIsSupported;
|
|||
class FGRenderer {
|
||||
|
||||
public:
|
||||
FGRenderer() {}
|
||||
~FGRenderer() {}
|
||||
FGRenderer();
|
||||
~FGRenderer();
|
||||
|
||||
void init();
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue