]> git.mxchange.org Git - flightgear.git/commitdiff
Harald JOHNSEN:
authorehofman <ehofman>
Sun, 26 Jun 2005 17:21:18 +0000 (17:21 +0000)
committerehofman <ehofman>
Sun, 26 Jun 2005 17:21:18 +0000 (17:21 +0000)
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

src/Main/renderer.cxx
src/Model/panelnode.hxx
src/Scenery/tilemgr.cxx

index 9742c34b2ccb58c4d7788c4d08baa8f6e75833f0..d8f6e8c309582e0f3f9c7f1dd27748556c0bd086 100644 (file)
@@ -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 );
index 0a6de5c17a9f6fd2a35b12866518405362b378ae..78139bf329b8f24ff6bb9ccc3960b8dfbca165db 100644 (file)
@@ -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(); }
index e502f55bdbe18e73438c2c4e9e33f14d9c670d9a..1cd496edddc276dc558f3a6f6daebf9276ef8080 100644 (file)
@@ -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() );