# include <config.h>
#endif
+#ifdef HAVE_WINDOWS_H
+# include <windows.h>
+#endif
+
#include <simgear/compiler.h>
#include <osg/ref_ptr>
#include <osg/LightModel>
#include <osg/LightSource>
#include <osg/Material>
+#include <osg/Math>
#include <osg/NodeCallback>
#include <osg/Notify>
#include <osg/PolygonMode>
#include "renderer.hxx"
#include "main.hxx"
#include "CameraGroup.hxx"
-#include "ViewPartitionNode.hxx"
+#include "FGEventHandler.hxx"
// XXX Make this go away when OSG 2.2 is released.
#if (FG_OSG_VERSION >= 21004)
static osg::ref_ptr<osg::Group> mRoot = new osg::Group;
-static osg::ref_ptr<ViewPartitionNode> viewPartition = new ViewPartitionNode;
-
FGRenderer::FGRenderer()
{
#ifdef FG_JPEG_SERVER
jpgRenderFrame = FGRenderer::update;
#endif
- manipulator = new FGManipulator;
+ eventHandler = new FGEventHandler;
}
FGRenderer::~FGRenderer()
mRoot->addChild(lightSource);
stateSet = globals->get_scenery()->get_scene_graph()->getOrCreateStateSet();
+ stateSet->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON);
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON);
stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
osg::Switch* sw = new osg::Switch;
sw->setUpdateCallback(new FGScenerySwitchCallback);
sw->addChild(mRoot.get());
- viewPartition->addChild(sw);
- viewPartition->addChild(thesky->getCloudRoot());
-
- mRealRoot->addChild(viewPartition.get());
+ mRealRoot->addChild(sw);
+ mRealRoot->addChild(thesky->getCloudRoot());
mRealRoot->addChild(FGCreateRedoutNode());
}
double sun_horiz_eff, moon_horiz_eff;
if (fgGetBool("/sim/rendering/horizon-effect")) {
- sun_horiz_eff = 0.67+pow(0.5+cos(l->get_sun_angle())*2/2, 0.33)/3;
- moon_horiz_eff = 0.67+pow(0.5+cos(l->get_moon_angle())*2/2, 0.33)/3;
+ sun_horiz_eff
+ = 0.67 + pow(osg::clampAbove(0.5 + cos(l->get_sun_angle()),
+ 0.0),
+ 0.33) / 3.0;
+ moon_horiz_eff
+ = 0.67 + pow(osg::clampAbove(0.5 + cos(l->get_moon_angle()),
+ 0.0),
+ 0.33)/3.0;
} else {
sun_horiz_eff = moon_horiz_eff = 1.0;
}
- static SGSkyState sstate;
-
- sstate.view_pos = toVec3f(current__view->get_view_pos());
- sstate.zero_elev = toVec3f(current__view->get_zero_elev());
- sstate.view_up = current__view->get_world_up();
- sstate.lon = current__view->getLongitude_deg()
- * SGD_DEGREES_TO_RADIANS;
- sstate.lat = current__view->getLatitude_deg()
- * SGD_DEGREES_TO_RADIANS;
- sstate.alt = current__view->getAltitudeASL_ft()
- * SG_FEET_TO_METER;
+ SGSkyState sstate;
+
+ SGVec3d viewPos = current__view->getViewPosition();
+ sstate.view_pos = toVec3f(viewPos);
+ SGGeod geodViewPos = SGGeod::fromCart(viewPos);
+ SGGeod geodZeroViewPos = SGGeod::fromGeodM(geodViewPos, 0);
+ sstate.zero_elev = toVec3f(SGVec3d::fromGeod(geodZeroViewPos));
+ SGQuatd hlOr = SGQuatd::fromLonLat(geodViewPos);
+ sstate.view_up = toVec3f(hlOr.backTransform(-SGVec3d::e3()));
+ sstate.lon = geodViewPos.getLongitudeRad();
+ sstate.lat = geodViewPos.getLatitudeRad();
+ sstate.alt = geodViewPos.getElevationM();
sstate.spin = l->get_sun_rotation();
sstate.gst = globals->get_time_params()->getGst();
- sstate.sun_ra = globals->get_ephem()->getSunRightAscension();
- sstate.sun_dec = globals->get_ephem()->getSunDeclination();
sstate.sun_dist = 50000.0 * sun_horiz_eff;
- sstate.moon_ra = globals->get_ephem()->getMoonRightAscension();
- sstate.moon_dec = globals->get_ephem()->getMoonDeclination();
sstate.moon_dist = 40000.0 * moon_horiz_eff;
sstate.sun_angle = l->get_sun_angle();
<< " moon_angle = " << l->moon_angle );
*/
- static SGSkyColor scolor;
+ SGSkyColor scolor;
scolor.sky_color = SGVec3f(l->sky_color().data());
+ scolor.adj_sky_color = SGVec3f(l->adj_sky_color().data());
scolor.fog_color = SGVec3f(l->adj_fog_color().data());
scolor.cloud_color = SGVec3f(l->cloud_color().data());
scolor.sun_angle = l->get_sun_angle();
scolor.moon_angle = l->get_moon_angle();
- scolor.nplanets = globals->get_ephem()->getNumPlanets();
- scolor.nstars = globals->get_ephem()->getNumStars();
- scolor.planet_data = globals->get_ephem()->getPlanets();
- scolor.star_data = globals->get_ephem()->getStars();
- thesky->reposition( sstate, delta_time_sec );
- thesky->repaint( scolor );
+ thesky->reposition( sstate, *globals->get_ephem(), delta_time_sec );
+ thesky->repaint( scolor, *globals->get_ephem() );
/*
SG_LOG( SG_GENERAL, SG_BULK,
l->adj_fog_color(),
l->get_sun_angle()*SGD_RADIANS_TO_DEGREES);
mUpdateVisitor->setVisibility(actual_visibility);
- viewPartition->setVisibility(actual_visibility);
simgear::GroundLightManager::instance()->update(mUpdateVisitor.get());
bool hotspots = fgGetBool("/sim/panel-hotspots");
osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT;
->getLightNodeMask(mUpdateVisitor.get());
if (hotspots)
cullMask |= simgear::PICK_BIT;
- camera->setCullMask(cullMask);
- // XXX
- for (int i = 0; i < viewer->getNumSlaves(); ++i)
- viewer->getSlave(i)._camera->setCullMask(cullMask);
+ CameraGroup::getDefault()->setCameraCullMasks(cullMask);
}
return !pickList.empty();
}
+void
+FGRenderer::setViewer(osgViewer::Viewer* viewer_)
+{
+ viewer = viewer_;
+}
+
+void
+FGRenderer::setEventHandler(FGEventHandler* eventHandler_)
+{
+ eventHandler = eventHandler_;
+}
+
void
FGRenderer::addCamera(osg::Camera* camera, bool useSceneData)
{