#include <Math/polar3d.hxx>
#include <Math/fg_random.h>
#include <Misc/fgpath.hxx>
+#include <Objects/materialmgr.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Time/event.hxx>
// ssg variables
ssgRoot *scene = NULL;
ssgBranch *terrain = NULL;
-ssgTransform *penguin = NULL;
+ssgSelector *penguin_sel = NULL;
+ssgTransform *penguin_pos = NULL;
// The following defines flight gear options. Because glutlib will also
// xglMaterialfv (GL_FRONT, GL_DIFFUSE, white);
}
- global_tile_mgr.render();
+ // global_tile_mgr.render();
// ssg test
double agl = current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER
- scenery.cur_elev;
- FG_LOG( FG_ALL, FG_INFO, "visibility is "
- << current_weather.get_visibility() );
+ // FG_LOG( FG_ALL, FG_INFO, "visibility is "
+ // << current_weather.get_visibility() );
if ( agl > 10.0 ) {
// ssgSetNearFar( 10.0f, current_weather.get_visibility() );
ssgSetNearFar( 0.5f, 100000.0f );
}
- sgMat4 sgTRANS;
- sgMakeTransMat4( sgTRANS,
- current_view.view_pos.x()
- + current_view.view_forward[0] * 20,
- current_view.view_pos.y()
- + current_view.view_forward[1] * 20,
- current_view.view_pos.z()
- + current_view.view_forward[2] * 20 );
-
- sgMat4 sgTMP;
- sgMat4 sgTUX;
- sgMultMat4( sgTMP, current_view.sgUP, sgTRANS );
- sgMultMat4( sgTUX, current_view.sgLARC_TO_SSG, sgTMP );
-
- sgCoord tuxpos;
- sgSetCoord( &tuxpos, sgTUX );
- penguin->setTransform( &tuxpos );
-
- sgMakeTransMat4( sgTRANS,
- current_view.view_pos.x(),
- current_view.view_pos.y(),
- current_view.view_pos.z() );
sgMat4 sgVIEW;
- sgMultMat4( sgVIEW, current_view.sgVIEW, sgTRANS );
+
+ if ( current_view.view_mode == FGView::FG_VIEW_FIRST_PERSON ) {
+ // select current view matrix
+ sgCopyMat4( sgVIEW, current_view.sgVIEW );
+
+ // disable TuX
+ penguin_sel->select(0);
+ } else if ( current_view.view_mode == FGView::FG_VIEW_FOLLOW ) {
+ // select view matrix from front of view matrix queue
+ FGMat4Wrapper tmp = current_view.follow.front();
+ sgCopyMat4( sgVIEW, tmp.m );
+ while ( current_view.follow.size() > 10 ) {
+ current_view.follow.pop_front();
+ }
+
+ // enable TuX and set up his position and orientation
+ penguin_sel->select(1);
+
+ sgMat4 sgTRANS;
+ sgMakeTransMat4( sgTRANS,
+ current_view.view_pos.x(),
+ current_view.view_pos.y(),
+ current_view.view_pos.z() );
+
+ // sgMat4 sgTMP;
+ sgMat4 sgTUX;
+ // sgMultMat4( sgTMP, current_view.sgUP, sgTRANS );
+ // sgMultMat4( sgTUX, current_view.sgLARC_TO_SSG, sgTMP );
+ sgMultMat4( sgTUX, current_view.sgVIEW_ROT, sgTRANS );
+
+ sgCoord tuxpos;
+ sgSetCoord( &tuxpos, sgTUX );
+ penguin_pos->setTransform( &tuxpos );
+ }
+
ssgSetCamera( sgVIEW );
- // ssgSetCamera( current_view.sgVIEW );
+
+ // position tile nodes and update range selectors
+ global_tile_mgr.prep_ssg_nodes();
+
+ // force the default state so ssg can get back on track if
+ // we've changed things elsewhere
+ FGMaterialSlot m_slot;
+ FGMaterialSlot *m_ptr = &m_slot;
+ if ( material_mgr.find( "Default", m_ptr ) );
+ m_ptr->get_state()->force();
+
+ // draw the ssg scene
ssgCullAndDraw( scene );
xglDisable( GL_TEXTURE_2D );
scene = new ssgRoot;
terrain = new ssgBranch;
terrain->setName( "Terrain" );
- penguin = new ssgTransform;
+ penguin_sel = new ssgSelector;
+ penguin_pos = new ssgTransform;
ssgEntity *tux_obj = ssgLoadAC( "tuxedo.ac" );
- penguin->addKid( tux_obj );
+ penguin_pos->addKid( tux_obj );
+ penguin_sel->addKid( penguin_pos );
ssgFlatten( tux_obj );
- ssgStripify( penguin );
+ ssgStripify( penguin_sel );
scene->addKid( terrain );
- scene->addKid( penguin );
+ scene->addKid( penguin_sel );
// pass control off to the master GLUT event handler
glutMainLoop();