X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FcreawxVTKRenderWindowInteractor.cxx;h=251a7cd8233a558e831503ecec8bd2ce267f4119;hb=946e6034021fe462f5a1604e18ea8121afb98a18;hp=107c0e30d83875458c027b86518363db119f20d6;hpb=cad06bc3e82dac96718dfe35a68f17c133c57e6e;p=crea.git diff --git a/src/creawxVTKRenderWindowInteractor.cxx b/src/creawxVTKRenderWindowInteractor.cxx index 107c0e3..251a7cd 100644 --- a/src/creawxVTKRenderWindowInteractor.cxx +++ b/src/creawxVTKRenderWindowInteractor.cxx @@ -1,10 +1,37 @@ +/* + # --------------------------------------------------------------------- + # + # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image + # pour la SantÈ) + # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton + # Previous Authors : Laurent Guigues, Jean-Pierre Roux + # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil + # + # This software is governed by the CeCILL-B license under French law and + # abiding by the rules of distribution of free software. You can use, + # modify and/ or redistribute the software under the terms of the CeCILL-B + # license as circulated by CEA, CNRS and INRIA at the following URL + # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + # or in the file LICENSE.txt. + # + # As a counterpart to the access to the source code and rights to copy, + # modify and redistribute granted by the license, users are provided only + # with a limited warranty and the software's author, the holder of the + # economic rights, and the successive licensors have only limited + # liability. + # + # The fact that you are presently reading this means that you have had + # knowledge of the CeCILL-B license and that you accept its terms. + # ------------------------------------------------------------------------ */ + + /*========================================================================= Program: Visualization Toolkit - Module: $RCSfile: creawxVTKRenderWindowInteractor.cxx,v $ + Module: $RCSfile$ Language: C++ - Date: $Date: 2009/01/07 12:55:23 $ - Version: $Revision: 1.4 $ + Date: $Date$ + Version: $Revision$ Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. @@ -15,8 +42,8 @@ PURPOSE. See the above copyright notice for more information. =========================================================================*/ -#ifdef USE_WXWIDGETS -#ifdef USE_VTK + +#include #include "creawxVTKRenderWindowInteractor.h" @@ -25,24 +52,48 @@ # include "vtkVersion.h" #endif -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) # include "vtkCommand.h" #else # include "vtkInteractorStyle.h" #endif +#include "vtkDebugLeaks.h" + +// AKT: wxOSX 2.9.x defines __WXOSX_COCOA__ rather than __WXCOCOA__ +#ifdef __WXOSX_COCOA__ +#define __WXCOCOA__ +#endif + +#if defined(__WXMAC__) && wxCHECK_VERSION(2,9,0) + // ControlDown has been changed to mean Command key down + #define ControlDown RawControlDown +#endif +#ifdef __WXMAC__ +#ifdef __WXCOCOA__ +#include "vtkCocoaRenderWindow.h" +#else +#include "vtkCarbonRenderWindow.h" +#endif +#endif + +//======================================================================= +// LG : NAMESPACE IS NECESSARY TO AVOID CONFLICTING SYMBOLS IN DYN LIBS +namespace crea +{ - //Keep this for compatibilty reason, this was introduced in wxGTK 2.4.0 +//Keep this for compatibilty reason, this was introduced in wxGTK 2.4.0 #if (!wxCHECK_VERSION(2, 4, 0)) - wxWindow* wxGetTopLevelParent(wxWindow *win) - { +wxWindow* wxGetTopLevelParent(wxWindow *win) +{ while ( win && !win->IsTopLevel() ) - win = win->GetParent(); + win = win->GetParent(); return win; - } +} #endif - +} +// LG : EO namespace bbwxvtk //======================================================================= // To access objc calls on cocoa @@ -56,17 +107,45 @@ #endif //VTK_USE_COCOA #endif //__WXCOCOA__ -#ifdef __WXGTK__ -# include // GDK_WINDOW_XWINDOW is found here in wxWidgets 2.8.0 -# include "gdk/gdkprivate.h" -#ifdef __WXGTK20__ -#include +#if wxMAJOR_VERSION <= 2 + + #ifdef __WXGTK__ + #include // GDK_WINDOW_XWINDOW is found here in wxWidgets 2.8.0 + #include "gdk/gdkprivate.h" + #if wxCHECK_VERSION(2, 9, 0) + // thanks to: http://thomasfischer.biz/?p=382 + #include + #include + #include + #define piz(wxwin) WX_PIZZA((wxwin)->m_wxwindow) + #define GetXWindow(wxwin) (wxwin)->m_wxwindow ? \ + GDK_WINDOW_XWINDOW(((GtkWidget*)piz(wxwin))->window) : \ + GDK_WINDOW_XWINDOW((wxwin)->m_widget->window) + #else + #if wxCHECK_VERSION(2, 8, 0) + #ifdef __WXGTK20__ + #include + #else + #include + #endif + #else + #include + #endif + + #define GetXWindow(wxwin) (wxwin)->m_wxwindow ? \ + GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) : \ + GDK_WINDOW_XWINDOW((wxwin)->m_widget->window) + #endif + #endif + #else -#include -#endif + #ifdef __WXGTK__ + #include + #include #define GetXWindow(wxwin) (wxwin)->m_wxwindow ? \ - GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) : \ - GDK_WINDOW_XWINDOW((wxwin)->m_widget->window) + GDK_WINDOW_XID(gtk_widget_get_window((wxwin)->m_wxwindow)) : \ + GDK_WINDOW_XID(gtk_widget_get_window((wxwin)->m_widget)) + #endif #endif #ifdef __WXX11__ @@ -74,7 +153,6 @@ #define GetXWindow(wxwin) ((Window)(wxwin)->GetHandle()) #endif - //For more info on this class please go to: //http://wxvtk.sf.net //This hack is for some buggy wxGTK version: @@ -84,115 +162,166 @@ # define WX_USE_X_CAPTURE 1 #endif -#define ID_creawxVTKRenderWindowInteractor_TIMER 1001 +#define ID_wxVTKRenderWindowInteractor_TIMER 1001 +//======================================================================= +// LG : NAMESPACE IS NECESSARY TO AVOID CONFLICTING SYMBOLS IN DYN LIBS namespace crea { #if defined(__WXGTK__) && defined(USE_WXGLCANVAS) -IMPLEMENT_DYNAMIC_CLASS(creawxVTKRenderWindowInteractor, wxGLCanvas) #else -IMPLEMENT_DYNAMIC_CLASS(creawxVTKRenderWindowInteractor, wxWindow) #endif //__WXGTK__ //--------------------------------------------------------------------------- #if defined(__WXGTK__) && defined(USE_WXGLCANVAS) -BEGIN_EVENT_TABLE(creawxVTKRenderWindowInteractor, wxGLCanvas) + //EED 2017-09-16 Migration wxWidgets 2.8 to 3.0 + #if wxMAJOR_VERSION <= 2 + IMPLEMENT_DYNAMIC_CLASS(wxVTKRenderWindowInteractor, wxGLCanvas) + BEGIN_EVENT_TABLE(wxVTKRenderWindowInteractor, wxGLCanvas) + #else + wxIMPLEMENT_DYNAMIC_CLASS(wxVTKRenderWindowInteractor, wxGLCanvas); + wxBEGIN_EVENT_TABLE(wxVTKRenderWindowInteractor, wxGLCanvas) + #endif #else -BEGIN_EVENT_TABLE(creawxVTKRenderWindowInteractor, wxWindow) + //EED 2017-09-16 Migration wxWidgets 2.8 to 3.0 + #if wxMAJOR_VERSION <= 2 + IMPLEMENT_DYNAMIC_CLASS(wxVTKRenderWindowInteractor, wxWindow) + BEGIN_EVENT_TABLE(wxVTKRenderWindowInteractor, wxWindow) + #else + wxIMPLEMENT_DYNAMIC_CLASS(wxVTKRenderWindowInteractor, wxWindow); + wxBEGIN_EVENT_TABLE(wxVTKRenderWindowInteractor, wxWindow) + #endif #endif //__WXGTK__ //refresh window by doing a Render - EVT_PAINT (creawxVTKRenderWindowInteractor::OnPaint) - EVT_ERASE_BACKGROUND(creawxVTKRenderWindowInteractor::OnEraseBackground) - EVT_MOTION (creawxVTKRenderWindowInteractor::OnMotion) + EVT_PAINT (wxVTKRenderWindowInteractor::OnPaint) + EVT_ERASE_BACKGROUND(wxVTKRenderWindowInteractor::OnEraseBackground) + EVT_MOTION (wxVTKRenderWindowInteractor::OnMotion) //Bind the events to the event converters - EVT_LEFT_DOWN (creawxVTKRenderWindowInteractor::OnButtonDown) - EVT_MIDDLE_DOWN (creawxVTKRenderWindowInteractor::OnButtonDown) - EVT_RIGHT_DOWN (creawxVTKRenderWindowInteractor::OnButtonDown) - EVT_LEFT_UP (creawxVTKRenderWindowInteractor::OnButtonUp) - EVT_MIDDLE_UP (creawxVTKRenderWindowInteractor::OnButtonUp) - EVT_RIGHT_UP (creawxVTKRenderWindowInteractor::OnButtonUp) + EVT_LEFT_DOWN (wxVTKRenderWindowInteractor::OnButtonDown) + EVT_MIDDLE_DOWN (wxVTKRenderWindowInteractor::OnButtonDown) + EVT_RIGHT_DOWN (wxVTKRenderWindowInteractor::OnButtonDown) + EVT_LEFT_UP (wxVTKRenderWindowInteractor::OnButtonUp) + EVT_MIDDLE_UP (wxVTKRenderWindowInteractor::OnButtonUp) + EVT_RIGHT_UP (wxVTKRenderWindowInteractor::OnButtonUp) #if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1) - EVT_ENTER_WINDOW(creawxVTKRenderWindowInteractor::OnEnter) - EVT_LEAVE_WINDOW(creawxVTKRenderWindowInteractor::OnLeave) - EVT_MOUSEWHEEL (creawxVTKRenderWindowInteractor::OnMouseWheel) -// If we use EVT_KEY_DOWN instead of EVT_CHAR, capital versions -// of all characters are always returned. EVT_CHAR also performs -// other necessary keyboard-dependent translations. - //EVT_KEY_DOWN (creawxVTKRenderWindowInteractor::OnKeyDown) - EVT_CHAR (creawxVTKRenderWindowInteractor::OnKeyDown) - EVT_KEY_UP (creawxVTKRenderWindowInteractor::OnKeyUp) -#endif - EVT_TIMER (ID_creawxVTKRenderWindowInteractor_TIMER, creawxVTKRenderWindowInteractor::OnTimer) - EVT_SIZE (creawxVTKRenderWindowInteractor::OnSize) + EVT_ENTER_WINDOW(wxVTKRenderWindowInteractor::OnEnter) + EVT_LEAVE_WINDOW(wxVTKRenderWindowInteractor::OnLeave) + EVT_MOUSEWHEEL (wxVTKRenderWindowInteractor::OnMouseWheel) +#if wxCHECK_VERSION(2, 8, 0) + EVT_MOUSE_CAPTURE_LOST(wxVTKRenderWindowInteractor::OnMouseCaptureLost) +#endif + EVT_KEY_DOWN (wxVTKRenderWindowInteractor::OnKeyDown) + EVT_KEY_UP (wxVTKRenderWindowInteractor::OnKeyUp) + EVT_CHAR (wxVTKRenderWindowInteractor::OnChar) +#endif + EVT_TIMER (ID_wxVTKRenderWindowInteractor_TIMER, wxVTKRenderWindowInteractor::OnTimer) + EVT_SIZE (wxVTKRenderWindowInteractor::OnSize) END_EVENT_TABLE() +vtkCxxRevisionMacro(wxVTKRenderWindowInteractor, "$Revision$") +vtkInstantiatorNewMacro(wxVTKRenderWindowInteractor) + +#if defined(__WXGTK__) && defined(USE_WXGLCANVAS) +static int wxvtk_attributes[]={ + WX_GL_DOUBLEBUFFER, + WX_GL_RGBA, + WX_GL_DEPTH_SIZE, + 16, + 0 +}; +#endif + //--------------------------------------------------------------------------- +wxVTKRenderWindowInteractor::wxVTKRenderWindowInteractor() + #if defined(__WXGTK__) && defined(USE_WXGLCANVAS) -creawxVTKRenderWindowInteractor::creawxVTKRenderWindowInteractor() : vtkRenderWindowInteractor(), wxGLCanvas() + #if wxCHECK_VERSION(2, 9, 0) // the order of the parameters to wxGLCanvas::wxGLCanvas has changed + : wxGLCanvas(0, -1, wxvtk_attributes, wxDefaultPosition, wxDefaultSize, 0, wxT("wxVTKRenderWindowInteractor")), + #else + : wxGLCanvas(0, -1, wxDefaultPosition, wxDefaultSize, 0, wxT("wxVTKRenderWindowInteractor"), wxvtk_attributes), + #endif #else -creawxVTKRenderWindowInteractor::creawxVTKRenderWindowInteractor() : vtkRenderWindowInteractor(), wxWindow() + : wxWindow(), #endif //__WXGTK__ - , timer(this, ID_creawxVTKRenderWindowInteractor_TIMER) + + vtkRenderWindowInteractor() + , timer(this, ID_wxVTKRenderWindowInteractor_TIMER) , ActiveButton(wxEVT_NULL) - , RenderAllowed(0) , Stereo(0) , Handle(0) , Created(true) , RenderWhenDisabled(1) , UseCaptureMouse(0) { - +#ifdef VTK_DEBUG_LEAKS + vtkDebugLeaks::ConstructClass("wxVTKRenderWindowInteractor"); +#endif +#if defined(__WXGTK__) && defined(USE_WXGLCANVAS) + this->context = new wxGLContext(this); +#endif this->RenderWindow = NULL; this->SetRenderWindow(vtkRenderWindow::New()); this->RenderWindow->Delete(); - - //this->SetBackgroundColour( wxColour(255,0,255) ); } //--------------------------------------------------------------------------- -creawxVTKRenderWindowInteractor::creawxVTKRenderWindowInteractor(wxWindow *parent, +wxVTKRenderWindowInteractor::wxVTKRenderWindowInteractor(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name) #if defined(__WXGTK__) && defined(USE_WXGLCANVAS) - : vtkRenderWindowInteractor(), wxGLCanvas(parent, id, pos, size, style, name) + #if wxCHECK_VERSION(2, 9, 0) // the order of the parameters to wxGLCanvas::wxGLCanvas has changed + : wxGLCanvas(parent, id, wxvtk_attributes, pos, size, style, name) + #else + : wxGLCanvas(parent, id, pos, size, style, name, wxvtk_attributes) + #endif #else - : vtkRenderWindowInteractor(), wxWindow(parent, id, pos, size, style, name) + : wxWindow(parent, id, pos, size, style, name) #endif //__WXGTK__ - , timer(this, ID_creawxVTKRenderWindowInteractor_TIMER) + , vtkRenderWindowInteractor() + , timer(this, ID_wxVTKRenderWindowInteractor_TIMER) , ActiveButton(wxEVT_NULL) - , RenderAllowed(0) , Stereo(0) , Handle(0) , Created(true) , RenderWhenDisabled(1) , UseCaptureMouse(0) { - +#ifdef VTK_DEBUG_LEAKS + vtkDebugLeaks::ConstructClass("wxVTKRenderWindowInteractor"); +#endif +#if defined(__WXGTK__) && defined(USE_WXGLCANVAS) + this->context = new wxGLContext(this); +#endif this->RenderWindow = NULL; this->SetRenderWindow(vtkRenderWindow::New()); this->RenderWindow->Delete(); - - // this->SetBackgroundColour( wxColour(255,0,0) ); +#ifdef __WXMAC__ + // On Mac (Carbon) we don't get notified of the initial window size with an EVT_SIZE event, + // so we update the size information of the interactor/renderwindow here + this->UpdateSize(size.x, size.y); +#endif } //--------------------------------------------------------------------------- -creawxVTKRenderWindowInteractor::~creawxVTKRenderWindowInteractor() -{ - // LG : trompe la mort ! +wxVTKRenderWindowInteractor::~wxVTKRenderWindowInteractor() +{ SetRenderWindow(NULL); - SetReferenceCount(0); + SetInteractorStyle(NULL); +#if defined(__WXGTK__) && defined(USE_WXGLCANVAS) + delete this->context; +#endif } //--------------------------------------------------------------------------- -creawxVTKRenderWindowInteractor * creawxVTKRenderWindowInteractor::New() +wxVTKRenderWindowInteractor * wxVTKRenderWindowInteractor::New() { // we don't make use of the objectfactory, because we're not registered - return new creawxVTKRenderWindowInteractor; + return new wxVTKRenderWindowInteractor; } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::Initialize() +void wxVTKRenderWindowInteractor::Initialize() { int *size = RenderWindow->GetSize(); // enable everything and start rendering @@ -207,7 +336,7 @@ void creawxVTKRenderWindowInteractor::Initialize() Initialized = 1; } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::Enable() +void wxVTKRenderWindowInteractor::Enable() { // if already enabled then done if (Enabled) @@ -216,12 +345,12 @@ void creawxVTKRenderWindowInteractor::Enable() // that's it Enabled = 1; #if defined(__WXGTK__) && defined(USE_WXGLCANVAS) - SetCurrent(); + wxGLCanvas::SetCurrent(*this->context); #endif Modified(); } //--------------------------------------------------------------------------- -bool creawxVTKRenderWindowInteractor::Enable(bool enable) +bool wxVTKRenderWindowInteractor::Enable(bool enable) { #if defined(__WXGTK__) && defined(USE_WXGLCANVAS) return wxGLCanvas::Enable(enable); @@ -230,7 +359,7 @@ bool creawxVTKRenderWindowInteractor::Enable(bool enable) #endif } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::Disable() +void wxVTKRenderWindowInteractor::Disable() { // if already disabled then done if (!Enabled) @@ -241,14 +370,14 @@ void creawxVTKRenderWindowInteractor::Disable() Modified(); } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::Start() +void wxVTKRenderWindowInteractor::Start() { // the interactor cannot control the event loop - vtkErrorMacro( << "creawxVTKRenderWindowInteractor::Start() " + vtkErrorMacro( << "wxVTKRenderWindowInteractor::Start() " "interactor cannot control event loop."); } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::UpdateSize(int x, int y) +void wxVTKRenderWindowInteractor::UpdateSize(int x, int y) { if( RenderWindow ) { @@ -260,37 +389,63 @@ void creawxVTKRenderWindowInteractor::UpdateSize(int x, int y) Size[1] = y; // and our RenderWindow's size RenderWindow->SetSize(x, y); +#if defined(__WXMSW__) + this->Refresh(); +#endif //__WXMSW__ } } } //--------------------------------------------------------------------------- -int creawxVTKRenderWindowInteractor::CreateTimer(int WXUNUSED(timertype)) +int wxVTKRenderWindowInteractor::CreateTimer(int WXUNUSED(timertype)) { // it's a one shot timer if (!timer.Start(10, TRUE)) - assert(false); + return 0; return 1; } +#if VTK_MAJOR_VERSION > 5 || (VTK_MAJOR_VERSION == 5 && VTK_MINOR_VERSION >= 2) +//------------------------------------------------------------------ +int wxVTKRenderWindowInteractor::InternalCreateTimer(int timerId, int timerType, + unsigned long duration) +{ + if (!timer.Start(duration, timerType == OneShotTimer)) + return 0; + + return ID_wxVTKRenderWindowInteractor_TIMER; +} +//------------------------------------------------------------------ +int wxVTKRenderWindowInteractor::InternalDestroyTimer(int platformTimerId) +{ + timer.Stop(); + return 1; +} +#endif //--------------------------------------------------------------------------- -int creawxVTKRenderWindowInteractor::DestroyTimer() +int wxVTKRenderWindowInteractor::DestroyTimer() { // do nothing return 1; } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnTimer(wxTimerEvent& WXUNUSED(event)) +void wxVTKRenderWindowInteractor::OnTimer(wxTimerEvent& WXUNUSED(event)) { if (!Enabled) return; -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) - // new style - InvokeEvent(vtkCommand::TimerEvent, NULL); +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) + // new style +#if VTK_MAJOR_VERSION > 5 || (VTK_MAJOR_VERSION == 5 && VTK_MINOR_VERSION >= 2) + // pass the right timer id + int timerId = this->GetCurrentTimerId(); + this->InvokeEvent(vtkCommand::TimerEvent, &timerId); #else - // old style - InteractorStyle->OnTimer(); + this->InvokeEvent(vtkCommand::TimerEvent, NULL); +#endif +#else + // old style + InteractorStyle->OnTimer(); #endif } @@ -303,31 +458,30 @@ void creawxVTKRenderWindowInteractor::OnTimer(wxTimerEvent& WXUNUSED(event)) // Anyway if this happen to break for you then compare to a recent version of wxPython // and look for the function long wxPyGetWinHandle(wxWindow* win) // in wxPython/src/helpers.cpp -long creawxVTKRenderWindowInteractor::GetHandleHack() +long wxVTKRenderWindowInteractor::GetHandleHack() { //helper function to hide the MSW vs GTK stuff long handle_tmp = 0; // __WXMSW__ is for Win32 -//__WXMAX__ stands for using Carbon C-headers, using either the CarbonLib/CFM or the native Mach-O builds (which then also use the latest features available) +// __WXMAC__ is for Carbon or Cocoa builds // __WXGTK__ is for both gtk 1.2.x and gtk 2.x #if defined(__WXMSW__) || defined(__WXMAC__) handle_tmp = (long)this->GetHandle(); #endif //__WXMSW__ -//__WXCOCOA__ stands for using the objective-c Cocoa API -#ifdef __WXCOCOA__ +// using above GetHandle() works fine with wxOSX 2.9.x +#if defined(__WXCOCOA__) && !wxCHECK_VERSION(2, 9, 0) // Here is how to find the NSWindow - wxTopLevelWindow* toplevel = dynamic_cast( - wxGetTopLevelParent( this ) ); - if (toplevel != NULL ) + wxTopLevelWindow* toplevel = dynamic_cast(wxGetTopLevelParent( this ) ); + if (toplevel != NULL ) { - handle_tmp = (long)toplevel->GetNSWindow(); + handle_tmp = (long)toplevel->GetNSWindow(); } // The NSView will be deducted from // [(NSWindow*)Handle contentView] // if only I knew how to write that in c++ -#endif //__WXCOCOA__ +#endif //__WXCOCOA__ && !wxCHECK_VERSION(2, 9, 0) // Find and return the actual X-Window. #if defined(__WXGTK__) || defined(__WXX11__) @@ -341,9 +495,8 @@ long creawxVTKRenderWindowInteractor::GetHandleHack() return handle_tmp; } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnPaint(wxPaintEvent& WXUNUSED(event)) +void wxVTKRenderWindowInteractor::OnPaint(wxPaintEvent& WXUNUSED(event)) { - //must always be here wxPaintDC pDC(this); @@ -352,31 +505,57 @@ void creawxVTKRenderWindowInteractor::OnPaint(wxPaintEvent& WXUNUSED(event)) { Handle = GetHandleHack(); RenderWindow->SetWindowId(reinterpret_cast(Handle)); +// Cocoa +// this->GetNSView() <-> DisplayId +// this->GetTopLevel()->GetNSWindow() <-> WindowId #ifdef __WXMSW__ RenderWindow->SetParentId(reinterpret_cast(this->GetParent()->GetHWND())); #endif //__WXMSW__ + + // This is another hack to prevent the VTK Render Window from closing the display. + // If VTK closes the display, ~wxContext chashes while trying to destroy its + // glContext (because the display is closed). The Get -> Set makes this VTK + // object think someone else is responsible for the display. + #ifdef __WXCOCOA__ + // avoid "Method not implemented" messages in Console + #else + this->RenderWindow->SetDisplayId(this->RenderWindow->GetGenericDisplayId()); + #endif } // get vtk to render to the wxWindows - //bbtkDebugMessage("Wx",9,"creawxVTKRenderWindowInteractor::OnPaint"<UpdateContext(); + } + #endif #else - // bbtkDebugMessage("Core",9,"creawxVTKRenderWindowInteractor::OnPaint public wxWindow, virtual public vtkRenderWindowInteractor \n"); -#endif //__WXGTK__ - + vtkCarbonRenderWindow* rwin = vtkCarbonRenderWindow::SafeDownCast(RenderWindow); + if( rwin ) + { +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 4) + // Must be somewhere after VTK 4.4 + rwin->UpdateGLRegion(); +#endif + } +#endif +#endif } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnEraseBackground(wxEraseEvent &event) +void wxVTKRenderWindowInteractor::OnEraseBackground(wxEraseEvent &event) { - //printf("EED creawxVTKRenderWindowInteractor::OnEraseBackground \n"); //turn off background erase to reduce flickering on MSW event.Skip(false); } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnSize(wxSizeEvent& WXUNUSED(event)) +void wxVTKRenderWindowInteractor::OnSize(wxSizeEvent& WXUNUSED(event)) { int w, h; GetClientSize(&w, &h); @@ -387,21 +566,20 @@ void creawxVTKRenderWindowInteractor::OnSize(wxSizeEvent& WXUNUSED(event)) return; } -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) InvokeEvent(vtkCommand::ConfigureEvent, NULL); #endif //this will check for Handle //Render(); } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnMotion(wxMouseEvent &event) +void wxVTKRenderWindowInteractor::OnMotion(wxMouseEvent &event) { if (!Enabled) { - return; + return; } - -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL); @@ -413,14 +591,14 @@ void creawxVTKRenderWindowInteractor::OnMotion(wxMouseEvent &event) } //--------------------------------------------------------------------------- #if !(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1) -void creawxVTKRenderWindowInteractor::OnEnter(wxMouseEvent &event) +void wxVTKRenderWindowInteractor::OnEnter(wxMouseEvent &event) { if (!Enabled) { return; } -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL); @@ -433,14 +611,14 @@ void creawxVTKRenderWindowInteractor::OnEnter(wxMouseEvent &event) #endif } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnLeave(wxMouseEvent &event) +void wxVTKRenderWindowInteractor::OnLeave(wxMouseEvent &event) { if (!Enabled) { return; } -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL); @@ -453,28 +631,29 @@ void creawxVTKRenderWindowInteractor::OnLeave(wxMouseEvent &event) #endif } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnKeyDown(wxKeyEvent &event) +void wxVTKRenderWindowInteractor::OnKeyDown(wxKeyEvent &event) { if (!Enabled) { return; } -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style int keycode = event.GetKeyCode(); char key = '\0'; - if (keycode < 256) + if (((unsigned int)keycode) < 256) { // TODO: Unicode in non-Unicode mode ?? key = (char)keycode; } - SetEventInformationFlipY(event.GetX(), event.GetY(), - event.ControlDown(), event.ShiftDown(), key, 0, NULL); - + // we don't get a valid mouse position inside the key event on every platform + // so we retrieve the mouse position explicitly and pass it along + wxPoint mousePos = ScreenToClient(wxGetMousePosition()); + SetEventInformationFlipY(mousePos.x, mousePos.y, + event.ControlDown(), event.ShiftDown(), key, 0, NULL); InvokeEvent(vtkCommand::KeyPressEvent, NULL); - InvokeEvent(vtkCommand::CharEvent, NULL); #else InteractorStyle->OnKeyDown(event.ControlDown(), event.ShiftDown(), event.GetKeyCode(), 1); @@ -482,25 +661,28 @@ void creawxVTKRenderWindowInteractor::OnKeyDown(wxKeyEvent &event) event.Skip(); } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnKeyUp(wxKeyEvent &event) +void wxVTKRenderWindowInteractor::OnKeyUp(wxKeyEvent &event) { if (!Enabled) { return; } -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style int keycode = event.GetKeyCode(); char key = '\0'; - if (keycode < 256) + if (((unsigned int)keycode) < 256) { // TODO: Unicode in non-Unicode mode ?? key = (char)keycode; } - SetEventInformationFlipY(event.GetX(), event.GetY(), - event.ControlDown(), event.ShiftDown(), key, 0, NULL); + // we don't get a valid mouse position inside the key event on every platform + // so we retrieve the mouse position explicitly and pass it along + wxPoint mousePos = ScreenToClient(wxGetMousePosition()); + SetEventInformationFlipY(mousePos.x, mousePos.y, + event.ControlDown(), event.ShiftDown(), key, 0, NULL); InvokeEvent(vtkCommand::KeyReleaseEvent, NULL); #else InteractorStyle->OnKeyUp(event.ControlDown(), event.ShiftDown(), @@ -509,8 +691,35 @@ void creawxVTKRenderWindowInteractor::OnKeyUp(wxKeyEvent &event) event.Skip(); } #endif //!(VTK_MAJOR_VERSION == 3 && VTK_MINOR_VERSION == 1) + //--------------------------------------------------------------------------- +void wxVTKRenderWindowInteractor::OnChar(wxKeyEvent &event) +{ + if (!Enabled) + { + return; + } + +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) + // new style + int keycode = event.GetKeyCode(); + char key = '\0'; + if (((unsigned int)keycode) < 256) + { + // TODO: Unicode in non-Unicode mode ?? + key = (char)keycode; + } + + // we don't get a valid mouse position inside the key event on every platform + // so we retrieve the mouse position explicitly and pass it along + wxPoint mousePos = ScreenToClient(wxGetMousePosition()); + SetEventInformationFlipY(mousePos.x, mousePos.y, + event.ControlDown(), event.ShiftDown(), key, 0, NULL); + InvokeEvent(vtkCommand::CharEvent, NULL); +#endif + event.Skip(); +} //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event) +void wxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event) { if (!Enabled || (ActiveButton != wxEVT_NULL)) { @@ -518,14 +727,20 @@ void creawxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event) } ActiveButton = event.GetEventType(); -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) + // On Mac (Carbon) and Windows we don't automatically get the focus when + // you click inside the window + // we therefore set the focus explicitly + // Apparently we need that on linux (GTK) too: + this->SetFocus(); + +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL); #endif if(event.RightDown()) { -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style InvokeEvent(vtkCommand::RightButtonPressEvent, NULL); #else @@ -536,7 +751,7 @@ void creawxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event) } else if(event.LeftDown()) { -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style InvokeEvent(vtkCommand::LeftButtonPressEvent, NULL); #else @@ -547,7 +762,7 @@ void creawxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event) } else if(event.MiddleDown()) { -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style InvokeEvent(vtkCommand::MiddleButtonPressEvent, NULL); #else @@ -566,7 +781,7 @@ void creawxVTKRenderWindowInteractor::OnButtonDown(wxMouseEvent &event) } } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event) +void wxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event) { //EVT_xxx_DOWN == EVT_xxx_UP - 1 //This is only needed if two mouse buttons are pressed at the same time. @@ -577,14 +792,17 @@ void creawxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event) return; } -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) + // See report by Shang Mu / Kerry Loux on wxVTK mailing list + this->SetFocus(); + +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) SetEventInformationFlipY(event.GetX(), event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL); #endif if(ActiveButton == wxEVT_RIGHT_DOWN) { -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style InvokeEvent(vtkCommand::RightButtonReleaseEvent, NULL); #else @@ -595,7 +813,7 @@ void creawxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event) } else if(ActiveButton == wxEVT_LEFT_DOWN) { -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style InvokeEvent(vtkCommand::LeftButtonReleaseEvent, NULL); #else @@ -606,7 +824,7 @@ void creawxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event) } else if(ActiveButton == wxEVT_MIDDLE_DOWN) { -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 0) // new style InvokeEvent(vtkCommand::MiddleButtonReleaseEvent, NULL); #else @@ -623,36 +841,55 @@ void creawxVTKRenderWindowInteractor::OnButtonUp(wxMouseEvent &event) ActiveButton = wxEVT_NULL; } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::OnMouseWheel(wxMouseEvent& event) +void wxVTKRenderWindowInteractor::OnMouseWheel(wxMouseEvent& event) { // Mouse wheel was only added after VTK 4.4 (I think...) -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 4) // new style //Set vtk event information ... The numebr of wheel rotations is stored in //the x varible. y varible is zero - SetEventInformationFlipY(event.GetWheelRotation() / event.GetWheelDelta(), 0, + SetEventInformationFlipY(event.GetX() , event.GetY(), event.ControlDown(), event.ShiftDown(), '\0', 0, NULL); if(event.GetWheelRotation() > 0) { //Send event to VTK -// EED -// InvokeEvent(vtkCommand::MouseWheelForwardEvent, NULL); + InvokeEvent(vtkCommand::MouseWheelForwardEvent, NULL); } else { //Send event to VTK -// EED -// InvokeEvent(vtkCommand::MouseWheelBackwardEvent, NULL); + InvokeEvent(vtkCommand::MouseWheelBackwardEvent, NULL); } #endif } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::Render() +#if wxCHECK_VERSION(2, 8, 0) +void wxVTKRenderWindowInteractor::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) { - RenderAllowed = 1; - if (!RenderWhenDisabled) + if (ActiveButton != wxEVT_NULL) + { + //Maybe also invoke the button release event here + } + // Reset ActiveButton so that + // 1. we do not process mouse button up events any more, + // 2. the next button down event will be processed and call CaptureMouse(). + // Otherwise ReleaseMouse() will be called + // without a previous CaptureMouse(). + ActiveButton = wxEVT_NULL; +} +#endif + +//--------------------------------------------------------------------------- +void wxVTKRenderWindowInteractor::Render() +{ +#if wxCHECK_VERSION(2, 8, 0) + int renderAllowed = !IsFrozen(); +#else + int renderAllowed = 1; +#endif + if (renderAllowed && !RenderWhenDisabled) { //the user doesn't want us to render when the toplevel frame //is disabled - first find the top level parent @@ -660,18 +897,21 @@ void creawxVTKRenderWindowInteractor::Render() if (topParent) { //if it exists, check whether it's enabled - //if it's not enabeld, RenderAllowed will be false - RenderAllowed = topParent->IsEnabled(); + //if it's not enabeld, renderAllowed will be false + renderAllowed = topParent->IsEnabled(); } } - if (RenderAllowed) + if (renderAllowed) { +#if defined(__WXGTK__) && defined(USE_WXGLCANVAS) + wxGLCanvas::SetCurrent(*(this->context)); +#endif if(Handle && (Handle == GetHandleHack()) ) { RenderWindow->Render(); } -#if VTK_MAJOR_VERSION == 5 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2) +#if VTK_MAJOR_VERSION > 4 || (VTK_MAJOR_VERSION == 4 && VTK_MINOR_VERSION > 2) else if(GetHandleHack()) { //this means the user has reparented us; let's adapt to the @@ -686,7 +926,7 @@ void creawxVTKRenderWindowInteractor::Render() } } //--------------------------------------------------------------------------- -void creawxVTKRenderWindowInteractor::SetRenderWhenDisabled(int newValue) +void wxVTKRenderWindowInteractor::SetRenderWhenDisabled(int newValue) { //Change value of __RenderWhenDisabled ivar. //If __RenderWhenDisabled is false (the default), this widget will not @@ -700,18 +940,18 @@ void creawxVTKRenderWindowInteractor::SetRenderWhenDisabled(int newValue) //prevent re-entrancy of code) and then handling all outstanding //GUI events. - //However, this often triggers an OnPaint() method for creawxVTKRWIs, + //However, this often triggers an OnPaint() method for wxVTKRWIs, //resulting in a Render(), resulting in Update() being called whilst //still in progress. - RenderWhenDisabled = (bool)(newValue!=0); + RenderWhenDisabled = (bool)newValue; } //--------------------------------------------------------------------------- // // Set the variable that indicates that we want a stereo capable window // be created. This method can only be called before a window is realized. // -void creawxVTKRenderWindowInteractor::SetStereo(int capable) +void wxVTKRenderWindowInteractor::SetStereo(int capable) { if (Stereo != capable) { @@ -725,22 +965,14 @@ void creawxVTKRenderWindowInteractor::SetStereo(int capable) //--------------------------------------------------------------------------- // // -void creawxVTKRenderWindowInteractor::PrintSelf(ostream& os, vtkIndent indent) +void wxVTKRenderWindowInteractor::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } -#if defined(_WIN32) -const char * creawxVTKRenderWindowInteractor::GetClassName() const -{ - return "creawxVTKRenderWindowInteractor"; } -#endif //_WIN32 - -} -// LG : EO namespace +// LG : EO namespace bbwxvtk //======================================================================= -#endif // USE_WX -#endif // USE_VTK +