X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0a67a93b17c37c018f60e662645ee2a44ba4e58e..fa2f5d3bc9563c2b88282d5487758572d8baffb3:/src/mac/carbon/glcanvas.cpp?ds=sidebyside diff --git a/src/mac/carbon/glcanvas.cpp b/src/mac/carbon/glcanvas.cpp index b3832d29fa..16e47d4c79 100644 --- a/src/mac/carbon/glcanvas.cpp +++ b/src/mac/carbon/glcanvas.cpp @@ -33,8 +33,6 @@ #include "wx/glcanvas.h" #include "wx/mac/uma.h" -#include - /* * GLContext implementation */ @@ -47,7 +45,7 @@ wxGLContext::wxGLContext( { m_window = win; - m_drawable = (AGLDrawable) UMAGetWindowPort(win->GetMacRootWindow()); + m_drawable = (AGLDrawable) UMAGetWindowPort(MAC_WXHWND(win->MacGetRootWindow())); m_glContext = aglCreateContext(fmt, other ? other->m_glContext : NULL); wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") ); @@ -113,9 +111,9 @@ void wxGLContext::SetColour(const char *colour) * wxGLCanvas implementation */ -IMPLEMENT_CLASS(wxGLCanvas, wxScrolledWindow) +IMPLEMENT_CLASS(wxGLCanvas, wxWindow) -BEGIN_EVENT_TABLE(wxGLCanvas, wxScrolledWindow) +BEGIN_EVENT_TABLE(wxGLCanvas, wxWindow) EVT_SIZE(wxGLCanvas::OnSize) END_EVENT_TABLE() @@ -143,17 +141,16 @@ wxGLCanvas::wxGLCanvas( wxWindow *parent, const wxGLCanvas *shared, wxWindowID i wxGLCanvas::~wxGLCanvas() { - if (m_glContext) - delete m_glContext; + if (m_glContext != NULL) { + delete m_glContext; + m_glContext = NULL; + } } -bool wxGLCanvas::Create(wxWindow *parent, const wxGLContext *shared, wxWindowID id, - const wxPoint& pos, const wxSize& size, long style, const wxString& name, - int *attribList, const wxPalette& palette) +static AGLPixelFormat ChoosePixelFormat(const int *attribList) { - m_macEraseOnRedraw = false ; GLint data[512]; - GLint defs[] = { AGL_RGBA, + GLint defaultAttribs[] = { AGL_RGBA, AGL_DOUBLEBUFFER, AGL_MINIMUM_POLICY, AGL_DEPTH_SIZE, 1, // use largest available depth buffer @@ -165,11 +162,11 @@ bool wxGLCanvas::Create(wxWindow *parent, const wxGLContext *shared, wxWindowID GLint *attribs; if (!attribList) { - attribs = defs; + attribs = defaultAttribs; } else { - int data[512], arg=0, p=0; + int arg=0, p=0; data[p++] = AGL_MINIMUM_POLICY; // make _SIZE tags behave more like GLX while( (attribList[arg]!=0) && (p<512) ) @@ -211,11 +208,19 @@ bool wxGLCanvas::Create(wxWindow *parent, const wxGLContext *shared, wxWindowID } data[p] = 0; - attribs = defs; + attribs = data; } - wxScrolledWindow::Create( parent, id, pos, size, style, name ); + + return aglChoosePixelFormat(NULL, 0, attribs); +} - AGLPixelFormat fmt = aglChoosePixelFormat(NULL, 0, attribs); +bool wxGLCanvas::Create(wxWindow *parent, const wxGLContext *shared, wxWindowID id, + const wxPoint& pos, const wxSize& size, long style, const wxString& name, + int *attribList, const wxPalette& palette) +{ + wxWindow::Create( parent, id, pos, size, style, name ); + + AGLPixelFormat fmt = ChoosePixelFormat(attribList); wxCHECK_MSG( fmt, false, wxT("Couldn't create OpenGl pixel format") ); m_glContext = new wxGLContext(fmt, this, palette, shared); @@ -248,7 +253,7 @@ void wxGLCanvas::SetViewport() int width, height; GetClientSize(& width, & height); Rect bounds ; - GetWindowPortBounds( GetMacRootWindow() , &bounds ) ; + GetWindowPortBounds( MAC_WXHWND(MacGetRootWindow()) , &bounds ) ; GLint parms[4] ; parms[0] = x ; parms[1] = bounds.bottom - bounds.top - ( y + height ) ; @@ -259,20 +264,32 @@ void wxGLCanvas::SetViewport() } void wxGLCanvas::OnSize(wxSizeEvent& event) +{ + MacUpdateView() ; +} + +void wxGLCanvas::MacUpdateView() { if (m_glContext) { UpdateContext(); m_glContext->SetCurrent(); - SetViewport(); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 ); - glMatrixMode(GL_MODELVIEW); } } +void wxGLCanvas::MacSuperChangedPosition() +{ + MacUpdateView() ; + wxWindow::MacSuperChangedPosition() ; +} + +void wxGLCanvas::MacTopLevelWindowChangedPosition() +{ + MacUpdateView() ; + wxWindow::MacTopLevelWindowChangedPosition() ; +} + void wxGLCanvas::SetCurrent() { if (m_glContext) @@ -287,4 +304,25 @@ void wxGLCanvas::SetColour(const char *colour) m_glContext->SetColour(colour); } + +//--------------------------------------------------------------------------- +// wxGLApp +//--------------------------------------------------------------------------- + +IMPLEMENT_CLASS(wxGLApp, wxApp) + +bool wxGLApp::InitGLVisual(int *attribList) +{ + AGLPixelFormat fmt = ChoosePixelFormat(attribList); + if (fmt != NULL) { + aglDestroyPixelFormat(fmt); + return true; + } else + return false; +} + +wxGLApp::~wxGLApp(void) +{ +} + #endif // wxUSE_GLCANVAS