X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a756f210019dd5b51331b7181c816d3882146a30..118322a3dfcc1803bd13df8193ea1be9ae39e653:/src/msw/glcanvas.cpp diff --git a/src/msw/glcanvas.cpp b/src/msw/glcanvas.cpp index 3b03757338..eacc888687 100644 --- a/src/msw/glcanvas.cpp +++ b/src/msw/glcanvas.cpp @@ -1,15 +1,15 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: glcanvas.cpp -// Purpose: wxGLCanvas, for using OpenGL with wxWindows under MS Windows +// Name: src/msw/glcanvas.cpp +// Purpose: wxGLCanvas, for using OpenGL with wxWidgets under MS Windows // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "glcanvas.h" #endif @@ -19,19 +19,46 @@ #pragma hdrstop #endif -#include - #if wxUSE_GLCANVAS #ifndef WX_PRECOMP -#include + #include "wx/frame.h" + #include "wx/settings.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" #endif -#include -#include -#include +#include "wx/msw/private.h" + +// DLL options compatibility check: +#include "wx/build.h" +WX_CHECK_BUILD_OPTIONS("wxGL") + +#include "wx/glcanvas.h" + +/* + The following two compiler directives are specific to the Microsoft Visual + C++ family of compilers + + Fundementally what they do is instruct the linker to use these two libraries + for the resolution of symbols. In essence, this is the equivalent of adding + these two libraries to either the Makefile or project file. + + This is NOT a recommended technique, and certainly is unlikely to be used + anywhere else in wxWidgets given it is so specific to not only wxMSW, but + also the VC compiler. However, in the case of opengl support, it's an + applicable technique as opengl is optional in setup.h This code (wrapped by + wxUSE_GLCANVAS), now allows opengl support to be added purely by modifying + setup.h rather than by having to modify either the project or DSP fle. + + See MSDN for further information on the exact usage of these commands. +*/ +#ifdef _MSC_VER +# pragma comment( lib, "opengl32" ) +# pragma comment( lib, "glu32" ) +#endif -#include static const wxChar *wxGLCanvasClassName = wxT("wxGLCanvasClass"); static const wxChar *wxGLCanvasClassNameNoRedraw = wxT("wxGLCanvasClassNR"); @@ -43,21 +70,21 @@ LRESULT WXDLLEXPORT APIENTRY _EXPORT wxWndProc(HWND hWnd, UINT message, * GLContext implementation */ -wxGLContext::wxGLContext(bool isRGB, wxGLCanvas *win, const wxPalette& palette) +wxGLContext::wxGLContext(bool WXUNUSED(isRGB), wxGLCanvas *win, const wxPalette& WXUNUSED(palette)) { m_window = win; m_hDC = win->GetHDC(); m_glContext = wglCreateContext((HDC) m_hDC); - wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") ); + wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGL context") ); wglMakeCurrent((HDC) m_hDC, m_glContext); } wxGLContext::wxGLContext( - bool isRGB, wxGLCanvas *win, - const wxPalette& palette, + bool WXUNUSED(isRGB), wxGLCanvas *win, + const wxPalette& WXUNUSED(palette), const wxGLContext *other /* for sharing display lists */ ) { @@ -66,7 +93,7 @@ wxGLContext::wxGLContext( m_hDC = win->GetHDC(); m_glContext = wglCreateContext((HDC) m_hDC); - wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") ); + wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGL context") ); if( other != 0 ) wglShareLists( other->m_glContext, m_glContext ); @@ -105,19 +132,16 @@ void wxGLContext::SetCurrent() */ } -void wxGLContext::SetColour(const char *colour) +void wxGLContext::SetColour(const wxChar *colour) { - float r = 0.0; - float g = 0.0; - float b = 0.0; - wxColour *col = wxTheColourDatabase->FindColour(colour); - if (col) - { - r = (float)(col->Red()/256.0); - g = (float)(col->Green()/256.0); - b = (float)(col->Blue()/256.0); - glColor3f( r, g, b); - } + wxColour col = wxTheColourDatabase->Find(colour); + if (col.Ok()) + { + float r = (float)(col.Red()/256.0); + float g = (float)(col.Green()/256.0); + float b = (float)(col.Blue()/256.0); + glColor3f( r, g, b); + } } @@ -144,7 +168,6 @@ wxGLCanvas::wxGLCanvas(wxWindow *parent, wxWindowID id, if ( ret ) { SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); - SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); } m_hDC = (WXHDC) ::GetDC((HWND) GetHWND()); @@ -152,7 +175,7 @@ wxGLCanvas::wxGLCanvas(wxWindow *parent, wxWindowID id, SetupPixelFormat(attribList); SetupPalette(palette); - m_glContext = new wxGLContext(TRUE, this, palette); + m_glContext = new wxGLContext(true, this, palette); } wxGLCanvas::wxGLCanvas( wxWindow *parent, @@ -168,7 +191,6 @@ wxGLCanvas::wxGLCanvas( wxWindow *parent, if ( ret ) { SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); - SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); } m_hDC = (WXHDC) ::GetDC((HWND) GetHWND()); @@ -176,7 +198,7 @@ wxGLCanvas::wxGLCanvas( wxWindow *parent, SetupPixelFormat(attribList); SetupPalette(palette); - m_glContext = new wxGLContext(TRUE, this, palette, shared ); + m_glContext = new wxGLContext(true, this, palette, shared ); } // Not very useful for wxMSW, but this is to be wxGTK compliant @@ -193,7 +215,6 @@ wxGLCanvas::wxGLCanvas( wxWindow *parent, const wxGLCanvas *shared, wxWindowID i if ( ret ) { SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); - SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); } m_hDC = (WXHDC) ::GetDC((HWND) GetHWND()); @@ -203,7 +224,7 @@ wxGLCanvas::wxGLCanvas( wxWindow *parent, const wxGLCanvas *shared, wxWindowID i wxGLContext *sharedContext=0; if (shared) sharedContext=shared->GetContext(); - m_glContext = new wxGLContext(TRUE, this, palette, sharedContext ); + m_glContext = new wxGLContext(true, this, palette, sharedContext ); } wxGLCanvas::~wxGLCanvas() @@ -223,7 +244,7 @@ bool wxGLCanvas::Create(wxWindow *parent, long style, const wxString& name) { - static bool s_registeredGLCanvasClass = FALSE; + static bool s_registeredGLCanvasClass = false; // We have to register a special window class because we need // the CS_OWNDC style for GLCanvas. @@ -266,7 +287,7 @@ bool wxGLCanvas::Create(wxWindow *parent, if ( !::RegisterClass(&wndclass) ) { wxLogLastError(wxT("RegisterClass(wxGLCanvasClass)")); - return FALSE; + return false; } // Register the GLCanvas class name for windows which don't do full repaint @@ -280,24 +301,20 @@ bool wxGLCanvas::Create(wxWindow *parent, ::UnregisterClass(wxGLCanvasClassName, wxhInstance); - return FALSE; + return false; } - s_registeredGLCanvasClass = TRUE; + s_registeredGLCanvasClass = true; } - wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindow without parent") ); + wxCHECK_MSG( parent, false, wxT("can't create wxWindow without parent") ); if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) - return FALSE; + return false; parent->AddChild(this); DWORD msflags = 0; - if ( style & wxBORDER ) - msflags |= WS_BORDER; - if ( style & wxTHICK_FRAME ) - msflags |= WS_THICKFRAME; /* A general rule with OpenGL and Win32 is that any window that will have a @@ -306,26 +323,9 @@ bool wxGLCanvas::Create(wxWindow *parent, books that contain the wgl function descriptions. */ + WXDWORD exStyle = 0; msflags |= WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; - - bool want3D; - WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D); - - // Even with extended styles, need to combine with WS_BORDER - // for them to look right. - if ( want3D || (m_windowStyle & wxSIMPLE_BORDER) || (m_windowStyle & wxRAISED_BORDER ) || - (m_windowStyle & wxSUNKEN_BORDER) || (m_windowStyle & wxDOUBLE_BORDER)) - { - msflags |= WS_BORDER; - } - - // calculate the value to return from WM_GETDLGCODE handler - if ( GetWindowStyleFlag() & wxWANTS_CHARS ) - { - // want everything: i.e. all keys and WM_CHAR message - m_lDlgCode = DLGC_WANTARROWS | DLGC_WANTCHARS | - DLGC_WANTTAB | DLGC_WANTMESSAGE; - } + msflags |= MSWGetStyle(style, & exStyle) ; return MSWCreate(wxGLCanvasClassName, NULL, pos, size, msflags, exStyle); } @@ -408,7 +408,6 @@ static void AdjustPFDForAttributes(PIXELFORMATDESCRIPTOR& pfd, int *attribList) void wxGLCanvas::SetupPixelFormat(int *attribList) // (HDC hDC) { - int pixelFormat; PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), /* size */ 1, /* version */ @@ -432,13 +431,13 @@ void wxGLCanvas::SetupPixelFormat(int *attribList) // (HDC hDC) AdjustPFDForAttributes(pfd, attribList); - pixelFormat = ChoosePixelFormat((HDC) m_hDC, &pfd); + int pixelFormat = ChoosePixelFormat((HDC) m_hDC, &pfd); if (pixelFormat == 0) { - wxLogWarning(_("ChoosePixelFormat failed.")); + wxLogLastError(_T("ChoosePixelFormat")); } else { - if (SetPixelFormat((HDC) m_hDC, pixelFormat, &pfd) != TRUE) { - wxLogWarning(_("SetPixelFormat failed.")); + if ( !::SetPixelFormat((HDC) m_hDC, pixelFormat, &pfd) ) { + wxLogLastError(_T("SetPixelFormat")); } } } @@ -467,8 +466,8 @@ void wxGLCanvas::SetupPalette(const wxPalette& palette) if (m_palette.Ok()) { - SelectPalette((HDC) m_hDC, (HPALETTE) m_palette.GetHPALETTE(), FALSE); - RealizePalette((HDC) m_hDC); + ::SelectPalette((HDC) m_hDC, (HPALETTE) m_palette.GetHPALETTE(), FALSE); + ::RealizePalette((HDC) m_hDC); } } @@ -520,7 +519,7 @@ void wxGLCanvas::SwapBuffers() m_glContext->SwapBuffers(); } -void wxGLCanvas::OnSize(wxSizeEvent& event) +void wxGLCanvas::OnSize(wxSizeEvent& WXUNUSED(event)) { } @@ -532,7 +531,7 @@ void wxGLCanvas::SetCurrent() } } -void wxGLCanvas::SetColour(const char *colour) +void wxGLCanvas::SetColour(const wxChar *colour) { if (m_glContext) m_glContext->SetColour(colour); @@ -548,10 +547,10 @@ void wxGLCanvas::OnQueryNewPalette(wxQueryNewPaletteEvent& event) ::SelectPalette((HDC) GetHDC(), (HPALETTE) GetPalette()->GetHPALETTE(), FALSE); ::RealizePalette((HDC) GetHDC()); Refresh(); - event.SetPaletteRealized(TRUE); + event.SetPaletteRealized(true); } else - event.SetPaletteRealized(FALSE); + event.SetPaletteRealized(false); } // I think this doesn't have to be propagated to child windows. @@ -571,11 +570,11 @@ void wxGLCanvas::OnPaletteChanged(wxPaletteChangedEvent& event) /* Give extensions proper function names. */ /* EXT_vertex_array */ -void glArrayElementEXT(GLint i) +void glArrayElementEXT(GLint WXUNUSED(i)) { } -void glColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) +void glColorPointerEXT(GLint WXUNUSED(size), GLenum WXUNUSED(type), GLsizei WXUNUSED(stride), GLsizei WXUNUSED(count), const GLvoid *WXUNUSED(pointer)) { } @@ -594,15 +593,15 @@ void glDrawArraysEXT(GLenum mode, GLint first, GLsizei count) #endif } -void glEdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *pointer) +void glEdgeFlagPointerEXT(GLsizei WXUNUSED(stride), GLsizei WXUNUSED(count), const GLboolean *WXUNUSED(pointer)) { } -void glGetPointervEXT(GLenum pname, GLvoid* *params) +void glGetPointervEXT(GLenum WXUNUSED(pname), GLvoid* *WXUNUSED(params)) { } -void glIndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) +void glIndexPointerEXT(GLenum WXUNUSED(type), GLsizei WXUNUSED(stride), GLsizei WXUNUSED(count), const GLvoid *WXUNUSED(pointer)) { } @@ -621,7 +620,7 @@ void glNormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid #endif } -void glTexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) +void glTexCoordPointerEXT(GLint WXUNUSED(size), GLenum WXUNUSED(type), GLsizei WXUNUSED(stride), GLsizei WXUNUSED(count), const GLvoid *WXUNUSED(pointer)) { } @@ -640,33 +639,33 @@ void glVertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, } /* EXT_color_subtable */ -void glColorSubtableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *table) +void glColorSubtableEXT(GLenum WXUNUSED(target), GLsizei WXUNUSED(start), GLsizei WXUNUSED(count), GLenum WXUNUSED(format), GLenum WXUNUSED(type), const GLvoid *WXUNUSED(table)) { } /* EXT_color_table */ -void glColorTableEXT(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table) +void glColorTableEXT(GLenum WXUNUSED(target), GLenum WXUNUSED(internalformat), GLsizei WXUNUSED(width), GLenum WXUNUSED(format), GLenum WXUNUSED(type), const GLvoid *WXUNUSED(table)) { } -void glCopyColorTableEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) +void glCopyColorTableEXT(GLenum WXUNUSED(target), GLenum WXUNUSED(internalformat), GLint WXUNUSED(x), GLint WXUNUSED(y), GLsizei WXUNUSED(width)) { } -void glGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid *table) +void glGetColorTableEXT(GLenum WXUNUSED(target), GLenum WXUNUSED(format), GLenum WXUNUSED(type), GLvoid *WXUNUSED(table)) { } -void glGetColorTableParamaterfvEXT(GLenum target, GLenum pname, GLfloat *params) +void glGetColorTableParamaterfvEXT(GLenum WXUNUSED(target), GLenum WXUNUSED(pname), GLfloat *WXUNUSED(params)) { } -void glGetColorTavleParameterivEXT(GLenum target, GLenum pname, GLint *params) +void glGetColorTavleParameterivEXT(GLenum WXUNUSED(target), GLenum WXUNUSED(pname), GLint *WXUNUSED(params)) { } /* SGI_compiled_vertex_array */ -void glLockArraysSGI(GLint first, GLsizei count) +void glLockArraysSGI(GLint WXUNUSED(first), GLsizei WXUNUSED(count)) { } @@ -676,26 +675,26 @@ void glUnlockArraysSGI() /* SGI_cull_vertex */ -void glCullParameterdvSGI(GLenum pname, GLdouble* params) +void glCullParameterdvSGI(GLenum WXUNUSED(pname), GLdouble* WXUNUSED(params)) { } -void glCullParameterfvSGI(GLenum pname, GLfloat* params) +void glCullParameterfvSGI(GLenum WXUNUSED(pname), GLfloat* WXUNUSED(params)) { } /* SGI_index_func */ -void glIndexFuncSGI(GLenum func, GLclampf ref) +void glIndexFuncSGI(GLenum WXUNUSED(func), GLclampf WXUNUSED(ref)) { } /* SGI_index_material */ -void glIndexMaterialSGI(GLenum face, GLenum mode) +void glIndexMaterialSGI(GLenum WXUNUSED(face), GLenum WXUNUSED(mode)) { } /* WIN_swap_hint */ -void glAddSwapHintRectWin(GLint x, GLint y, GLsizei width, GLsizei height) +void glAddSwapHintRectWin(GLint WXUNUSED(x), GLint WXUNUSED(y), GLsizei WXUNUSED(width), GLsizei WXUNUSED(height)) { } @@ -733,14 +732,14 @@ bool wxGLApp::InitGLVisual(int *attribList) AdjustPFDForAttributes(pfd, attribList); // use DC for whole (root) screen, since no windows have yet been created - pixelFormat = ChoosePixelFormat((HDC) ::GetDC(NULL), &pfd); + pixelFormat = ChoosePixelFormat(ScreenHDC(), &pfd); if (pixelFormat == 0) { wxLogError(_("Failed to initialize OpenGL")); - return FALSE; + return false; } - return TRUE; + return true; } wxGLApp::~wxGLApp()