Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ContextWX.cpp
1 #include "ContextWX.hh"
2 #include <iostream>
3 #include <Utils/GlewInitWrapper.hh>
4 
5 using namespace BIAS;
6 using namespace std;
7 
8 #define TIMER_ID 1967735
9 
10 BEGIN_EVENT_TABLE(ContextWX, wxGLCanvas)
11  EVT_PAINT (ContextWX::OnPaint)
12  EVT_LEFT_DOWN (ContextWX::OnLeftDown)
13  EVT_LEFT_UP (ContextWX::OnLeftUp)
14  EVT_MIDDLE_DOWN (ContextWX::OnMiddleDown)
15  EVT_MIDDLE_UP (ContextWX::OnMiddleUp)
16  EVT_RIGHT_DOWN (ContextWX::OnRightDown)
17  EVT_RIGHT_UP (ContextWX::OnRightUp)
18  EVT_RIGHT_DOWN (ContextWX::OnRightDown)
19  EVT_LEFT_DCLICK (ContextWX::OnLeftDClick)
20  EVT_RIGHT_DCLICK(ContextWX::OnRightDClick)
21  EVT_MOTION (ContextWX::OnMotion)
22  EVT_SIZE (ContextWX::OnSize)
23  EVT_KEY_DOWN (ContextWX::OnKeyDown)
24  EVT_KEY_UP (ContextWX::OnKeyUp)
25  EVT_CHAR (ContextWX::OnKey )
26  EVT_TIMER (TIMER_ID, ContextWX::OnTimer)
27  EVT_ERASE_BACKGROUND(ContextWX::OnEraseBG)
28  EVT_ENTER_WINDOW (ContextWX::OnEnterWindow)
29  EVT_LEAVE_WINDOW (ContextWX::OnLeaveWindow)
30 END_EVENT_TABLE()
31 
32 int ContextWX::defaultAttribs[] = {
33  WX_GL_RGBA,
34  WX_GL_LEVEL, 0, //means main window, <0 underlay, >0 overlay
35  WX_GL_MIN_RED, 8,
36  WX_GL_MIN_GREEN, 8,
37  WX_GL_MIN_BLUE, 8,
38  WX_GL_MIN_ALPHA, 8,
39  WX_GL_DEPTH_SIZE, 24,
40  WX_GL_DOUBLEBUFFER, 1 , //use double buffer
41  //WX_GL_SAMPLE_BUFFERS, 1, //multisampling (aliasing)
42  0 //termination flag
43 };
44 
45 // Try to comment out this line if WX crashes when trying to create context.
46 // This means you wont get a context with the desired attributes but
47 // hopefully a context which works (might have less bits or lead to strange
48 // behaviour because you have a strange color format).
49 
50 //#define GL_USE_DEFAULT_ATTRIBS
51 
52 ContextWX::ContextWX(wxWindow* parent, wxWindowID id, const wxPoint& pos,
53  const wxSize& size, long style,
54  const wxString& name, int* attribList, const wxPalette& palette) :
55 #if wxCHECK_VERSION(2, 9, 0)
56  #ifdef GL_USE_DEFAULT_ATTRIBS
57  wxGLCanvas(parent, id, defaultAttribs, pos, size, style, name, palette),
58  #else
59  wxGLCanvas(parent, id, attribList, pos, size, style, name, palette),
60  #endif
61 #else
62  #ifdef GL_USE_DEFAULT_ATTRIBS
63  wxGLCanvas(parent, id, pos, size, style, name, defaultAttribs, palette),
64  #else
65  wxGLCanvas(parent, id, pos, size, style, name, attribList, palette),
66  #endif
67 #endif
68 
69  initialized_(false)
70 {
71 #if wxCHECK_VERSION(2, 9, 0)
72  context_ = new wxGLContext(this);
73 #endif
74  _OldMouseX = 0;
75  _OldMouseY = 0;
76  _FirstPaint = true;
77  //wxGLContext_ = new wxGLContext(this, NULL);
78  Timer_.SetOwner(this, TIMER_ID);
79 }
80 
81 
82 // The shared context constructor is deprecated in wx >= 2.9
83 // so this constructor will / should be removed
84 /*
85 ContextWX::ContextWX(wxWindow* parent, wxGLContext* shared, wxWindowID id,
86  const wxPoint& pos, const wxSize& size, long style,
87  const wxString& name, int* attribList, const wxPalette& palette)
88  : wxGLCanvas(parent, shared, id, pos, size, style, name, attribList, palette),
89  initialized_(false)
90 {
91  _OldMouseX = 0;
92  _OldMouseY = 0;
93  _FirstPaint = true;
94  GlewInitWrapper::GetInstance()->Init();
95  //wxGLContext_ = new wxGLContext(this, shared);
96  Timer_.SetOwner(this, TIMER_ID);
97 }*/
98 
99 int ContextWX::
101 {
102 //only in wxwidgets >2.9.0
103 // if(this->IsDisplaySupported(defaultAttribs)){
104 // cout<<"Default Attributes are supported"<<endl;
105 // return 0;
106 // }
107 // else{
108 // BIASERR("No working opengl display mode could be found.");
109 // }
110  return -1;
111 }
112 
113 void ContextWX::OnPaint(wxPaintEvent & /*event*/)
114 {
115  wxPaintDC dc(this);
116  #if wxCHECK_VERSION(2, 9, 0)
117  SetCurrent(*context_);
118  #else
119  SetCurrent();
120  #endif
121 
122  static bool firstCall = true;
123  if (_FirstPaint && firstCall)
124  {
125  firstCall = false;
127  _FirstPaint = false;
128  }
129 
130  if(initialized_) {
131  Render();
132  SwapBuffers();
133  }
134 }
135 
136 void ContextWX::OnTimer(wxTimerEvent & /*event*/)
137 {
138  if (TimerExpired()) Refresh();
139  if (TimerInterval_ >0)
140  Timer_.Start(TimerInterval_, true);
141 
142 }
143 
144 void ContextWX::OnLeftUp(wxMouseEvent& event)
145 {
146  LeftMouseUp(event.GetX(),event.GetY());
147  Refresh();
148 }
149 
150 void ContextWX::OnLeftDown(wxMouseEvent& event)
151 {
152  SetFocus();
153  LeftMouseDown(event.GetX(), event.GetY());
154  Refresh();
155 }
156 
157 void ContextWX::OnMiddleUp(wxMouseEvent& event)
158 {
159  MiddleMouseUp(event.GetX(),event.GetY());
160  Refresh();
161 }
162 
163 void ContextWX::OnMiddleDown(wxMouseEvent& event)
164 {
165  //SetFocus();
166  MiddleMouseDown(event.GetX(), event.GetY());
167  Refresh();
168 }
169 
170 void ContextWX::OnRightUp(wxMouseEvent& event)
171 {
172  RightMouseUp(event.GetX(),event.GetY());
173  Refresh();
174 }
175 
176 
177 void ContextWX::OnRightDown(wxMouseEvent& event)
178 {
179  RightMouseSingleClicked(event.GetX(), event.GetY());
180  RightMouseDown(event.GetX(), event.GetY());
181  Refresh();
182 }
183 
184 void ContextWX::OnLeftDClick(wxMouseEvent& event)
185 {
186  modifiers m=NONE;
187  if (event.MetaDown()) m=ALT;
188  if (event.ShiftDown()) m=SHIFT;
189  LeftMouseDoubleClicked(event.GetX(), event.GetY(),m);
190  Refresh();
191 }
192 
193 void ContextWX::OnRightDClick(wxMouseEvent & event)
194 {
195  RightMouseDoubleClicked(event.GetX(), event.GetY());
196  Refresh();
197 }
198 
199 void ContextWX::OnLeaveWindow(wxMouseEvent& event)
200 {
201  MouseLeftWindow();
202  Refresh();
203 }
204 
205 void ContextWX::OnEnterWindow(wxMouseEvent& event)
206 {
207  SetFocus();
208 }
209 
210 void ContextWX::OnMotion(wxMouseEvent& event)
211 {
212 
213  bool caught = false;
214  if( event.LeftIsDown() && event.RightIsDown() ) {
215  caught = LeftAndRightMouseMoved(_OldMouseX, event.GetX(), _OldMouseY, event.GetY());
216  Refresh();
217  }
218  else {
219  if (event.LeftIsDown())
220  {
221  caught = LeftMouseMoved(_OldMouseX, event.GetX(), _OldMouseY, event.GetY());
222  Refresh();
223  }
224 
225  if (event.RightIsDown())
226  {
227  caught = RightMouseMoved(_OldMouseX, event.GetX(), _OldMouseY, event.GetY());
228  Refresh();
229  }
230  }
231  if (event.MiddleIsDown())
232  {
233  caught = MiddleMouseMoved(_OldMouseX, event.GetX(), _OldMouseY, event.GetY());
234  Refresh();
235  }
236  if(!caught){
237  caught = MouseMoved(event.GetX(), event.GetY());
238  Refresh();
239  }
240 
241  _OldMouseX = event.GetX();
242  _OldMouseY = event.GetY();
243  //cout<<"CWX OnMotion:"<<_OldMouseX<<","<<_OldMouseY<<endl;
244  event.Skip();
245 }
246 
247 void ContextWX::OnSize(wxSizeEvent& event)
248 {
249  if (_FirstPaint) return;
250  WindowReshape(event.GetSize().GetWidth(), event.GetSize().GetHeight());
251  event.Skip();
252 }
253 
254 
255 void ContextWX::OnKeyDown(wxKeyEvent& event)
256 {
257  //keydown may be needed in the parent window
258  event.ResumePropagation(wxEVENT_PROPAGATE_MAX);
259  event.Skip();
260 }
261 
262 
263 void ContextWX::OnKey(wxKeyEvent& event)
264 {
265 
266  int key = event.GetKeyCode();
267  if (key<300) {
268  StandardKeyPressed(key,event.GetX(),event.GetY());
269  }
270  else
271  switch(key)
272  {
273  case WXK_F1:
274  SpecialKeyPressed(KEY_F1);
275  break;
276  case WXK_F2:
277  SpecialKeyPressed(KEY_F2);
278  break;
279  case WXK_F3:
280  SpecialKeyPressed(KEY_F3);
281  break;
282  case WXK_F4:
283  SpecialKeyPressed(KEY_F4);
284  break;
285  case WXK_F5:
286  SpecialKeyPressed(KEY_F5);
287  break;
288  case WXK_F6:
289  SpecialKeyPressed(KEY_F6);
290  break;
291  case WXK_F7:
292  SpecialKeyPressed(KEY_F7);
293  break;
294  case WXK_F8:
295  SpecialKeyPressed(KEY_F8);
296  break;
297  case WXK_F9:
298  SpecialKeyPressed(KEY_F9);
299  break;
300  case WXK_F10:
301  SpecialKeyPressed(KEY_F10);
302  break;
303  case WXK_F11:
304  SpecialKeyPressed(KEY_F11);
305  break;
306  case WXK_F12:
307  SpecialKeyPressed(KEY_F12);
308  break;
309 
310  case WXK_HOME:
311  SpecialKeyPressed(KEY_HOME);
312  break;
313  }
314  //cerr <<"ContextWX::OnKeyPress\n";
315  event.ResumePropagation(wxEVENT_PROPAGATE_MAX);
316  event.Skip();
317 }
318 
319 void ContextWX::OnKeyUp(wxKeyEvent& event)
320 {
321 
322  int key = event.GetKeyCode();
323  if (key<300) {
324  StandardKeyUp(key,event.GetX(),event.GetY());
325  }
326  else
327  switch(key)
328  {
329  case WXK_F1:
330  SpecialKeyUp(KEY_F1);
331  break;
332  case WXK_F2:
333  SpecialKeyUp(KEY_F2);
334  break;
335  case WXK_F3:
336  SpecialKeyUp(KEY_F3);
337  break;
338  case WXK_F4:
339  SpecialKeyUp(KEY_F4);
340  break;
341  case WXK_F5:
342  SpecialKeyUp(KEY_F5);
343  break;
344  case WXK_F6:
345  SpecialKeyUp(KEY_F6);
346  break;
347  case WXK_F7:
348  SpecialKeyUp(KEY_F7);
349  break;
350  case WXK_F8:
351  SpecialKeyUp(KEY_F8);
352  break;
353  case WXK_F9:
354  SpecialKeyUp(KEY_F9);
355  break;
356  case WXK_F10:
357  SpecialKeyUp(KEY_F10);
358  break;
359  case WXK_F11:
360  SpecialKeyUp(KEY_F11);
361  break;
362  case WXK_F12:
363  SpecialKeyUp(KEY_F12);
364  break;
365 
366  case WXK_HOME:
367  SpecialKeyUp(KEY_HOME);
368  break;
369  }
370  //cerr <<"ContextWX::OnKeyPress\n";
371  event.ResumePropagation(wxEVENT_PROPAGATE_MAX);
372  event.Skip();
373 }
374 
375 void ContextWX::SetTimer(unsigned int interval)
376 {
377  //cout <<"Timer: "<<interval<<endl;
378  if (interval <10) {
379  BIASERR("Timer smaller then 10ms are prohibited");
380  return;
381  }
382  // cout <<interval<<endl;
383  TimerInterval_ = interval;
384  if (TimerInterval_ >0)
385  Timer_.Start(TimerInterval_, true);
386 }
387 
389 {
390  Timer_.Stop();
391 }
392 
394  if (this->GetParent() && this->GetParent()->IsShown()) {
395  #if wxCHECK_VERSION(2, 9, 0)
396  SetCurrent(*context_);
397  #else
398  SetCurrent();
399  #endif
400  } else {
401  if (this->GetParent()){
402  BIASWARN("trying to make hidden context current!");
403  } else {
404  BIASWARN("trying to make context without parent current!");
405  }
406  }
407 }
408 
409 void ContextWX::OnEraseBG(wxEraseEvent& event)
410 {
411 }
bool LeftMouseDoubleClicked(int x, int y, int m)
virtual void OnPaint(wxPaintEvent &event)
Definition: ContextWX.cpp:113
bool MiddleMouseDown(int x, int y)
bool StandardKeyUp(unsigned char, int, int)
bool RightMouseDoubleClicked(int x, int y)
virtual void SetTimer(unsigned int interval)
activate timer with intervall in ms
Definition: ContextWX.cpp:375
bool LeftMouseDown(int x, int y)
virtual int Render()
Simple rendering routine.
bool LeftMouseMoved(int x1, int x2, int y1, int y2)
virtual void MakeGLContextCurrent()
try to make this OpenGl context current
Definition: ContextWX.cpp:393
bool TimerExpired()
Always informs both camera and scenes!
bool MiddleMouseUp(int x, int y)
Context implementation for wxWidgets.
Definition: ContextWX.hh:31
static GlewInitWrapper * GetInstance()
bool StandardKeyPressed(unsigned char, int, int)
int FindWorkingDisplayConfiguration()
Definition: ContextWX.cpp:100
bool RightMouseSingleClicked(int x, int y)
bool LeftMouseUp(int x, int y)
bool RightMouseDown(int x, int y)
bool LeftAndRightMouseMoved(int x1, int x2, int y1, int y2)
bool RightMouseUp(int x, int y)
bool WindowReshape(int width, int height)
bool MiddleMouseMoved(int x1, int x2, int y1, int y2)
bool MouseMoved(int x, int y)
ContextWX(wxWindow *parent, wxWindowID id=-1, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=0, const wxString &name=wxT("GLCanvas"), int *attribList=defaultAttribs, const wxPalette &palette=wxNullPalette)
Definition: ContextWX.cpp:52
bool RightMouseMoved(int x1, int x2, int y1, int y2)
virtual void DeactivateTimer()
deactivate timer
Definition: ContextWX.cpp:388