]> git.mxchange.org Git - flightgear.git/blobdiff - src/ATC/ATCdisplay.cxx
More efficient rotation matrix calc from Norm Vine.
[flightgear.git] / src / ATC / ATCdisplay.cxx
index c3a91ba75327213579fcd467eae0c7e1e938c561..287b845b3f0956eb11df6448bbd0ca3f2e852eda 100644 (file)
 #include "ATCdisplay.hxx"
 
 
-FGATCDisplay *current_atcdisplay;
-
-
 // Constructor
-FGATCDisplay::FGATCDisplay( void ) {
+FGATCDisplay::FGATCDisplay() {
     rep_msg = false;
+    change_msg_flag = false;
     dsp_offset1 = 0;
     dsp_offset2 = 0;
 }
 
 
 // Destructor
-FGATCDisplay::~FGATCDisplay( void ) {
+FGATCDisplay::~FGATCDisplay() {
 }
 
-void FGATCDisplay::init( void ) {
+void FGATCDisplay::init() {
 }
 
+void FGATCDisplay::bind() {
+}
+
+void FGATCDisplay::unbind() {
+}
 
 // update - this actually draws the visuals and should be called from the main Flightgear rendering loop.
-void FGATCDisplay::update() {
+void FGATCDisplay::update(double dt) {
+
+    // These strings are used for temporary storage of the transmission string in order
+    // that the string we view only changes when the next repetition starts scrolling
+    // even though the master string (rep_msg_str) may change at any time.
+    static string msg1 = "";
+    static string msg2 = "";
 
     if(rep_msg) {
+       //cout << "dsp_offset1 = " << dsp_offset1 << " dsp_offset2 = " << dsp_offset2 << endl;
+       if(dsp_offset1 == 0) {
+           msg1 = rep_msg_str;
+       }
+       if(dsp_offset2 == 0) {
+           msg2 = rep_msg_str;
+       }
+       // Check for the situation where one offset is negative and the message is changed
+       if(change_msg_flag) {
+           if(dsp_offset1 < 0) {
+               msg1 = rep_msg_str;
+           } else if(dsp_offset2 < 0) {
+               msg2 = rep_msg_str;
+           }
+           change_msg_flag = false;
+       }
+
        float fps = general.get_frame_rate();
        
        //cout << "In FGATC::update()" << endl;
@@ -62,13 +88,6 @@ void FGATCDisplay::update() {
        int iwidth   = xsize_node->getIntValue();
        int iheight  = ysize_node->getIntValue();
        
-       //TODO - if the string is bigger than the buffer the program exits - we really ought to have a robust check here
-       char buf[256];
-       //float fps = visibility/1600;
-       //      sprintf(buf,"%-4.1f  %7.0f  %7.0f", fps, tris, culled);
-//     sprintf(buf,"%s %-5.1f", "visibility ", visibility);
-       sprintf(buf,"%s", rep_msg_str.c_str());
-       
        glMatrixMode( GL_PROJECTION );
        glPushMatrix();
        glLoadIdentity();
@@ -82,13 +101,13 @@ void FGATCDisplay::update() {
        
        glColor3f( 0.9, 0.4, 0.2 );
        
-//     guiFnt.drawString( buf,
+//     guiFnt.drawString( rep_msg_str.c_str(),
 //         int(iwidth - guiFnt.getStringWidth(buf) - 10 - (int)dsp_offset),
 //         (iheight - 20) );
-       guiFnt.drawString( buf,
+       guiFnt.drawString( msg1.c_str(),
            int(iwidth - 10 - dsp_offset1),
            (iheight - 20) );
-       guiFnt.drawString( buf,
+       guiFnt.drawString( msg2.c_str(),
            int(iwidth - 10 - dsp_offset2),
            (iheight - 20) );
        glEnable( GL_DEPTH_TEST );
@@ -113,8 +132,75 @@ void FGATCDisplay::update() {
        }
        
     }
+
+    if(msgList.size()) {
+       //cout << "Attempting to render single message\n";
+       // We have at least one non-repeating message to process
+       msgList_itr = msgList.begin();
+       int i = 0;
+       while(msgList_itr != msgList.end()) {
+           atcMessage m = *msgList_itr;
+           //cout << "m.counter = " << m.counter << '\n';
+           if(m.counter > m.stop_count) {
+               //cout << "Stopping single message\n";
+               msgList_itr = msgList.erase(msgList_itr);
+           } else if(m.counter > m.start_count) {
+               //cout << "Displaying single message\n";
+               // Display the message
+               // FIXME - I'm sure all this opengl code should only be called once until all drawing is finished
+               SGPropertyNode *xsize_node = fgGetNode("/sim/startup/xsize");
+               SGPropertyNode *ysize_node = fgGetNode("/sim/startup/ysize");
+               int iwidth   = xsize_node->getIntValue();
+               int iheight  = ysize_node->getIntValue();
+               glMatrixMode( GL_PROJECTION );
+               glPushMatrix();
+               glLoadIdentity();
+               gluOrtho2D( 0, iwidth, 0, iheight );
+               glMatrixMode( GL_MODELVIEW );
+               glPushMatrix();
+               glLoadIdentity();
+               
+               glDisable( GL_DEPTH_TEST );
+               glDisable( GL_LIGHTING );
+       
+               glColor3f( 0.9, 0.4, 0.2 );
+       
+               guiFnt.drawString( m.msg.c_str(),
+                   100,
+                   (iheight - 40) );   // TODO - relate the distance in that the string is rendered to the string length.
+               glEnable( GL_DEPTH_TEST );
+               glEnable( GL_LIGHTING );
+               glMatrixMode( GL_PROJECTION );
+               glPopMatrix();
+               glMatrixMode( GL_MODELVIEW );
+               glPopMatrix();
+               ++m.counter;
+               msgList[i] = m;
+               ++msgList_itr;
+               ++i;
+           } else {
+               ++m.counter;
+               msgList[i] = m;
+               ++msgList_itr;
+               ++i;
+           }
+       }
+    }
 }
 
+void FGATCDisplay::RegisterSingleMessage(string msg, int delay) {
+    atcMessage m;
+    m.msg = msg;
+    m.repeating = false;
+    m.counter = 0;
+    m.start_count = delay * 30;                // Fixme - need to use actual FPS
+    m.stop_count = m.start_count + 100;                // Display for 3 - 5 seconds for now - this might have to change eg. be related to length of message in future
+    //cout << "m.stop_count = " << m.stop_count << '\n';
+    m.id = 0;
+    
+    msgList.push_back(m);
+    //cout << "Single message registered\n";
+}
 
 void FGATCDisplay::RegisterRepeatingMessage(string msg) {
     rep_msg = true;
@@ -123,7 +209,8 @@ void FGATCDisplay::RegisterRepeatingMessage(string msg) {
 }
 
 void FGATCDisplay::ChangeRepeatingMessage(string newmsg) {
-    //Not implemented yet
+    rep_msg_str = newmsg;
+    change_msg_flag = true;
     return;
 }