#include <simgear/environment/visual_enviro.hxx>
+#include <simgear/scene/model/shadowvolume.hxx>
+
#include <Scenery/tileentry.hxx>
#include <Time/light.hxx>
#include <Time/light.hxx>
ssgSimpleState *hud_and_panel;
ssgSimpleState *menus;
+SGShadowVolume *shadows;
+
FGRenderer::FGRenderer()
{
#ifdef FG_JPEG_SERVER
menus->disable( GL_CULL_FACE );
menus->disable( GL_TEXTURE_2D );
menus->enable( GL_BLEND );
+
+ shadows = new SGShadowVolume;
+ shadows->init( fgGetNode("/sim/rendering", true) );
+ shadows->addOccluder( globals->get_scenery()->get_aircraft_branch(), SGShadowVolume::occluderTypeAircraft );
+
}
sstate.moon_dist = 40000.0 * moon_horiz_eff;
thesky->reposition( sstate, delta_time_sec );
+
+ shadows->setupShadows(
+ current__view->getLongitude_deg(),
+ current__view->getLatitude_deg(),
+ globals->get_time_params()->getGst(),
+ globals->get_ephem()->getSunRightAscension(),
+ globals->get_ephem()->getSunDeclination(),
+ l->get_sun_angle());
}
glEnable( GL_DEPTH_TEST );
- current__view->getHeadingOffset_deg(),
fgGetDouble("/velocities/airspeed-kt", 0.0));
+ // compute shadows and project them on screen
+ bool is_internal = globals->get_current_view()->getInternal();
+ // draw before ac because ac internal rendering clear the depth buffer
+
+ if( is_internal )
+ shadows->endOfFrame();
+
if ( draw_otw ) {
FGTileMgr::set_tile_filter( false );
sgSetModelFilter( false );
sgSetModelFilter( true );
globals->get_aircraft_model()->select( true );
}
+ if( !is_internal )
+ shadows->endOfFrame();
// display HUD && Panel
glDisable( GL_FOG );
// even know what many of them do, but they're pure virtual and
// require implementation.
//
- virtual int getNumTriangles() { die(); return 0; }
+ virtual int getNumTriangles() { return 0; }
virtual void getTriangle(int n, short* v1, short* v2, short* v3) { die(); }
virtual int getNumLines() { die(); return 0; }
virtual void getLine(int n, short* v1, short* v2) { die(); }
#include <simgear/math/vector.hxx>
#include <simgear/structure/exception.hxx>
#include <simgear/scene/model/modellib.hxx>
+#include <simgear/scene/model/shadowvolume.hxx>
#include <Main/globals.hxx>
#include <Main/fg_props.hxx>
bool FGTileMgr::tile_filter = true;
+extern SGShadowVolume *shadows;
+
// Constructor
FGTileMgr::FGTileMgr():
state( Start ),
long index = tile_cache.get_oldest_tile();
if ( index >= 0 ) {
FGTileEntry *old = tile_cache.get_tile( index );
+ shadows->deleteOccluderFromTile( (ssgBranch *) old->get_terra_transform() );
old->disconnect_ssg_nodes();
delete_queue.push( old );
tile_cache.clear_entry( index );
globals->get_sim_time_sec() );
if ( obj_model != NULL ) {
dm->get_obj_trans()->addKid( obj_model );
+ shadows->addOccluder( (ssgBranch *) obj_model->getParent(0),
+ SGShadowVolume::occluderTypeTileObject,
+ (ssgBranch *) dm->get_tile()->get_terra_transform());
}
} catch (const sg_exception& exc) {
SG_LOG( SG_ALL, SG_ALERT, exc.getMessage() );