]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Extensions/Visualization/OpenGLMeshMapper.hxx
OpenGL and MS-Windows nearly finished
[cpPlugins.git] / lib / cpPlugins / Extensions / Visualization / OpenGLMeshMapper.hxx
index 524f4e8af40cddff8d9430dff0546e65e330f9a7..f1f04682994a47281340c10c22a287afd3af0009 100644 (file)
 #define GL_GLEXT_PROTOTYPES
 #include <GL/glext.h>
 
+#ifdef _WIN32
+
+PFNGLGENBUFFERSARBPROC           pglGenBuffers = 0;
+PFNGLBINDBUFFERARBPROC           pglBindBuffer = 0;
+PFNGLBUFFERDATAARBPROC           pglBufferData = 0;
+PFNGLBUFFERSUBDATAARBPROC        pglBufferSubData = 0;
+PFNGLDELETEBUFFERSARBPROC        pglDeleteBuffers = 0;
+PFNGLGETBUFFERPARAMETERIVARBPROC pglGetBufferParameteriv = 0;
+PFNGLMAPBUFFERARBPROC            pglMapBuffer = 0;
+PFNGLUNMAPBUFFERARBPROC          pglUnmapBuffer = 0;
+
+#define glGenBuffers           pglGenBuffers
+#define glBindBuffer           pglBindBuffer
+#define glBufferData           pglBufferData
+#define glBufferSubData        pglBufferSubData
+#define glDeleteBuffers        pglDeleteBuffers
+#define glGetBufferParameteriv pglGetBufferParameteriv
+#define glMapBuffer            pglMapBuffer
+#define glUnmapBuffer          pglUnmapBuffer
+
+#endif // _WIN32
+
+#ifdef _WIN32
+
+typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
+typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
+PFNWGLSWAPINTERVALEXTPROC pwglSwapIntervalEXT = 0;
+PFNWGLGETSWAPINTERVALEXTPROC pwglGetSwapIntervalEXT = 0;
+#define wglSwapIntervalEXT      pwglSwapIntervalEXT
+#define wglGetSwapIntervalEXT   pwglGetSwapIntervalEXT
+
+#endif // _WIN32
+
 // some definitions for what the polydata has in it
 #define CPPLUGINS_VTK_PDM_NORMALS            0x0001
 #define CPPLUGINS_VTK_PDM_COLORS             0x0002
@@ -130,7 +163,7 @@ RenderPiece( vtkRenderer* aren, vtkActor* act )
   renderNeeded     &= !this->GetGlobalImmediateModeRendering( );
 
   // Something has changed in the pipeline?
-  if( 
+  if(
     this->GetMTime( ) > this->BuildTime ||
     in->GetMTime( ) > this->BuildTime ||
     act->GetProperty( )->GetMTime( ) > this->BuildTime ||
@@ -279,8 +312,8 @@ Draw( vtkRenderer* aren, vtkActor* act )
   if( this->Colors )
   {
     c = this->Colors;
-    if( 
-      ( 
+    if(
+      (
         this->ScalarMode == VTK_SCALAR_MODE_USE_CELL_DATA ||
         this->ScalarMode == VTK_SCALAR_MODE_USE_CELL_FIELD_DATA ||
         this->ScalarMode == VTK_SCALAR_MODE_USE_FIELD_DATA ||
@@ -438,7 +471,7 @@ Draw( vtkRenderer* aren, vtkActor* act )
       if( nPoints == 2 && zResolve )
         glDepthRange( zRes, 1. );
 
-      glDrawElements( 
+      glDrawElements(
         mode, nPoints, this->IndexElementType, ( GLuint* )( 0 ) + accum
         );
       accum += nPoints;
@@ -530,10 +563,59 @@ _ConfigureOpenGL( )
   if( input == NULL )
     return( false );
 
+#ifdef _WIN32 
+  // get pointers to GL functions
+  glGenBuffers =
+    ( PFNGLGENBUFFERSARBPROC )wglGetProcAddress( "glGenBuffers" );
+  glBindBuffer =
+    ( PFNGLBINDBUFFERARBPROC )wglGetProcAddress( "glBindBuffer" );
+  glBufferData =
+    ( PFNGLBUFFERDATAARBPROC )wglGetProcAddress( "glBufferData" );
+  glBufferSubData =
+    ( PFNGLBUFFERSUBDATAARBPROC )wglGetProcAddress( "glBufferSubData" );
+  glDeleteBuffers =
+    ( PFNGLDELETEBUFFERSARBPROC )wglGetProcAddress( "glDeleteBuffers" );
+  glGetBufferParameteriv =
+    ( PFNGLGETBUFFERPARAMETERIVARBPROC )wglGetProcAddress(
+      "glGetBufferParameteriv"
+      );
+  glMapBuffer =
+    ( PFNGLMAPBUFFERARBPROC )wglGetProcAddress( "glMapBuffer" );
+  glUnmapBuffer =
+    ( PFNGLUNMAPBUFFERARBPROC )wglGetProcAddress( "glUnmapBuffer" );
+
+  // check once again VBO extension
+  if(
+    glGenBuffers != NULL &&
+    glBindBuffer != NULL &&
+    glBufferData != NULL &&
+    glBufferSubData != NULL &&
+    glMapBuffer != NULL &&
+    glUnmapBuffer != NULL &&
+    glDeleteBuffers != NULL &&
+    glGetBufferParameteriv != NULL
+    )
+    this->VBOSupported = true;
+  else
+    this->VBOSupported = false;
+
+  // check EXT_swap_control is supported
+  /* TODO: really needed?
+     wglSwapIntervalEXT =
+     ( PFNWGLSWAPINTERVALEXTPROC )wglGetProcAddress( "wglSwapIntervalEXT" );
+     wglGetSwapIntervalEXT =
+     ( PFNWGLGETSWAPINTERVALEXTPROC )wglGetProcAddress(
+     "wglGetSwapIntervalEXT"
+     );
+     if( wglSwapIntervalEXT != NULL && wglGetSwapIntervalEXT != NULL )
+     wglSwapIntervalEXT( 0 );
+  */
+#else // _WIN32
   // Check if VBO ( Vertex Buffer Object ) is supported
   std::string str = ( const char* )( glGetString( GL_EXTENSIONS ) );
   this->VBOSupported =
     ( str.find( "GL_ARB_vertex_buffer_object" ) != std::string::npos );
+#endif // _WIN32 
 
   if( this->VBOSupported )
   {