1 // This is brl/bbas/bgui/bgui_vsol_camera_tableau.h
2 #ifndef bgui_vsol_camera_tableau_h_
3 #define bgui_vsol_camera_tableau_h_
4 //-----------------------------------------------------------------------------
5 //:
6 // \file
7 // \brief A tableau that knows how to project 3-d vsol objects with a camera
8 // \author
9 //   J.L. Mundy
10 //
11 // \verbatim
12 //  Created June 2, 2003
13 //  Modifications:
14 //   Peter Vanroose - 8 May 2004 - re-implemented add_vsol_box_3d() with a single polygon
15 //   Now obsolete == do not use in new code === J.L. Mundy, March 1, 2008
16 // \endverbatim
17 //-----------------------------------------------------------------------------
18 #include <vector>
19 #include <iostream>
20 #include <map>
21 #ifdef _MSC_VER
22 #  include <vcl_msvc_warnings.h>
23 #endif
24 #include <vgl/algo/vgl_p_matrix.h>
25 #include <vgui/vgui_style.h>
26 #include <vgl/vgl_point_2d.h>
27 #include <vsol/vsol_spatial_object_3d_sptr.h>
28 #include <vsol/vsol_point_3d_sptr.h>
29 #include <vsol/vsol_line_3d_sptr.h>
30 #include <vsol/vsol_polygon_3d_sptr.h>
31 #include <vsol/vsol_box_3d_sptr.h>
32 #include <vgui/vgui_tableau_sptr.h>
33 #include <vgui/vgui_style_sptr.h>
34 #include <vgui/vgui_image_tableau_sptr.h>
35 #include <vgui/vgui_easy2D_tableau.h>
36 
37 #include "bgui_vsol_camera_tableau_sptr.h"
38 class bgui_vsol_soview2D_point;
39 class bgui_vsol_soview2D_line_seg;
40 class bgui_vsol_soview2D_polygon;
41 
42 class bgui_vsol_camera_tableau : public vgui_easy2D_tableau
43 {
44  public:
45   bgui_vsol_camera_tableau(const char* n="unnamed");
46 
47   bgui_vsol_camera_tableau(vgui_image_tableau_sptr const& it,
48                            const char* n="unnamed");
49 
50   bgui_vsol_camera_tableau(vgui_tableau_sptr const& t,
51                            const char* n="unnamed");
52 
53   ~bgui_vsol_camera_tableau();
54 
55   //:virtual handle method for events
56   virtual bool handle(vgui_event const &);
57 
58   //:the projection camera
set_camera(vgl_p_matrix<double> const & camera)59   void set_camera(vgl_p_matrix<double> const& camera) { camera_=camera; }
get_camera()60   vgl_p_matrix<double> get_camera() const { return camera_; }
61 
62   //: display for projected vsol_point_3d
63   bgui_vsol_soview2D_point*
64     add_vsol_point_3d(vsol_point_3d_sptr const& point);
65 
66   //: display for vsol_line_3d
67   bgui_vsol_soview2D_line_seg*
68     add_vsol_line_3d(vsol_line_3d_sptr const& line);
69 
70   //: display for vsol_polygon_3d
71   bgui_vsol_soview2D_polygon*
72     add_vsol_polygon_3d(vsol_polygon_3d_sptr const& poly);
73 
74   //:display for a 3D box
75   bgui_vsol_soview2D_polygon*
76     add_vsol_box_3d(vsol_box_3d_sptr const& box);
77 
78   //: display for general spatial object
79   void add_spatial_object_3d(vsol_spatial_object_3d_sptr const& sos);
80 
81   //: display methods for sets of objects
82   void add_spatial_objects_3d(std::vector<vsol_spatial_object_3d_sptr> const& sos);
83 
84   void add_points_3d(std::vector<vsol_point_3d_sptr> const & lines);
85 
86   void add_lines_3d(std::vector<vsol_line_3d_sptr> const & lines);
87 
88   void add_polygons_3d(std::vector<vsol_polygon_3d_sptr> const & lines);
89 
90   void add_boxes_3d(std::vector<vsol_box_3d_sptr> const & lines);
91 
92 
93   //: clear the tableau including the highlight map
94   void clear_all();
95 
96   //: Methods for getting mapped objects
enable_highlight()97   void enable_highlight() { highlight_ = true; }
disable_highlight()98   void disable_highlight() { highlight_ = false; }
99 
100   //: Methods for changing the default style of displayable objects
101 
102   void set_vsol_point_3d_style(const float r, const float g, const float b,
103                                const float point_radius);
104 
105   void set_vsol_line_3d_style(const float r, const float g, const float b,
106                               const float line_width);
107 
108   void set_vsol_polygon_3d_style(const float r, const float g, const float b,
109                                  const float line_width);
110 
111   void set_vsol_box_3d_style(const float r, const float g, const float b,
112                              const float line_width);
113 
114  protected:
115   //internal methods
116   vgl_point_2d<double>  project(vsol_point_3d_sptr const& p3d);
117   //members
118   bool highlight_;
119   void init();
120   std::map<int, vsol_spatial_object_3d_sptr> obj_map_;
121   std::map<std::string, vgui_style_sptr> style_map_;
122   int old_id_;
123   vgui_style_sptr highlight_style_;
124   vgui_style_sptr old_style_;
125   vgl_p_matrix<double> camera_;
126 };
127 
128 //this stuff is needed to establish inheritance between tableau  smart pointers
129 //cloned from xcv_image_tableau
130 struct bgui_vsol_camera_tableau_new : public bgui_vsol_camera_tableau_sptr
131 {
132   typedef bgui_vsol_camera_tableau_sptr base;
133 
134   bgui_vsol_camera_tableau_new(const char* n="unnamed") :
basebgui_vsol_camera_tableau_new135     base(new bgui_vsol_camera_tableau(n)) { }
136   bgui_vsol_camera_tableau_new(vgui_image_tableau_sptr const& it,
137                                const char* n="unnamed") :
basebgui_vsol_camera_tableau_new138     base(new bgui_vsol_camera_tableau(it,n)) { }
139 
140   bgui_vsol_camera_tableau_new(vgui_tableau_sptr const& t, const char* n="unnamed")
basebgui_vsol_camera_tableau_new141     :  base(new bgui_vsol_camera_tableau(t, n)) { }
142 
vgui_easy2D_tableau_sptrbgui_vsol_camera_tableau_new143   operator vgui_easy2D_tableau_sptr () const { vgui_easy2D_tableau_sptr tt; tt.vertical_cast(*this); return tt; }
144 };
145 
146 #endif // bgui_vsol_camera_tableau_h_
147