// Constructor
FGView::FGView( void ) {
- MAT3identity(WORLD);
}
void FGView::Init( void ) {
FG_LOG( FG_VIEW, FG_INFO, "Initializing View parameters" );
+ view_mode = FG_VIEW_FIRST_PERSON;
view_offset = 0.0;
goal_view_offset = 0.0;
}
-// Basically, this is a modified version of the Mesa gluLookAt()
-// function that's been modified slightly so we can capture the
-// result before sending it off to OpenGL land.
-void FGView::LookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
- GLdouble centerx, GLdouble centery, GLdouble centerz,
- GLdouble upx, GLdouble upy, GLdouble upz ) {
- GLfloat *m;
- GLdouble x[3], y[3], z[3];
- GLdouble mag;
-
- m = current_view.MODEL_VIEW;
-
- /* Make rotation matrix */
-
- /* Z vector */
- z[0] = eyex - centerx;
- z[1] = eyey - centery;
- z[2] = eyez - centerz;
- mag = sqrt( z[0]*z[0] + z[1]*z[1] + z[2]*z[2] );
- if (mag) { /* mpichler, 19950515 */
- z[0] /= mag;
- z[1] /= mag;
- z[2] /= mag;
+// Cycle view mode
+void FGView::cycle_view_mode() {
+ if ( view_mode == FG_VIEW_FIRST_PERSON ) {
+ view_mode = FG_VIEW_FOLLOW;
+ } else if ( view_mode == FG_VIEW_FOLLOW ) {
+ view_mode = FG_VIEW_FIRST_PERSON;
}
-
- /* Y vector */
- y[0] = upx;
- y[1] = upy;
- y[2] = upz;
-
- /* X vector = Y cross Z */
- x[0] = y[1]*z[2] - y[2]*z[1];
- x[1] = -y[0]*z[2] + y[2]*z[0];
- x[2] = y[0]*z[1] - y[1]*z[0];
-
- /* Recompute Y = Z cross X */
- y[0] = z[1]*x[2] - z[2]*x[1];
- y[1] = -z[0]*x[2] + z[2]*x[0];
- y[2] = z[0]*x[1] - z[1]*x[0];
-
- /* mpichler, 19950515 */
- /* cross product gives area of parallelogram, which is < 1.0 for
- * non-perpendicular unit-length vectors; so normalize x, y here
- */
-
- mag = sqrt( x[0]*x[0] + x[1]*x[1] + x[2]*x[2] );
- if (mag) {
- x[0] /= mag;
- x[1] /= mag;
- x[2] /= mag;
- }
-
- mag = sqrt( y[0]*y[0] + y[1]*y[1] + y[2]*y[2] );
- if (mag) {
- y[0] /= mag;
- y[1] /= mag;
- y[2] /= mag;
- }
-
-#define M(row,col) m[col*4+row]
- M(0,0) = x[0]; M(0,1) = x[1]; M(0,2) = x[2]; M(0,3) = 0.0;
- M(1,0) = y[0]; M(1,1) = y[1]; M(1,2) = y[2]; M(1,3) = 0.0;
- M(2,0) = z[0]; M(2,1) = z[1]; M(2,2) = z[2]; M(2,3) = 0.0;
- // the following is part of the original gluLookAt(), but we are
- // commenting it out because we know we are going to be doing a
- // translation below which will set these values anyways
- // M(3,0) = 0.0; M(3,1) = 0.0; M(3,2) = 0.0; M(3,3) = 1.0;
-#undef M
-
- // Translate Eye to Origin
- // replaces: glTranslated( -eyex, -eyey, -eyez );
-
- // this has been slightly modified from the original glTranslate()
- // code because we know that coming into this m[12] = m[13] =
- // m[14] = 0.0, and m[15] = 1.0;
- m[12] = m[0] * -eyex + m[4] * -eyey + m[8] * -eyez /* + m[12] */;
- m[13] = m[1] * -eyex + m[5] * -eyey + m[9] * -eyez /* + m[13] */;
- m[14] = m[2] * -eyex + m[6] * -eyey + m[10] * -eyez /* + m[14] */;
- m[15] = 1.0 /* m[3] * -eyex + m[7] * -eyey + m[11] * -eyez + m[15] */;
-
- // xglMultMatrixd( m );
- xglLoadMatrixf( m );
}
FGInterface *f = current_aircraft.fdm_state;
UpdateViewMath(f);
- UpdateWorldToEye(f);
if ((current_options.get_panel_status() != panel_hist) && (current_options.get_panel_status()))
{
}
if ( ! current_options.get_panel_status() ) {
- xglViewport(0, 0 , (GLint)(winWidth), (GLint)(winHeight) );
+ // xglViewport(0, 0 , (GLint)(winWidth), (GLint)(winHeight) );
} else {
- xglViewport(0, (GLint)((winHeight)*0.5768), (GLint)(winWidth),
- (GLint)((winHeight)*0.4232) );
+ // xglViewport(0, (GLint)((winHeight)*0.5768), (GLint)(winWidth),
+ // (GLint)((winHeight)*0.4232) );
}
- // Tell GL we are about to modify the projection parameters
- xglMatrixMode(GL_PROJECTION);
- xglLoadIdentity();
- if ( f->get_Altitude() * FEET_TO_METER - scenery.cur_elev > 10.0 ) {
- ssgSetNearFar( 10.0, 100000.0 );
- gluPerspective(current_options.get_fov(), win_ratio, 10.0, 100000.0);
- } else {
- ssgSetNearFar( 0.5, 100000.0 );
- gluPerspective(current_options.get_fov(), win_ratio, 0.5, 100000.0);
- // printf("Near ground, minimizing near clip plane\n");
- }
- // }
-
- xglMatrixMode(GL_MODELVIEW);
- xglLoadIdentity();
-
- // set up our view volume (default)
-#if !defined(FG_VIEW_INLINE_OPTIMIZATIONS)
- LookAt(view_pos.x(), view_pos.y(), view_pos.z(),
- view_pos.x() + view_forward[0],
- view_pos.y() + view_forward[1],
- view_pos.z() + view_forward[2],
- view_up[0], view_up[1], view_up[2]);
-
- // look almost straight up (testing and eclipse watching)
- /* LookAt(view_pos.x(), view_pos.y(), view_pos.z(),
- view_pos.x() + view_up[0] + .001,
- view_pos.y() + view_up[1] + .001,
- view_pos.z() + view_up[2] + .001,
- view_up[0], view_up[1], view_up[2]); */
-
- // lock view horizontally towards sun (testing)
- /* LookAt(view_pos.x(), view_pos.y(), view_pos.z(),
- view_pos.x() + surface_to_sun[0],
- view_pos.y() + surface_to_sun[1],
- view_pos.z() + surface_to_sun[2],
- view_up[0], view_up[1], view_up[2]); */
-
- // lock view horizontally towards south (testing)
- /* LookAt(view_pos.x(), view_pos.y(), view_pos.z(),
- view_pos.x() + surface_south[0],
- view_pos.y() + surface_south[1],
- view_pos.z() + surface_south[2],
- view_up[0], view_up[1], view_up[2]); */
-
-#else // defined(FG_VIEW_INLINE_OPTIMIZATIONS)
- //void FGView::LookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
- // GLdouble centerx, GLdouble centery, GLdouble centerz,
- // GLdouble upx, GLdouble upy, GLdouble upz )
- {
- GLfloat *m;
- GLdouble x[3], y[3], z[3];
- // GLdouble mag;
-
- m = current_view.MODEL_VIEW;
-
- /* Make rotation matrix */
-
- /* Z vector */
- z[0] = -view_forward[0]; //eyex - centerx;
- z[1] = -view_forward[1]; //eyey - centery;
- z[2] = -view_forward[2]; //eyez - centerz;
-
- // In our case this is a unit vector NHV
-
- // mag = sqrt( z[0]*z[0] + z[1]*z[1] + z[2]*z[2] );
- // if (mag) { /* mpichler, 19950515 */
- // mag = 1.0/mag;
- // printf("mag(%f) ", mag);
- // z[0] *= mag;
- // z[1] *= mag;
- // z[2] *= mag;
- // }
-
- /* Y vector */
- y[0] = view_up[0]; //upx;
- y[1] = view_up[1]; //upy;
- y[2] = view_up[2]; //upz;
-
- /* X vector = Y cross Z */
- x[0] = y[1]*z[2] - y[2]*z[1];
- x[1] = -y[0]*z[2] + y[2]*z[0];
- x[2] = y[0]*z[1] - y[1]*z[0];
-
- // printf(" %f %f %f ", y[0], y[1], y[2]);
-
- /* Recompute Y = Z cross X */
- // y[0] = z[1]*x[2] - z[2]*x[1];
- // y[1] = -z[0]*x[2] + z[2]*x[0];
- // y[2] = z[0]*x[1] - z[1]*x[0];
-
- // printf(" %f %f %f\n", y[0], y[1], y[2]);
-
- // In our case these are unit vectors NHV
-
- /* mpichler, 19950515 */
- /* cross product gives area of parallelogram, which is < 1.0 for
- * non-perpendicular unit-length vectors; so normalize x, y here
- */
-
- // mag = sqrt( x[0]*x[0] + x[1]*x[1] + x[2]*x[2] );
- // if (mag) {
- // mag = 1.0/mag;
- // printf("mag2(%f) ", mag);
- // x[0] *= mag;
- // x[1] *= mag;
- // x[2] *= mag;
- // }
-
- // mag = sqrt( y[0]*y[0] + y[1]*y[1] + y[2]*y[2] );
- // if (mag) {
- // mag = 1.0/mag;
- // printf("mag3(%f)\n", mag);
- // y[0] *= mag;
- // y[1] *= mag;
- // y[2] *= mag;
- // }
-
-#define M(row,col) m[col*4+row]
- M(0,0) = x[0]; M(0,1) = x[1]; M(0,2) = x[2]; M(0,3) = 0.0;
- M(1,0) = y[0]; M(1,1) = y[1]; M(1,2) = y[2]; M(1,3) = 0.0;
- M(2,0) = z[0]; M(2,1) = z[1]; M(2,2) = z[2]; M(2,3) = 0.0;
- // the following is part of the original gluLookAt(), but we are
- // commenting it out because we know we are going to be doing a
- // translation below which will set these values anyways
- // M(3,0) = 0.0; M(3,1) = 0.0; M(3,2) = 0.0; M(3,3) = 1.0;
-#undef M
-
- // Translate Eye to Origin
- // replaces: glTranslated( -eyex, -eyey, -eyez );
-
- // this has been slightly modified from the original glTranslate()
- // code because we know that coming into this m[12] = m[13] =
- // m[14] = 0.0, and m[15] = 1.0;
- m[12] = m[0] * -view_pos.x() + m[4] * -view_pos.y() + m[8] * -view_pos.z() /* + m[12] */;
- m[13] = m[1] * -view_pos.x() + m[5] * -view_pos.y() + m[9] * -view_pos.z() /* + m[13] */;
- m[14] = m[2] * -view_pos.x() + m[6] * -view_pos.y() + m[10] * -view_pos.z() /* + m[14] */;
- m[15] = 1.0 /* m[3] * -view_pos.x() + m[7] * -view_pos.y() + m[11] * -view_pos.z() + m[15] */;
-
- // xglMultMatrixd( m );
- xglLoadMatrixf( m );
- }
-#endif // FG_VIEW_INLINE_OPTIMIZATIONS
-
-
panel_hist = current_options.get_panel_status();
}
MAT3mat R, TMP, UP, LOCAL, VIEW;
double ntmp;
- sgMat4 sgLOCAL, sgUP, sgVIEW;
-
if ( update_fov ) {
// printf("Updating fov\n");
UpdateFOV( current_options );
} else {
+ // calculate the transformation matrix to go from LaRCsim to ssg
+ sgVec3 vec1;
+ sgSetVec3( vec1, 0.0, 1.0, 0.0 );
+ sgMat4 mat1;
+ sgMakeRotMat4( mat1, 90, vec1 );
+
+ sgVec3 vec2;
+ sgSetVec3( vec2, 1.0, 0.0, 0.0 );
+ sgMat4 mat2;
+ sgMakeRotMat4( mat2, 90, vec2 );
+
+ sgMultMat4( sgLARC_TO_SSG, mat1, mat2 );
+
+ /*
+ cout << "LaRCsim to SSG:" << endl;
+ MAT3mat print;
+ int i;
+ int j;
+ for ( i = 0; i < 4; i++ ) {
+ for ( j = 0; j < 4; j++ ) {
+ print[i][j] = sgLARC_TO_SSG[i][j];
+ }
+ }
+ MAT3print( print, stdout);
+ */
+
// code to calculate LOCAL matrix calculated from Phi, Theta, and
// Psi (roll, pitch, yaw) in case we aren't running LaRCsim as our
// flight model
MAT3_SET_VEC(vec, 0.0, 0.0, 1.0);
MAT3rotate(R, vec, f->get_Phi());
- /* printf("Roll matrix\n"); */
- /* MAT3print(R, stdout); */
+ // cout << "Roll matrix" << endl;
+ // MAT3print(R, stdout);
+
+ sgVec3 sgrollvec;
+ sgSetVec3( sgrollvec, 0.0, 0.0, 1.0 );
+ sgMat4 sgPHI; // roll
+ sgMakeRotMat4( sgPHI, f->get_Phi() * RAD_TO_DEG, sgrollvec );
+
MAT3_SET_VEC(vec, 0.0, 1.0, 0.0);
- /* MAT3mult_vec(vec, vec, R); */
MAT3rotate(TMP, vec, f->get_Theta());
- /* printf("Pitch matrix\n"); */
- /* MAT3print(TMP, stdout); */
+ // cout << "Pitch matrix" << endl;;
+ // MAT3print(TMP, stdout);
MAT3mult(R, R, TMP);
+ // cout << "tmp rotation matrix, R:" << endl;;
+ // MAT3print(R, stdout);
+
+ sgVec3 sgpitchvec;
+ sgSetVec3( sgpitchvec, 0.0, 1.0, 0.0 );
+ sgMat4 sgTHETA; // pitch
+ sgMakeRotMat4( sgTHETA, f->get_Theta() * RAD_TO_DEG,
+ sgpitchvec );
+
+ sgMat4 sgROT;
+ sgMultMat4( sgROT, sgPHI, sgTHETA );
+
MAT3_SET_VEC(vec, 1.0, 0.0, 0.0);
- /* MAT3mult_vec(vec, vec, R); */
- /* MAT3rotate(TMP, vec, FG_Psi - FG_PI_2); */
MAT3rotate(TMP, vec, -f->get_Psi());
- /* printf("Yaw matrix\n");
- MAT3print(TMP, stdout); */
+ // cout << "Yaw matrix" << endl;
+ // MAT3print(TMP, stdout);
MAT3mult(LOCAL, R, TMP);
- // cout << "FG derived LOCAL matrix using MAT3 routines" << endl;
+ // cout << "LOCAL matrix:" << endl;
// MAT3print(LOCAL, stdout);
- sgMakeRotMat4( sgLOCAL,
- f->get_Psi() * RAD_TO_DEG,
- f->get_Phi() * RAD_TO_DEG,
- f->get_Theta() * RAD_TO_DEG );
+ sgVec3 sgyawvec;
+ sgSetVec3( sgyawvec, 1.0, 0.0, 0.0 );
+ sgMat4 sgPSI; // pitch
+ sgMakeRotMat4( sgPSI, -f->get_Psi() * RAD_TO_DEG, sgyawvec );
+
+ sgMultMat4( sgLOCAL, sgROT, sgPSI );
+
/*
- cout << "FG derived LOCAL matrix using sg routines" << endl;
MAT3mat print;
int i;
int j;
}
}
MAT3print( print, stdout);
-
- sgMat4 sgIDENT;
- sgMakeIdentMat4( sgIDENT );
- for ( i = 0; i < 4; i++ ) {
- for ( j = 0; j < 4; j++ ) {
- print[i][j] = sgIDENT[i][j];
- }
- }
- MAT3print( print, stdout);
*/
} // if ( use_larcsim_local_to_body )
// Calculate the VIEW matrix
MAT3mult(VIEW, LOCAL, UP);
- cout << "VIEW matrix" << endl;;
- MAT3print(VIEW, stdout);
+ // cout << "VIEW matrix" << endl;;
+ // MAT3print(VIEW, stdout);
- sgMultMat4( sgVIEW, sgLOCAL, sgUP );
- cout << "FG derived VIEW matrix using sg routines" << endl;
+ sgMat4 sgTMP, sgTMP2;
+ sgMultMat4( sgTMP, sgLOCAL, sgUP );
+
+ // generate the sg view up vector
+ sgVec3 vec1;
+ sgSetVec3( vec1, 1.0, 0.0, 0.0 );
+ sgXformVec3( sgview_up, vec1, sgTMP );
+
+ // generate the view offset matrix
+ sgMakeRotMat4( sgVIEW_OFFSET, view_offset * RAD_TO_DEG, sgview_up );
+
+ /*
+ cout << "sg VIEW_OFFSET matrix" << endl;
MAT3mat print;
int i;
int j;
for ( i = 0; i < 4; i++ ) {
for ( j = 0; j < 4; j++ ) {
- print[i][j] = sgVIEW[i][j];
+ print[i][j] = sgVIEW_OFFSET[i][j];
}
}
MAT3print( print, stdout);
+ */
+
+ sgMultMat4( sgTMP2, sgTMP, sgVIEW_OFFSET );
+ sgMultMat4( sgVIEW_ROT, sgLARC_TO_SSG, sgTMP2 );
+
+ sgMakeTransMat4( sgTRANS, view_pos.x(), view_pos.y(), view_pos.z() );
+
+ sgMultMat4( sgVIEW, sgVIEW_ROT, sgTRANS );
+
+ FGMat4Wrapper tmp;
+ sgCopyMat4( tmp.m, sgVIEW );
+ follow.push_back( tmp );
// generate the current up, forward, and fwrd-view vectors
MAT3_SET_VEC(vec, 1.0, 0.0, 0.0);
MAT3mult_vec(view_up, vec, VIEW);
+ /*
+ cout << "FG derived VIEW matrix using sg routines" << endl;
+ MAT3mat print;
+ int i;
+ int j;
+ for ( i = 0; i < 4; i++ ) {
+ for ( j = 0; j < 4; j++ ) {
+ print[i][j] = sgVIEW[i][j];
+ }
+ }
+ MAT3print( print, stdout);
+ */
+
MAT3_SET_VEC(vec, 0.0, 0.0, 1.0);
MAT3mult_vec(forward, vec, VIEW);
// printf( "Forward vector is (%.2f,%.2f,%.2f)\n", forward[0], forward[1],
}
-// Update the "World to Eye" transformation matrix
-// This is most useful for view frustum culling
-void FGView::UpdateWorldToEye( FGInterface *f ) {
- MAT3mat R_Phi, R_Theta, R_Psi, R_Lat, R_Lon, T_view;
- MAT3mat TMP;
- MAT3hvec vec;
-
- if ( use_larcsim_local_to_body ) {
-
- // Question: hey this is even different then LOCAL[][] above??
- // Answer: yet another coordinate system, this time the
- // coordinate system in which we do our view frustum culling.
-
- AIRCRAFT[0][0] = -f->get_T_local_to_body_22();
- AIRCRAFT[0][1] = -f->get_T_local_to_body_23();
- AIRCRAFT[0][2] = f->get_T_local_to_body_21();
- AIRCRAFT[0][3] = 0.0;
- AIRCRAFT[1][0] = f->get_T_local_to_body_32();
- AIRCRAFT[1][1] = f->get_T_local_to_body_33();
- AIRCRAFT[1][2] = -f->get_T_local_to_body_31();
- AIRCRAFT[1][3] = 0.0;
- AIRCRAFT[2][0] = f->get_T_local_to_body_12();
- AIRCRAFT[2][1] = f->get_T_local_to_body_13();
- AIRCRAFT[2][2] = -f->get_T_local_to_body_11();
- AIRCRAFT[2][3] = 0.0;
- AIRCRAFT[3][0] = AIRCRAFT[3][1] = AIRCRAFT[3][2] = AIRCRAFT[3][3] = 0.0;
- AIRCRAFT[3][3] = 1.0;
-
- } else {
-
- // Roll Matrix
- MAT3_SET_HVEC(vec, 0.0, 0.0, -1.0, 1.0);
- MAT3rotate(R_Phi, vec, f->get_Phi());
- // printf("Roll matrix (Phi)\n");
- // MAT3print(R_Phi, stdout);
-
- // Pitch Matrix
- MAT3_SET_HVEC(vec, 1.0, 0.0, 0.0, 1.0);
- MAT3rotate(R_Theta, vec, f->get_Theta());
- // printf("\nPitch matrix (Theta)\n");
- // MAT3print(R_Theta, stdout);
-
- // Yaw Matrix
- MAT3_SET_HVEC(vec, 0.0, -1.0, 0.0, 1.0);
- MAT3rotate(R_Psi, vec, f->get_Psi() + FG_PI /* - view_offset */ );
- // MAT3rotate(R_Psi, vec, f->get_Psi() + FG_PI - view_offset );
- // printf("\nYaw matrix (Psi)\n");
- // MAT3print(R_Psi, stdout);
-
- // aircraft roll/pitch/yaw
- MAT3mult(TMP, R_Phi, R_Theta);
- MAT3mult(AIRCRAFT, TMP, R_Psi);
-
- } // if ( use_larcsim_local_to_body )
-
-#if !defined(FG_VIEW_INLINE_OPTIMIZATIONS)
-
- // printf("AIRCRAFT matrix\n");
- // MAT3print(AIRCRAFT, stdout);
-
- // View rotation matrix relative to current aircraft orientation
- MAT3_SET_HVEC(vec, 0.0, -1.0, 0.0, 1.0);
- MAT3mult_vec(vec, vec, AIRCRAFT);
- // printf("aircraft up vector = %.2f %.2f %.2f\n",
- // vec[0], vec[1], vec[2]);
- MAT3rotate(TMP, vec, -view_offset );
- MAT3mult(VIEW_OFFSET, AIRCRAFT, TMP);
- // printf("VIEW_OFFSET matrix\n");
- // MAT3print(VIEW_OFFSET, stdout);
-
- // View position in scenery centered coordinates
- MAT3_SET_HVEC(vec, view_pos.x(), view_pos.y(), view_pos.z(), 1.0);
- MAT3translate(T_view, vec);
- // printf("\nTranslation matrix\n");
- // MAT3print(T_view, stdout);
-
- // Latitude
- MAT3_SET_HVEC(vec, 1.0, 0.0, 0.0, 1.0);
- // R_Lat = rotate about X axis
- MAT3rotate(R_Lat, vec, f->get_Latitude());
- // printf("\nLatitude matrix\n");
- // MAT3print(R_Lat, stdout);
-
- // Longitude
- MAT3_SET_HVEC(vec, 0.0, 0.0, 1.0, 1.0);
- // R_Lon = rotate about Z axis
- MAT3rotate(R_Lon, vec, f->get_Longitude() - FG_PI_2 );
- // printf("\nLongitude matrix\n");
- // MAT3print(R_Lon, stdout);
-
- // lon/lat
- MAT3mult(WORLD, R_Lat, R_Lon);
- // printf("\nworld\n");
- // MAT3print(WORLD, stdout);
-
- MAT3mult(EYE_TO_WORLD, VIEW_OFFSET, WORLD);
- MAT3mult(EYE_TO_WORLD, EYE_TO_WORLD, T_view);
- // printf("\nEye to world\n");
- // MAT3print(EYE_TO_WORLD, stdout);
-
- MAT3invert(WORLD_TO_EYE, EYE_TO_WORLD);
- // printf("\nWorld to eye\n");
- // MAT3print(WORLD_TO_EYE, stdout);
-
- // printf( "\nview_pos = %.2f %.2f %.2f\n",
- // view_pos.x, view_pos.y, view_pos.z );
-
- // MAT3_SET_HVEC(eye, 0.0, 0.0, 0.0, 1.0);
- // MAT3mult_vec(vec, eye, EYE_TO_WORLD);
- // printf("\neye -> world = %.2f %.2f %.2f\n", vec[0], vec[1], vec[2]);
-
- // MAT3_SET_HVEC(vec1, view_pos.x, view_pos.y, view_pos.z, 1.0);
- // MAT3mult_vec(vec, vec1, WORLD_TO_EYE);
- // printf( "\nabs_view_pos -> eye = %.2f %.2f %.2f\n",
- // vec[0], vec[1], vec[2]);
-#else // FG_VIEW_INLINE_OPTIMIZATIONS
-
- MAT3_SET_HVEC(vec, -AIRCRAFT[1][0], -AIRCRAFT[1][1], -AIRCRAFT[1][2], -AIRCRAFT[1][3]);
- getRotMatrix((double *)TMP, vec, -view_offset );
- MAT3mult(VIEW_OFFSET, AIRCRAFT, TMP);
- // MAT3print_formatted(VIEW_OFFSET, stdout, "VIEW_OFFSET matrix:\n",
- // NULL, "%#8.6f ", "\n");
-
- // Build spherical to cartesian transform matrix directly
- double *mat = (double *)WORLD; //T_view; //WORLD;
- double cos_lat = f->get_cos_latitude(); //cos(f->get_Latitude());
- double sin_lat = f->get_sin_latitude(); //sin(f->get_Latitude());
- // using trig identities this:
- // mat[0] = cos(f->get_Longitude() - FG_PI_2);//cos_lon;
- // mat[1] = sin(f->get_Longitude() - FG_PI_2);//sin_lon;
- // becomes this: :-)
- mat[0] = f->get_sin_longitude(); //cos_lon;
- mat[1] = -f->get_cos_longitude(); //sin_lon;
- mat[4] = -cos_lat*mat[1]; //mat[1]=sin_lon;
- mat[5] = cos_lat*mat[0]; //mat[0]=cos_lon;
- mat[6] = sin_lat;
- mat[8] = sin_lat*mat[1]; //mat[1]=sin_lon;
- mat[9] = -sin_lat*mat[0]; //mat[0]=cos_lon;
- mat[10] = cos_lat;
-
- // BUILD EYE_TO_WORLD = AIRCRAFT * WORLD
- // and WORLD_TO_EYE = Inverse( EYE_TO_WORLD) concurrently
- // by Transposing the 3x3 rotation sub-matrix
- WORLD_TO_EYE[0][0] = EYE_TO_WORLD[0][0] =
- VIEW_OFFSET[0][0]*mat[0] + VIEW_OFFSET[0][1]*mat[4] + VIEW_OFFSET[0][2]*mat[8];
-
- WORLD_TO_EYE[1][0] = EYE_TO_WORLD[0][1] =
- VIEW_OFFSET[0][0]*mat[1] + VIEW_OFFSET[0][1]*mat[5] + VIEW_OFFSET[0][2]*mat[9];
-
- WORLD_TO_EYE[2][0] = EYE_TO_WORLD[0][2] =
- VIEW_OFFSET[0][1]*mat[6] + VIEW_OFFSET[0][2]*mat[10];
-
- WORLD_TO_EYE[0][1] = EYE_TO_WORLD[1][0] =
- VIEW_OFFSET[1][0]*mat[0] + VIEW_OFFSET[1][1]*mat[4] + VIEW_OFFSET[1][2]*mat[8];
-
- WORLD_TO_EYE[1][1] = EYE_TO_WORLD[1][1] =
- VIEW_OFFSET[1][0]*mat[1] + VIEW_OFFSET[1][1]*mat[5] + VIEW_OFFSET[1][2]*mat[9];
-
- WORLD_TO_EYE[2][1] = EYE_TO_WORLD[1][2] =
- VIEW_OFFSET[1][1]*mat[6] + VIEW_OFFSET[1][2]*mat[10];
-
- WORLD_TO_EYE[0][2] = EYE_TO_WORLD[2][0] =
- VIEW_OFFSET[2][0]*mat[0] + VIEW_OFFSET[2][1]*mat[4] + VIEW_OFFSET[2][2]*mat[8];
-
- WORLD_TO_EYE[1][2] = EYE_TO_WORLD[2][1] =
- VIEW_OFFSET[2][0]*mat[1] + VIEW_OFFSET[2][1]*mat[5] + VIEW_OFFSET[2][2]*mat[9];
-
- WORLD_TO_EYE[2][2] = EYE_TO_WORLD[2][2] =
- VIEW_OFFSET[2][1]*mat[6] + VIEW_OFFSET[2][2]*mat[10];
-
- // TRANSLATE TO VIEW POSITION
- EYE_TO_WORLD[3][0] = view_pos.x();
- EYE_TO_WORLD[3][1] = view_pos.y();
- EYE_TO_WORLD[3][2] = view_pos.z();
-
- // FILL 0 ENTRIES
- WORLD_TO_EYE[0][3] = WORLD_TO_EYE[1][3] = WORLD_TO_EYE[2][3] =
- EYE_TO_WORLD[0][3] = EYE_TO_WORLD[1][3] = EYE_TO_WORLD[2][3] = 0.0;
-
- // FILL UNITY ENTRIES
- WORLD_TO_EYE[3][3] = EYE_TO_WORLD[3][3] = 1.0;
-
- /* MAKE THE INVERTED TRANSLATIONS */
- mat = (double *)EYE_TO_WORLD;
- WORLD_TO_EYE[3][0] = -mat[12]*mat[0]
- -mat[13]*mat[1]
- -mat[14]*mat[2];
-
- WORLD_TO_EYE[3][1] = -mat[12]*mat[4]
- -mat[13]*mat[5]
- -mat[14]*mat[6];
-
- WORLD_TO_EYE[3][2] = -mat[12]*mat[8]
- -mat[13]*mat[9]
- -mat[14]*mat[10];
-
- // MAT3print_formatted(EYE_TO_WORLD, stdout, "EYE_TO_WORLD matrix:\n",
- // NULL, "%#8.6f ", "\n");
-
- // MAT3print_formatted(WORLD_TO_EYE, stdout, "WORLD_TO_EYE matrix:\n",
- // NULL, "%#8.6f ", "\n");
-
-#endif // defined(FG_VIEW_INLINE_OPTIMIZATIONS)
-}
-
-
-#if 0
-// Reject non viewable spheres from current View Frustrum by Curt
-// Olson curt@me.umn.edu and Norman Vine nhv@yahoo.com with 'gentle
-// guidance' from Steve Baker sbaker@link.com
-int
-FGView::SphereClip( const Point3D& cp, const double radius )
-{
- double x1, y1;
-
- MAT3vec eye;
- double *mat;
- double x, y, z;
-
- x = cp->x;
- y = cp->y;
- z = cp->z;
-
- mat = (double *)(WORLD_TO_EYE);
-
- eye[2] = x*mat[2] + y*mat[6] + z*mat[10] + mat[14];
-
- // Check near and far clip plane
- if( ( eye[2] > radius ) ||
- ( eye[2] + radius + current_weather.visibility < 0) )
- // ( eye[2] + radius + far_plane < 0) )
- {
- return 1;
- }
-
- // check right and left clip plane (from eye perspective)
- x1 = radius * fov_x_clip;
- eye[0] = (x*mat[0] + y*mat[4] + z*mat[8] + mat[12]) * slope_x;
- if( (eye[2] > -(eye[0]+x1)) || (eye[2] > (eye[0]-x1)) ) {
- return(1);
- }
-
- // check bottom and top clip plane (from eye perspective)
- y1 = radius * fov_y_clip;
- eye[1] = (x*mat[1] + y*mat[5] + z*mat[9] + mat[13]) * slope_y;
- if( (eye[2] > -(eye[1]+y1)) || (eye[2] > (eye[1]-y1)) ) {
- return 1;
- }
-
- return 0;
-}
-#endif
-
-
// Destructor
FGView::~FGView( void ) {
}