#include <GUI/new_gui.hxx>
#include <Instrumentation/HUD/HUD.hxx>
#include <Environment/precipitation_mgr.hxx>
+#include <Environment/environment_mgr.hxx>
#include "splash.hxx"
#include "renderer.hxx"
bool FGScenerySwitchCallback::scenery_enabled = false;
-// Sky structures
-SGSky *thesky;
-
static osg::ref_ptr<osg::FrameStamp> mFrameStamp = new osg::FrameStamp;
static osg::ref_ptr<SGUpdateVisitor> mUpdateVisitor= new SGUpdateVisitor;
}
#endif
-FGRenderer::FGRenderer()
+FGRenderer::FGRenderer() :
+ _sky(NULL)
{
#ifdef FG_JPEG_SERVER
jpgRenderFrame = updateRenderer;
#ifdef FG_JPEG_SERVER
jpgRenderFrame = NULL;
#endif
+ delete _sky;
}
// Initialize various GL/view parameters
// critical parts of the scene graph in addition to the splash screen.
void
FGRenderer::splashinit( void ) {
- osgViewer::Viewer* viewer = globals->get_renderer()->getViewer();
+ osgViewer::Viewer* viewer = getViewer();
mRealRoot = dynamic_cast<osg::Group*>(viewer->getSceneData());
mRealRoot->addChild(fgCreateSplashNode());
mFrameStamp = viewer->getFrameStamp();
SGConfigureDirectionalLights( use_point_sprites, enhanced_lighting,
distance_attenuation );
+
+ if (const char* tc = fgGetString("/sim/rendering/texture-compression", NULL)) {
+ if (strcmp(tc, "false") == 0 || strcmp(tc, "off") == 0 ||
+ strcmp(tc, "0") == 0 || strcmp(tc, "no") == 0 ||
+ strcmp(tc, "none") == 0) {
+ SGSceneFeatures::instance()->setTextureCompression(SGSceneFeatures::DoNotUseCompression);
+ } else if (strcmp(tc, "arb") == 0) {
+ SGSceneFeatures::instance()->setTextureCompression(SGSceneFeatures::UseARBCompression);
+ } else if (strcmp(tc, "dxt1") == 0) {
+ SGSceneFeatures::instance()->setTextureCompression(SGSceneFeatures::UseDXT1Compression);
+ } else if (strcmp(tc, "dxt3") == 0) {
+ SGSceneFeatures::instance()->setTextureCompression(SGSceneFeatures::UseDXT3Compression);
+ } else if (strcmp(tc, "dxt5") == 0) {
+ SGSceneFeatures::instance()->setTextureCompression(SGSceneFeatures::UseDXT5Compression);
+ } else {
+ SG_LOG(SG_VIEW, SG_WARN, "Unknown texture compression setting!");
+ }
+ }
+
+// create sky, but can't build until setupView, since we depend
+// on other subsystems to be inited, eg Ephemeris
+ _sky = new SGSky;
+
+ SGPath texture_path(globals->get_fg_root());
+ texture_path.append("Textures");
+ texture_path.append("Sky");
+ for (int i = 0; i < FGEnvironmentMgr::MAX_CLOUD_LAYERS; i++) {
+ SGCloudLayer * layer = new SGCloudLayer(texture_path.str());
+ _sky->add_cloud_layer(layer);
+ }
+
+ _sky->texture_path( texture_path.str() );
}
void
if ( fgGetBool("/sim/startup/fullscreen") )
fgOSFullScreen();
+// build the sky
+ // The sun and moon diameters are scaled down numbers of the
+ // actual diameters. This was needed to fit both the sun and the
+ // moon within the distance to the far clip plane.
+ // Moon diameter: 3,476 kilometers
+ // Sun diameter: 1,390,000 kilometers
+ _sky->build( 80000.0, 80000.0,
+ 463.3, 361.8,
+ *globals->get_ephem(),
+ fgGetNode("/environment", true));
+
viewer->getCamera()
->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
sunLight->setUpdateCallback(new FGLightSourceUpdateCallback(true));
sunLight->setReferenceFrame(osg::LightSource::RELATIVE_RF);
sunLight->setLocalStateSetModes(osg::StateAttribute::ON);
+
// Hang a StateSet above the sky subgraph in order to turn off
// light 0
Group* skyGroup = new Group;
StateSet* skySS = skyGroup->getOrCreateStateSet();
skySS->setMode(GL_LIGHT0, StateAttribute::OFF);
- skyGroup->addChild(thesky->getPreRoot());
+ skyGroup->addChild(_sky->getPreRoot());
sunLight->addChild(skyGroup);
mRoot->addChild(sceneGroup);
mRoot->addChild(sunLight);
+
// Clouds are added to the scene graph later
stateSet = globals->get_scenery()->get_scene_graph()->getOrCreateStateSet();
stateSet->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON);
// The clouds are attached directly to the scene graph root
// because, in theory, they don't want the same default state set
// as the rest of the scene. This may not be true in practice.
- mRealRoot->addChild(thesky->getCloudRoot());
+ mRealRoot->addChild(_sky->getCloudRoot());
mRealRoot->addChild(FGCreateRedoutNode());
// Attach empty program to the scene root so that shader programs
// don't leak into state sets (effects) that shouldn't have one.
_splash_alpha->setDoubleValue(sAlpha);
}
-#if 0 // OSGFIXME
- // OSGFIXME: features no longer available or no longer run-time configurable
- {
- bool use_point_sprites = _point_sprites->getBoolValue();
- bool enhanced_lighting = _enhanced_lighting->getBoolValue();
- bool distance_attenuation = _distance_attenuation->getBoolValue();
-
- SGConfigureDirectionalLights( use_point_sprites, enhanced_lighting,
- distance_attenuation );
- }
-#endif
-
FGLight *l = static_cast<FGLight*>(globals->get_subsystem("lighting"));
// update fog params
double actual_visibility;
if (_cloud_status->getBoolValue()) {
- actual_visibility = thesky->get_visibility();
+ actual_visibility = _sky->get_visibility();
} else {
actual_visibility = _visibility_m->getDoubleValue();
}
// update fog params if visibility has changed
double visibility_meters = _visibility_m->getDoubleValue();
- thesky->set_visibility(visibility_meters);
+ _sky->set_visibility(visibility_meters);
double altitude_m = _altitude_ft->getDoubleValue() * SG_FEET_TO_METER;
- thesky->modify_vis( altitude_m, 0.0 /* time factor, now unused */);
+ _sky->modify_vis( altitude_m, 0.0 /* time factor, now unused */);
// update the sky dome
if ( skyblend ) {
scolor.moon_angle = l->get_moon_angle();
double delta_time_sec = _sim_delta_sec->getDoubleValue();
- thesky->reposition( sstate, *globals->get_ephem(), delta_time_sec );
- thesky->repaint( scolor, *globals->get_ephem() );
+ _sky->reposition( sstate, *globals->get_ephem(), delta_time_sec );
+ _sky->repaint( scolor, *globals->get_ephem() );
//OSGFIXME
// shadows->setupShadows(
{
int curWidth = _xsize->getIntValue(),
curHeight = _ysize->getIntValue();
+ SG_LOG(SG_VIEW, SG_DEBUG, "FGRenderer::resize: new size " << width << " x " << height);
if ((curHeight != height) || (curWidth != width)) {
// must guard setting these, or PLIB-PUI fails with too many live interfaces
_xsize->setIntValue(width);