00001
00002 #include "stage.hh"
00003 #include "option.hh"
00004
00005 #include <map>
00006 #include <stack>
00007
00008 namespace Stg
00009 {
00010 class Canvas : public Fl_Gl_Window
00011 {
00012 friend class WorldGui;
00013 friend class Model;
00014
00015 private:
00016
00017 class GlColorStack
00018 {
00019 public:
00020 GlColorStack() : colorstack() {}
00021 ~GlColorStack() {}
00022
00023 void Push( double r, double g, double b, double a=1.0 )
00024 {
00025 Push( Color(r,g,b,a) );
00026 }
00027
00028 void Push( Color col )
00029 {
00030 colorstack.push( col );
00031 glColor4f( col.r, col.g, col.b, col.a );
00032 }
00033
00034 void Pop()
00035 {
00036 if( colorstack.size() < 1 )
00037 PRINT_WARN1( "Attempted to ColorStack.Pop() but ColorStack %p is empty",
00038 this );
00039 else
00040 {
00041 Color& old = colorstack.top();
00042 colorstack.pop();
00043 glColor4f( old.r, old.g, old.b, old.a );
00044 }
00045 }
00046
00047 unsigned int Length()
00048 { return colorstack.size(); }
00049
00050 private:
00051 std::stack<Color> colorstack;
00052 } colorstack;
00053
00054 std::list<Model*> models_sorted;
00055
00056 Camera* current_camera;
00057 OrthoCamera camera;
00058 PerspectiveCamera perspective_camera;
00059 bool dirty_buffer;
00060 Worldfile* wf;
00061
00062 int startx, starty;
00063 bool selectedModel;
00064 bool clicked_empty_space;
00065 int empty_space_startx, empty_space_starty;
00066 std::list<Model*> selected_models;
00067 Model* last_selection;
00068
00069
00070 msec_t interval;
00071
00072 void RecordRay( double x1, double y1, double x2, double y2 );
00073 void DrawRays();
00074 void ClearRays();
00075 void DrawGlobalGrid();
00076
00077 void AddModel( Model* mod );
00078 void RemoveModel( Model* mod );
00079
00080 Option
00081 showBBoxes,
00082 showBlocks,
00083 showBlur,
00084 showClock,
00085 showData,
00086 showFlags,
00087 showFollow,
00088 showFootprints,
00089 showGrid,
00090 showOccupancy,
00091 showScreenshots,
00092 showStatus,
00093 showTrailArrows,
00094 showTrailRise,
00095 showTrails,
00096 showVoxels,
00097 pCamOn,
00098 visualizeAll;
00099
00100 public:
00101 Canvas( WorldGui* world, int x, int y, int width, int height);
00102 ~Canvas();
00103
00104 bool graphics;
00105 WorldGui* world;
00106 unsigned long frames_rendered_count;
00107 int screenshot_frame_skip;
00108
00109 std::map< std::string, Option* > _custom_options;
00110
00111 void Screenshot();
00112 void InitGl();
00113 void InitTextures();
00114 void createMenuItems( Fl_Menu_Bar* menu, std::string path );
00115
00116 void FixViewport(int W,int H);
00117 void DrawFloor();
00118 void DrawBlocks();
00119 void DrawBoundingBoxes();
00120 void resetCamera();
00121 virtual void renderFrame();
00122 virtual void draw();
00123 virtual int handle( int event );
00124 void resize(int X,int Y,int W,int H);
00125
00126 void CanvasToWorld( int px, int py,
00127 double *wx, double *wy, double* wz );
00128
00129 Model* getModel( int x, int y );
00130 bool selected( Model* mod );
00131 void select( Model* mod );
00132 void unSelect( Model* mod );
00133 void unSelectAll();
00134
00135 inline void setDirtyBuffer( void ) { dirty_buffer = true; }
00136 inline bool dirtyBuffer( void ) const { return dirty_buffer; }
00137
00138 void PushColor( Color col )
00139 { colorstack.Push( col ); }
00140
00141 void PushColor( double r, double g, double b, double a )
00142 { colorstack.Push( r,g,b,a ); }
00143
00144 void PopColor(){ colorstack.Pop(); }
00145
00146 void InvertView( uint32_t invertflags );
00147
00148 bool VisualizeAll(){ return ! visualizeAll; }
00149
00150 static void TimerCallback( Canvas* canvas );
00151 static void perspectiveCb( Fl_Widget* w, void* p );
00152
00153 void EnterScreenCS();
00154 void LeaveScreenCS();
00155
00156 void Load( Worldfile* wf, int section );
00157 void Save( Worldfile* wf, int section );
00158
00159 bool IsTopView(){ return( (fabs( camera.yaw() ) < 0.1) &&
00160 (fabs( camera.pitch() ) < 0.1) ); }
00161 };
00162
00163 }