]> 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 cf00f911c6eb467d3af4d60c5fea447dff3014d2..287b845b3f0956eb11df6448bbd0ca3f2e852eda 100644 (file)
@@ -54,7 +54,7 @@ void FGATCDisplay::unbind() {
 }
 
 // update - this actually draws the visuals and should be called from the main Flightgear rendering loop.
-void FGATCDisplay::update(int dt) {
+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
@@ -132,8 +132,75 @@ void FGATCDisplay::update(int dt) {
        }
        
     }
+
+    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;