]>
git.saurik.com Git - wxWidgets.git/blob - src/mac/glcanvas.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxGLCanvas, for using OpenGL with wxWindows under Macintosh 
   8 // Copyright:   (c) AUTHOR 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "glcanvas.h" 
  16 #include "wx/wxprec.h" 
  18 #if defined(__BORLANDC__) 
  30 #include "wx/settings.h" 
  33 #include "wx/glcanvas.h" 
  34 #include "wx/mac/uma.h" 
  37  * GLContext implementation 
  40 wxGLContext::wxGLContext( 
  41                AGLPixelFormat fmt
, wxGLCanvas 
*win
, 
  42                const wxPalette
& palette
, 
  43                const wxGLContext 
*other        
/* for sharing display lists */ 
  48     m_drawable 
= (AGLDrawable
) UMAGetWindowPort(win
->GetMacRootWindow()); 
  50     m_glContext 
= aglCreateContext(fmt
, other 
? other
->m_glContext 
: NULL
); 
  51     wxCHECK_RET( m_glContext
, wxT("Couldn't create OpenGl context") ); 
  54     b 
= aglSetDrawable(m_glContext
, m_drawable
); 
  55     wxCHECK_RET( b
, wxT("Couldn't bind OpenGl context") ); 
  56         aglEnable(m_glContext 
, AGL_BUFFER_RECT 
) ; 
  57     b 
= aglSetCurrentContext(m_glContext
); 
  58     wxCHECK_RET( b
, wxT("Couldn't activate OpenGl context") ); 
  61 wxGLContext::~wxGLContext() 
  65     aglSetCurrentContext(NULL
); 
  66         aglDestroyContext(m_glContext
); 
  70 void wxGLContext::SwapBuffers() 
  74     aglSwapBuffers(m_glContext
); 
  78 void wxGLContext::SetCurrent() 
  82     aglSetCurrentContext(m_glContext
); 
  86 void wxGLContext::Update() 
  90     aglUpdateContext(m_glContext
); 
  94 void wxGLContext::SetColour(const char *colour
) 
  99   wxColour 
*col 
= wxTheColourDatabase
->FindColour(colour
); 
 102     r 
= (float)(col
->Red()/256.0); 
 103     g 
= (float)(col
->Green()/256.0); 
 104     b 
= (float)(col
->Blue()/256.0); 
 111  * wxGLCanvas implementation 
 114 IMPLEMENT_CLASS(wxGLCanvas
, wxScrolledWindow
) 
 116 BEGIN_EVENT_TABLE(wxGLCanvas
, wxScrolledWindow
) 
 117     EVT_SIZE(wxGLCanvas::OnSize
) 
 120 wxGLCanvas::wxGLCanvas(wxWindow 
*parent
, wxWindowID id
, 
 121     const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
, 
 122     int *attribList
, const wxPalette
& palette
) 
 124     Create(parent
, NULL
, id
, pos
, size
, style
, name
, attribList
, palette
); 
 127 wxGLCanvas::wxGLCanvas( wxWindow 
*parent
, 
 128               const wxGLContext 
*shared
, wxWindowID id
, 
 129               const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
, 
 130               int *attribList
, const wxPalette
& palette 
) 
 132     Create(parent
, shared
, id
, pos
, size
, style
, name
, attribList
, palette
); 
 135 wxGLCanvas::wxGLCanvas( wxWindow 
*parent
, const wxGLCanvas 
*shared
, wxWindowID id
, 
 136                         const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
, 
 137                         int *attribList
, const wxPalette
& palette 
) 
 139     Create(parent
, shared 
? shared
->GetContext() : NULL
, id
, pos
, size
, style
, name
, attribList
, palette
); 
 142 wxGLCanvas::~wxGLCanvas() 
 148 bool wxGLCanvas::Create(wxWindow 
*parent
, const wxGLContext 
*shared
, wxWindowID id
, 
 149                         const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
, 
 150                         int *attribList
, const wxPalette
& palette
) 
 152         m_macEraseOnRedraw 
= false ; 
 154     GLint defs
[] = { AGL_RGBA
,  
 157                      AGL_DEPTH_SIZE
, 1,  // use largest available depth buffer 
 170       int data
[512], arg
=0, p
=0; 
 172       data
[p
++] = AGL_MINIMUM_POLICY
; // make _SIZE tags behave more like GLX 
 173       while( (attribList
[arg
]!=0) && (p
<512) ) 
 175         switch( attribList
[arg
++] ) 
 177           case WX_GL_RGBA
: data
[p
++] = AGL_RGBA
; break; 
 178           case WX_GL_BUFFER_SIZE
: 
 179             data
[p
++]=AGL_BUFFER_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 181             data
[p
++]=AGL_LEVEL
; data
[p
++]=attribList
[arg
++]; break; 
 182           case WX_GL_DOUBLEBUFFER
: data
[p
++] = AGL_DOUBLEBUFFER
; break; 
 183           case WX_GL_STEREO
: data
[p
++] = AGL_STEREO
; break; 
 184           case WX_GL_AUX_BUFFERS
: 
 185             data
[p
++]=AGL_AUX_BUFFERS
; data
[p
++]=attribList
[arg
++]; break; 
 187             data
[p
++]=AGL_RED_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 188           case WX_GL_MIN_GREEN
: 
 189             data
[p
++]=AGL_GREEN_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 191             data
[p
++]=AGL_BLUE_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 192           case WX_GL_MIN_ALPHA
: 
 193             data
[p
++]=AGL_ALPHA_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 194           case WX_GL_DEPTH_SIZE
:  
 195             data
[p
++]=AGL_DEPTH_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 196           case WX_GL_STENCIL_SIZE
:  
 197             data
[p
++]=AGL_STENCIL_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 198           case WX_GL_MIN_ACCUM_RED
: 
 199             data
[p
++]=AGL_ACCUM_RED_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 200           case WX_GL_MIN_ACCUM_GREEN
: 
 201             data
[p
++]=AGL_ACCUM_GREEN_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 202           case WX_GL_MIN_ACCUM_BLUE
: 
 203             data
[p
++]=AGL_ACCUM_BLUE_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 204           case WX_GL_MIN_ACCUM_ALPHA
: 
 205             data
[p
++]=AGL_ACCUM_ALPHA_SIZE
; data
[p
++]=attribList
[arg
++]; break; 
 214     wxScrolledWindow::Create( parent
, id
, pos
, size
, style
, name 
); 
 216     AGLPixelFormat fmt 
= aglChoosePixelFormat(NULL
, 0, attribs
); 
 217     wxCHECK_MSG( fmt
, false, wxT("Couldn't create OpenGl pixel format") ); 
 219     m_glContext 
= new wxGLContext(fmt
, this, palette
, shared
); 
 221     aglDestroyPixelFormat(fmt
); 
 226 void wxGLCanvas::SwapBuffers() 
 229     m_glContext
->SwapBuffers(); 
 232 void wxGLCanvas::UpdateContext() 
 235     m_glContext
->Update(); 
 238 void wxGLCanvas::SetViewport() 
 240   // viewport is initially set to entire port 
 241   // adjust glViewport to just this window 
 245     MacClientToRootWindow( &x 
, &y 
) ; 
 247     GetClientSize(& width
, & height
); 
 249     GetWindowPortBounds( GetMacRootWindow() , &bounds 
) ; 
 252     parms
[1] = bounds
.bottom 
- bounds
.top 
- ( y 
+ height 
) ; 
 256         aglSetInteger( m_glContext
->m_glContext 
, AGL_BUFFER_RECT 
, parms 
) ; 
 259 void wxGLCanvas::OnSize(wxSizeEvent
& event
) 
 264     m_glContext
->SetCurrent(); 
 267     glMatrixMode(GL_PROJECTION
); 
 269     glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 ); 
 270     glMatrixMode(GL_MODELVIEW
); 
 274 void wxGLCanvas::SetCurrent() 
 278     m_glContext
->SetCurrent(); 
 282 void wxGLCanvas::SetColour(const char *colour
) 
 285     m_glContext
->SetColour(colour
); 
 288 #endif // wxUSE_GLCANVAS