Revision: 7158
http://playerstage.svn.sourceforge.net/playerstage/?rev=7158&view=rev
Author: rtv
Date: 2008-11-19 01:24:40 +0000 (Wed, 19 Nov 2008)
Log Message:
-----------
added persistent sorted list for in-order rendering
Modified Paths:
--------------
code/stage/trunk/libstage/canvas.cc
code/stage/trunk/libstage/stage.hh
code/stage/trunk/libstage/stage_internal.hh
code/stage/trunk/libstage/worldgui.cc
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-11-18 02:48:05 UTC (rev 7157)
+++ code/stage/trunk/libstage/canvas.cc 2008-11-19 01:24:40 UTC (rev 7158)
@@ -1,8 +1,11 @@
/** canvas.cc
Implement the main world viewing area in FLTK and OpenGL.
- Authors: Richard Vaughan ([EMAIL PROTECTED])
- Alex Couture-Beil ([EMAIL PROTECTED])
- Jeremy Asher ([EMAIL PROTECTED])
+
+ Authors:
+ Richard Vaughan ([EMAIL PROTECTED])
+ Alex Couture-Beil ([EMAIL PROTECTED])
+ Jeremy Asher ([EMAIL PROTECTED])
+
$Id$
*/
@@ -11,7 +14,7 @@
#include "replace.h"
#include <string>
-#include <map>
+//#include <map>
#include <sstream>
#include <png.h>
#include <GLUT/glut.h>
@@ -85,21 +88,11 @@
assert( can_do( FL_ACCUM ) );
graphics = true;
-
-// // // start the timer that causes regular redraws
-// Fl::add_timeout( ((double)interval/1000),
-//
(Fl_Timeout_Handler)StgCanvas::TimerCallback,
-// this);
-
-
- GLenum status;
-
-
-
}
StgCanvas::~StgCanvas()
-{
+{
+ // nothing to do
}
StgModel* StgCanvas::getModel( int x, int y )
@@ -469,6 +462,7 @@
if( pCamOn == false ) {camera.move( 0, 10 ); }
else { perspective_camera.forward( 0.5 ); } break;
default:
+ redraw(); // we probably set a display config - so
need this
return 0; // keypress unhandled
}
@@ -493,9 +487,11 @@
glViewport(0,0,W,H);
}
+void StgCanvas::AddModel( StgModel* mod )
+{
+ models_sorted = g_list_append( models_sorted, mod );
+}
-
-
void StgCanvas::DrawGlobalGrid()
{
stg_bounds3d_t bounds = world->GetExtent();
@@ -564,10 +560,10 @@
void StgCanvas::DrawBlocks()
{
- LISTMETHOD( world->StgWorld::children, StgModel*, DrawBlocksTree );
+ LISTMETHOD( models_sorted, StgModel*, DrawBlocksTree );
}
-void StgCanvas::resetCamera()
+inline void StgCanvas::resetCamera()
{
float max_x = 0, max_y = 0, min_x = 0, min_y = 0;
@@ -599,6 +595,27 @@
//TODO reset perspective cam
}
+// used to sort a list of models by inverse distance from the x,y pose in
[coords]
+gint compare_distance( StgModel* a, StgModel* b, double coords[2] )
+{
+ stg_pose_t a_pose = a->GetGlobalPose();
+ stg_pose_t b_pose = b->GetGlobalPose();
+
+ double a_dist = hypot( coords[1] - a_pose.y,
+ coords[0] -
a_pose.x );
+
+ double b_dist = hypot( coords[1] - b_pose.y,
+ coords[0] -
b_pose.x );
+
+ if( a_dist < b_dist )
+ return 1;
+
+ if( a_dist > b_dist )
+ return -1;
+
+ return 0; // must be the same
+}
+
void StgCanvas::renderFrame()
{
//before drawing, order all models based on distance from camera
@@ -610,23 +627,15 @@
x += -sin( sphi ) * 100;
y += -cos( sphi ) * 100;
- // TODO - keep this map around in between frames, because the order
- // changes slowly, and sorting an already-sorted list is
- // usually very fast (rtv)
-
- //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++ )
-
+ double coords[2];
+ coords[0] = x;
+ coords[1] = y;
+
+ // sort the list of models by inverse distance from the camera -
+ // probably doesn't change too much between frames so this is
+ // usually fast
+ models_sorted = g_list_sort_with_data( models_sorted,
(GCompareDataFunc)compare_distance, coords );
+
glEnable( GL_DEPTH_TEST );
if( ! showTrails )
@@ -635,7 +644,7 @@
if( showTree || showOccupancy )
{
glPushMatrix();
-
+
GLfloat scale = 1.0/world->Resolution();
glScalef( scale, scale, 1.0 ); // XX TODO - this seems slightly
// out for Z. look into it.
@@ -648,27 +657,22 @@
glPopMatrix();
}
-
if( showFootprints )
- {
- glDisable( GL_DEPTH_TEST );
-
- for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
- i->second->DrawTrailFootprint();
- }
- glEnable( GL_DEPTH_TEST );
- }
+ {
+ glDisable( GL_DEPTH_TEST );
+ LISTMETHOD( models_sorted, StgModel*, DrawTrailFootprint );
+ glEnable( GL_DEPTH_TEST );
+ }
if( showGrid )
DrawGlobalGrid();
else
DrawFloor();
-
+
if( showBlocks )
- DrawBlocks();
+ DrawBlocks();
-
// MOTION BLUR
// if( showBlocks )
// {
@@ -748,21 +752,21 @@
// }
// }
- if( showTrailRise )
- {
- for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
- i->second->DrawTrailBlocks();
- }
- }
+// if( showTrailRise )
+// {
+// for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
+// i->second->DrawTrailBlocks();
+// }
+// }
- if( showTrailArrows )
- {
- glEnable( GL_DEPTH_TEST );
- for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
- i->second->DrawTrailArrows();
- }
+// if( showTrailArrows )
+// {
+// glEnable( GL_DEPTH_TEST );
+// for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
+// i->second->DrawTrailArrows();
+// }
- }
+// }
for( GList* it=selected_models; it; it=it->next )
@@ -789,34 +793,29 @@
}
if( showGrid )
- for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
- i->second->DrawGrid();
- }
-
-
+ LISTMETHOD( models_sorted, StgModel*, DrawGrid );
+
if( showFlags )
- for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
- i->second->DrawFlagList();
- }
-
-
+ LISTMETHOD( models_sorted, StgModel*, DrawFlagList );
+
if( showBlinken )
- for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
- i->second->DrawBlinkenlights();
- }
-
-
- if ( showStatus ) {
- glPushMatrix();
- for( std::multimap< float, StgModel* >::reverse_iterator i =
ordered.rbegin(); i != ordered.rend(); i++ ) {
+ LISTMETHOD( models_sorted, StgModel*, DrawBlinkenlights );
+
+ if( showStatus )
+ {
+ glDisable( GL_DEPTH_TEST );
+
+ glPushMatrix();
//ensure two icons can't be in the exact same plane
if( camera.pitch() == 0 && !pCamOn )
glTranslatef( 0, 0, 0.1 );
- i->second->DrawStatusTree( current_camera );
- }
- glPopMatrix();
- }
+ LISTMETHODARG( models_sorted, StgModel*, DrawStatusTree,
&camera );
+
+ glEnable( GL_DEPTH_TEST );
+ glPopMatrix();
+ }
+
if( world->GetRayList() )
{
glDisable( GL_DEPTH_TEST );
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2008-11-18 02:48:05 UTC (rev 7157)
+++ code/stage/trunk/libstage/stage.hh 2008-11-19 01:24:40 UTC (rev 7158)
@@ -1899,6 +1899,8 @@
// Quit time pause
bool pause_time;
+ virtual void AddModel( StgModel* mod );
+
protected:
virtual void PushColor( stg_color_t col );
virtual void PushColor( double r, double g, double b, double a );
Modified: code/stage/trunk/libstage/stage_internal.hh
===================================================================
--- code/stage/trunk/libstage/stage_internal.hh 2008-11-18 02:48:05 UTC (rev
7157)
+++ code/stage/trunk/libstage/stage_internal.hh 2008-11-19 01:24:40 UTC (rev
7158)
@@ -54,6 +54,8 @@
private:
GlColorStack colorstack;
+ GList* models_sorted;
+
Camera* current_camera;
OrthoCamera camera;
PerspectiveCamera perspective_camera;
@@ -77,6 +79,8 @@
void ClearRays();
void DrawGlobalGrid();
+ void AddModel( StgModel* mod );
+
Option
showBlinken,
showBlocks,
Modified: code/stage/trunk/libstage/worldgui.cc
===================================================================
--- code/stage/trunk/libstage/worldgui.cc 2008-11-18 02:48:05 UTC (rev
7157)
+++ code/stage/trunk/libstage/worldgui.cc 2008-11-19 01:24:40 UTC (rev
7158)
@@ -330,7 +330,15 @@
return val;
}
+void StgWorldGui::AddModel( StgModel* mod )
+{
+ if( mod->parent == NULL )
+ canvas->AddModel( mod );
+
+ StgWorld::AddModel( mod );
+}
+
std::string StgWorldGui::ClockString()
{
const uint32_t usec_per_hour = 3600000000U;
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit