From 8aab71034ad577c64b0cad427cba1bf1eda940b7 Mon Sep 17 00:00:00 2001
From: curt <curt>
Date: Wed, 1 Nov 2000 04:32:04 +0000
Subject: [PATCH] Woohoo! some success with external views ...

---
 src/Main/keyboard.cxx      | 117 +------------------------------------
 src/Main/main.cxx          |  83 +++++++++-----------------
 src/Main/viewer_lookat.cxx |  10 ++--
 src/Main/viewer_rph.cxx    |   7 ++-
 4 files changed, 37 insertions(+), 180 deletions(-)

diff --git a/src/Main/keyboard.cxx b/src/Main/keyboard.cxx
index d5bbf920a..22dbc9593 100644
--- a/src/Main/keyboard.cxx
+++ b/src/Main/keyboard.cxx
@@ -83,7 +83,7 @@ void GLUTkey(unsigned char k, int x, int y) {
     int speed;
 
     FGInterface *f = current_aircraft.fdm_state;
-    FGViewerRPH *v = (FGViewerRPH *)globals->get_current_view();
+    FGViewer *v = globals->get_current_view();
 
     FG_LOG( FG_INPUT, FG_DEBUG, "Key hit = " << k );
     if ( puKeyboard(k, PU_DOWN) ) {
@@ -153,75 +153,27 @@ void GLUTkey(unsigned char k, int x, int y) {
 	    return;
 	case 49: // numeric keypad 1
 	    v->set_goal_view_offset( FG_PI * 0.75 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(-25.0, 25.0, 1.0);
-		v->set_view_offset( FG_PI * 0.75 );
-	    }
 	    return;
 	case 50: // numeric keypad 2
 	    v->set_goal_view_offset( FG_PI );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(-25.0, 0.0, 1.0);
-		v->set_view_offset( FG_PI );
-	    }
 	    return;
 	case 51: // numeric keypad 3
 	    v->set_goal_view_offset( FG_PI * 1.25 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(-25.0, -25.0, 1.0);
-		v->set_view_offset( FG_PI * 1.25 );
-	    }
 	    return;
 	case 52: // numeric keypad 4
 	    v->set_goal_view_offset( FG_PI * 0.50 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(0.0, 25.0, 1.0);
-		v->set_view_offset( FG_PI * 0.50 );
-	    }
 	    return;
 	case 54: // numeric keypad 6
 	    v->set_goal_view_offset( FG_PI * 1.50 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(0.0, -25.0, 1.0);
-		v->set_view_offset( FG_PI * 1.50 );
-	    }
 	    return;
 	case 55: // numeric keypad 7
 	    v->set_goal_view_offset( FG_PI * 0.25 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(25.0, 25.0, 1.0);
-		v->set_view_offset( FG_PI * 0.25 );
-	    }
 	    return;
 	case 56: // numeric keypad 8
 	    v->set_goal_view_offset( 0.00 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(25.0, 0.0, 1.0);
-		v->set_view_offset( 0.00 );
-	    }
 	    return;
 	case 57: // numeric keypad 9
 	    v->set_goal_view_offset( FG_PI * 1.75 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(25.0, -25.0, 1.0);
-		v->set_view_offset( FG_PI * 1.75 );
-	    }
 	    return;
 	case 65: // A key
 	    speed = globals->get_options()->get_speed_up();
@@ -419,23 +371,6 @@ void GLUTkey(unsigned char k, int x, int y) {
 	    return;
 	case 118: // v key
 	    globals->set_current_view( globals->get_viewmgr()->next_view() );
-#if 0
-	    // globals->get_options()->cycle_view_mode();
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_options()->set_view_mode(FGOptions::FG_VIEW_PILOT);
-		v->set_goal_view_offset( 0.0 );
-		v->set_view_offset( 0.0 );
-	    } else if ( globals->get_options()->get_view_mode() ==
-			FGOptions::FG_VIEW_PILOT )
-	    {
-		globals->get_options()->set_view_mode( FGOptions::FG_VIEW_FOLLOW );
-		v->set_goal_view_offset( FG_PI * 1.75 );
-		v->set_view_offset( FG_PI * 1.75 );
-		globals->get_current_view()->set_pilot_offset(25.0, -25.0, 1.0);
-	    }
-#endif
 	    fgReshape( globals->get_options()->get_xsize(),
 		       globals->get_options()->get_ysize() );
 	    return;
@@ -474,7 +409,7 @@ void GLUTkey(unsigned char k, int x, int y) {
 
 // Handle "special" keyboard events
 void GLUTspecialkey(int k, int x, int y) {
-    FGViewerRPH *v = (FGViewerRPH *)globals->get_current_view();
+    FGViewer *v = globals->get_current_view();
 
     FG_LOG( FG_INPUT, FG_DEBUG, "Special key hit = " << k );
 
@@ -556,75 +491,27 @@ void GLUTspecialkey(int k, int x, int y) {
 	}
 	case GLUT_KEY_END: // numeric keypad 1
 	    v->set_goal_view_offset( FG_PI * 0.75 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW)
-	    {
-		globals->get_current_view()->set_pilot_offset(-25.0, 25.0, 1.0);
-		v->set_view_offset( FG_PI * 0.75 );
-	    }
 	    return;
 	case GLUT_KEY_DOWN: // numeric keypad 2
 	    v->set_goal_view_offset( FG_PI );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(-25.0, 0.0, 1.0);
-		v->set_view_offset( FG_PI );
-	    }
 	    return;
 	case GLUT_KEY_PAGE_DOWN: // numeric keypad 3
 	    v->set_goal_view_offset( FG_PI * 1.25 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW)
-	    {
-		globals->get_current_view()->set_pilot_offset(-25.0, -25.0, 1.0);
-		v->set_view_offset( FG_PI * 1.25 );
-	    }
 	    return;
 	case GLUT_KEY_LEFT: // numeric keypad 4
 	    v->set_goal_view_offset( FG_PI * 0.50 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(0.0, 25.0, 1.0);
-		v->set_view_offset( FG_PI * 0.50 );
-	    }
 	    return;
 	case GLUT_KEY_RIGHT: // numeric keypad 6
 	    v->set_goal_view_offset( FG_PI * 1.50 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(0.0, -25.0, 1.0);
-		v->set_view_offset( FG_PI * 1.50 );
-	    }
 	    return;
 	case GLUT_KEY_HOME: // numeric keypad 7
 	    v->set_goal_view_offset( FG_PI * 0.25 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(25.0, 25.0, 1.0);
-		v->set_view_offset( FG_PI * 0.25 );
-	    }
 	    return;
 	case GLUT_KEY_UP: // numeric keypad 8
 	    v->set_goal_view_offset( 0.00 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(25.0, 0.0, 1.0);
-		v->set_view_offset( 0.00 );
-	    }
 	    return;
 	case GLUT_KEY_PAGE_UP: // numeric keypad 9
 	    v->set_goal_view_offset( FG_PI * 1.75 );
-	    if ( globals->get_options()->get_view_mode() ==
-		 FGOptions::FG_VIEW_FOLLOW )
-	    {
-		globals->get_current_view()->set_pilot_offset(25.0, -25.0, 1.0);
-		v->set_view_offset( FG_PI * 1.75 );
-	    }
 	    return;
 	}
     } else {
diff --git a/src/Main/main.cxx b/src/Main/main.cxx
index 89027c124..ea6659760 100644
--- a/src/Main/main.cxx
+++ b/src/Main/main.cxx
@@ -341,12 +341,16 @@ void fgRenderFrame( void ) {
 
 	sgVec3 po;		// chase view pilot_offset
 	sgVec3 wup;		// chase view world up
-	sgSetVec3( po, 0.0, 0.0, 200.0 );
+	sgSetVec3( po, 0.0, 0.0, 50.0 );
 	sgCopyVec3( wup, pilot_view->get_world_up() );
-	// sgMat4 CXFM;		// chase view + pilot offset xform
-	// sgMakeRotMat4( CXFM, cur_fdm_state->get_Psi() * RAD_TO_DEG, wup );
-	// sgVec3 npo;		// new pilot offset after rotation
-	// sgXformVec3( npo, po, CXFM );
+	sgMat4 CXFM;		// chase view + pilot offset xform
+	sgMakeRotMat4( CXFM,
+		       chase_view->get_view_offset() * RAD_TO_DEG -
+		       cur_fdm_state->get_Psi() * RAD_TO_DEG,
+		       wup );
+	sgVec3 npo;		// new pilot offset after rotation
+	sgXformVec3( po, po, pilot_view->get_UP() );
+	sgXformVec3( npo, po, CXFM );
 
 	chase_view->set_geod_view_pos( cur_fdm_state->get_Longitude(), 
 				       cur_fdm_state->get_Lat_geocentric(), 
@@ -355,26 +359,11 @@ void fgRenderFrame( void ) {
 	chase_view->set_sea_level_radius( cur_fdm_state->
 					  get_Sea_level_radius() *
 					  FEET_TO_METER );
-	chase_view->set_pilot_offset( po[0], po[1], po[2] );
-	sgVec3 negpo;
-	sgNegateVec3( negpo, po );
-	chase_view->set_view_forward( negpo ); 
+	chase_view->set_pilot_offset( npo[0], npo[1], npo[2] );
+	chase_view->set_view_forward( pilot_view->get_view_pos() ); 
 	chase_view->set_view_up( wup );
 
 #if 0
-	// this is a test, we are trying to match RPH and LookAt
-	// matrices
-	chase_view->set_geod_view_pos( cur_fdm_state->get_Longitude(), 
-				       cur_fdm_state->get_Lat_geocentric(), 
-				       cur_fdm_state->get_Altitude() *
-				       FEET_TO_METER );
-	chase_view->set_sea_level_radius( cur_fdm_state->
-					  get_Sea_level_radius() *
-					  FEET_TO_METER );
-	chase_view->set_view_forward( pilot_view->get_view_forward() );
-	chase_view->set_view_up( pilot_view->get_view_up() );
-#endif
-
 	sgMat4 rph;
 	sgCopyMat4( rph, pilot_view->get_VIEW() );
 	cout << "RPH Matrix = " << endl;
@@ -395,22 +384,9 @@ void fgRenderFrame( void ) {
 	    }
 	    cout << endl;
 	}
-
-	// update view volume parameters
-	// cout << "before pilot_view update" << endl;
-#if 0
-        if ( globals->get_options()->get_view_mode() ==
-	     FGOptions::FG_VIEW_FOLLOW )
-	{
-	    float * offset = globals->get_current_view()->get_pilot_offset();
-	    globals->get_current_view()->set_pilot_offset( offset[0],
-							   offset[1],
-							   offset[2] );
-	} else {
-	    globals->get_current_view()->set_pilot_offset(0.0, 0.0, 0.0);
-	}
 #endif
 
+	// update view port
 	if ( ! fgPanelVisible() ) {
 	    xglViewport( 0, 0 ,
 			 (GLint)(globals->get_options()->get_xsize()),
@@ -737,39 +713,32 @@ void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
     }
 
     // update the view angle
+    FGViewer *v = globals->get_current_view();
     for ( i = 0; i < multi_loop; i++ ) {
-	if ( fabs(globals->get_current_view()->get_goal_view_offset() - 
-		  globals->get_current_view()->get_view_offset()) < 0.05 )
-	{
-	    globals->get_current_view()->set_view_offset( globals->get_current_view()->get_goal_view_offset() );
+	if ( fabs(v->get_goal_view_offset() - v->get_view_offset()) < 0.05 ) {
+	    v->set_view_offset( v->get_goal_view_offset() );
 	    break;
 	} else {
 	    // move current_view.view_offset towards
 	    // current_view.goal_view_offset
-	    if ( globals->get_current_view()->get_goal_view_offset() > 
-		 globals->get_current_view()->get_view_offset() )
+	    if ( v->get_goal_view_offset() > v->get_view_offset() )
             {
-		if ( globals->get_current_view()->get_goal_view_offset() - 
-		     globals->get_current_view()->get_view_offset() < FG_PI )
-                {
-		    globals->get_current_view()->inc_view_offset( 0.01 );
+		if ( v->get_goal_view_offset() - v->get_view_offset() < FG_PI ){
+		    v->inc_view_offset( 0.01 );
 		} else {
-		    globals->get_current_view()->inc_view_offset( -0.01 );
+		    v->inc_view_offset( -0.01 );
 		}
 	    } else {
-		if ( globals->get_current_view()->get_view_offset() - 
-		     globals->get_current_view()->get_goal_view_offset() <
-		     FG_PI )
-                {
-		    globals->get_current_view()->inc_view_offset( -0.01 );
+		if ( v->get_view_offset() - v->get_goal_view_offset() < FG_PI ){
+		    v->inc_view_offset( -0.01 );
 		} else {
-		    globals->get_current_view()->inc_view_offset( 0.01 );
+		    v->inc_view_offset( 0.01 );
 		}
 	    }
-	    if ( globals->get_current_view()->get_view_offset() > FG_2PI ) {
-		globals->get_current_view()->inc_view_offset( -FG_2PI );
-	    } else if ( globals->get_current_view()->get_view_offset() < 0 ) {
-		globals->get_current_view()->inc_view_offset( FG_2PI );
+	    if ( v->get_view_offset() > FG_2PI ) {
+		v->inc_view_offset( -FG_2PI );
+	    } else if ( v->get_view_offset() < 0 ) {
+		v->inc_view_offset( FG_2PI );
 	    }
 	}
     }
diff --git a/src/Main/viewer_lookat.cxx b/src/Main/viewer_lookat.cxx
index 6aa8e82ed..74d5be64c 100644
--- a/src/Main/viewer_lookat.cxx
+++ b/src/Main/viewer_lookat.cxx
@@ -135,19 +135,19 @@ void FGViewerLookAt::update() {
 
     FG_LOG( FG_VIEW, FG_DEBUG, "sea level radius = " << sea_level_radius );
     FG_LOG( FG_VIEW, FG_DEBUG, "Polar view pos = " << p );
-    FG_LOG( FG_VIEW, FG_INFO, "Absolute view pos = "
+    FG_LOG( FG_VIEW, FG_DEBUG, "Absolute view pos = "
 	    << abs_view_pos[0] << ","
 	    << abs_view_pos[1] << ","
 	    << abs_view_pos[2] );
-    FG_LOG( FG_VIEW, FG_INFO, "Relative view pos = "
+    FG_LOG( FG_VIEW, FG_DEBUG, "Relative view pos = "
 	    << view_pos[0] << "," << view_pos[1] << "," << view_pos[2] );
-    FG_LOG( FG_VIEW, FG_INFO, "pilot offset = "
+    FG_LOG( FG_VIEW, FG_DEBUG, "pilot offset = "
 	    << pilot_offset[0] << "," << pilot_offset[1] << ","
 	    << pilot_offset[2] );
-    FG_LOG( FG_VIEW, FG_INFO, "view forward = "
+    FG_LOG( FG_VIEW, FG_DEBUG, "view forward = "
 	    << view_forward[0] << "," << view_forward[1] << ","
 	    << view_forward[2] );
-    FG_LOG( FG_VIEW, FG_INFO, "view up = "
+    FG_LOG( FG_VIEW, FG_DEBUG, "view up = "
 	    << view_up[0] << "," << view_up[1] << ","
 	    << view_up[2] );
 
diff --git a/src/Main/viewer_rph.cxx b/src/Main/viewer_rph.cxx
index 503c2de46..17926f5f8 100644
--- a/src/Main/viewer_rph.cxx
+++ b/src/Main/viewer_rph.cxx
@@ -189,7 +189,7 @@ void FGViewerRPH::update() {
 	    << abs_view_pos[0] << ","
 	    << abs_view_pos[1] << ","
 	    << abs_view_pos[2] );
-    FG_LOG( FG_VIEW, FG_DEBUG, "Relative view pos = "
+    FG_LOG( FG_VIEW, FG_DEBUG, "(RPH) Relative view pos = "
 	    << view_pos[0] << "," << view_pos[1] << "," << view_pos[2] );
 
     // code to calculate LOCAL matrix calculated from Phi, Theta, and
@@ -275,8 +275,9 @@ void FGViewerRPH::update() {
     // cout << "VIEW_OFFSET matrix" << endl;
     // print_sgMat4( VIEW_OFFSET );
     sgXformVec3( view_forward, forward, VIEW_OFFSET );
-    // cout << "view_forward = " << view_forward[0] << ","
-    //      << view_forward[1] << "," << view_forward[2] << endl;
+    FG_LOG( FG_VIEW, FG_DEBUG, "(RPH) view forward = "
+	    << view_forward[0] << "," << view_forward[1] << ","
+	    << view_forward[2] );
 	
     // VIEW_ROT = LARC_TO_SSG * ( VIEWo * VIEW_OFFSET )
 #ifdef USE_FAST_VIEWROT