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