- // Generate a "look at" matrix using OpenGL (!) coordinate
- // conventions.
- float lookat[3];
- float pitch = view->get_view_tilt();
- float rot = view->get_view_offset();
- lookat[0] = -sin(rot);
- lookat[1] = sin(pitch) / cos(pitch);
- lookat[2] = -cos(rot);
- if(fabs(lookat[1]) > 9999) lookat[1] = 9999; // FPU sanity
- gluLookAt(0, 0, 0, lookat[0], lookat[1], lookat[2], 0, 1, 0);
-
- // Translate the origin to the location of the panel quad
- glTranslatef(a[0], a[1], a[2]);
-
- // Generate a matrix to translate unit square coordinates from the
- // panel to real world coordinates. Use a basis for the panel
- // quad and invert. Note: this matrix is relatively expensive to
- // compute, and is invariant. Consider precomputing and storing
- // it. Also, consider using the plib vector math routines, so the
- // reuse junkies don't yell at me. (Fine, I hard-coded a cross
- // product. Just shoot me and be done with it.)
- float u[3], v[3], w[3], m[9];
- for(i=0; i<3; i++) u[i] = b[i] - a[i]; // U = B - A
- for(i=0; i<3; i++) v[i] = c[i] - a[i]; // V = C - A
- w[0] = u[1]*v[2] - v[1]*u[2]; // W = U x V
- w[1] = u[2]*v[0] - v[2]*u[0];
- w[2] = u[0]*v[1] - v[0]*u[1];
- for(int i=0; i<3; i++) { // |Ux Uy Uz|-1
- m[i] = u[i]; // m =|Vx Vy Vz|
- m[i+3] = v[i]; // |Wx Wy Wz|
- m[i+6] = w[i];
- }
- invert33Matrix(m);
-
- float glm[16]; // Expand to a 4x4 OpenGL matrix.
- glm[0] = m[0]; glm[4] = m[1]; glm[8] = m[2]; glm[12] = 0;
- glm[1] = m[3]; glm[5] = m[4]; glm[9] = m[5]; glm[13] = 0;
- glm[2] = m[6]; glm[6] = m[7]; glm[10] = m[8]; glm[14] = 0;
- glm[3] = 0; glm[7] = 0; glm[11] = 0; glm[15] = 1;
- glMultMatrixf(glm);
-
- // Finally, a scaling factor to convert the 1024x768 range the
- // panel uses to a unit square mapped to the panel quad.
- glScalef(1./1024, 1./768, 1);
-
- // Scale to the appropriate vertical size. I'm not quite clear on
- // this yet; an identical scaling is not appropriate for
- // _width, for example. This should probably go away when panel
- // coordinates get sanified for virtual cockpits.
- glScalef(1, _height/768.0, 1);
-
- // Now, turn off the Z buffer. The panel code doesn't need
- // it, and we're using different clip planes anyway (meaning we
- // can't share it without glDepthRange() hackery or much
- // framebuffer bandwidth wasteage)
- glDisable(GL_DEPTH_TEST);
-}
-
-void
-FGPanel::cleanupVirtualCockpit()
-{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- glEnable(GL_DEPTH_TEST);