Revision: 6739
          http://playerstage.svn.sourceforge.net/playerstage/?rev=6739&view=rev
Author:   alexcb
Date:     2008-07-02 13:50:09 -0700 (Wed, 02 Jul 2008)

Log Message:
-----------
created depth-based ordered list for drawing stall icons to fix transparency 
issues

Modified Paths:
--------------
    code/stage/trunk/libstage/canvas.cc

Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-07-02 20:31:01 UTC (rev 6738)
+++ code/stage/trunk/libstage/canvas.cc 2008-07-02 20:50:09 UTC (rev 6739)
@@ -9,6 +9,8 @@
 #include "replace.h"
 
 #include <string>
+#include <map>
+#include <sstream>
 #include <png.h>
 
 #include "file_manager.hh"
@@ -478,6 +480,30 @@
 
 void StgCanvas::renderFrame()
 {
+       //before drawing, order all models based on distance from camera
+       float x = camera.getX();
+       float y = camera.getY();
+       float sphi = dtor( camera.getYaw() );
+       
+       //estimate point of camera location - hard to do with orthogonal mode
+       x += -sin( sphi ) * 100;
+       y += -cos( sphi ) * 100;
+       
+       //store all models in a sorted multimap
+       std::multimap< float, StgModel* > ordered;
+       for( GList* it=world->StgWorld::children; it; it=it->next ) {
+               StgModel* ptr = (StgModel*) it->data;
+               stg_pose_t pose = ptr->GetPose();
+               
+               float dist = sqrt( ( x - pose.x ) * ( x - pose.x ) + ( y - 
pose.y ) * ( y - pose.y ) );
+               ordered.insert( std::pair< float, StgModel* >( dist, 
(StgModel*)it->data ) );
+       }
+       
+       //now the models can be iterated over with:
+       // for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ )
+       
+       
+       
   if( ! showTrails )
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   
@@ -503,18 +529,17 @@
       glPopMatrix();
     }
   
-  for( GList* it=selected_models; it; it=it->next )
-    ((StgModel*)it->data)->DrawSelected();
+       for( GList* it=selected_models; it; it=it->next )
+               ((StgModel*)it->data)->DrawSelected();
   
   if( showFootprints )
     {
       glDisable( GL_DEPTH_TEST );
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL );
                
-      for( GList* it=world->StgWorld::children; it; it=it->next )
-       {
-         ((StgModel*)it->data)->DrawTrailFootprint();
-       }
+               for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ ) {
+                       i->second->DrawTrailFootprint();
+               }
       glEnable( GL_DEPTH_TEST );
     }
   
@@ -522,17 +547,19 @@
     {
       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL );
                
-      for( GList* it=world->StgWorld::children; it; it=it->next )
-       {
-         ((StgModel*)it->data)->DrawTrailBlocks();
-       }
+               for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ ) {
+                       i->second->DrawTrailBlocks();
+               }
+               
     }
   
   if( showTrailArrows )
     {
       glEnable( GL_DEPTH_TEST );
-      for( GList* it=world->StgWorld::children; it; it=it->next )
-       ((StgModel*)it->data)->DrawTrailArrows();
+               for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ ) {
+                       i->second->DrawTrailArrows();
+               }
+               
     }
 
   if( showBlocks )
@@ -545,26 +572,39 @@
                        it = world->StgWorld::children;
                else
                        it = selected_models;
-               for( ; it; it=it->next ) 
-                       ((StgModel*)it->data)->DataVisualizeTree();
+                       for( ; it; it=it->next ) 
+                               ((StgModel*)it->data)->DataVisualizeTree();
+
+               
        }
   
   if( showGrid ) 
-    for( GList* it=world->StgWorld::children; it; it=it->next )
-      ((StgModel*)it->data)->DrawGrid();
+         for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ ) {
+                 i->second->DrawGrid();
+         }
+       
                
   if( showFlags ) 
-    for( GList* it=world->StgWorld::children; it; it=it->next )
-      ((StgModel*)it->data)->DrawFlagList();
+         for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ ) {
+                 i->second->DrawFlagList();
+         }
+       
                
   if( showBlinken ) 
-    for( GList* it=world->StgWorld::children; it; it=it->next )
-      ((StgModel*)it->data)->DrawBlinkenlights();      
+       for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ ) {
+               i->second->DrawBlinkenlights();
+       }
        
-  if ( showStatus )
-    for( GList* it=world->StgWorld::children; it; it=it->next )
-      ((StgModel*)it->data)->DrawStatusTree( this );
        
+       if ( showStatus ) {
+
+               for( std::multimap< float, StgModel* >::reverse_iterator i = 
ordered.rbegin(); i != ordered.rend(); i++ ) {
+                       i->second->DrawStatusTree( this );
+               }
+               
+               std::cout << std::endl;
+       }
+       
   if( world->GetRayList() )
     {
       glDisable( GL_DEPTH_TEST );


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to