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