1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/glcanvas.cpp
3 // Purpose: wxGLCanvas, for using OpenGL with wxWidgets under MS Windows
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "glcanvas.h"
16 #include "wx/wxprec.h"
18 #if defined(__BORLANDC__)
26 #include "wx/settings.h"
32 #include "wx/module.h"
34 #include "wx/msw/private.h"
36 // DLL options compatibility check:
38 WX_CHECK_BUILD_OPTIONS("wxGL")
40 #include "wx/glcanvas.h"
42 #if GL_EXT_vertex_array
43 #define WXUNUSED_WITHOUT_GL_EXT_vertex_array(name) name
45 #define WXUNUSED_WITHOUT_GL_EXT_vertex_array(name) WXUNUSED(name)
49 The following two compiler directives are specific to the Microsoft Visual
50 C++ family of compilers
52 Fundementally what they do is instruct the linker to use these two libraries
53 for the resolution of symbols. In essence, this is the equivalent of adding
54 these two libraries to either the Makefile or project file.
56 This is NOT a recommended technique, and certainly is unlikely to be used
57 anywhere else in wxWidgets given it is so specific to not only wxMSW, but
58 also the VC compiler. However, in the case of opengl support, it's an
59 applicable technique as opengl is optional in setup.h This code (wrapped by
60 wxUSE_GLCANVAS), now allows opengl support to be added purely by modifying
61 setup.h rather than by having to modify either the project or DSP fle.
63 See MSDN for further information on the exact usage of these commands.
66 # pragma comment( lib, "opengl32" )
67 # pragma comment( lib, "glu32" )
71 static const wxChar
*wxGLCanvasClassName
= wxT("wxGLCanvasClass");
72 static const wxChar
*wxGLCanvasClassNameNoRedraw
= wxT("wxGLCanvasClassNR");
74 LRESULT WXDLLEXPORT APIENTRY _EXPORT
wxWndProc(HWND hWnd
, UINT message
,
75 WPARAM wParam
, LPARAM lParam
);
77 // ----------------------------------------------------------------------------
78 // wxGLModule is responsible for unregistering wxGLCanvasClass Windows class
79 // ----------------------------------------------------------------------------
81 class wxGLModule
: public wxModule
84 bool OnInit() { return true; }
85 void OnExit() { UnregisterClasses(); }
87 // register the GL classes if not done yet, return true if ok, false if
88 // registration failed
89 static bool RegisterClasses();
91 // unregister the classes, done automatically on program termination
92 static void UnregisterClasses();
95 // wxGLCanvas is only used from the main thread so this is MT-ok
96 static bool ms_registeredGLClasses
;
98 DECLARE_DYNAMIC_CLASS(wxGLModule
)
101 IMPLEMENT_DYNAMIC_CLASS(wxGLModule
, wxModule
)
103 bool wxGLModule::ms_registeredGLClasses
= false;
106 bool wxGLModule::RegisterClasses()
108 if (ms_registeredGLClasses
)
111 // We have to register a special window class because we need the CS_OWNDC
112 // style for GLCanvas.
115 From Angel Popov <jumpo@bitex.com>
117 Here are two snips from a dicussion in the OpenGL Gamedev list that explains
118 how this problem can be fixed:
120 "There are 5 common DCs available in Win95. These are aquired when you call
121 GetDC or GetDCEx from a window that does _not_ have the OWNDC flag.
122 OWNDC flagged windows do not get their DC from the common DC pool, the issue
123 is they require 800 bytes each from the limited 64Kb local heap for GDI."
125 "The deal is, if you hold onto one of the 5 shared DC's too long (as GL apps
126 do), Win95 will actually "steal" it from you. MakeCurrent fails,
127 apparently, because Windows re-assigns the HDC to a different window. The
128 only way to prevent this, the only reliable means, is to set CS_OWNDC."
133 // the fields which are common to all classes
134 wndclass
.lpfnWndProc
= (WNDPROC
)wxWndProc
;
135 wndclass
.cbClsExtra
= 0;
136 wndclass
.cbWndExtra
= sizeof( DWORD
); // VZ: what is this DWORD used for?
137 wndclass
.hInstance
= wxhInstance
;
138 wndclass
.hIcon
= (HICON
) NULL
;
139 wndclass
.hCursor
= ::LoadCursor((HINSTANCE
)NULL
, IDC_ARROW
);
140 wndclass
.lpszMenuName
= NULL
;
142 // Register the GLCanvas class name
143 wndclass
.hbrBackground
= (HBRUSH
)NULL
;
144 wndclass
.lpszClassName
= wxGLCanvasClassName
;
145 wndclass
.style
= CS_HREDRAW
| CS_VREDRAW
| CS_DBLCLKS
| CS_OWNDC
;
147 if ( !::RegisterClass(&wndclass
) )
149 wxLogLastError(wxT("RegisterClass(wxGLCanvasClass)"));
153 // Register the GLCanvas class name for windows which don't do full repaint
155 wndclass
.lpszClassName
= wxGLCanvasClassNameNoRedraw
;
156 wndclass
.style
&= ~(CS_HREDRAW
| CS_VREDRAW
);
158 if ( !::RegisterClass(&wndclass
) )
160 wxLogLastError(wxT("RegisterClass(wxGLCanvasClassNameNoRedraw)"));
162 ::UnregisterClass(wxGLCanvasClassName
, wxhInstance
);
167 ms_registeredGLClasses
= true;
173 void wxGLModule::UnregisterClasses()
175 // we need to unregister the classes in case we're in a DLL which is
176 // unloaded and then loaded again because if we don't, the registration is
177 // going to fail in wxGLCanvas::Create() the next time we're loaded
178 if ( ms_registeredGLClasses
)
180 ::UnregisterClass(wxGLCanvasClassName
, wxhInstance
);
181 ::UnregisterClass(wxGLCanvasClassNameNoRedraw
, wxhInstance
);
183 ms_registeredGLClasses
= false;
188 * GLContext implementation
191 wxGLContext::wxGLContext(bool WXUNUSED(isRGB
), wxGLCanvas
*win
, const wxPalette
& WXUNUSED(palette
))
195 m_hDC
= win
->GetHDC();
197 m_glContext
= wglCreateContext((HDC
) m_hDC
);
198 wxCHECK_RET( m_glContext
, wxT("Couldn't create OpenGL context") );
200 wglMakeCurrent((HDC
) m_hDC
, m_glContext
);
203 wxGLContext::wxGLContext(
204 bool WXUNUSED(isRGB
), wxGLCanvas
*win
,
205 const wxPalette
& WXUNUSED(palette
),
206 const wxGLContext
*other
/* for sharing display lists */
211 m_hDC
= win
->GetHDC();
213 m_glContext
= wglCreateContext((HDC
) m_hDC
);
214 wxCHECK_RET( m_glContext
, wxT("Couldn't create OpenGL context") );
217 wglShareLists( other
->m_glContext
, m_glContext
);
219 wglMakeCurrent((HDC
) m_hDC
, m_glContext
);
222 wxGLContext::~wxGLContext()
226 wglMakeCurrent(NULL
, NULL
);
227 wglDeleteContext(m_glContext
);
231 void wxGLContext::SwapBuffers()
235 wglMakeCurrent((HDC
) m_hDC
, m_glContext
);
236 ::SwapBuffers((HDC
) m_hDC
); //blits the backbuffer into DC
240 void wxGLContext::SetCurrent()
244 wglMakeCurrent((HDC
) m_hDC
, m_glContext
);
248 void wxGLContext::SetColour(const wxChar
*colour
)
250 wxColour col
= wxTheColourDatabase
->Find(colour
);
253 float r
= (float)(col
.Red()/256.0);
254 float g
= (float)(col
.Green()/256.0);
255 float b
= (float)(col
.Blue()/256.0);
262 * wxGLCanvas implementation
265 IMPLEMENT_CLASS(wxGLCanvas
, wxWindow
)
267 BEGIN_EVENT_TABLE(wxGLCanvas
, wxWindow
)
268 EVT_SIZE(wxGLCanvas::OnSize
)
269 EVT_PALETTE_CHANGED(wxGLCanvas::OnPaletteChanged
)
270 EVT_QUERY_NEW_PALETTE(wxGLCanvas::OnQueryNewPalette
)
273 wxGLCanvas::wxGLCanvas(wxWindow
*parent
, wxWindowID id
,
274 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
,
275 int *attribList
, const wxPalette
& palette
) : wxWindow()
277 m_glContext
= (wxGLContext
*) NULL
;
279 bool ret
= Create(parent
, id
, pos
, size
, style
, name
);
283 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
));
286 m_hDC
= (WXHDC
) ::GetDC((HWND
) GetHWND());
288 SetupPixelFormat(attribList
);
289 SetupPalette(palette
);
291 m_glContext
= new wxGLContext(true, this, palette
);
294 wxGLCanvas::wxGLCanvas( wxWindow
*parent
,
295 const wxGLContext
*shared
, wxWindowID id
,
296 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
,
297 int *attribList
, const wxPalette
& palette
)
300 m_glContext
= (wxGLContext
*) NULL
;
302 bool ret
= Create(parent
, id
, pos
, size
, style
, name
);
306 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
));
309 m_hDC
= (WXHDC
) ::GetDC((HWND
) GetHWND());
311 SetupPixelFormat(attribList
);
312 SetupPalette(palette
);
314 m_glContext
= new wxGLContext(true, this, palette
, shared
);
317 // Not very useful for wxMSW, but this is to be wxGTK compliant
319 wxGLCanvas::wxGLCanvas( wxWindow
*parent
, const wxGLCanvas
*shared
, wxWindowID id
,
320 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
,
321 int *attribList
, const wxPalette
& palette
):
324 m_glContext
= (wxGLContext
*) NULL
;
326 bool ret
= Create(parent
, id
, pos
, size
, style
, name
);
330 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
));
333 m_hDC
= (WXHDC
) ::GetDC((HWND
) GetHWND());
335 SetupPixelFormat(attribList
);
336 SetupPalette(palette
);
338 wxGLContext
*sharedContext
=0;
339 if (shared
) sharedContext
=shared
->GetContext();
340 m_glContext
= new wxGLContext(true, this, palette
, sharedContext
);
343 wxGLCanvas::~wxGLCanvas()
347 ::ReleaseDC((HWND
) GetHWND(), (HDC
) m_hDC
);
350 // Replaces wxWindow::Create functionality, since we need to use a different
352 bool wxGLCanvas::Create(wxWindow
*parent
,
357 const wxString
& name
)
359 wxCHECK_MSG( parent
, false, wxT("can't create wxWindow without parent") );
361 if ( !wxGLModule::RegisterClasses() )
363 wxLogError(_("Failed to register OpenGL window class."));
368 if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) )
371 parent
->AddChild(this);
376 A general rule with OpenGL and Win32 is that any window that will have a
377 HGLRC built for it must have two flags: WS_CLIPCHILDREN & WS_CLIPSIBLINGS.
378 You can find references about this within the knowledge base and most OpenGL
379 books that contain the wgl function descriptions.
383 msflags
|= WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
;
384 msflags
|= MSWGetStyle(style
, & exStyle
) ;
386 return MSWCreate(wxGLCanvasClassName
, NULL
, pos
, size
, msflags
, exStyle
);
389 static void AdjustPFDForAttributes(PIXELFORMATDESCRIPTOR
& pfd
, int *attribList
)
392 pfd
.dwFlags
&= ~PFD_DOUBLEBUFFER
;
393 pfd
.iPixelType
= PFD_TYPE_COLORINDEX
;
397 while( (attribList
[arg
]!=0) )
399 switch( attribList
[arg
++] )
402 pfd
.iPixelType
= PFD_TYPE_RGBA
;
404 case WX_GL_BUFFER_SIZE
:
405 pfd
.cColorBits
= (BYTE
)attribList
[arg
++];
408 // this member looks like it may be obsolete
409 if (attribList
[arg
] > 0) {
410 pfd
.iLayerType
= (BYTE
)PFD_OVERLAY_PLANE
;
411 } else if (attribList
[arg
] < 0) {
412 pfd
.iLayerType
= (BYTE
)PFD_UNDERLAY_PLANE
;
414 pfd
.iLayerType
= (BYTE
)PFD_MAIN_PLANE
;
418 case WX_GL_DOUBLEBUFFER
:
419 pfd
.dwFlags
|= PFD_DOUBLEBUFFER
;
422 pfd
.dwFlags
|= PFD_STEREO
;
424 case WX_GL_AUX_BUFFERS
:
425 pfd
.cAuxBuffers
= (BYTE
)attribList
[arg
++];
428 pfd
.cColorBits
= (BYTE
)(pfd
.cColorBits
+ (pfd
.cRedBits
= (BYTE
)attribList
[arg
++]));
430 case WX_GL_MIN_GREEN
:
431 pfd
.cColorBits
= (BYTE
)(pfd
.cColorBits
+ (pfd
.cGreenBits
= (BYTE
)attribList
[arg
++]));
434 pfd
.cColorBits
= (BYTE
)(pfd
.cColorBits
+ (pfd
.cBlueBits
= (BYTE
)attribList
[arg
++]));
436 case WX_GL_MIN_ALPHA
:
437 // doesn't count in cColorBits
438 pfd
.cAlphaBits
= (BYTE
)attribList
[arg
++];
440 case WX_GL_DEPTH_SIZE
:
441 pfd
.cDepthBits
= (BYTE
)attribList
[arg
++];
443 case WX_GL_STENCIL_SIZE
:
444 pfd
.cStencilBits
= (BYTE
)attribList
[arg
++];
446 case WX_GL_MIN_ACCUM_RED
:
447 pfd
.cAccumBits
= (BYTE
)(pfd
.cAccumBits
+ (pfd
.cAccumRedBits
= (BYTE
)attribList
[arg
++]));
449 case WX_GL_MIN_ACCUM_GREEN
:
450 pfd
.cAccumBits
= (BYTE
)(pfd
.cAccumBits
+ (pfd
.cAccumGreenBits
= (BYTE
)attribList
[arg
++]));
452 case WX_GL_MIN_ACCUM_BLUE
:
453 pfd
.cAccumBits
= (BYTE
)(pfd
.cAccumBits
+ (pfd
.cAccumBlueBits
= (BYTE
)attribList
[arg
++]));
455 case WX_GL_MIN_ACCUM_ALPHA
:
456 pfd
.cAccumBits
= (BYTE
)(pfd
.cAccumBits
+ (pfd
.cAccumAlphaBits
= (BYTE
)attribList
[arg
++]));
465 void wxGLCanvas::SetupPixelFormat(int *attribList
) // (HDC hDC)
467 PIXELFORMATDESCRIPTOR pfd
= {
468 sizeof(PIXELFORMATDESCRIPTOR
), /* size */
472 PFD_DOUBLEBUFFER
, /* support double-buffering */
473 PFD_TYPE_RGBA
, /* color type */
474 16, /* preferred color depth */
475 0, 0, 0, 0, 0, 0, /* color bits (ignored) */
476 0, /* no alpha buffer */
477 0, /* alpha bits (ignored) */
478 0, /* no accumulation buffer */
479 0, 0, 0, 0, /* accum bits (ignored) */
480 16, /* depth buffer */
481 0, /* no stencil buffer */
482 0, /* no auxiliary buffers */
483 PFD_MAIN_PLANE
, /* main layer */
485 0, 0, 0, /* no layer, visible, damage masks */
488 AdjustPFDForAttributes(pfd
, attribList
);
490 int pixelFormat
= ChoosePixelFormat((HDC
) m_hDC
, &pfd
);
491 if (pixelFormat
== 0) {
492 wxLogLastError(_T("ChoosePixelFormat"));
495 if ( !::SetPixelFormat((HDC
) m_hDC
, pixelFormat
, &pfd
) ) {
496 wxLogLastError(_T("SetPixelFormat"));
501 void wxGLCanvas::SetupPalette(const wxPalette
& palette
)
503 int pixelFormat
= GetPixelFormat((HDC
) m_hDC
);
504 PIXELFORMATDESCRIPTOR pfd
;
506 DescribePixelFormat((HDC
) m_hDC
, pixelFormat
, sizeof(PIXELFORMATDESCRIPTOR
), &pfd
);
508 if (pfd
.dwFlags
& PFD_NEED_PALETTE
)
518 if ( !m_palette
.Ok() )
520 m_palette
= CreateDefaultPalette();
525 ::SelectPalette((HDC
) m_hDC
, (HPALETTE
) m_palette
.GetHPALETTE(), FALSE
);
526 ::RealizePalette((HDC
) m_hDC
);
530 wxPalette
wxGLCanvas::CreateDefaultPalette()
532 PIXELFORMATDESCRIPTOR pfd
;
534 int pixelFormat
= GetPixelFormat((HDC
) m_hDC
);
536 DescribePixelFormat((HDC
) m_hDC
, pixelFormat
, sizeof(PIXELFORMATDESCRIPTOR
), &pfd
);
538 paletteSize
= 1 << pfd
.cColorBits
;
541 (LOGPALETTE
*) malloc(sizeof(LOGPALETTE
) + paletteSize
* sizeof(PALETTEENTRY
));
542 pPal
->palVersion
= 0x300;
543 pPal
->palNumEntries
= (WORD
)paletteSize
;
545 /* build a simple RGB color palette */
547 int redMask
= (1 << pfd
.cRedBits
) - 1;
548 int greenMask
= (1 << pfd
.cGreenBits
) - 1;
549 int blueMask
= (1 << pfd
.cBlueBits
) - 1;
552 for (i
=0; i
<paletteSize
; ++i
) {
553 pPal
->palPalEntry
[i
].peRed
=
554 (BYTE
)((((i
>> pfd
.cRedShift
) & redMask
) * 255) / redMask
);
555 pPal
->palPalEntry
[i
].peGreen
=
556 (BYTE
)((((i
>> pfd
.cGreenShift
) & greenMask
) * 255) / greenMask
);
557 pPal
->palPalEntry
[i
].peBlue
=
558 (BYTE
)((((i
>> pfd
.cBlueShift
) & blueMask
) * 255) / blueMask
);
559 pPal
->palPalEntry
[i
].peFlags
= 0;
563 HPALETTE hPalette
= CreatePalette(pPal
);
567 palette
.SetHPALETTE((WXHPALETTE
) hPalette
);
572 void wxGLCanvas::SwapBuffers()
575 m_glContext
->SwapBuffers();
578 void wxGLCanvas::OnSize(wxSizeEvent
& WXUNUSED(event
))
582 void wxGLCanvas::SetCurrent()
584 // although on MSW it works even if the window is still hidden, it doesn't
585 // under wxGTK and documentation mentions that SetCurrent() can only be
586 // called for a shown window, so check it
587 wxASSERT_MSG( GetParent()->IsShown(),
588 _T("can't make hidden GL canvas current") );
592 m_glContext
->SetCurrent();
596 void wxGLCanvas::SetColour(const wxChar
*colour
)
599 m_glContext
->SetColour(colour
);
602 // TODO: Have to have this called by parent frame (?)
603 // So we need wxFrame to call OnQueryNewPalette for all children...
604 void wxGLCanvas::OnQueryNewPalette(wxQueryNewPaletteEvent
& event
)
606 /* realize palette if this is the current window */
607 if ( GetPalette()->Ok() ) {
608 ::UnrealizeObject((HPALETTE
) GetPalette()->GetHPALETTE());
609 ::SelectPalette((HDC
) GetHDC(), (HPALETTE
) GetPalette()->GetHPALETTE(), FALSE
);
610 ::RealizePalette((HDC
) GetHDC());
612 event
.SetPaletteRealized(true);
615 event
.SetPaletteRealized(false);
618 // I think this doesn't have to be propagated to child windows.
619 void wxGLCanvas::OnPaletteChanged(wxPaletteChangedEvent
& event
)
621 /* realize palette if this is *not* the current window */
623 GetPalette()->Ok() && (this != event
.GetChangedWindow()) )
625 ::UnrealizeObject((HPALETTE
) GetPalette()->GetHPALETTE());
626 ::SelectPalette((HDC
) GetHDC(), (HPALETTE
) GetPalette()->GetHPALETTE(), FALSE
);
627 ::RealizePalette((HDC
) GetHDC());
632 /* Give extensions proper function names. */
634 /* EXT_vertex_array */
635 void glArrayElementEXT(GLint
WXUNUSED(i
))
639 void glColorPointerEXT(GLint
WXUNUSED(size
), GLenum
WXUNUSED(type
), GLsizei
WXUNUSED(stride
), GLsizei
WXUNUSED(count
), const GLvoid
*WXUNUSED(pointer
))
643 void glDrawArraysEXT(GLenum
WXUNUSED_WITHOUT_GL_EXT_vertex_array(mode
),
644 GLint
WXUNUSED_WITHOUT_GL_EXT_vertex_array(first
),
645 GLsizei
WXUNUSED_WITHOUT_GL_EXT_vertex_array(count
))
647 #ifdef GL_EXT_vertex_array
648 static PFNGLDRAWARRAYSEXTPROC proc
= 0;
652 proc
= (PFNGLDRAWARRAYSEXTPROC
) wglGetProcAddress("glDrawArraysEXT");
656 (* proc
) (mode
, first
, count
);
660 void glEdgeFlagPointerEXT(GLsizei
WXUNUSED(stride
), GLsizei
WXUNUSED(count
), const GLboolean
*WXUNUSED(pointer
))
664 void glGetPointervEXT(GLenum
WXUNUSED(pname
), GLvoid
* *WXUNUSED(params
))
668 void glIndexPointerEXT(GLenum
WXUNUSED(type
), GLsizei
WXUNUSED(stride
), GLsizei
WXUNUSED(count
), const GLvoid
*WXUNUSED(pointer
))
672 void glNormalPointerEXT(GLenum
WXUNUSED_WITHOUT_GL_EXT_vertex_array(type
),
673 GLsizei
WXUNUSED_WITHOUT_GL_EXT_vertex_array(stride
),
674 GLsizei
WXUNUSED_WITHOUT_GL_EXT_vertex_array(count
),
675 const GLvoid
*WXUNUSED_WITHOUT_GL_EXT_vertex_array(pointer
))
677 #ifdef GL_EXT_vertex_array
678 static PFNGLNORMALPOINTEREXTPROC proc
= 0;
682 proc
= (PFNGLNORMALPOINTEREXTPROC
) wglGetProcAddress("glNormalPointerEXT");
686 (* proc
) (type
, stride
, count
, pointer
);
690 void glTexCoordPointerEXT(GLint
WXUNUSED(size
), GLenum
WXUNUSED(type
), GLsizei
WXUNUSED(stride
), GLsizei
WXUNUSED(count
), const GLvoid
*WXUNUSED(pointer
))
694 void glVertexPointerEXT(GLint
WXUNUSED_WITHOUT_GL_EXT_vertex_array(size
),
695 GLenum
WXUNUSED_WITHOUT_GL_EXT_vertex_array(type
),
696 GLsizei
WXUNUSED_WITHOUT_GL_EXT_vertex_array(stride
),
697 GLsizei
WXUNUSED_WITHOUT_GL_EXT_vertex_array(count
),
698 const GLvoid
*WXUNUSED_WITHOUT_GL_EXT_vertex_array(pointer
))
700 #ifdef GL_EXT_vertex_array
701 static PFNGLVERTEXPOINTEREXTPROC proc
= 0;
705 proc
= (PFNGLVERTEXPOINTEREXTPROC
) wglGetProcAddress("glVertexPointerEXT");
708 (* proc
) (size
, type
, stride
, count
, pointer
);
712 /* EXT_color_subtable */
713 void glColorSubtableEXT(GLenum
WXUNUSED(target
), GLsizei
WXUNUSED(start
), GLsizei
WXUNUSED(count
), GLenum
WXUNUSED(format
), GLenum
WXUNUSED(type
), const GLvoid
*WXUNUSED(table
))
717 /* EXT_color_table */
718 void glColorTableEXT(GLenum
WXUNUSED(target
), GLenum
WXUNUSED(internalformat
), GLsizei
WXUNUSED(width
), GLenum
WXUNUSED(format
), GLenum
WXUNUSED(type
), const GLvoid
*WXUNUSED(table
))
722 void glCopyColorTableEXT(GLenum
WXUNUSED(target
), GLenum
WXUNUSED(internalformat
), GLint
WXUNUSED(x
), GLint
WXUNUSED(y
), GLsizei
WXUNUSED(width
))
726 void glGetColorTableEXT(GLenum
WXUNUSED(target
), GLenum
WXUNUSED(format
), GLenum
WXUNUSED(type
), GLvoid
*WXUNUSED(table
))
730 void glGetColorTableParamaterfvEXT(GLenum
WXUNUSED(target
), GLenum
WXUNUSED(pname
), GLfloat
*WXUNUSED(params
))
734 void glGetColorTavleParameterivEXT(GLenum
WXUNUSED(target
), GLenum
WXUNUSED(pname
), GLint
*WXUNUSED(params
))
738 /* SGI_compiled_vertex_array */
739 void glLockArraysSGI(GLint
WXUNUSED(first
), GLsizei
WXUNUSED(count
))
743 void glUnlockArraysSGI()
748 /* SGI_cull_vertex */
749 void glCullParameterdvSGI(GLenum
WXUNUSED(pname
), GLdouble
* WXUNUSED(params
))
753 void glCullParameterfvSGI(GLenum
WXUNUSED(pname
), GLfloat
* WXUNUSED(params
))
758 void glIndexFuncSGI(GLenum
WXUNUSED(func
), GLclampf
WXUNUSED(ref
))
762 /* SGI_index_material */
763 void glIndexMaterialSGI(GLenum
WXUNUSED(face
), GLenum
WXUNUSED(mode
))
768 void glAddSwapHintRectWin(GLint
WXUNUSED(x
), GLint
WXUNUSED(y
), GLsizei
WXUNUSED(width
), GLsizei
WXUNUSED(height
))
773 //---------------------------------------------------------------------------
775 //---------------------------------------------------------------------------
777 IMPLEMENT_CLASS(wxGLApp
, wxApp
)
779 bool wxGLApp::InitGLVisual(int *attribList
)
782 PIXELFORMATDESCRIPTOR pfd
= {
783 sizeof(PIXELFORMATDESCRIPTOR
), /* size */
787 PFD_DOUBLEBUFFER
, /* support double-buffering */
788 PFD_TYPE_RGBA
, /* color type */
789 16, /* preferred color depth */
790 0, 0, 0, 0, 0, 0, /* color bits (ignored) */
791 0, /* no alpha buffer */
792 0, /* alpha bits (ignored) */
793 0, /* no accumulation buffer */
794 0, 0, 0, 0, /* accum bits (ignored) */
795 16, /* depth buffer */
796 0, /* no stencil buffer */
797 0, /* no auxiliary buffers */
798 PFD_MAIN_PLANE
, /* main layer */
800 0, 0, 0, /* no layer, visible, damage masks */
803 AdjustPFDForAttributes(pfd
, attribList
);
805 // use DC for whole (root) screen, since no windows have yet been created
806 pixelFormat
= ChoosePixelFormat(ScreenHDC(), &pfd
);
808 if (pixelFormat
== 0) {
809 wxLogError(_("Failed to initialize OpenGL"));