Harald JOHNSEN:
Changes ======= New volumetric shadows for FlightGear. There is now two new checkboxes in the rendering dialog to enable/disable shadows for the user aircraft and for static scenery objects (ie those defined in the .stg files). AI and random objects are not handled for the moment. known bugs ========== - ghost objects
This commit is contained in:
parent
8e5eed90d5
commit
f2cf76171f
3 changed files with 34 additions and 1 deletions
|
@ -51,6 +51,8 @@
|
|||
|
||||
#include <simgear/environment/visual_enviro.hxx>
|
||||
|
||||
#include <simgear/scene/model/shadowvolume.hxx>
|
||||
|
||||
#include <Scenery/tileentry.hxx>
|
||||
#include <Time/light.hxx>
|
||||
#include <Time/light.hxx>
|
||||
|
@ -115,6 +117,8 @@ ssgSimpleState *default_state;
|
|||
ssgSimpleState *hud_and_panel;
|
||||
ssgSimpleState *menus;
|
||||
|
||||
SGShadowVolume *shadows;
|
||||
|
||||
FGRenderer::FGRenderer()
|
||||
{
|
||||
#ifdef FG_JPEG_SERVER
|
||||
|
@ -170,6 +174,11 @@ FGRenderer::build_states( void ) {
|
|||
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 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -441,6 +450,14 @@ FGRenderer::update( bool refresh_camera_settings ) {
|
|||
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 );
|
||||
|
@ -680,6 +697,13 @@ FGRenderer::update( bool refresh_camera_settings ) {
|
|||
- 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 );
|
||||
|
@ -696,6 +720,8 @@ FGRenderer::update( bool refresh_camera_settings ) {
|
|||
sgSetModelFilter( true );
|
||||
globals->get_aircraft_model()->select( true );
|
||||
}
|
||||
if( !is_internal )
|
||||
shadows->endOfFrame();
|
||||
|
||||
// display HUD && Panel
|
||||
glDisable( GL_FOG );
|
||||
|
|
|
@ -39,7 +39,7 @@ public:
|
|||
// 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(); }
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#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>
|
||||
|
@ -57,6 +58,8 @@ queue<FGTileEntry *> FGTileMgr::delete_queue;
|
|||
|
||||
bool FGTileMgr::tile_filter = true;
|
||||
|
||||
extern SGShadowVolume *shadows;
|
||||
|
||||
// Constructor
|
||||
FGTileMgr::FGTileMgr():
|
||||
state( Start ),
|
||||
|
@ -124,6 +127,7 @@ void FGTileMgr::sched_tile( const SGBucket& b, const bool is_inner_ring ) {
|
|||
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 );
|
||||
|
@ -315,6 +319,9 @@ void FGTileMgr::update_queues()
|
|||
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() );
|
||||
|
|
Loading…
Reference in a new issue