]>
git.saurik.com Git - wxWidgets.git/blob - utils/glcanvas/src/glcanvas.cpp
a668badcabc56ed0a0e8b8bb0b20a1f79ded7413
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 //---------------------------------------------------------------------------
31 //---------------------------------------------------------------------------
33 XVisualInfo
*g_visual_info
= (XVisualInfo
*) NULL
;
35 //---------------------------------------------------------------------------
37 //---------------------------------------------------------------------------
39 IMPLEMENT_CLASS(wxGLContext
,wxObject
)
41 wxGLContext::wxGLContext( bool WXUNUSED(isRGB
), wxWindow
*win
, const wxPalette
& WXUNUSED(palette
) )
44 m_widget
= win
->m_wxwindow
;
46 wxCHECK_RET( g_visual_info
!= NULL
, "invalid visual for OpenGl" );
48 m_glContext
= glXCreateContext( GDK_DISPLAY(), g_visual_info
, None
, GL_TRUE
);
50 wxCHECK_RET( m_glContext
!= NULL
, "Couldn't create OpenGl context" );
52 glXMakeCurrent( GDK_DISPLAY(), GDK_WINDOW_XWINDOW(m_widget
->window
), m_glContext
);
55 wxGLContext::~wxGLContext()
59 glXMakeCurrent( GDK_DISPLAY(), GDK_WINDOW_XWINDOW(m_widget
->window
), m_glContext
);
61 glXDestroyContext( GDK_DISPLAY(), m_glContext
);
65 void wxGLContext::SwapBuffers()
69 glXSwapBuffers( GDK_DISPLAY(), GDK_WINDOW_XWINDOW( m_widget
->window
) );
73 void wxGLContext::SetCurrent()
77 glXMakeCurrent( GDK_DISPLAY(), GDK_WINDOW_XWINDOW(m_widget
->window
), m_glContext
);
81 void wxGLContext::SetColour(const char *colour
)
86 wxColour
*col
= wxTheColourDatabase
->FindColour(colour
);
89 r
= (float)(col
->Red()/256.0);
90 g
= (float)(col
->Green()/256.0);
91 b
= (float)(col
->Blue()/256.0);
96 void wxGLContext::SetupPixelFormat()
100 void wxGLContext::SetupPalette( const wxPalette
& WXUNUSED(palette
) )
104 wxPalette
wxGLContext::CreateDefaultPalette()
106 return wxNullPalette
;
109 //---------------------------------------------------------------------------
111 //---------------------------------------------------------------------------
113 IMPLEMENT_CLASS(wxGLCanvas
, wxScrolledWindow
)
115 BEGIN_EVENT_TABLE(wxGLCanvas
, wxScrolledWindow
)
116 EVT_SIZE(wxGLCanvas::OnSize
)
119 wxGLCanvas::wxGLCanvas(wxWindow
*parent
, wxWindowID id
,
120 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
,
121 int *WXUNUSED(attribList
), const wxPalette
& palette
):
122 wxScrolledWindow(parent
, id
, pos
, size
, style
, name
)
124 m_glContext
= new wxGLContext( TRUE
, this, palette
);
127 wxGLCanvas::~wxGLCanvas()
129 if (m_glContext
) delete m_glContext
;
132 void wxGLCanvas::SwapBuffers()
134 if (m_glContext
) m_glContext
->SwapBuffers();
137 void wxGLCanvas::OnSize(wxSizeEvent
& WXUNUSED(event
))
140 GetClientSize(& width
, & height
);
144 m_glContext
->SetCurrent();
146 glViewport(0, 0, (GLint
)width
, (GLint
)height
);
147 glMatrixMode(GL_PROJECTION
);
149 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
150 glMatrixMode(GL_MODELVIEW
);
154 void wxGLCanvas::SetCurrent()
156 if (m_glContext
) m_glContext
->SetCurrent();
159 void wxGLCanvas::SetColour( const char *colour
)
161 if (m_glContext
) m_glContext
->SetColour( colour
);
164 //--------------------------------------------------------------------
166 //--------------------------------------------------------------------
168 class wxGLModule
: public wxModule
171 virtual bool OnInit();
172 virtual void OnExit();
175 DECLARE_DYNAMIC_CLASS(wxGLModule
)
178 IMPLEMENT_DYNAMIC_CLASS(wxGLModule
, wxModule
)
180 bool wxGLModule::OnInit()
182 int data
[] = { GLX_RGBA
,GLX_RED_SIZE
,1,GLX_GREEN_SIZE
,1,
183 GLX_BLUE_SIZE
,1,GLX_DOUBLEBUFFER
,None
};
185 g_visual_info
= glXChooseVisual( GDK_DISPLAY(), DefaultScreen(GDK_DISPLAY()), data
);
187 wxCHECK_MSG( g_visual_info
!= NULL
, FALSE
, "Couldn't choose visual for OpenGl" );
189 wxVisualSetByExternal
= gdkx_visual_get(g_visual_info
->visualid
);
191 wxColormapSetByExternal
= gdk_colormap_new( gdkx_visual_get(g_visual_info
->visualid
), TRUE
);
196 void wxGLModule::OnExit()