]> git.saurik.com Git - wxWidgets.git/blame - wxPython/contrib/glcanvas/msw/myglcanvas.cpp
reSWIGged
[wxWidgets.git] / wxPython / contrib / glcanvas / msw / myglcanvas.cpp
CommitLineData
19cf4f80
RD
1/////////////////////////////////////////////////////////////////////////////
2// Name: glcanvas.cpp
3// Purpose: wxGLCanvas, for using OpenGL with wxWindows under MS Windows
4// Author: Julian Smart
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
0122b7e3 9// Licence: wxWindows licence
19cf4f80
RD
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "glcanvas.h"
14#endif
15
16#include "wx/wxprec.h"
17
18#if defined(__BORLANDC__)
19#pragma hdrstop
20#endif
21
22#include <wx/setup.h>
23
24
8a721b35 25#undef wxUSE_GLCANVAS
19cf4f80
RD
26#define wxUSE_GLCANVAS 1
27#if wxUSE_GLCANVAS
28
29#ifndef WX_PRECOMP
1e4a197e
RD
30 #include "wx/frame.h"
31 #include "wx/settings.h"
32 #include "wx/intl.h"
33 #include "wx/log.h"
19cf4f80
RD
34#endif
35
1e4a197e 36#include "wx/msw/private.h"
19cf4f80
RD
37
38#include "myglcanvas.h"
39
1e4a197e 40const wxChar* wxGLCanvasName = wxT("GLcanvas");
0122b7e3
RD
41static const wxChar *wxGLCanvasClassName = wxT("wxGLCanvasClass");
42static const wxChar *wxGLCanvasClassNameNoRedraw = wxT("wxGLCanvasClassNR");
19cf4f80
RD
43
44LRESULT WXDLLEXPORT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message,
45 WPARAM wParam, LPARAM lParam);
46
47/*
48 * GLContext implementation
49 */
50
51wxGLContext::wxGLContext(bool isRGB, wxGLCanvas *win, const wxPalette& palette)
52{
53 m_window = win;
54
55 m_hDC = win->GetHDC();
56
57 m_glContext = wglCreateContext((HDC) m_hDC);
58 wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") );
59
60 wglMakeCurrent((HDC) m_hDC, m_glContext);
61}
62
63wxGLContext::wxGLContext(
64 bool isRGB, wxGLCanvas *win,
65 const wxPalette& palette,
66 const wxGLContext *other /* for sharing display lists */
67 )
68{
69 m_window = win;
70
71 m_hDC = win->GetHDC();
72
73 m_glContext = wglCreateContext((HDC) m_hDC);
74 wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") );
75
76 if( other != 0 )
77 wglShareLists( other->m_glContext, m_glContext );
78
79 wglMakeCurrent((HDC) m_hDC, m_glContext);
80}
81
82wxGLContext::~wxGLContext()
83{
84 if (m_glContext)
85 {
86 wglMakeCurrent(NULL, NULL);
87 wglDeleteContext(m_glContext);
88 }
89}
90
91void wxGLContext::SwapBuffers()
92{
93 if (m_glContext)
94 {
95 wglMakeCurrent((HDC) m_hDC, m_glContext);
96 ::SwapBuffers((HDC) m_hDC); //blits the backbuffer into DC
97 }
98}
99
100void wxGLContext::SetCurrent()
101{
102 if (m_glContext)
103 {
104 wglMakeCurrent((HDC) m_hDC, m_glContext);
105 }
106
107 /*
108 setupPixelFormat(hDC);
109 setupPalette(hDC);
110 */
111}
112
1e4a197e 113void wxGLContext::SetColour(const wxChar *colour)
19cf4f80
RD
114{
115 float r = 0.0;
116 float g = 0.0;
117 float b = 0.0;
118 wxColour *col = wxTheColourDatabase->FindColour(colour);
119 if (col)
120 {
121 r = (float)(col->Red()/256.0);
122 g = (float)(col->Green()/256.0);
123 b = (float)(col->Blue()/256.0);
124 glColor3f( r, g, b);
125 }
126}
127
128
129/*
130 * wxGLCanvas implementation
131 */
132
ab11ebfa 133IMPLEMENT_CLASS(wxGLCanvas, wxWindow)
19cf4f80 134
ab11ebfa 135BEGIN_EVENT_TABLE(wxGLCanvas, wxWindow)
19cf4f80
RD
136 EVT_SIZE(wxGLCanvas::OnSize)
137 EVT_PALETTE_CHANGED(wxGLCanvas::OnPaletteChanged)
138 EVT_QUERY_NEW_PALETTE(wxGLCanvas::OnQueryNewPalette)
139END_EVENT_TABLE()
140
141wxGLCanvas::wxGLCanvas(wxWindow *parent, wxWindowID id,
142 const wxPoint& pos, const wxSize& size, long style, const wxString& name,
ab11ebfa 143 int *attribList, const wxPalette& palette) : wxWindow()
19cf4f80
RD
144{
145 m_glContext = (wxGLContext*) NULL;
146
147 bool ret = Create(parent, id, pos, size, style, name);
148
149 if ( ret )
150 {
8a053704
VS
151 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
152 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
19cf4f80
RD
153 }
154
155 m_hDC = (WXHDC) ::GetDC((HWND) GetHWND());
156
157 SetupPixelFormat(attribList);
158 SetupPalette(palette);
159
160 m_glContext = new wxGLContext(TRUE, this, palette);
161}
162
163wxGLCanvas::wxGLCanvas( wxWindow *parent,
164 const wxGLContext *shared, wxWindowID id,
165 const wxPoint& pos, const wxSize& size, long style, const wxString& name,
166 int *attribList, const wxPalette& palette )
ab11ebfa 167 : wxWindow()
19cf4f80
RD
168{
169 m_glContext = (wxGLContext*) NULL;
170
171 bool ret = Create(parent, id, pos, size, style, name);
172
173 if ( ret )
174 {
8a053704
VS
175 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
176 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
19cf4f80
RD
177 }
178
179 m_hDC = (WXHDC) ::GetDC((HWND) GetHWND());
180
181 SetupPixelFormat(attribList);
182 SetupPalette(palette);
183
184 m_glContext = new wxGLContext(TRUE, this, palette, shared );
185}
186
187// Not very useful for wxMSW, but this is to be wxGTK compliant
188
189wxGLCanvas::wxGLCanvas( wxWindow *parent, const wxGLCanvas *shared, wxWindowID id,
190 const wxPoint& pos, const wxSize& size, long style, const wxString& name,
191 int *attribList, const wxPalette& palette ):
ab11ebfa 192 wxWindow()
19cf4f80
RD
193{
194 m_glContext = (wxGLContext*) NULL;
195
196 bool ret = Create(parent, id, pos, size, style, name);
197
198 if ( ret )
199 {
8a053704
VS
200 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
201 SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
19cf4f80
RD
202 }
203
204 m_hDC = (WXHDC) ::GetDC((HWND) GetHWND());
205
206 SetupPixelFormat(attribList);
207 SetupPalette(palette);
208
209 wxGLContext *sharedContext=0;
210 if (shared) sharedContext=shared->GetContext();
211 m_glContext = new wxGLContext(TRUE, this, palette, sharedContext );
212}
213
214wxGLCanvas::~wxGLCanvas()
215{
216 if (m_glContext)
217 delete m_glContext;
218
219 ::ReleaseDC((HWND) GetHWND(), (HDC) m_hDC);
220}
221
0122b7e3
RD
222// Replaces wxWindow::Create functionality, since we need to use a different
223// window class
224bool wxGLCanvas::Create(wxWindow *parent,
225 wxWindowID id,
226 const wxPoint& pos,
227 const wxSize& size,
228 long style,
229 const wxString& name)
19cf4f80 230{
0122b7e3 231 static bool s_registeredGLCanvasClass = FALSE;
19cf4f80
RD
232
233 // We have to register a special window class because we need
234 // the CS_OWNDC style for GLCanvas.
235
236 /*
237 From Angel Popov <jumpo@bitex.com>
238
239 Here are two snips from a dicussion in the OpenGL Gamedev list that explains
240 how this problem can be fixed:
241
242 "There are 5 common DCs available in Win95. These are aquired when you call
243 GetDC or GetDCEx from a window that does _not_ have the OWNDC flag.
244 OWNDC flagged windows do not get their DC from the common DC pool, the issue
245 is they require 800 bytes each from the limited 64Kb local heap for GDI."
246
247 "The deal is, if you hold onto one of the 5 shared DC's too long (as GL apps
248 do), Win95 will actually "steal" it from you. MakeCurrent fails,
249 apparently, because Windows re-assigns the HDC to a different window. The
250 only way to prevent this, the only reliable means, is to set CS_OWNDC."
251 */
252
0122b7e3 253 if (!s_registeredGLCanvasClass)
19cf4f80
RD
254 {
255 WNDCLASS wndclass;
256
19cf4f80
RD
257 // the fields which are common to all classes
258 wndclass.lpfnWndProc = (WNDPROC)wxWndProc;
259 wndclass.cbClsExtra = 0;
260 wndclass.cbWndExtra = sizeof( DWORD ); // VZ: what is this DWORD used for?
261 wndclass.hInstance = wxhInstance;
262 wndclass.hIcon = (HICON) NULL;
263 wndclass.hCursor = ::LoadCursor((HINSTANCE)NULL, IDC_ARROW);
264 wndclass.lpszMenuName = NULL;
265
266 // Register the GLCanvas class name
267 wndclass.hbrBackground = (HBRUSH)NULL;
268 wndclass.lpszClassName = wxGLCanvasClassName;
0122b7e3 269 wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC;
19cf4f80 270
0122b7e3 271 if ( !::RegisterClass(&wndclass) )
19cf4f80
RD
272 {
273 wxLogLastError(wxT("RegisterClass(wxGLCanvasClass)"));
274 return FALSE;
275 }
276
0122b7e3
RD
277 // Register the GLCanvas class name for windows which don't do full repaint
278 // on resize
279 wndclass.lpszClassName = wxGLCanvasClassNameNoRedraw;
280 wndclass.style &= ~(CS_HREDRAW | CS_VREDRAW);
281
282 if ( !::RegisterClass(&wndclass) )
283 {
284 wxLogLastError(wxT("RegisterClass(wxGLCanvasClassNameNoRedraw)"));
285
286 ::UnregisterClass(wxGLCanvasClassName, wxhInstance);
287
288 return FALSE;
289 }
290
291 s_registeredGLCanvasClass = TRUE;
19cf4f80
RD
292 }
293
294 wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindow without parent") );
295
296 if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
297 return FALSE;
298
299 parent->AddChild(this);
300
301 DWORD msflags = 0;
302 if ( style & wxBORDER )
303 msflags |= WS_BORDER;
304 if ( style & wxTHICK_FRAME )
305 msflags |= WS_THICKFRAME;
306
307 /*
308 A general rule with OpenGL and Win32 is that any window that will have a
309 HGLRC built for it must have two flags: WS_CLIPCHILDREN & WS_CLIPSIBLINGS.
310 You can find references about this within the knowledge base and most OpenGL
311 books that contain the wgl function descriptions.
312 */
313
0122b7e3 314 msflags |= WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
19cf4f80
RD
315
316 bool want3D;
317 WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D);
318
319 // Even with extended styles, need to combine with WS_BORDER
320 // for them to look right.
321 if ( want3D || (m_windowStyle & wxSIMPLE_BORDER) || (m_windowStyle & wxRAISED_BORDER ) ||
322 (m_windowStyle & wxSUNKEN_BORDER) || (m_windowStyle & wxDOUBLE_BORDER))
323 {
324 msflags |= WS_BORDER;
325 }
326
0122b7e3 327 return MSWCreate(wxGLCanvasClassName, NULL, pos, size, msflags, exStyle);
19cf4f80
RD
328}
329
0122b7e3 330static void AdjustPFDForAttributes(PIXELFORMATDESCRIPTOR& pfd, int *attribList)
19cf4f80 331{
19cf4f80
RD
332 if (attribList) {
333 pfd.dwFlags &= ~PFD_DOUBLEBUFFER;
334 pfd.iPixelType = PFD_TYPE_COLORINDEX;
335 pfd.cColorBits = 0;
336 int arg=0;
337
338 while( (attribList[arg]!=0) )
339 {
340 switch( attribList[arg++] )
341 {
342 case WX_GL_RGBA:
343 pfd.iPixelType = PFD_TYPE_RGBA;
344 break;
345 case WX_GL_BUFFER_SIZE:
346 pfd.cColorBits = attribList[arg++];
347 break;
348 case WX_GL_LEVEL:
349 // this member looks like it may be obsolete
350 if (attribList[arg] > 0) {
f54a35fe 351 pfd.iLayerType = (BYTE)PFD_OVERLAY_PLANE;
19cf4f80 352 } else if (attribList[arg] < 0) {
f54a35fe 353 pfd.iLayerType = (BYTE)PFD_UNDERLAY_PLANE;
19cf4f80 354 } else {
f54a35fe 355 pfd.iLayerType = (BYTE)PFD_MAIN_PLANE;
19cf4f80
RD
356 }
357 arg++;
358 break;
359 case WX_GL_DOUBLEBUFFER:
360 pfd.dwFlags |= PFD_DOUBLEBUFFER;
361 break;
362 case WX_GL_STEREO:
363 pfd.dwFlags |= PFD_STEREO;
364 break;
365 case WX_GL_AUX_BUFFERS:
366 pfd.cAuxBuffers = attribList[arg++];
367 break;
368 case WX_GL_MIN_RED:
369 pfd.cColorBits += (pfd.cRedBits = attribList[arg++]);
370 break;
371 case WX_GL_MIN_GREEN:
372 pfd.cColorBits += (pfd.cGreenBits = attribList[arg++]);
373 break;
374 case WX_GL_MIN_BLUE:
375 pfd.cColorBits += (pfd.cBlueBits = attribList[arg++]);
376 break;
377 case WX_GL_MIN_ALPHA:
378 // doesn't count in cColorBits
379 pfd.cAlphaBits = attribList[arg++];
380 break;
381 case WX_GL_DEPTH_SIZE:
382 pfd.cDepthBits = attribList[arg++];
383 break;
384 case WX_GL_STENCIL_SIZE:
385 pfd.cStencilBits = attribList[arg++];
386 break;
387 case WX_GL_MIN_ACCUM_RED:
388 pfd.cAccumBits += (pfd.cAccumRedBits = attribList[arg++]);
389 break;
390 case WX_GL_MIN_ACCUM_GREEN:
391 pfd.cAccumBits += (pfd.cAccumGreenBits = attribList[arg++]);
392 break;
393 case WX_GL_MIN_ACCUM_BLUE:
394 pfd.cAccumBits += (pfd.cAccumBlueBits = attribList[arg++]);
395 break;
396 case WX_GL_MIN_ACCUM_ALPHA:
397 pfd.cAccumBits += (pfd.cAccumAlphaBits = attribList[arg++]);
398 break;
399 default:
400 break;
401 }
402 }
403 }
0122b7e3
RD
404}
405
406void wxGLCanvas::SetupPixelFormat(int *attribList) // (HDC hDC)
407{
0122b7e3
RD
408 PIXELFORMATDESCRIPTOR pfd = {
409 sizeof(PIXELFORMATDESCRIPTOR), /* size */
410 1, /* version */
411 PFD_SUPPORT_OPENGL |
412 PFD_DRAW_TO_WINDOW |
413 PFD_DOUBLEBUFFER, /* support double-buffering */
414 PFD_TYPE_RGBA, /* color type */
415 16, /* prefered color depth */
416 0, 0, 0, 0, 0, 0, /* color bits (ignored) */
417 0, /* no alpha buffer */
418 0, /* alpha bits (ignored) */
419 0, /* no accumulation buffer */
420 0, 0, 0, 0, /* accum bits (ignored) */
421 16, /* depth buffer */
422 0, /* no stencil buffer */
423 0, /* no auxiliary buffers */
424 PFD_MAIN_PLANE, /* main layer */
425 0, /* reserved */
426 0, 0, 0, /* no layer, visible, damage masks */
427 };
428
429 AdjustPFDForAttributes(pfd, attribList);
430
1e4a197e 431 int pixelFormat = ChoosePixelFormat((HDC) m_hDC, &pfd);
19cf4f80 432 if (pixelFormat == 0) {
1e4a197e 433 wxLogLastError(_T("ChoosePixelFormat"));
19cf4f80 434 }
0122b7e3 435 else {
1e4a197e
RD
436 if ( !::SetPixelFormat((HDC) m_hDC, pixelFormat, &pfd) ) {
437 wxLogLastError(_T("SetPixelFormat"));
0122b7e3 438 }
19cf4f80
RD
439 }
440}
441
442void wxGLCanvas::SetupPalette(const wxPalette& palette)
443{
444 int pixelFormat = GetPixelFormat((HDC) m_hDC);
445 PIXELFORMATDESCRIPTOR pfd;
446
447 DescribePixelFormat((HDC) m_hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
448
449 if (pfd.dwFlags & PFD_NEED_PALETTE)
450 {
451 }
452 else
453 {
0122b7e3 454 return;
19cf4f80
RD
455 }
456
457 m_palette = palette;
458
459 if ( !m_palette.Ok() )
460 {
461 m_palette = CreateDefaultPalette();
462 }
463
464 if (m_palette.Ok())
465 {
466 SelectPalette((HDC) m_hDC, (HPALETTE) m_palette.GetHPALETTE(), FALSE);
467 RealizePalette((HDC) m_hDC);
468 }
469}
470
471wxPalette wxGLCanvas::CreateDefaultPalette()
472{
473 PIXELFORMATDESCRIPTOR pfd;
474 int paletteSize;
475 int pixelFormat = GetPixelFormat((HDC) m_hDC);
476
477 DescribePixelFormat((HDC) m_hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
478
479 paletteSize = 1 << pfd.cColorBits;
480
481 LOGPALETTE* pPal =
482 (LOGPALETTE*) malloc(sizeof(LOGPALETTE) + paletteSize * sizeof(PALETTEENTRY));
483 pPal->palVersion = 0x300;
484 pPal->palNumEntries = paletteSize;
485
486 /* build a simple RGB color palette */
487 {
0122b7e3
RD
488 int redMask = (1 << pfd.cRedBits) - 1;
489 int greenMask = (1 << pfd.cGreenBits) - 1;
490 int blueMask = (1 << pfd.cBlueBits) - 1;
491 int i;
492
493 for (i=0; i<paletteSize; ++i) {
494 pPal->palPalEntry[i].peRed =
495 (((i >> pfd.cRedShift) & redMask) * 255) / redMask;
496 pPal->palPalEntry[i].peGreen =
497 (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask;
498 pPal->palPalEntry[i].peBlue =
499 (((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask;
500 pPal->palPalEntry[i].peFlags = 0;
501 }
19cf4f80
RD
502 }
503
504 HPALETTE hPalette = CreatePalette(pPal);
505 free(pPal);
506
507 wxPalette palette;
508 palette.SetHPALETTE((WXHPALETTE) hPalette);
509
510 return palette;
511}
512
513void wxGLCanvas::SwapBuffers()
514{
515 if (m_glContext)
516 m_glContext->SwapBuffers();
517}
518
519void wxGLCanvas::OnSize(wxSizeEvent& event)
520{
19cf4f80
RD
521}
522
523void wxGLCanvas::SetCurrent()
524{
525 if (m_glContext)
526 {
527 m_glContext->SetCurrent();
528 }
529}
530
1e4a197e 531void wxGLCanvas::SetColour(const wxChar *colour)
19cf4f80
RD
532{
533 if (m_glContext)
534 m_glContext->SetColour(colour);
535}
536
537// TODO: Have to have this called by parent frame (?)
538// So we need wxFrame to call OnQueryNewPalette for all children...
539void wxGLCanvas::OnQueryNewPalette(wxQueryNewPaletteEvent& event)
540{
541 /* realize palette if this is the current window */
542 if ( GetPalette()->Ok() ) {
543 ::UnrealizeObject((HPALETTE) GetPalette()->GetHPALETTE());
544 ::SelectPalette((HDC) GetHDC(), (HPALETTE) GetPalette()->GetHPALETTE(), FALSE);
545 ::RealizePalette((HDC) GetHDC());
546 Refresh();
547 event.SetPaletteRealized(TRUE);
548 }
549 else
550 event.SetPaletteRealized(FALSE);
551}
552
553// I think this doesn't have to be propagated to child windows.
554void wxGLCanvas::OnPaletteChanged(wxPaletteChangedEvent& event)
555{
556 /* realize palette if this is *not* the current window */
557 if ( GetPalette() &&
558 GetPalette()->Ok() && (this != event.GetChangedWindow()) )
559 {
560 ::UnrealizeObject((HPALETTE) GetPalette()->GetHPALETTE());
561 ::SelectPalette((HDC) GetHDC(), (HPALETTE) GetPalette()->GetHPALETTE(), FALSE);
562 ::RealizePalette((HDC) GetHDC());
563 Refresh();
564 }
565}
566
567/* Give extensions proper function names. */
568
569/* EXT_vertex_array */
570void glArrayElementEXT(GLint i)
571{
572}
573
574void glColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer)
575{
576}
577
578void glDrawArraysEXT(GLenum mode, GLint first, GLsizei count)
579{
580#ifdef GL_EXT_vertex_array
581 static PFNGLDRAWARRAYSEXTPROC proc = 0;
582
583 if ( !proc )
584 {
585 proc = (PFNGLDRAWARRAYSEXTPROC) wglGetProcAddress("glDrawArraysEXT");
586 }
587
588 if ( proc )
589 (* proc) (mode, first, count);
590#endif
591}
592
593void glEdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *pointer)
594{
595}
596
597void glGetPointervEXT(GLenum pname, GLvoid* *params)
598{
599}
600
601void glIndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer)
602{
603}
604
605void glNormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer)
606{
607#ifdef GL_EXT_vertex_array
608 static PFNGLNORMALPOINTEREXTPROC proc = 0;
609
610 if ( !proc )
611 {
612 proc = (PFNGLNORMALPOINTEREXTPROC) wglGetProcAddress("glNormalPointerEXT");
613 }
614
615 if ( proc )
616 (* proc) (type, stride, count, pointer);
617#endif
618}
619
620void glTexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer)
621{
622}
623
624void glVertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer)
625{
626#ifdef GL_EXT_vertex_array
627 static PFNGLVERTEXPOINTEREXTPROC proc = 0;
628
629 if ( !proc )
630 {
631 proc = (PFNGLVERTEXPOINTEREXTPROC) wglGetProcAddress("glVertexPointerEXT");
632 }
633 if ( proc )
634 (* proc) (size, type, stride, count, pointer);
635#endif
636}
637
638/* EXT_color_subtable */
639void glColorSubtableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *table)
640{
641}
642
643/* EXT_color_table */
644void glColorTableEXT(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)
645{
646}
647
648void glCopyColorTableEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)
649{
650}
651
652void glGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid *table)
653{
654}
655
656void glGetColorTableParamaterfvEXT(GLenum target, GLenum pname, GLfloat *params)
657{
658}
659
660void glGetColorTavleParameterivEXT(GLenum target, GLenum pname, GLint *params)
661{
662}
663
664/* SGI_compiled_vertex_array */
665void glLockArraysSGI(GLint first, GLsizei count)
666{
667}
668
669void glUnlockArraysSGI()
670{
671}
672
673
674/* SGI_cull_vertex */
675void glCullParameterdvSGI(GLenum pname, GLdouble* params)
676{
677}
678
679void glCullParameterfvSGI(GLenum pname, GLfloat* params)
680{
681}
682
683/* SGI_index_func */
684void glIndexFuncSGI(GLenum func, GLclampf ref)
685{
686}
687
688/* SGI_index_material */
689void glIndexMaterialSGI(GLenum face, GLenum mode)
690{
691}
692
693/* WIN_swap_hint */
694void glAddSwapHintRectWin(GLint x, GLint y, GLsizei width, GLsizei height)
695{
696}
697
0122b7e3
RD
698
699//---------------------------------------------------------------------------
700// wxGLApp
701//---------------------------------------------------------------------------
702
703IMPLEMENT_CLASS(wxGLApp, wxApp)
704
705bool wxGLApp::InitGLVisual(int *attribList)
706{
707 int pixelFormat;
708 PIXELFORMATDESCRIPTOR pfd = {
709 sizeof(PIXELFORMATDESCRIPTOR), /* size */
710 1, /* version */
711 PFD_SUPPORT_OPENGL |
712 PFD_DRAW_TO_WINDOW |
713 PFD_DOUBLEBUFFER, /* support double-buffering */
714 PFD_TYPE_RGBA, /* color type */
715 16, /* prefered color depth */
716 0, 0, 0, 0, 0, 0, /* color bits (ignored) */
717 0, /* no alpha buffer */
718 0, /* alpha bits (ignored) */
719 0, /* no accumulation buffer */
720 0, 0, 0, 0, /* accum bits (ignored) */
721 16, /* depth buffer */
722 0, /* no stencil buffer */
723 0, /* no auxiliary buffers */
724 PFD_MAIN_PLANE, /* main layer */
725 0, /* reserved */
726 0, 0, 0, /* no layer, visible, damage masks */
727 };
728
729 AdjustPFDForAttributes(pfd, attribList);
730
731 // use DC for whole (root) screen, since no windows have yet been created
1e4a197e 732 pixelFormat = ChoosePixelFormat(ScreenHDC(), &pfd);
0122b7e3
RD
733
734 if (pixelFormat == 0) {
735 wxLogError(_("Failed to initialize OpenGL"));
736 return FALSE;
737 }
738
739 return TRUE;
740}
741
742wxGLApp::~wxGLApp()
743{
744}
745
19cf4f80
RD
746#endif
747 // wxUSE_GLCANVAS