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
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit