]>
git.saurik.com Git - wxWidgets.git/blob - utils/glcanvas/gtk/glcanvas.cpp
6021bcec7dabe7ad274834eaad7ea83b9fc35cad
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxGLCanvas, for using OpenGL/Mesa with wxWindows and GTK
4 // Author: Robert Roebling
8 // Copyright: (c) Robert Roebling
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "glcanvas.h"
19 #include "wx/colour.h"
20 #include "wx/module.h"
29 #include "wx/gtk/win_gtk.h"
31 //---------------------------------------------------------------------------
33 //---------------------------------------------------------------------------
35 XVisualInfo
*g_vi
= (XVisualInfo
*) NULL
;
37 //---------------------------------------------------------------------------
39 //---------------------------------------------------------------------------
41 IMPLEMENT_CLASS(wxGLContext
,wxObject
)
43 wxGLContext::wxGLContext( bool WXUNUSED(isRGB
), wxWindow
*win
, const wxPalette
& WXUNUSED(palette
) )
46 m_widget
= ((wxGLCanvas
*)win
)->m_glWidget
;
48 wxCHECK_RET( g_vi
, "invalid visual for OpenGl" );
50 m_glContext
= glXCreateContext( GDK_DISPLAY(), g_vi
, None
, GL_TRUE
);
52 wxCHECK_RET( m_glContext
, "Couldn't create OpenGl context" );
55 wxGLContext::wxGLContext(
56 bool WXUNUSED(isRGB
), wxWindow
*win
,
57 const wxPalette
& WXUNUSED(palette
),
58 const wxGLContext
*other
/* for sharing display lists */
62 m_widget
= ((wxGLCanvas
*)win
)->m_glWidget
;
64 wxCHECK_RET( g_vi
, "invalid visual for OpenGl" );
67 m_glContext
= glXCreateContext( GDK_DISPLAY(), g_vi
, other
->m_glContext
,
70 m_glContext
= glXCreateContext( GDK_DISPLAY(), g_vi
, None
, GL_TRUE
);
72 wxCHECK_RET( m_glContext
, "Couldn't create OpenGl context" );
75 wxGLContext::~wxGLContext()
77 if (!m_glContext
) return;
79 if (m_glContext
== glXGetCurrentContext())
81 glXMakeCurrent( GDK_DISPLAY(), None
, NULL
);
84 glXDestroyContext( GDK_DISPLAY(), m_glContext
);
87 void wxGLContext::SwapBuffers()
91 glXSwapBuffers( GDK_DISPLAY(), GDK_WINDOW_XWINDOW( m_widget
->window
) );
95 void wxGLContext::SetCurrent()
99 glXMakeCurrent( GDK_DISPLAY(), GDK_WINDOW_XWINDOW(m_widget
->window
), m_glContext
);
103 void wxGLContext::SetColour(const char *colour
)
108 wxColour
*col
= wxTheColourDatabase
->FindColour(colour
);
111 r
= (float)(col
->Red()/256.0);
112 g
= (float)(col
->Green()/256.0);
113 b
= (float)(col
->Blue()/256.0);
118 void wxGLContext::SetupPixelFormat()
122 void wxGLContext::SetupPalette( const wxPalette
& WXUNUSED(palette
) )
126 wxPalette
wxGLContext::CreateDefaultPalette()
128 return wxNullPalette
;
131 //---------------------------------------------------------------------------
133 //---------------------------------------------------------------------------
135 IMPLEMENT_CLASS(wxGLCanvas
, wxScrolledWindow
)
137 BEGIN_EVENT_TABLE(wxGLCanvas
, wxScrolledWindow
)
138 EVT_SIZE(wxGLCanvas::OnSize
)
141 wxGLCanvas::wxGLCanvas( wxWindow
*parent
, wxWindowID id
,
142 const wxPoint
& pos
, const wxSize
& size
,
143 long style
, const wxString
& name
,
145 const wxPalette
& palette
)
147 Create( parent
, NULL
, id
, pos
, size
, style
, name
, attribList
, palette
);
150 wxGLCanvas::wxGLCanvas( wxWindow
*parent
,
151 const wxGLContext
*shared
,
153 const wxPoint
& pos
, const wxSize
& size
,
154 long style
, const wxString
& name
,
156 const wxPalette
& palette
)
158 Create( parent
, shared
, id
, pos
, size
, style
, name
, attribList
, palette
);
161 bool wxGLCanvas::Create( wxWindow
*parent
,
162 const wxGLContext
*shared
,
164 const wxPoint
& pos
, const wxSize
& size
,
165 long style
, const wxString
& name
,
167 const wxPalette
& palette
)
170 m_acceptsFocus
= TRUE
;
172 if (!PreCreation( parent
, pos
, size
) ||
173 !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
))
175 wxFAIL_MSG( _T("wxGLCanvas creation failed") );
181 int data
[] = { GLX_RGBA
,
183 GLX_DEPTH_SIZE
, 1, /* use largest available depth buffer */
189 attribList
= (int*) data
;
193 int data
[512], arg
=0, p
=0;
195 while( (attribList
[arg
]!=0) && (p
<512) )
197 switch( attribList
[arg
++] )
199 case WX_GL_RGBA
: data
[p
++] = GLX_RGBA
; break;
200 case WX_GL_DOUBLEBUFFER
: data
[p
++] = GLX_DOUBLEBUFFER
; break;
201 case WX_GL_DEPTH_SIZE
:
202 data
[p
++]=GLX_DEPTH_SIZE
; data
[p
++]=attribList
[arg
++]; break;
204 data
[p
++]=GLX_RED_SIZE
; data
[p
++]=attribList
[arg
++]; break;
205 case WX_GL_MIN_GREEN
:
206 data
[p
++]=GLX_GREEN_SIZE
; data
[p
++]=attribList
[arg
++]; break;
208 data
[p
++]=GLX_BLUE_SIZE
; data
[p
++]=attribList
[arg
++]; break;
215 attribList
= (int*) data
;
219 Display
*dpy
= GDK_DISPLAY();
221 g_vi
= glXChooseVisual( dpy
, DefaultScreen(dpy
), attribList
);
223 GdkVisual
*visual
= gdkx_visual_get( g_vi
->visualid
);
224 GdkColormap
*colormap
= gdk_colormap_new( gdkx_visual_get(g_vi
->visualid
), TRUE
);
226 gtk_widget_push_colormap( colormap
);
227 gtk_widget_push_visual( visual
);
229 m_glWidget
= gtk_myfixed_new();
230 m_widget
= m_glWidget
;
232 gtk_widget_pop_visual();
233 gtk_widget_pop_colormap();
235 m_parent
->DoAddChild( this );
237 /* must be realized for OpenGl output */
238 gtk_widget_realize( m_glWidget
);
240 m_glContext
= new wxGLContext( TRUE
, this, palette
, shared
);
243 g_vi
= (XVisualInfo
*) NULL
;
245 // gdk_window_set_back_pixmap( m_glWidget->window, None, 0 );
247 /* we pretend to have a m_wxwindow so that PostCreation hooks
248 up the events for expose and draw */
249 m_wxwindow
= m_glWidget
;
257 wxGLCanvas::~wxGLCanvas()
259 if (m_glContext
) delete m_glContext
;
260 m_wxwindow
= (GtkWidget
*) NULL
;
263 void wxGLCanvas::SwapBuffers()
265 if (m_glContext
) m_glContext
->SwapBuffers();
268 void wxGLCanvas::OnSize(wxSizeEvent
& WXUNUSED(event
))
271 GetClientSize( &width
, &height
);
272 if (m_glContext
&& GTK_WIDGET_REALIZED(m_glWidget
) )
275 // gdk_window_set_back_pixmap( gtk_widget_get_parent_window(m_glWidget), None, 0 );
277 glViewport(0, 0, (GLint
)width
, (GLint
)height
);
278 glMatrixMode(GL_PROJECTION
);
280 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
281 glMatrixMode(GL_MODELVIEW
);
285 void wxGLCanvas::SetCurrent()
287 if (m_glContext
) m_glContext
->SetCurrent();
290 void wxGLCanvas::SetColour( const char *colour
)
292 if (m_glContext
) m_glContext
->SetColour( colour
);
295 GtkWidget
*wxGLCanvas::GetConnectWidget()
300 bool wxGLCanvas::IsOwnGtkWindow( GdkWindow
*window
)
302 return (window
== m_glWidget
->window
);