]> git.mxchange.org Git - flightgear.git/blobdiff - src/Cockpit/hud_ladr.cxx
Small tweaks to initialization sequence and logic so we can default to
[flightgear.git] / src / Cockpit / hud_ladr.cxx
index 5127aea01f60dfcb21196d7d104ff0bd6adcf960..2ce6b2423b922ff8e36aea7312f79407ed8f9dd5 100644 (file)
@@ -29,7 +29,11 @@ HudLadder ::   HudLadder(  string name,
                           float     glide_slope_val,
                           bool      worm_energy,
                           bool      waypoint,
-                          bool      working) :
+                          bool      working,
+                          int           zenithsymbol, //suma
+                          int       nadirsymbol, //suma
+                          int           hat_marker): //suma
+
     dual_instr_item( x, y, width, height,
                     ptch_source,
                     roll_source,
@@ -45,12 +49,12 @@ HudLadder ::   HudLadder(  string name,
     factor                             ( factr           ),
     hudladder_type             ( name            ),
     frl                                        ( frl_spot              ),
+    target_spot                        ( target                ),
     velocity_vector            ( vel_vec               ),
     drift_marker               ( drift                 ),
     alpha_bracket              ( alpha                 ),
     energy_marker              ( energy                ),
     climb_dive_marker  ( climb         ),
-    target_spot                        ( target                ),
     glide_slope_marker ( glide                 ),
     glide_slope                        ( glide_slope_val),
     energy_worm                        ( worm_energy),
@@ -58,8 +62,14 @@ HudLadder ::   HudLadder(  string name,
 
 
 {
-    if( !width_units ) {
-       width_units = 45;
+               
+    zenith= zenithsymbol; //suma
+       nadir=nadirsymbol; //suma
+       hat= hat_marker; //suma
+       if( !width_units ) 
+       {
+          width_units = 45;
     }
 }
    
@@ -79,12 +89,12 @@ HudLadder( const HudLadder & image ) :
     factor                             ( image.factor        ),
     hudladder_type             ( image.hudladder_type),
     frl                                        ( image.frl),
+    target_spot                        ( image.target_spot),
     velocity_vector            ( image.velocity_vector),
     drift_marker               ( image.drift_marker),
     alpha_bracket              ( image.alpha_bracket),
     energy_marker              ( image.energy_marker),
     climb_dive_marker  ( image.climb_dive_marker),
-    target_spot                        ( image.target_spot),
     glide_slope_marker ( image.glide_slope_marker),
     glide_slope                        ( image.glide_slope),
     energy_worm                        ( image.energy_worm),
@@ -127,15 +137,17 @@ void HudLadder :: draw( void )
 
     float  x_ini,x_ini2;
     float  x_end,x_end2;
-    float  y;
+    float  y = 0;
     int count;
-    float cosine, sine,xvvr,yvvr,Vxx,Vyy,Vzz,up_vel,ground_vel,actslope;
-    float Axx,Ayy,Azz,total_vel,pot_slope,t1,t2,psi,alpha,pla;
-    float vel_x,vel_y,drift;
-    char     Textaux[8] ;
-    bool  pitch_ladder;
-    bool  climb_dive_ladder;
-    bool  clip_plane;
+    float cosine, sine, xvvr, yvvr, Vxx = 0.0, Vyy = 0.0, Vzz = 0.0,
+        up_vel, ground_vel, actslope = 0.0;
+    float Axx = 0.0, Ayy = 0.0, Azz = 0.0, total_vel = 0.0, pot_slope, t1,
+        t2 = 0.0, psi = 0.0, alpha,pla;
+    float vel_x = 0.0, vel_y = 0.0, drift;
+    // char     Textaux[8] ;
+    bool  pitch_ladder = false;
+    bool  climb_dive_ladder = false;
+    bool  clip_plane = false;
 
     GLdouble eqn_top[4] = {0.0,-1.0,0.0,0.0};
     GLdouble eqn_left[4] = {-1.0,0.0,0.0,100.0};
@@ -150,13 +162,13 @@ void HudLadder :: draw( void )
     pla = get_throttleval();
 
     int lgear,wown,wowm,ilcanclaw,ihook;
-    ilcanclaw = get_iaux1();
-    lgear = get_iaux2();
-    wown = get_iaux3();
-    wowm = get_iaux4();
-    ihook = get_iaux5();
+    ilcanclaw = get_iaux2();
+    lgear = get_iaux3();
+    wown = get_iaux4();
+    wowm = get_iaux5();
+    ihook = get_iaux6();
     
-    float pitch_value = current_ch1() * RAD_TO_DEG;
+    float pitch_value = current_ch1() * SGD_RADIANS_TO_DEGREES;
        
     if(hudladder_type=="Climb/Dive Ladder") {
        pitch_ladder = false;
@@ -164,7 +176,8 @@ void HudLadder :: draw( void )
        clip_plane = true;
     }
     else
-       if(hudladder_type=="Pitch Ladder") {
+       // hudladder_type=="Pitch Ladder" 
+       {
            pitch_ladder = true;
            climb_dive_ladder = false;
            clip_plane = false;
@@ -234,14 +247,16 @@ void HudLadder :: draw( void )
                actslope = (up_vel/fabs(up_vel))*90.0;
            }
        } else {
-           actslope = atan(up_vel/ground_vel)*RAD_TO_DEG;
+           actslope = atan(up_vel/ground_vel)*SGD_RADIANS_TO_DEGREES;
        }
 
-       xvvr = (((atan2(Vyy,Vxx)*RAD_TO_DEG)-psi)*(640.0/45.0));
-       drift = ((atan2(Vyy,Vxx)*RAD_TO_DEG)-psi);
+       xvvr = (((atan2(Vyy,Vxx)*SGD_RADIANS_TO_DEGREES)-psi)*
+               (factor/globals->get_current_view()->get_aspect_ratio()));
+       drift = ((atan2(Vyy,Vxx)*SGD_RADIANS_TO_DEGREES)-psi);
        yvvr = ((actslope - pitch_value)*factor);
        vel_y = ((actslope -pitch_value) * cos(roll_value) + drift*sin(roll_value))*factor;
-       vel_x = (-(actslope -pitch_value)*sin(roll_value) + drift*cos(roll_value))*(640/45.0);
+       vel_x = (-(actslope -pitch_value)*sin(roll_value) + drift*cos(roll_value))*
+               (factor/globals->get_current_view()->get_aspect_ratio());
        //  printf("%f %f %f %f\n",vel_x,vel_y,drift,psi);
        //****************************************************************    
        // OBJECT MOVING RETICLE
@@ -369,7 +384,7 @@ void HudLadder :: draw( void )
            t1 = up_vel/total_vel;
            t2 = asin((Vxx*Axx + Vyy*Ayy + Vzz*Azz)/(9.81*total_vel));
        }
-       pot_slope = ((t2/3)*RAD_TO_DEG)*factor + vel_y;
+       pot_slope = ((t2/3)*SGD_RADIANS_TO_DEGREES)*factor + vel_y;
        //    if (pot_slope < (vel_y - 45)) pot_slope = vel_y-45;
        //    if (pot_slope > (vel_y + 45)) pot_slope = vel_y+45;
 
@@ -413,8 +428,8 @@ void HudLadder :: draw( void )
            // ATTRIB - ON CONDITION
            glBegin(GL_LINE_STRIP);
            glVertex2f(-6, -134);
-           glVertex2f(-6, t2*RAD_TO_DEG*4.0 - 134);
-           glVertex2f(+6, t2*RAD_TO_DEG*4.0 - 134);
+           glVertex2f(-6, t2*SGD_RADIANS_TO_DEGREES*4.0 - 134);
+           glVertex2f(+6, t2*SGD_RADIANS_TO_DEGREES*4.0 - 134);
            glVertex2f(6, -134);
            glEnd();
            // OBJECT MOVING RETICLE
@@ -444,7 +459,8 @@ void HudLadder :: draw( void )
 
     //****************************************************************    
 
-    if(climb_dive_ladder) {// CONFORMAL_HUD
+    if(climb_dive_ladder)
+       {                     // CONFORMAL_HUD
 
        vmin              = pitch_value - (float)width_units;
        vmax              = pitch_value + (float)width_units; 
@@ -453,18 +469,19 @@ void HudLadder :: draw( void )
 
     }
     else 
-       if (pitch_ladder) {//Default Hud
+       // pitch_ladder - Default Hud
+       {
 
            vmin              = pitch_value - (float)width_units * 0.5f;
            vmax              = pitch_value + (float)width_units * 0.5f;
 
        }
 
-    glRotatef(roll_value * RAD_TO_DEG, 0.0, 0.0, 1.0);
+    glRotatef(roll_value * SGD_RADIANS_TO_DEGREES, 0.0, 0.0, 1.0);
     // FRL marker not rotated - this line shifted below
 
-    if( div_units ) {
-  
+    if( div_units ) 
+       {
         char     TextLadder[8] ;
         float    label_length ;
         float    label_height ;
@@ -473,32 +490,34 @@ void HudLadder :: draw( void )
         float    bot ;
         float    top ;
         float    text_offset = 4.0f ;
-       float    zero_offset;
+       float    zero_offset = 0.0;
                
-       if(climb_dive_ladder)
-           zero_offset = 50.0f ;
-       else
-           if(pitch_ladder)
+       if ( climb_dive_ladder ) {
+           zero_offset = 50.0f ; // horizon line is wider by this much (hard coded ??)
+       } else {
                zero_offset = 10.0f ;
+    }
                
        fntFont *font      = HUDtext->getFont();
        float    pointsize = HUDtext->getPointSize();
        float    italic    = HUDtext->getSlant();
 
-        TextList.setFont( HUDtext );
-        TextList.erase();
-        LineList.erase();
-        StippleLineList.erase();
+    TextList.setFont( HUDtext );
+    TextList.erase();
+    LineList.erase();
+    StippleLineList.erase();
 
-        int last = FloatToInt(vmax)+1;
-        int i    = FloatToInt(vmin);
+    int last = FloatToInt(vmax)+1;
+    int i    = FloatToInt(vmin);
 
         if( !scr_hole ) {
            x_end =  half_span;
-            for( ; i<last ; i++ ) {
+            for( ; i<last ; i++ ) 
+                       {
                 
                 y =  (((float)(i - pitch_value) * factor) + .5f);
-                if( !(i % div_units ))    {        //  At integral multiple of div
+                if( !(i % div_units ))            //  At integral multiple of div
+                               {
                 
                     sprintf( TextLadder, "%d", i );
                     font->getBBox ( TextLadder, pointsize, italic,
@@ -509,15 +528,30 @@ void HudLadder :: draw( void )
                 
                     x_ini = -half_span;
                     
-                    if( i >= 0 ) {
+                    if( i >= 0 ) 
+                                       {
                         // Make zero point wider on left
                         if( i == 0 )
                             x_ini -= zero_offset;
-                        // Zero or above draw solid lines
-                        Line(x_ini, y, x_end, y);
+                            
+                                               // Zero or above draw solid lines
+                                               Line(x_ini, y, x_end, y);
+                                               
+                                               if(i == 90)
+                                               if(zenith == 1)
+                                               {
+                                                 drawZenith(x_ini, x_end,y);
+                                               }
                     } else {
                         // Below zero draw dashed lines.
                         StippleLine(x_ini, y, x_end, y);
+
+                                               
+                                               if(i == -90)
+                                               if(nadir ==1)
+                                               { 
+                                                       drawNadir(x_ini, x_end,y);
+                                               }
                     }
                     
                     // Calculate the position of the left text and write it.
@@ -532,7 +566,8 @@ void HudLadder :: draw( void )
 
                x_end = -half_span + hole;
                x_ini2= half_span  - hole;
-               for( ; i<last ; i++ )      {
+               for( ; i<last ; i++ )      
+               {
 
                    if(hudladder_type=="Pitch Ladder")
                        y = (((float)(i - pitch_value) * factor) + .5);
@@ -555,30 +590,48 @@ void HudLadder :: draw( void )
                        x_ini = -half_span;
                        x_end2= half_span;
                     
-                       if( i >= 0 ) { 
+                       if( i >= 0 ) 
+                       { 
                            // Make zero point wider on left
-                           if( i == 0 ) {
-                               x_ini -= zero_offset;
-                               x_end2 +=zero_offset;
-                           } else {
-                               if(climb_dive_ladder){
-                                   // Zero or above draw solid lines
-                                   Line(x_end, y-5.0, x_end, y);
-                                   Line(x_ini2, y-5.0, x_ini2, y);
-                               }
+                           if( i == 0 ) 
+                               {
+                                   x_ini -= zero_offset;
+                                       x_end2 +=zero_offset;
+                           } 
+                           //draw climb bar vertical lines
+                               if(climb_dive_ladder)
+                               {
+                                  // Zero or above draw solid lines
+                                  Line(x_end, y-5.0, x_end, y);
+                                  Line(x_ini2, y-5.0, x_ini2, y);
                            }
-
+                               // draw pitch / climb bar
                            Line(x_ini, y, x_end, y);
                            Line(x_ini2, y, x_end2, y);
 
-                       } else {
-                           // Below zero draw dashed lines.
-                           if(climb_dive_ladder) {
-                               Line(x_end, y+5.0, x_end, y);
-                               Line(x_ini2, y+5.0, x_ini2, y);
+                               if(i == 90)
+                               if(zenith == 1)
+                               {  
+                                 drawZenith(x_ini2, x_end,y);
+                               }
+                       }
+                       else  // i < 0
+                       {
+                           // draw dive bar vertical lines
+                           if(climb_dive_ladder) 
+                               {
+                                       Line(x_end, y+5.0, x_end, y);
+                                       Line(x_ini2, y+5.0, x_ini2, y);
                            }
-                           StippleLine(x_ini, y, x_end, y);
+                           // draw pitch / dive bars
+                               StippleLine(x_ini, y, x_end, y);
                            StippleLine(x_ini2, y, x_end2, y);
+               
+                           if(i == -90)
+                           if(nadir == 1)
+                               {
+                                   drawNadir(x_ini2, x_end,y);
+                               }
                        }
                     
                        // Now calculate the location of the left side label using
@@ -621,10 +674,10 @@ void HudLadder :: draw( void )
        //waypoint marker computation
        float fromwp_lat,towp_lat,fromwp_lon,towp_lon,dist,delx,dely,hyp,theta,brg;
 
-       fromwp_lon = get_longitude()*DEG_TO_RAD;
-       fromwp_lat = get_latitude()*DEG_TO_RAD;
-       towp_lon = get_aux5()*DEG_TO_RAD;
-       towp_lat = get_aux6()*DEG_TO_RAD;
+       fromwp_lon = get_longitude()*SGD_DEGREES_TO_RADIANS;
+       fromwp_lat = get_latitude()*SGD_DEGREES_TO_RADIANS;
+       towp_lon = get_aux2()*SGD_DEGREES_TO_RADIANS;
+       towp_lat = get_aux1()*SGD_DEGREES_TO_RADIANS;
 
        dist = acos(sin(fromwp_lat)*sin(towp_lat)+cos(fromwp_lat)*cos(towp_lat)*cos(fabs(fromwp_lon-towp_lon)));
        delx= towp_lat - fromwp_lat;
@@ -635,19 +688,21 @@ void HudLadder :: draw( void )
        } else {
            theta = 0.0;
        }
-       brg = theta*RAD_TO_DEG;
+       brg = theta*SGD_RADIANS_TO_DEGREES;
        if (brg > 360.0) brg = 0.0;
        if (delx < 0) brg = 180 - brg;
 
        //        {Brg  = asin(cos(towp_lat)*sin(fabs(fromwp_lon-towp_lon))/ sin(dist));
-       //        Brg = Brg * RAD_TO_DEG; }
-       dist = dist*RAD_TO_DEG * 60.0*1852.0; //rad->deg->nm->m
+       //        Brg = Brg * SGD_RADIANS_TO_DEGREES; }
+       dist = dist*SGD_RADIANS_TO_DEGREES * 60.0*1852.0; //rad->deg->nm->m
        // end waypoint marker computation
        //*********************************************************
        // OBJECT MOVING RETICLE
        // TYPE ARROW
        // waypoint marker
-       if (fabs(brg-psi) > 10.0) {
+
+         if (fabs(brg-psi) > 10.0) 
+         {
            glPushMatrix();
            glTranslatef( centroid.x, centroid.y, 0);
            glTranslatef( vel_x, vel_y, 0);
@@ -662,9 +717,13 @@ void HudLadder :: draw( void )
            glVertex2f(2.5,20.0);
            glEnd();
            glPopMatrix();
-       }
-       // waypoint marker on heading scale
-       if (fabs(brg-psi) < 12.0) {
+         }
+
+         // waypoint marker on heading scale
+         if (fabs(brg-psi) < 12.0) 
+         {
+         if(hat ==0)
+         {
            glBegin(GL_LINE_LOOP);
            glVertex2f(((brg-psi)*60/25)+320,240.0);
            glVertex2f(((brg-psi)*60/25)+326,240.0-4);
@@ -674,7 +733,155 @@ void HudLadder :: draw( void )
            glVertex2f(((brg-psi)*60/25)+317,240.0-4);
            glVertex2f(((brg-psi)*60/25)+314,240.0-4);
            glEnd();
-       }
-       //*************************************************************
-    }// if waypoint_marker
+         } else {//if hat=0
+
+                 float x= (brg-psi)*60/25 + 320,  y=240.0, r=5.0;
+                 float x1,y1;
+                                                               
+                 glEnable(GL_POINT_SMOOTH);
+                                                                                 
+         glBegin(GL_POINTS);
+                       
+                 for(int count=0; count<=200; count++)
+                 {
+                       float temp = count * 3.142 * 3 / (200.0*2.0);
+                       float temp1 = temp-(45.0*SGD_DEGREES_TO_RADIANS);
+                   x1 = x + r * cos(temp1); 
+                   y1 = y + r * sin(temp1);
+                                        
+                       glVertex2f(x1, y1);
+                 }
+                                       
+                 glEnd();
+                 glDisable(GL_POINT_SMOOTH); 
+         } //hat=0
+
+         } //brg<12
+    } // if waypoint_marker
 }//draw
+
+/******************************************************************/
+
+//begin suma
+       //  draws the zenith symbol  for highest possible climb angle (i,e 90 degree climb angle)
+
+void HudLadder :: 
+drawZenith(float xfirst,float xlast,float yvalue )
+{
+
+            float xcentre = (xfirst + xlast)/2.0;
+                float ycentre = yvalue;
+
+         Line(xcentre-9.0, ycentre, xcentre-3.0, ycentre+1.3);
+            Line(xcentre-9.0, ycentre, xcentre-3.0, ycentre-1.3);
+  
+            Line(xcentre+9.0, ycentre, xcentre+3.0, ycentre+1.3);
+            Line(xcentre+9.0, ycentre, xcentre+3.0, ycentre-1.3);
+
+            Line(xcentre, ycentre+9.0, xcentre-1.3, ycentre+3.0);
+            Line(xcentre, ycentre+9.0, xcentre+1.3, ycentre+3.0);
+
+                Line(xcentre-3.9, ycentre+3.9, xcentre-3.0, ycentre+1.3);
+            Line(xcentre-3.9, ycentre+3.9, xcentre-1.3, ycentre+3.0);
+
+            Line(xcentre+3.9, ycentre+3.9, xcentre+1.3, ycentre+3.0);
+            Line(xcentre+3.9, ycentre+3.9, xcentre+3.0, ycentre+1.3);
+
+            Line(xcentre-3.9, ycentre-3.9, xcentre-3.0, ycentre-1.3);
+            Line(xcentre-3.9, ycentre-3.9, xcentre-1.3, ycentre-2.6);
+
+            Line(xcentre+3.9, ycentre-3.9, xcentre+3.0, ycentre-1.3);
+            Line(xcentre+3.9, ycentre-3.9, xcentre+1.3, ycentre-2.6);
+
+            Line(xcentre-1.3, ycentre-2.6, xcentre, ycentre-27.0);
+         Line(xcentre+1.3, ycentre-2.6, xcentre, ycentre-27.0);
+
+  
+} 
+       //end suma
+
+//begin suma
+       //  draws the nadir symbol  for lowest possible dive angle (i,e 90 degree dive angle)
+
+
+void HudLadder ::
+drawNadir(float xfirst, float xlast, float yvalue)
+{
+
+            float xcentre = (xfirst + xlast)/2.0;
+                float ycentre = yvalue;    
+
+
+               float r = 7.5;
+               float ang,temp;
+               float x1,y1,x2,y2,xcent,ycent;
+
+       
+        // to draw a circle
+
+               float xcent1, xcent2, ycent1, ycent2;
+               xcent1 = xcentre + r * cos(0.0);
+               ycent1 = ycentre + r * sin(0.0);
+       for(int count=1; count<=400; count++) 
+               {  
+                       float temp = count * 2 * 3.142 / 400.0;
+                   xcent2 = xcentre + r * cos(temp); 
+                       ycent2 = ycentre + r * sin(temp);                           
+                       
+                       Line(xcent1, ycent1, xcent2, ycent2);
+
+                       xcent1 = xcent2;
+                       ycent1 = ycent2;
+               }     
+               
+               xcent2 = xcentre + r * cos(0.0);
+               ycent2 = ycentre + r * sin(0.0);
+
+        drawOneLine(xcent1, ycent1, xcent2, ycent2); //to connect last point to first point
+               //end circle
+
+
+               Line(xcentre, ycentre+7.5, xcentre, ycentre+22.5); //to draw a line above the circle
+
+               Line(xcentre-7.5, ycentre, xcentre+7.5,ycentre); //line in the middle of circle
+
+               float theta = asin (2.5/7.5);
+               float theta1 = asin(5.0/7.5);
+
+                x1 = xcentre + r * cos(theta);
+                y1 = ycentre + 2.5;
+
+                x2 = xcentre + r * cos((180.0 * SGD_DEGREES_TO_RADIANS) - theta);
+                y2 = ycentre + 2.5;
+
+                Line(x1,y1,x2,y2);
+
+               
+                x1 = xcentre + r * cos(theta1);
+                y1 = ycentre + 5.0;
+
+                x2 = xcentre + r * cos((180.0 * SGD_DEGREES_TO_RADIANS)-theta1);
+                y2 = ycentre + 5.0;
+
+                Line(x1,y1,x2,y2);
+
+
+                x1 = xcentre + r * cos((180.0 * SGD_DEGREES_TO_RADIANS) +theta);
+                y1 = ycentre - 2.5;
+
+                x2 = xcentre + r * cos((360.0* SGD_DEGREES_TO_RADIANS)-theta);
+                y2 = ycentre - 2.5;
+
+                Line(x1,y1,x2,y2);
+
+               
+                x1 = xcentre + r * cos((180.0* SGD_DEGREES_TO_RADIANS) +theta1);
+                y1 = ycentre - 5.0;
+
+                x2 = xcentre + r * cos((360.0* SGD_DEGREES_TO_RADIANS)-theta1);
+                y2 = ycentre - 5.0;
+
+                Line(x1,y1,x2,y2);
+
+
+}