1 #include "bgui_vsol2D_tableau.h"
2 //:
3 // \file
4 #include <bgui/bgui_vsol_soview2D.h>
5 #include "vgui/vgui.h"
6 #include "vgui/vgui_style.h"
7 #include <vsol/vsol_spatial_object_2d.h>
8 #include <vsol/vsol_point_2d.h>
9 #include <vsol/vsol_line_2d.h>
10 #include <vsol/vsol_polyline_2d.h>
11 #include <vsol/vsol_conic_2d.h>
12 #include <vsol/vsol_polygon_2d.h>
13 #include <vdgl/vdgl_digital_curve.h>
14 #include <cassert>
15 #ifdef _MSC_VER
16 #  include "vcl_msvc_warnings.h"
17 #endif
18 
bgui_vsol2D_tableau(const char * n)19 bgui_vsol2D_tableau::bgui_vsol2D_tableau(const char* n) :
20   vgui_easy2D_tableau(n) { this->init(); }
21 
bgui_vsol2D_tableau(vgui_image_tableau_sptr const & it,const char * n)22 bgui_vsol2D_tableau::bgui_vsol2D_tableau(vgui_image_tableau_sptr const& it,
23                                          const char* n) :
24   vgui_easy2D_tableau(it, n) { this->init(); }
25 
bgui_vsol2D_tableau(vgui_tableau_sptr const & t,const char * n)26 bgui_vsol2D_tableau::bgui_vsol2D_tableau(vgui_tableau_sptr const& t,
27                                          const char* n) :
28   vgui_easy2D_tableau(t, n) { this->init(); }
29 
~bgui_vsol2D_tableau()30 bgui_vsol2D_tableau::~bgui_vsol2D_tableau()
31 {
32 }
33 
init()34 void bgui_vsol2D_tableau::init()
35 {
36   //define default soview styles
37   //these can be overridden by later set_*_syle commands prior to drawing.
38   //
39   point_style_                = vgui_style::new_style(0.0f, 1.0f, 0.0f, 3.0f, 1.0f);
40   line_style_                 = vgui_style::new_style(0.8f, 0.2f, 0.9f, 1.0f, 3.0f);
41   conic_style_                 = vgui_style::new_style(0.2f, 0.8f, 0.1f, 1.0f, 3.0f);
42   polyline_style_             = vgui_style::new_style(0.8f, 0.2f, 0.9f, 1.0f, 3.0f);
43   digital_curve_style_        = vgui_style::new_style(0.8f, 0.0f, 0.8f, 1.0f, 3.0f);
44   dotted_digital_curve_style_ = vgui_style::new_style(0.8f, 0.0f, 0.8f, 3.0f, 3.0f);
45   edgel_curve_style_          = vgui_style::new_style(0.0f, 0.5f, 0.8f, 1.0f, 3.0f);
46   dotted_edgel_curve_style_   = vgui_style::new_style(0.0f, 0.5f, 0.8f, 3.0f, 3.0f);
47 }
48 
49 
50 bgui_vsol_soview2D_point*
add_vsol_point_2d(vsol_point_2d_sptr const & p,const vgui_style_sptr & style)51 bgui_vsol2D_tableau::add_vsol_point_2d(vsol_point_2d_sptr const& p,
52                                               const vgui_style_sptr& style)
53 {
54   bgui_vsol_soview2D_point* obj =
55       new bgui_vsol_soview2D_point(p);
56   add(obj);
57   if (style)
58     obj->set_style( style );
59   else
60     obj->set_style( point_style_ );
61   return obj;
62 }
63 
64 
65 bgui_vsol_soview2D_line_seg*
add_vsol_line_2d(vsol_line_2d_sptr const & line,const vgui_style_sptr & style)66 bgui_vsol2D_tableau::add_vsol_line_2d(vsol_line_2d_sptr const& line,
67                                              const vgui_style_sptr& style)
68 {
69   bgui_vsol_soview2D_line_seg* obj =
70       new bgui_vsol_soview2D_line_seg(line);
71   add(obj);
72   if (style)
73     obj->set_style( style );
74   else
75     obj->set_style( line_style_ );
76   return obj;
77 }
78 
79 
80 bgui_vsol_soview2D_conic_seg*
add_vsol_conic_2d(vsol_conic_2d_sptr const & conic,const vgui_style_sptr & style)81 bgui_vsol2D_tableau::add_vsol_conic_2d(vsol_conic_2d_sptr const& conic,
82                                       const vgui_style_sptr& style)
83 {
84   bgui_vsol_soview2D_conic_seg* obj =
85       new bgui_vsol_soview2D_conic_seg(conic);
86   add(obj);
87   if (style)
88     obj->set_style( style );
89   else
90     obj->set_style( conic_style_ );
91   return obj;
92 }
93 
94 
95 bgui_vsol_soview2D_polyline*
add_vsol_polyline_2d(vsol_polyline_2d_sptr const & pline,const vgui_style_sptr & style)96 bgui_vsol2D_tableau::add_vsol_polyline_2d(vsol_polyline_2d_sptr const& pline,
97                                                  const vgui_style_sptr& style)
98 {
99   bgui_vsol_soview2D_polyline* obj =
100       new bgui_vsol_soview2D_polyline(pline);
101   add(obj);
102   if (style)
103     obj->set_style( style );
104   else
105     obj->set_style( polyline_style_ );
106   return obj;
107 }
108 
109 
110 bgui_vsol_soview2D_polygon*
add_vsol_polygon_2d(vsol_polygon_2d_sptr const & pline,const vgui_style_sptr & style)111 bgui_vsol2D_tableau::add_vsol_polygon_2d(vsol_polygon_2d_sptr const& pline,
112                                                 const vgui_style_sptr& style)
113 {
114   bgui_vsol_soview2D_polygon* obj =
115       new bgui_vsol_soview2D_polygon(pline);
116   add(obj);
117   if (style)
118     obj->set_style( style );
119   else
120     obj->set_style( polyline_style_ );
121   return obj;
122 }
123 
124 bgui_vsol_soview2D_polygon_set*
add_vsol_polygon_2d_set(vsol_poly_set_2d_sptr const & set,const vgui_style_sptr & style)125 bgui_vsol2D_tableau::add_vsol_polygon_2d_set(vsol_poly_set_2d_sptr const& set,
126                                              const vgui_style_sptr& style)
127 {
128   bgui_vsol_soview2D_polygon_set* obj =
129       new bgui_vsol_soview2D_polygon_set(set);
130   add(obj);
131   if (style)
132     obj->set_style( style );
133   else
134     obj->set_style( polyline_style_ );
135   return obj;
136 }
137 
138 bgui_vsol_soview2D_digital_curve*
add_digital_curve(vsol_digital_curve_2d_sptr const & dc,const vgui_style_sptr & style)139 bgui_vsol2D_tableau::add_digital_curve(vsol_digital_curve_2d_sptr const& dc,
140                                        const vgui_style_sptr& style)
141 {
142   bgui_vsol_soview2D_digital_curve* obj =
143     new bgui_vsol_soview2D_digital_curve(dc);
144   add(obj);
145   if (style)
146     obj->set_style( style );
147   else
148     obj->set_style( digital_curve_style_ );
149   return obj;
150 }
151 
152 
153 bgui_vsol_soview2D_digital_curve*
add_dotted_digital_curve(vsol_digital_curve_2d_sptr const & dc,const vgui_style_sptr & style)154 bgui_vsol2D_tableau::add_dotted_digital_curve(vsol_digital_curve_2d_sptr const& dc,
155                                               const vgui_style_sptr& style)
156 {
157   bgui_vsol_soview2D_digital_curve* obj =
158       new bgui_vsol_soview2D_digital_curve(dc, true);
159   add(obj);
160   if (style)
161     obj->set_style( style );
162   else
163     obj->set_style( dotted_digital_curve_style_ );
164   return obj;
165 }
166 
167 
168 bgui_vsol_soview2D_edgel_curve*
add_edgel_curve(vdgl_digital_curve_sptr const & dc,const vgui_style_sptr & style)169 bgui_vsol2D_tableau::add_edgel_curve(vdgl_digital_curve_sptr const& dc,
170                                               const vgui_style_sptr& style)
171 {
172   bgui_vsol_soview2D_edgel_curve* obj =
173     new bgui_vsol_soview2D_edgel_curve(dc);
174   add(obj);
175   if (style)
176     obj->set_style( style );
177   else
178     obj->set_style( edgel_curve_style_ );
179   return obj;
180 }
181 
182 
183 bgui_vsol_soview2D_edgel_curve*
add_dotted_edgel_curve(vdgl_digital_curve_sptr const & dc,const vgui_style_sptr & style)184 bgui_vsol2D_tableau::add_dotted_edgel_curve(vdgl_digital_curve_sptr const& dc,
185                                             const vgui_style_sptr& style)
186 {
187   bgui_vsol_soview2D_edgel_curve* obj =
188       new bgui_vsol_soview2D_edgel_curve(dc, true);
189   add(obj);
190   if (style)
191     obj->set_style( style );
192   else
193     obj->set_style( dotted_edgel_curve_style_ );
194   return obj;
195 }
196 
197 
198 void bgui_vsol2D_tableau::
add_spatial_objects(std::vector<vsol_spatial_object_2d_sptr> const & sos,const vgui_style_sptr & style)199 add_spatial_objects(std::vector<vsol_spatial_object_2d_sptr> const& sos,
200                     const vgui_style_sptr& style)
201 {
202   for (std::vector<vsol_spatial_object_2d_sptr>::const_iterator sit = sos.begin();
203        sit != sos.end(); sit++)
204   {
205     add_spatial_object( (*sit) , style );
206   }
207 }
208 
209 
210 void bgui_vsol2D_tableau::
add_spatial_object(vsol_spatial_object_2d_sptr const & sos,const vgui_style_sptr & style)211 add_spatial_object(vsol_spatial_object_2d_sptr const& sos,
212                    const vgui_style_sptr& style)
213 {
214   if (sos->cast_to_point()) {
215     vsol_point_2d_sptr p = sos->cast_to_point();
216     this->add_vsol_point_2d(p , style );
217   }
218   else if (sos->cast_to_curve())
219   {
220     if (sos->cast_to_curve()->cast_to_digital_curve())
221     {
222       vsol_digital_curve_2d_sptr dc =
223         sos->cast_to_curve()->cast_to_digital_curve();
224       this->add_digital_curve(dc , style);
225     }
226     else if (sos->cast_to_curve()->cast_to_vdgl_digital_curve())
227     {
228       vdgl_digital_curve_sptr dc =
229         sos->cast_to_curve()->cast_to_vdgl_digital_curve();
230       this->add_edgel_curve(dc , style);
231     }
232     else if (sos->cast_to_curve()->cast_to_line())
233     {
234       vsol_line_2d_sptr line =
235         sos->cast_to_curve()->cast_to_line();
236       this->add_vsol_line_2d(line, style);
237     }
238     else if (sos->cast_to_curve()->cast_to_polyline())
239     {
240       vsol_polyline_2d_sptr pline =
241         sos->cast_to_curve()->cast_to_polyline();
242       this->add_vsol_polyline_2d(pline , style);
243     }
244     else if (sos->cast_to_curve()->cast_to_conic())
245     {
246       vsol_conic_2d_sptr conic = sos->cast_to_curve()->cast_to_conic();
247 
248       // make sure the endpoints are already defined
249       assert(conic->p0() && conic->p1());
250 
251       this->add_vsol_conic_2d(conic, style);
252     }
253     else
254       assert(!"unknown curve type in bgui_vsol2D_tableau::add_spatial_object()");
255   }
256   else if (sos->cast_to_region()) {
257     if (sos->cast_to_region()->cast_to_polygon())
258     {
259       vsol_polygon_2d_sptr pline =
260         sos->cast_to_region()->cast_to_polygon();
261       this->add_vsol_polygon_2d(pline, style);
262     }
263     else
264       assert(!"unknown region type in bgui_vsol2D_tableau::add_spatial_object()");
265   }
266   else
267     assert(!"unknown spatial object type in bgui_vsol2D_tableau::add_spatial_object()");
268   return;
269 }
270 
271 
set_vsol_spatial_object_2d_style(vsol_spatial_object_2d_sptr sos,const vgui_style_sptr & style)272 void bgui_vsol2D_tableau::set_vsol_spatial_object_2d_style(vsol_spatial_object_2d_sptr sos,
273                                                            const vgui_style_sptr& style)
274 {
275   if (sos->cast_to_point()) {
276     set_vsol_point_2d_style(style);
277   }
278   else if (sos->cast_to_curve()) {
279     set_digital_curve_style(style);
280   }
281 }
282 
283 
set_vsol_point_2d_style(const vgui_style_sptr & style)284 void bgui_vsol2D_tableau::set_vsol_point_2d_style(const vgui_style_sptr& style)
285 {
286   point_style_->rgba[0] = style->rgba[0];
287   point_style_->rgba[1] = style->rgba[1];
288   point_style_->rgba[2] = style->rgba[2];
289   point_style_->point_size = style->point_size;
290   point_style_->line_width = style->line_width;
291 }
292 
293 
set_vsol_line_2d_style(const vgui_style_sptr & style)294 void bgui_vsol2D_tableau::set_vsol_line_2d_style(const vgui_style_sptr& style)
295 {
296   line_style_->rgba[0] = style->rgba[0];
297   line_style_->rgba[1] = style->rgba[1];
298   line_style_->rgba[2] = style->rgba[2];
299   line_style_->point_size = style->point_size;
300   line_style_->line_width = style->line_width;
301 }
302 
303 
set_vsol_polyline_2d_style(const vgui_style_sptr & style)304 void bgui_vsol2D_tableau::set_vsol_polyline_2d_style(const vgui_style_sptr& style)
305 {
306   polyline_style_->rgba[0] = style->rgba[0];
307   polyline_style_->rgba[1] = style->rgba[1];
308   polyline_style_->rgba[2] = style->rgba[2];
309   polyline_style_->point_size = style->point_size;
310   polyline_style_->line_width = style->line_width;
311 }
312 
313 
set_digital_curve_style(const vgui_style_sptr & style)314 void bgui_vsol2D_tableau::set_digital_curve_style(const vgui_style_sptr& style)
315 {
316   digital_curve_style_->rgba[0] = style->rgba[0];
317   digital_curve_style_->rgba[1] = style->rgba[1];
318   digital_curve_style_->rgba[2] = style->rgba[2];
319   digital_curve_style_->point_size = style->point_size;
320   digital_curve_style_->line_width = style->line_width;
321 }
322 
323 
set_dotted_digital_curve_style(const vgui_style_sptr & style)324 void bgui_vsol2D_tableau::set_dotted_digital_curve_style(const vgui_style_sptr& style)
325 {
326   dotted_digital_curve_style_->rgba[0] = style->rgba[0];
327   dotted_digital_curve_style_->rgba[1] = style->rgba[1];
328   dotted_digital_curve_style_->rgba[2] = style->rgba[2];
329   dotted_digital_curve_style_->point_size = style->point_size;
330   dotted_digital_curve_style_->line_width = style->line_width;
331 }
332 
333 
set_edgel_curve_style(const vgui_style_sptr & style)334 void bgui_vsol2D_tableau::set_edgel_curve_style(const vgui_style_sptr& style)
335 {
336   edgel_curve_style_->rgba[0] = style->rgba[0];
337   edgel_curve_style_->rgba[1] = style->rgba[1];
338   edgel_curve_style_->rgba[2] = style->rgba[2];
339   edgel_curve_style_->point_size = style->point_size;
340   edgel_curve_style_->line_width = style->line_width;
341 }
342 
343 
set_dotted_edgel_curve_style(const vgui_style_sptr & style)344 void bgui_vsol2D_tableau::set_dotted_edgel_curve_style(const vgui_style_sptr& style)
345 {
346   dotted_edgel_curve_style_->rgba[0] = style->rgba[0];
347   dotted_edgel_curve_style_->rgba[1] = style->rgba[1];
348   dotted_edgel_curve_style_->rgba[2] = style->rgba[2];
349   dotted_edgel_curve_style_->point_size = style->point_size;
350   dotted_edgel_curve_style_->line_width = style->line_width;
351 }
352