Fix 3D view crash with some graphics cards.

This commit is contained in:
Phinitnan Chanasabaeng 2011-01-29 11:19:54 +01:00 committed by jean-pierre charras
parent 7ccdb5589d
commit 4a34bf0d9d
4 changed files with 16 additions and 10 deletions

View File

@ -73,9 +73,9 @@ EVT_MENU_RANGE( ID_POPUP_3D_VIEW_START, ID_POPUP_3D_VIEW_END,
Pcb3D_GLCanvas::OnPopUpMenu ) Pcb3D_GLCanvas::OnPopUpMenu )
END_EVENT_TABLE() END_EVENT_TABLE()
Pcb3D_GLCanvas::Pcb3D_GLCanvas( WinEDA3D_DrawFrame* parent ) : Pcb3D_GLCanvas::Pcb3D_GLCanvas( WinEDA3D_DrawFrame* parent, int* attribList ) :
#if wxCHECK_VERSION( 2, 9, 0 ) #if wxCHECK_VERSION( 2, 7, 0 )
wxGLCanvas( parent, -1, NULL, wxDefaultPosition, wxDefaultSize, wxGLCanvas( parent, -1, attribList, wxDefaultPosition, wxDefaultSize,
wxFULL_REPAINT_ON_RESIZE ) wxFULL_REPAINT_ON_RESIZE )
#else #else
wxGLCanvas( parent, -1, wxDefaultPosition, wxDefaultSize, wxGLCanvas( parent, -1, wxDefaultPosition, wxDefaultSize,
@ -87,7 +87,7 @@ Pcb3D_GLCanvas::Pcb3D_GLCanvas( WinEDA3D_DrawFrame* parent ) :
m_Parent = parent; m_Parent = parent;
m_ortho = false; m_ortho = false;
#if wxCHECK_VERSION( 2, 9, 0 ) #if wxCHECK_VERSION( 2, 7, 0 )
// Explicitly create a new rendering context instance for this canvas. // Explicitly create a new rendering context instance for this canvas.
m_glRC = new wxGLContext( this ); m_glRC = new wxGLContext( this );
@ -101,7 +101,7 @@ Pcb3D_GLCanvas::~Pcb3D_GLCanvas()
{ {
ClearLists(); ClearLists();
m_init = FALSE; m_init = FALSE;
#if wxCHECK_VERSION( 2, 9, 0 ) #if wxCHECK_VERSION( 2, 7, 0 )
delete m_glRC; delete m_glRC;
#endif #endif
} }

View File

@ -55,7 +55,11 @@ static void CALLBACK tesswxPoint2Vertex( const GLvoid* data );
void Pcb3D_GLCanvas::Redraw( bool finish ) void Pcb3D_GLCanvas::Redraw( bool finish )
{ {
#if wxCHECK_VERSION( 2, 9, 0 ) /* SwapBuffer requires the window to be shown before calling */
if( !IsShown() )
return;
#if wxCHECK_VERSION( 2, 7, 0 )
SetCurrent( *m_glRC ); SetCurrent( *m_glRC );
#else #else
SetCurrent(); SetCurrent();
@ -96,8 +100,9 @@ void Pcb3D_GLCanvas::Redraw( bool finish )
} }
glFlush(); glFlush();
if( finish ) if( finish );
glFinish(); glFinish();
SwapBuffers(); SwapBuffers();
} }

View File

@ -78,7 +78,8 @@ WinEDA3D_DrawFrame::WinEDA3D_DrawFrame( WinEDA_BasePcbFrame* parent,
ReCreateVToolbar(); ReCreateVToolbar();
// Make a Pcb3D_GLCanvas // Make a Pcb3D_GLCanvas
m_Canvas = new Pcb3D_GLCanvas( this ); int attrs[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0};
m_Canvas = new Pcb3D_GLCanvas( this, attrs );
m_auimgr.SetManagedWindow( this ); m_auimgr.SetManagedWindow( this );

View File

@ -141,11 +141,11 @@ private:
/// Tracks whether to use Orthographic or Perspective projection /// Tracks whether to use Orthographic or Perspective projection
//TODO: Does this belong here, or in WinEDA3D_DrawFrame ??? //TODO: Does this belong here, or in WinEDA3D_DrawFrame ???
bool m_ortho; bool m_ortho;
#if wxCHECK_VERSION( 2, 9, 0 ) #if wxCHECK_VERSION( 2, 7, 0 )
wxGLContext* m_glRC; wxGLContext* m_glRC;
#endif #endif
public: public:
Pcb3D_GLCanvas( WinEDA3D_DrawFrame* parent ); Pcb3D_GLCanvas( WinEDA3D_DrawFrame* parent, int* attribList = 0 );
~Pcb3D_GLCanvas(); ~Pcb3D_GLCanvas();
void ClearLists(); void ClearLists();