From: <rt...@us...> - 2008-06-30 00:59:04
|
Revision: 6713 http://playerstage.svn.sourceforge.net/playerstage/?rev=6713&view=rev Author: rtv Date: 2008-06-30 00:59:07 -0700 (Mon, 30 Jun 2008) Log Message: ----------- added quick screenshot option. screenshots have a bug - they only work right when the image width is a multiple of 8 Modified Paths: -------------- code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/stage.hh code/stage/trunk/libstage/worldgui.cc code/stage/trunk/worlds/fasr.world Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-06-29 11:40:30 UTC (rev 6712) +++ code/stage/trunk/libstage/canvas.cc 2008-06-30 07:59:07 UTC (rev 6713) @@ -1,8 +1,8 @@ /** canvas.cc - Implement the main world viewing area in FLTK and OpenGL. -Author: Richard Vaughan (va...@sf...) -$Id: canvas.cc,v 1.12 2008-03-03 07:01:12 rtv Exp $ - */ + Implement the main world viewing area in FLTK and OpenGL. + Author: Richard Vaughan (va...@sf...) + $Id: canvas.cc,v 1.12 2008-03-03 07:01:12 rtv Exp $ +*/ #include "stage_internal.hh" #include "texture_manager.hh" @@ -26,8 +26,8 @@ c->redraw(); Fl::repeat_timeout(((double)c->interval/1000), - (Fl_Timeout_Handler)StgCanvas::TimerCallback, - c); + (Fl_Timeout_Handler)StgCanvas::TimerCallback, + c); } @@ -46,34 +46,35 @@ showTrailRise( "Trails/Rising blocks", "show_trailrise", "#r", false ), showTrails( "Trails/Fast", "show_trailfast", "t", false ), showTree( "Debug/Tree", "show_tree", "#T", false ), - showOccupancy( "Debug/Occupancy", "show_occupancy", "#O", false ) + showOccupancy( "Debug/Occupancy", "show_occupancy", "#O", false ), + showScreenshots( "Save screenshots", "screenshots", "", false ) { - end(); + end(); - //show(); // must do this so that the GL context is created before configuring GL - // but that line causes a segfault in Linux/X11! TODO: test in OS X + //show(); // must do this so that the GL context is created before configuring GL + // but that line causes a segfault in Linux/X11! TODO: test in OS X - this->world = world; - selected_models = NULL; - last_selection = NULL; + this->world = world; + selected_models = NULL; + last_selection = NULL; - use_perspective_camera = false; - perspective_camera.setPose( -3.0, 0.0, 1.0 ); - perspective_camera.setPitch( 70.0 ); //look down + use_perspective_camera = false; + perspective_camera.setPose( -3.0, 0.0, 1.0 ); + perspective_camera.setPitch( 70.0 ); //look down - startx = starty = 0; - //panx = pany = stheta = sphi = 0.0; - //scale = 15.0; - interval = 50; //msec between redraws + startx = starty = 0; + //panx = pany = stheta = sphi = 0.0; + //scale = 15.0; + interval = 50; //msec between redraws - graphics = true; - dragging = false; - rotating = false; + graphics = true; + dragging = false; + rotating = false; - // // start the timer that causes regular redraws - Fl::add_timeout( ((double)interval/1000), - (Fl_Timeout_Handler)StgCanvas::TimerCallback, - this); + // // start the timer that causes regular redraws + Fl::add_timeout( ((double)interval/1000), + (Fl_Timeout_Handler)StgCanvas::TimerCallback, + this); } StgCanvas::~StgCanvas() @@ -610,27 +611,35 @@ glMatrixMode (GL_MODELVIEW); } - - if( 0 ) + + if( showScreenshots ) Screenshot(); } void StgCanvas::Screenshot() { - GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT,viewport); - - int width = viewport[2] - viewport[0]; - int height = viewport[3] - viewport[1]; + int viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + int width = viewport[2];//w(); + int height = viewport[3];//;;h(); int depth = 3; // RGB - - uint8_t* pixels= new uint8_t[ width * height * depth ]; + + // printf( "VP: %d %d %d %d WIN %d %d\n", +// viewport[0], +// viewport[1], +// viewport[2], +// viewport[3], +// w(), +// h() ); + + uint8_t* pixels = new uint8_t[ width * height * depth ]; glFlush(); // make sure the drawing is done // read the pixels from the screen - glReadPixels( viewport[0], viewport[1], width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels ); + //glReadPixels( viewport[0], viewport[1], width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels ); + glReadPixels( 0,0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels ); static uint32_t count = 0; char filename[64]; @@ -644,23 +653,29 @@ // write png header information png_structp pp = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); + assert(pp); png_infop info = png_create_info_struct(pp); + assert(info); + png_init_io(pp, fp); - png_set_compression_level(pp, Z_DEFAULT_COMPRESSION); + + png_bytep rowpointers[height]; + for( int i=0; i<height; i++ ) + rowpointers[i] = &pixels[ (height-1-i) * width * depth ]; + + png_set_rows( pp, info, rowpointers ); + + //png_set_compression_level(pp, Z_DEFAULT_COMPRESSION); png_set_IHDR( pp, info, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - png_write_info(pp, info); + + png_write_png( pp, info, PNG_TRANSFORM_IDENTITY, NULL ); + png_destroy_write_struct(&pp, &info); - // write pixels in reverse row order - for( int y=height-1; y >= 0; y-- ) - png_write_row( pp, pixels + 3*y*width ); - - png_write_end(pp, info); - png_destroy_write_struct(&pp, 0); fclose(fp); printf( "Saved %s\n", filename ); @@ -684,6 +699,7 @@ showTrails.CreateMenuItem( menu, path ); showTrailRise.CreateMenuItem( menu, path ); showTree.CreateMenuItem( menu, path ); + showScreenshots.CreateMenuItem( menu, path ); } @@ -711,6 +727,7 @@ showTrailRise.Load( wf, sec ); showTrails.Load( wf, sec ); showTree.Load( wf, sec ); + showScreenshots.Load( wf, sec ); invalidate(); // we probably changed something } @@ -741,6 +758,7 @@ showTrailRise.Save( wf, sec ); showTrails.Save( wf, sec ); showTree.Save( wf, sec ); + showScreenshots.Save( wf, sec ); } Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-06-29 11:40:30 UTC (rev 6712) +++ code/stage/trunk/libstage/stage.hh 2008-06-30 07:59:07 UTC (rev 6713) @@ -1938,19 +1938,20 @@ void DrawGlobalGrid(); Option - showBlinken, - showBlocks, - showClock, - showData, - showFlags, - showFollow, - showFootprints, - showGrid, - showOccupancy, - showTrailArrows, - showTrailRise, - showTrails, - showTree; + showBlinken, + showBlocks, + showClock, + showData, + showFlags, + showFollow, + showFootprints, + showGrid, + showOccupancy, + showScreenshots, + showTrailArrows, + showTrailRise, + showTrails, + showTree; public: Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-06-29 11:40:30 UTC (rev 6712) +++ code/stage/trunk/libstage/worldgui.cc 2008-06-30 07:59:07 UTC (rev 6713) @@ -1,99 +1,99 @@ /** @defgroup worldgui World with Graphical User Interface - The Stage window consists of a menu bar, a view of the simulated - world, and a status bar. + The Stage window consists of a menu bar, a view of the simulated + world, and a status bar. - The world view shows part of the simulated world. You can zoom the - view in and out, and scroll it to see more of the world. Simulated - robot devices, obstacles, etc., are rendered as colored polygons. The - world view can also show visualizations of the data and configuration - of various sensor and actuator models. The View menu has options to - control which data and configurations are rendered. + The world view shows part of the simulated world. You can zoom the + view in and out, and scroll it to see more of the world. Simulated + robot devices, obstacles, etc., are rendered as colored polygons. The + world view can also show visualizations of the data and configuration + of various sensor and actuator models. The View menu has options to + control which data and configurations are rendered. -API: Stg::StgWorldGui + API: Stg::StgWorldGui -<h2>Worldfile Properties</h2> + <h2>Worldfile Properties</h2> -@par Summary and default values + @par Summary and default values -@verbatim -window -( -# gui properties -center [0 0] -size [700 740] -scale 1.0 + @verbatim + window + ( + # gui properties + center [0 0] + size [700 740] + scale 1.0 -# model properties do not apply to the gui window -) -@endverbatim + # model properties do not apply to the gui window + ) + @endverbatim -@par Details -- title [string] -- the string displayed in the window title bar. Defaults to the worldfile file name. -- size [width:int width:int] -- size of the window in pixels -- center [x:float y:float] -- location of the center of the window in world coordinates (meters) -- scale [?:double] -- ratio of world to pixel coordinates (window zoom) + @par Details + - title [string] + - the string displayed in the window title bar. Defaults to the worldfile file name. + - size [width:int width:int] + - size of the window in pixels + - center [x:float y:float] + - location of the center of the window in world coordinates (meters) + - scale [?:double] + - ratio of world to pixel coordinates (window zoom) -<h2>Using the Stage window</h2> + <h2>Using the Stage window</h2> -<h3>Scrolling the view</h3> + <h3>Scrolling the view</h3> -<p>Left-click and drag on the background to move your view of the world. + <p>Left-click and drag on the background to move your view of the world. -<h3>Zooming the view</h3> + <h3>Zooming the view</h3> -<p>Right-click and drag on the background to zoom your view of the -world. When you press the right mouse button, a circle appears. Moving -the mouse adjusts the size of the circle; the current view is scaled -with the circle. + <p>Right-click and drag on the background to zoom your view of the + world. When you press the right mouse button, a circle appears. Moving + the mouse adjusts the size of the circle; the current view is scaled + with the circle. -<h3>Saving the world</h3> + <h3>Saving the world</h3> -<P>You can save the current pose of everything in the world, using the -File/Save menu item. <b>Warning: the saved poses overwrite the current -world file.</b> Make a copy of your world file before saving if you -want to keep the old poses. + <P>You can save the current pose of everything in the world, using the + File/Save menu item. <b>Warning: the saved poses overwrite the current + world file.</b> Make a copy of your world file before saving if you + want to keep the old poses. -<h3>Saving a screenshot</h3> + <h3>Saving a screenshot</h3> -<p> The File/Export menu allows you to export a screenshot of the -current world view in JPEG or PNG format. The frame is saved in the -current directory with filename in the format "stage-(frame -number).(jpg/png)". + <p> The File/Export menu allows you to export a screenshot of the + current world view in JPEG or PNG format. The frame is saved in the + current directory with filename in the format "stage-(frame + number).(jpg/png)". -You can also save sequences of screen shots. To start saving a -sequence, select the desired time interval from the same menu, then -select File/Export/Sequence of frames. The frames are saved in the -current directory with filenames in the format "stage-(sequence -number)-(frame number).(jpg/png)". + You can also save sequences of screen shots. To start saving a + sequence, select the desired time interval from the same menu, then + select File/Export/Sequence of frames. The frames are saved in the + current directory with filenames in the format "stage-(sequence + number)-(frame number).(jpg/png)". -The frame and sequence numbers are reset to zero every time you run -Stage, so be careful to rename important frames before they are -overwritten. + The frame and sequence numbers are reset to zero every time you run + Stage, so be careful to rename important frames before they are + overwritten. -<h3>Pausing and resuming the clock</h3> + <h3>Pausing and resuming the clock</h3> -<p>The Clock/Pause menu item allows you to stop the simulation clock, - freezing the world. Selecting this item again re-starts the clock. + <p>The Clock/Pause menu item allows you to stop the simulation clock, + freezing the world. Selecting this item again re-starts the clock. - <h3>View options</h3> + <h3>View options</h3> - <p>The View menu allows you to toggle rendering of a 1m grid, to help - you line up objects (View/Grid). You can control whether polygons are - filled (View/Fill polygons); turning this off slightly improves - graphics performance. The rest of the view menu contains options for - rendering of data and configuration for each type of model, and a - debug menu that enables visualization of some of the innards of Stage. + <p>The View menu allows you to toggle rendering of a 1m grid, to help + you line up objects (View/Grid). You can control whether polygons are + filled (View/Fill polygons); turning this off slightly improves + graphics performance. The rest of the view menu contains options for + rendering of data and configuration for each type of model, and a + debug menu that enables visualization of some of the innards of Stage. - */ +*/ #include "stage_internal.hh" #include "region.hh" @@ -114,129 +114,129 @@ #define PACKAGE_STRING "Stage-3.dev" #endif - StgWorldGui::StgWorldGui(int W,int H,const char* L) : - Fl_Window(W,H,L), - ShowAll( "Visualize all models", "show_vis", "", true ) +StgWorldGui::StgWorldGui(int W,int H,const char* L) : + Fl_Window(W,H,L), + ShowAll( "Visualize all models", "show_vis", "", true ) { - //size_range( 100,100 ); // set minimum window size - oDlg = NULL; - graphics = true; - paused = false; + //size_range( 100,100 ); // set minimum window size + oDlg = NULL; + graphics = true; + paused = false; - interval_real = (stg_usec_t)thousand * DEFAULT_INTERVAL_REAL; + interval_real = (stg_usec_t)thousand * DEFAULT_INTERVAL_REAL; - for( unsigned int i=0; i<INTERVAL_LOG_LEN; i++ ) - this->interval_log[i] = this->interval_real; + for( unsigned int i=0; i<INTERVAL_LOG_LEN; i++ ) + this->interval_log[i] = this->interval_real; - // build the menus - mbar = new Fl_Menu_Bar(0,0, W, 30);// 640, 30); - mbar->textsize(12); + // build the menus + mbar = new Fl_Menu_Bar(0,0, W, 30);// 640, 30); + mbar->textsize(12); - canvas = new StgCanvas( this,0,30,W,H-30 ); - resizable(canvas); - end(); + canvas = new StgCanvas( this,0,30,W,H-30 ); + resizable(canvas); + end(); - mbar->add( "&File", 0, 0, 0, FL_SUBMENU ); - mbar->add( "File/&Load World...", FL_CTRL + 'l', StgWorldGui::fileLoadCb, this, FL_MENU_DIVIDER ); - mbar->add( "File/&Save World", FL_CTRL + 's', StgWorldGui::fileSaveCb, this ); - mbar->add( "File/Save World &As...", FL_CTRL + FL_SHIFT + 's', StgWorldGui::fileSaveAsCb, this, FL_MENU_DIVIDER ); + mbar->add( "&File", 0, 0, 0, FL_SUBMENU ); + mbar->add( "File/&Load World...", FL_CTRL + 'l', fileLoadCb, this, FL_MENU_DIVIDER ); + mbar->add( "File/&Save World", FL_CTRL + 's', fileSaveCb, this ); + mbar->add( "File/Save World &As...", FL_CTRL + FL_SHIFT + 's', StgWorldGui::fileSaveAsCb, this, FL_MENU_DIVIDER ); - mbar->add( "File/Screenshots", 0,0,0, FL_SUBMENU ); - //mbar->add( "File/Screenshots/ + //mbar->add( "File/Screenshots", 0,0,0, FL_SUBMENU ); + //mbar->add( "File/Screenshots/Save Frames, fileScreenshotSaveCb, this,FL_MENU_TOGGLE ); - mbar->add( "File/E&xit", FL_CTRL+'q', StgWorldGui::fileExitCb, this ); + mbar->add( "File/E&xit", FL_CTRL+'q', StgWorldGui::fileExitCb, this ); - mbar->add( "&View", 0, 0, 0, FL_SUBMENU ); - mbar->add( "View/Filter data...", FL_SHIFT + 'd', StgWorldGui::viewOptionsCb, this ); - canvas->CreateMenuItems( mbar, "View" ); + mbar->add( "&View", 0, 0, 0, FL_SUBMENU ); + mbar->add( "View/Filter data...", FL_SHIFT + 'd', StgWorldGui::viewOptionsCb, this ); + canvas->CreateMenuItems( mbar, "View" ); - mbar->add( "&Help", 0, 0, 0, FL_SUBMENU ); - mbar->add( "Help/&About Stage...", 0, StgWorldGui::helpAboutCb, this ); - //mbar->add( "Help/HTML Documentation", FL_CTRL + 'g', (Fl_Callback *)dummy_cb ); + mbar->add( "&Help", 0, 0, 0, FL_SUBMENU ); + mbar->add( "Help/&About Stage...", 0, StgWorldGui::helpAboutCb, this ); + //mbar->add( "Help/HTML Documentation", FL_CTRL + 'g', (Fl_Callback *)dummy_cb ); - callback( StgWorldGui::windowCb, this ); + callback( StgWorldGui::windowCb, this ); - show(); + show(); } StgWorldGui::~StgWorldGui() { - delete mbar; - if ( oDlg ) - delete oDlg; - delete canvas; + delete mbar; + if ( oDlg ) + delete oDlg; + delete canvas; } void StgWorldGui::Load( const char* filename ) { - PRINT_DEBUG1( "%s.Load()", token ); + PRINT_DEBUG1( "%s.Load()", token ); - fileMan->newWorld( filename ); + fileMan->newWorld( filename ); - StgWorld::Load( filename ); + StgWorld::Load( filename ); - int world_section = 0; // use the top-level section for some parms - // that traditionally live there + int world_section = 0; // use the top-level section for some parms + // that traditionally live there - this->paused = - wf->ReadInt( world_section, "paused", this->paused ); + this->paused = + wf->ReadInt( world_section, "paused", this->paused ); - this->interval_real = (stg_usec_t)thousand * - wf->ReadInt( world_section, "interval_real", (int)(this->interval_real/thousand) ); + this->interval_real = (stg_usec_t)thousand * + wf->ReadInt( world_section, "interval_real", (int)(this->interval_real/thousand) ); - // use the window section for the rest - int window_section = wf->LookupEntity( "window" ); + // use the window section for the rest + int window_section = wf->LookupEntity( "window" ); - if( window_section < 1) // no section defined - return; + if( window_section < 1) // no section defined + return; - int width = (int)wf->ReadTupleFloat(window_section, "size", 0, w() ); - int height = (int)wf->ReadTupleFloat(window_section, "size", 1, h() ); - // on OS X this behaves badly - prevents the Window manager resizing - //larger than this size. - size( width,height ); + int width = (int)wf->ReadTupleFloat(window_section, "size", 0, w() ); + int height = (int)wf->ReadTupleFloat(window_section, "size", 1, h() ); + // on OS X this behaves badly - prevents the Window manager resizing + //larger than this size. + size( width,height ); - // configure the canvas - canvas->Load( wf, window_section ); + // configure the canvas + canvas->Load( wf, window_section ); - updateOptions(); + updateOptions(); } void StgWorldGui::UnLoad() { - StgWorld::UnLoad(); -// canvas->camera.setPose( 0, 0 ); + StgWorld::UnLoad(); + // canvas->camera.setPose( 0, 0 ); } bool StgWorldGui::Save( const char* filename ) { - PRINT_DEBUG1( "%s.Save()", token ); + PRINT_DEBUG1( "%s.Save()", token ); - StgWorld::Save( filename ); + StgWorld::Save( filename ); - // use the window section for the rest - int window_section = wf->LookupEntity( "window" ); + // use the window section for the rest + int window_section = wf->LookupEntity( "window" ); - if( window_section > 0 ) // section defined - { - wf->WriteTupleFloat( window_section, "size", 0, w() ); - wf->WriteTupleFloat( window_section, "size", 1, h() ); + if( window_section > 0 ) // section defined + { + wf->WriteTupleFloat( window_section, "size", 0, w() ); + wf->WriteTupleFloat( window_section, "size", 1, h() ); - canvas->Save( wf, window_section ); + canvas->Save( wf, window_section ); - // TODO - per model visualizations save - } + // TODO - per model visualizations save + } - // TODO - error checking - return true; + // TODO - error checking + return true; } bool StgWorldGui::Update() { if( real_time_of_last_update == 0 ) - real_time_of_last_update = RealTimeNow(); + real_time_of_last_update = RealTimeNow(); bool val = paused ? true : StgWorld::Update(); @@ -244,16 +244,16 @@ stg_usec_t timenow; do { // we loop over updating the GUI, sleeping if there's any spare - // time - Fl::check(); + // time + Fl::check(); - timenow = RealTimeNow(); - interval = timenow - real_time_of_last_update; // guaranteed to be >= 0 + timenow = RealTimeNow(); + interval = timenow - real_time_of_last_update; // guaranteed to be >= 0 - double sleeptime = (double)interval_real - (double)interval; + double sleeptime = (double)interval_real - (double)interval; - if( sleeptime > 0 ) - usleep( (stg_usec_t)MIN(sleeptime,100000) ); // check the GUI at 10Hz min + if( sleeptime > 0 ) + usleep( (stg_usec_t)MIN(sleeptime,100000) ); // check the GUI at 10Hz min } while( interval < interval_real ); @@ -268,351 +268,351 @@ void StgWorldGui::ClockString( char* str, size_t maxlen ) { - const uint32_t usec_per_hour = 360000000; - const uint32_t usec_per_minute = 60000000; - const uint32_t usec_per_second = 1000000; - const uint32_t usec_per_msec = 1000; + const uint32_t usec_per_hour = 360000000; + const uint32_t usec_per_minute = 60000000; + const uint32_t usec_per_second = 1000000; + const uint32_t usec_per_msec = 1000; - uint32_t hours = sim_time / usec_per_hour; - uint32_t minutes = (sim_time % usec_per_hour) / usec_per_minute; - uint32_t seconds = (sim_time % usec_per_minute) / usec_per_second; - uint32_t msec = (sim_time % usec_per_second) / usec_per_msec; + uint32_t hours = sim_time / usec_per_hour; + uint32_t minutes = (sim_time % usec_per_hour) / usec_per_minute; + uint32_t seconds = (sim_time % usec_per_minute) / usec_per_second; + uint32_t msec = (sim_time % usec_per_second) / usec_per_msec; - // find the average length of the last few realtime intervals; - stg_usec_t average_real_interval = 0; - for( uint32_t i=0; i<INTERVAL_LOG_LEN; i++ ) - average_real_interval += interval_log[i]; - average_real_interval /= INTERVAL_LOG_LEN; + // find the average length of the last few realtime intervals; + stg_usec_t average_real_interval = 0; + for( uint32_t i=0; i<INTERVAL_LOG_LEN; i++ ) + average_real_interval += interval_log[i]; + average_real_interval /= INTERVAL_LOG_LEN; - double localratio = (double)interval_sim / (double)average_real_interval; + double localratio = (double)interval_sim / (double)average_real_interval; #ifdef DEBUG - if( hours > 0 ) - snprintf( str, maxlen, "Time: %uh%02um%02u.%03us\t[%.6f]\tsubs: %d %s", - hours, minutes, seconds, msec, - localratio, - total_subs, - paused ? "--PAUSED--" : "" ); - else - snprintf( str, maxlen, "Time: %02um%02u.%03us\t[%.6f]\tsubs: %d %s", - minutes, seconds, msec, - localratio, - total_subs, - paused ? "--PAUSED--" : "" ); + if( hours > 0 ) + snprintf( str, maxlen, "Time: %uh%02um%02u.%03us\t[%.6f]\tsubs: %d %s", + hours, minutes, seconds, msec, + localratio, + total_subs, + paused ? "--PAUSED--" : "" ); + else + snprintf( str, maxlen, "Time: %02um%02u.%03us\t[%.6f]\tsubs: %d %s", + minutes, seconds, msec, + localratio, + total_subs, + paused ? "--PAUSED--" : "" ); #else - if( hours > 0 ) - snprintf( str, maxlen, "%uh%02um%02u.%03us\t[%.2f] %s", - hours, minutes, seconds, msec, - localratio, - paused ? "--PAUSED--" : "" ); - else - snprintf( str, maxlen, "%02um%02u.%03us\t[%.2f] %s", - minutes, seconds, msec, - localratio, - paused ? "--PAUSED--" : "" ); + if( hours > 0 ) + snprintf( str, maxlen, "%uh%02um%02u.%03us\t[%.2f] %s", + hours, minutes, seconds, msec, + localratio, + paused ? "--PAUSED--" : "" ); + else + snprintf( str, maxlen, "%02um%02u.%03us\t[%.2f] %s", + minutes, seconds, msec, + localratio, + paused ? "--PAUSED--" : "" ); #endif } void StgWorldGui::DrawTree( bool drawall ) { - g_hash_table_foreach( superregions, (GHFunc)SuperRegion::Draw_cb, NULL ); + g_hash_table_foreach( superregions, (GHFunc)SuperRegion::Draw_cb, NULL ); } void StgWorldGui::DrawFloor() { - PushColor( 1,1,1,1 ); - g_hash_table_foreach( superregions, (GHFunc)SuperRegion::Floor_cb, NULL ); - PopColor(); + PushColor( 1,1,1,1 ); + g_hash_table_foreach( superregions, (GHFunc)SuperRegion::Floor_cb, NULL ); + PopColor(); } void StgWorldGui::windowCb( Fl_Widget* w, void* p ) { - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - switch ( Fl::event() ) { - case FL_SHORTCUT: - if ( Fl::event_key() == FL_Escape ) - return; - case FL_CLOSE: // clicked close button - bool done = worldGui->closeWindowQuery(); - if ( !done ) - return; - } + switch ( Fl::event() ) { + case FL_SHORTCUT: + if ( Fl::event_key() == FL_Escape ) + return; + case FL_CLOSE: // clicked close button + bool done = worldGui->closeWindowQuery(); + if ( !done ) + return; + } - exit(0); + exit(0); } void StgWorldGui::fileLoadCb( Fl_Widget* w, void* p ) { - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - const char* filename; - const char* worldsPath; - //bool success; - const char* pattern = "World Files (*.world)"; + const char* filename; + const char* worldsPath; + //bool success; + const char* pattern = "World Files (*.world)"; - worldsPath = worldGui->fileMan->worldsRoot().c_str(); - Fl_File_Chooser fc( worldsPath, pattern, Fl_File_Chooser::CREATE, "Load World File..." ); - fc.ok_label( "Load" ); + worldsPath = worldGui->fileMan->worldsRoot().c_str(); + Fl_File_Chooser fc( worldsPath, pattern, Fl_File_Chooser::CREATE, "Load World File..." ); + fc.ok_label( "Load" ); - fc.show(); - while (fc.shown()) - Fl::wait(); + fc.show(); + while (fc.shown()) + Fl::wait(); - filename = fc.value(); + filename = fc.value(); - if (filename != NULL) { // chose something - if ( worldGui->fileMan->readable( filename ) ) { - // file is readable, clear and load + if (filename != NULL) { // chose something + if ( worldGui->fileMan->readable( filename ) ) { + // file is readable, clear and load - // if (initialized) { - worldGui->Stop(); - worldGui->UnLoad(); - // } + // if (initialized) { + worldGui->Stop(); + worldGui->UnLoad(); + // } - // todo: make sure loading is successful - worldGui->Load( filename ); - worldGui->Start(); // if (stopped) - } - else { - fl_alert( "Unable to read selected world file." ); - } + // todo: make sure loading is successful + worldGui->Load( filename ); + worldGui->Start(); // if (stopped) + } + else { + fl_alert( "Unable to read selected world file." ); + } - } + } } void StgWorldGui::fileSaveCb( Fl_Widget* w, void* p ) { - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - // save to current file - bool success = worldGui->Save( NULL ); - if ( !success ) { - fl_alert( "Error saving world file." ); - } + // save to current file + bool success = worldGui->Save( NULL ); + if ( !success ) { + fl_alert( "Error saving world file." ); + } } void StgWorldGui::fileSaveAsCb( Fl_Widget* w, void* p ) { - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - worldGui->saveAsDialog(); + worldGui->saveAsDialog(); } void StgWorldGui::fileExitCb( Fl_Widget* w, void* p ) { - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - bool done = worldGui->closeWindowQuery(); - if (done) { - exit(0); - } + bool done = worldGui->closeWindowQuery(); + if (done) { + exit(0); + } } void StgWorldGui::viewOptionsCb( Fl_Widget* w, void* p ) { - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - if ( !worldGui->oDlg ) { - int x = worldGui->w()+worldGui->x() + 10; - int y = worldGui->y(); - OptionsDlg* oDlg = new OptionsDlg( x,y, 180,250 ); - oDlg->callback( optionsDlgCb, worldGui ); - oDlg->showAllOpt( &worldGui->ShowAll ); - oDlg->setOptions( worldGui->drawOptions ); - oDlg->show(); + if ( !worldGui->oDlg ) { + int x = worldGui->w()+worldGui->x() + 10; + int y = worldGui->y(); + OptionsDlg* oDlg = new OptionsDlg( x,y, 180,250 ); + oDlg->callback( optionsDlgCb, worldGui ); + oDlg->showAllOpt( &worldGui->ShowAll ); + oDlg->setOptions( worldGui->drawOptions ); + oDlg->show(); - worldGui->oDlg = oDlg; - } - else { - worldGui->oDlg->show(); // bring it to front - } + worldGui->oDlg = oDlg; + } + else { + worldGui->oDlg->show(); // bring it to front + } } void StgWorldGui::optionsDlgCb( Fl_Widget* w, void* p ) { - OptionsDlg* oDlg = static_cast<OptionsDlg*>( w ); - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + OptionsDlg* oDlg = static_cast<OptionsDlg*>( w ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - // get event from dialog - OptionsDlg::event_t event; - event = oDlg->event(); + // get event from dialog + OptionsDlg::event_t event; + event = oDlg->event(); - // Check FLTK events first - switch ( Fl::event() ) { - case FL_SHORTCUT: - if ( Fl::event_key() != FL_Escape ) - break; //return - // otherwise, ESC pressed-> do as below - case FL_CLOSE: // clicked close button - // override event to close - event = OptionsDlg::CLOSE; - break; - } + // Check FLTK events first + switch ( Fl::event() ) { + case FL_SHORTCUT: + if ( Fl::event_key() != FL_Escape ) + break; //return + // otherwise, ESC pressed-> do as below + case FL_CLOSE: // clicked close button + // override event to close + event = OptionsDlg::CLOSE; + break; + } - switch ( event ) { - case OptionsDlg::CHANGE: - { - //Option* o = oDlg->changed(); - //printf( "\"%s\" changed to %d!\n", o->name().c_str(), o->val() ); - break; - } - case OptionsDlg::CLOSE: - // invalidate the oDlg pointer from the WorldGui - // instance before the dialog is destroyed - worldGui->oDlg = NULL; - oDlg->hide(); - //Fl::delete_widget( oDlg ); - return; - case OptionsDlg::NO_EVENT: - case OptionsDlg::CHANGE_ALL: - break; - } + switch ( event ) { + case OptionsDlg::CHANGE: + { + //Option* o = oDlg->changed(); + //printf( "\"%s\" changed to %d!\n", o->name().c_str(), o->val() ); + break; + } + case OptionsDlg::CLOSE: + // invalidate the oDlg pointer from the WorldGui + // instance before the dialog is destroyed + worldGui->oDlg = NULL; + oDlg->hide(); + //Fl::delete_widget( oDlg ); + return; + case OptionsDlg::NO_EVENT: + case OptionsDlg::CHANGE_ALL: + break; + } } void aboutOKBtnCb( Fl_Widget* w, void* p ) { - Fl_Return_Button* btn; - btn = static_cast<Fl_Return_Button*>( w ); + Fl_Return_Button* btn; + btn = static_cast<Fl_Return_Button*>( w ); - btn->window()->do_callback(); + btn->window()->do_callback(); } void aboutCloseCb( Fl_Widget* w, void* p ) { - Fl_Window* win; - win = static_cast<Fl_Window*>( w ); - Fl_Text_Display* textDisplay; - textDisplay = static_cast<Fl_Text_Display*>( p ); + Fl_Window* win; + win = static_cast<Fl_Window*>( w ); + Fl_Text_Display* textDisplay; + textDisplay = static_cast<Fl_Text_Display*>( p ); - Fl_Text_Buffer* tbuf = textDisplay->buffer(); - textDisplay->buffer( NULL ); - delete tbuf; - Fl::delete_widget( win ); + Fl_Text_Buffer* tbuf = textDisplay->buffer(); + textDisplay->buffer( NULL ); + delete tbuf; + Fl::delete_widget( win ); } void StgWorldGui::helpAboutCb( Fl_Widget* w, void* p ) { - StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); + StgWorldGui* worldGui = static_cast<StgWorldGui*>( p ); - fl_register_images(); + fl_register_images(); - const int Width = 400; - const int Height = 220; - const int Spc = 10; - const int ButtonH = 25; - const int ButtonW = 60; - const int pngH = 82; - //const int pngW = 264; + const int Width = 400; + const int Height = 220; + const int Spc = 10; + const int ButtonH = 25; + const int ButtonW = 60; + const int pngH = 82; + //const int pngW = 264; - Fl_Window* win = new Fl_Window( Width, Height ); // make a window + Fl_Window* win = new Fl_Window( Width, Height ); // make a window - Fl_Box* box = new Fl_Box( Spc, Spc, - Width-2*Spc, pngH ); // widget that will contain image + Fl_Box* box = new Fl_Box( Spc, Spc, + Width-2*Spc, pngH ); // widget that will contain image - std::string fullpath; - fullpath = worldGui->fileMan->fullPath( "stagelogo.png" ); - Fl_PNG_Image* png = new Fl_PNG_Image( fullpath.c_str() ); // load image into ram - box->image( png ); // attach image to box + std::string fullpath; + fullpath = worldGui->fileMan->fullPath( "stagelogo.png" ); + Fl_PNG_Image* png = new Fl_PNG_Image( fullpath.c_str() ); // load image into ram + box->image( png ); // attach image to box - Fl_Text_Display* textDisplay; - textDisplay = new Fl_Text_Display( Spc, pngH+2*Spc, - Width-2*Spc, Height-pngH-ButtonH-4*Spc ); - textDisplay->box( FL_NO_BOX ); - textDisplay->color( win->color() ); - win->callback( aboutCloseCb, textDisplay ); + Fl_Text_Display* textDisplay; + textDisplay = new Fl_Text_Display( Spc, pngH+2*Spc, + Width-2*Spc, Height-pngH-ButtonH-4*Spc ); + textDisplay->box( FL_NO_BOX ); + textDisplay->color( win->color() ); + win->callback( aboutCloseCb, textDisplay ); - const char* AboutText = - "\n" - "Part of the Player Project\n" - "http://playerstage.sourceforge.net\n" - "Copyright 2000-2008 Richard Vaughan and contributors"; + const char* AboutText = + "\n" + "Part of the Player Project\n" + "http://playerstage.sourceforge.net\n" + "Copyright 2000-2008 Richard Vaughan and contributors"; - Fl_Text_Buffer* tbuf = new Fl_Text_Buffer; - tbuf->text( PACKAGE_STRING ); - tbuf->append( AboutText ); - textDisplay->buffer( tbuf ); + Fl_Text_Buffer* tbuf = new Fl_Text_Buffer; + tbuf->text( PACKAGE_STRING ); + tbuf->append( AboutText ); + textDisplay->buffer( tbuf ); - Fl_Return_Button* button; - button = new Fl_Return_Button( (Width - ButtonW)/2, Height-Spc-ButtonH, - ButtonW, ButtonH, - "&OK" ); - button->callback( aboutOKBtnCb ); + Fl_Return_Button* button; + button = new Fl_Return_Button( (Width - ButtonW)/2, Height-Spc-ButtonH, + ButtonW, ButtonH, + "&OK" ); + button->callback( aboutOKBtnCb ); - win->show(); + win->show(); } bool StgWorldGui::saveAsDialog() { - const char* newFilename; - bool success = false; - const char* pattern = "World Files (*.world)"; + const char* newFilename; + bool success = false; + const char* pattern = "World Files (*.world)"; - Fl_File_Chooser fc( wf->filename, pattern, Fl_File_Chooser::CREATE, "Save File As..." ); - fc.ok_label( "Save" ); + Fl_File_Chooser fc( wf->filename, pattern, Fl_File_Chooser::CREATE, "Save File As..." ); + fc.ok_label( "Save" ); - fc.show(); - while (fc.shown()) - Fl::wait(); + fc.show(); + while (fc.shown()) + Fl::wait(); - newFilename = fc.value(); + newFilename = fc.value(); - if (newFilename != NULL) { - // todo: make sure file ends in .world - success = Save( newFilename ); - if ( !success ) { - fl_alert( "Error saving world file." ); - } - } + if (newFilename != NULL) { + // todo: make sure file ends in .world + success = Save( newFilename ); + if ( !success ) { + fl_alert( "Error saving world file." ); + } + } - return success; + return success; } bool StgWorldGui::closeWindowQuery() { - int choice; + int choice; - if ( wf ) { - // worldfile loaded, ask to save - choice = fl_choice("Do you want to save?", - "&Cancel", // ->0: defaults to ESC - "&Yes", // ->1 - "&No" // ->2 - ); + if ( wf ) { + // worldfile loaded, ask to save + choice = fl_choice("Do you want to save?", + "&Cancel", // ->0: defaults to ESC + "&Yes", // ->1 + "&No" // ->2 + ); - switch (choice) { - case 1: // Yes - if ( saveAsDialog() ) { - return true; - } - else { - return false; - } - case 2: // No - return true; - } + switch (choice) { + case 1: // Yes + if ( saveAsDialog() ) { + return true; + } + else { + return false; + } + case 2: // No + return true; + } - // Cancel - return false; - } - else { - // nothing is loaded, just quit - return true; - } + // Cancel + return false; + } + else { + // nothing is loaded, just quit + return true; + } } void StgWorldGui::updateOptions() { std::set<Option*, Option::optComp> options; - std::vector<Option*> modOpts; - for( GList* it=update_list; it; it=it->next ) { - modOpts = ((StgModel*)it->data)->getOptions(); - options.insert( modOpts.begin(), modOpts.end() ); - } + std::vector<Option*> modOpts; + for( GList* it=update_list; it; it=it->next ) { + modOpts = ((StgModel*)it->data)->getOptions(); + options.insert( modOpts.begin(), modOpts.end() ); + } - drawOptions.assign( options.begin(), options.end() ); + drawOptions.assign( options.begin(), options.end() ); - if ( oDlg ) { - oDlg->setOptions( drawOptions ); - } + if ( oDlg ) { + oDlg->setOptions( drawOptions ); + } } Modified: code/stage/trunk/worlds/fasr.world =================================================================== --- code/stage/trunk/worlds/fasr.world 2008-06-29 11:40:30 UTC (rev 6712) +++ code/stage/trunk/worlds/fasr.world 2008-06-30 07:59:07 UTC (rev 6713) @@ -21,7 +21,7 @@ # configure the GUI window window ( - size [ 671.000 413.000 ] + size [ 280.000 480.000 ] center [-0.294 0.114] rotate [ -52.500 -18.500 ] scale 27.525 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |