1 // Copyright (C) 2007-2019 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 #include "VTKViewer_OpenGLHelper.h"
27 # ifndef GLX_GLXEXT_LEGACY
28 # define GLX_GLXEXT_LEGACY
37 #define GL_GetProcAddress( x ) glXGetProcAddressARB( (const GLubyte*)x )
39 #define GL_GetProcAddress( x ) wglGetProcAddress( (const LPCSTR)x )
42 // ============================================================================
43 // function : VTKViewer_OpenGLHelper
45 // ============================================================================
46 VTKViewer_OpenGLHelper::VTKViewer_OpenGLHelper()
47 : vglShaderSourceARB (NULL),
48 vglCreateShaderObjectARB (NULL),
49 vglCompileShaderARB (NULL),
50 vglCreateProgramObjectARB (NULL),
51 vglAttachObjectARB (NULL),
52 vglLinkProgramARB (NULL),
53 vglUseProgramObjectARB (NULL),
54 vglGenBuffersARB (NULL),
55 vglBindBufferARB (NULL),
56 vglBufferDataARB (NULL),
57 vglDeleteBuffersARB (NULL),
58 vglGetAttribLocationARB (NULL),
59 vglVertexAttribPointerARB (NULL),
60 vglEnableVertexAttribArrayARB (NULL),
61 vglDisableVertexAttribArrayARB (NULL),
63 vglDetachObjectARB (NULL),
64 vglDeleteObjectARB (NULL),
65 vglValidateProgramARB (NULL),
66 vglGetShaderivARB (NULL),
67 vglGetProgramivARB (NULL),
68 vglGetShaderInfoLogARB (NULL),
69 vglUniformMatrix4fvARB (NULL),
70 vglGenVertexArraysARB (NULL),
71 vglBindVertexArrayARB (NULL),
72 vglUniform1iARB (NULL),
73 vglGetUniformLocationARB (NULL),
74 vglActiveTextureARB (NULL),
75 vglGetStringiARB (NULL),
77 mIsInitialized (false)
82 // ============================================================================
83 // function : ~VTKViewer_OpenGLHelper
85 // ============================================================================
86 VTKViewer_OpenGLHelper::~VTKViewer_OpenGLHelper()
91 // ============================================================================
94 // ============================================================================
95 void VTKViewer_OpenGLHelper::Init()
100 vglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)GL_GetProcAddress( "glShaderSourceARB" );
101 if( !vglShaderSourceARB )
104 vglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)GL_GetProcAddress( "glCreateShaderObjectARB" );
105 if( !vglCreateShaderObjectARB )
108 vglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)GL_GetProcAddress( "glCompileShaderARB" );
109 if( !vglCompileShaderARB )
112 vglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glCreateProgramObjectARB" );
113 if( !vglCreateProgramObjectARB )
116 vglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)GL_GetProcAddress( "glAttachObjectARB" );
117 if( !vglAttachObjectARB )
120 vglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)GL_GetProcAddress( "glLinkProgramARB" );
121 if( !vglLinkProgramARB )
124 vglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glUseProgramObjectARB" );
125 if( !vglUseProgramObjectARB )
128 vglGenBuffersARB = (PFNGLGENBUFFERSARBPROC)GL_GetProcAddress( "glGenBuffersARB" );
129 if( !vglGenBuffersARB )
132 vglBindBufferARB = (PFNGLBINDBUFFERARBPROC)GL_GetProcAddress( "glBindBufferARB" );
133 if( !vglBindBufferARB )
136 vglBufferDataARB = (PFNGLBUFFERDATAARBPROC)GL_GetProcAddress( "glBufferDataARB" );
137 if( !vglBufferDataARB )
140 vglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)GL_GetProcAddress( "glDeleteBuffersARB" );
141 if( !vglDeleteBuffersARB )
144 vglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)GL_GetProcAddress( "glGetAttribLocation" );
145 if( !vglGetAttribLocationARB )
148 vglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)GL_GetProcAddress( "glVertexAttribPointer" );
149 if( !vglVertexAttribPointerARB )
152 vglEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)GL_GetProcAddress( "glEnableVertexAttribArray" );
153 if(!vglEnableVertexAttribArrayARB)
156 vglDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)GL_GetProcAddress( "glDisableVertexAttribArray" );
157 if(!vglDisableVertexAttribArrayARB)
161 vglDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)GL_GetProcAddress( "glDetachObjectARB" );
162 if( !vglDetachObjectARB )
165 vglDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)GL_GetProcAddress( "glDeleteObjectARB" );
166 if( !vglDeleteObjectARB )
169 vglValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)GL_GetProcAddress( "glValidateProgramARB" );
170 if ( !vglValidateProgramARB )
173 vglGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)GL_GetProcAddress( "glGetUniformLocationARB" );
174 if( !vglGetUniformLocationARB )
177 vglGetShaderivARB = (PFNGLGETSHADERIVARBPROC)GL_GetProcAddress( "glGetShaderiv" );
178 if( !vglGetShaderivARB )
181 vglActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)GL_GetProcAddress( "glActiveTexture" );
182 if (!vglActiveTextureARB)
185 vglGetStringiARB = (PFNGLGETSTRINGIPROC)GL_GetProcAddress("glGetStringi");
186 if (!vglGetStringiARB)
189 vglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)GL_GetProcAddress( "glGetProgramiv" );
190 if( !vglGetProgramivARB )
193 vglGetShaderInfoLogARB = (PFNGLGETSHADERINFOLOGARBPROC)GL_GetProcAddress( "glGetShaderInfoLog" );
194 if( !vglGetShaderInfoLogARB )
197 vglUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)GL_GetProcAddress( "glUniformMatrix4fv" );
198 if( !vglUniformMatrix4fvARB )
201 vglGenVertexArraysARB = (PFNGLGENVERTEXARRAYSARBPROC)GL_GetProcAddress( "glGenVertexArrays" );
202 if( !vglGenVertexArraysARB )
205 vglBindVertexArrayARB = (PFNGLBINDVERTEXARRAYARBPROC)GL_GetProcAddress( "glBindVertexArray" );
206 if( !vglBindVertexArrayARB )
209 vglUniform1iARB = (PFNGLUNIFORM1IARBPROC)GL_GetProcAddress( "glUniform1i" );
210 if( !vglUniform1iARB )
214 mIsInitialized = true;
220 char* readFromFile( std::string fileName )
222 FILE* file = fopen( fileName.c_str(), "r" );
224 char* content = NULL;
229 fseek( file, 0, SEEK_END );
230 count = ftell( file );
235 content = ( char* )malloc( sizeof( char ) * ( count + 1 ) );
236 count = fread( content, sizeof( char ), count, file );
237 content[ count ] = '\0';
245 // ============================================================================
246 // function : CreateShaderProgram
248 // ============================================================================
249 bool VTKViewer_OpenGLHelper::CreateShaderProgram (const std::string& theFilePath,
250 GLhandleARB& theProgram,
251 GLhandleARB& theVertexShader,
252 GLhandleARB& theFragmentShader) const
256 theProgram = vglCreateProgramObjectARB();
259 std::cerr << "Can't create opengl program." << std::endl;
263 std::string fileName;
265 GLint linked, compileStatus, validateStatus;
267 // Create vertex shader.
268 fileName = theFilePath + ".vs.glsl";
270 shaderContent = GUI_OPENGL::readFromFile (fileName);
272 theVertexShader = vglCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
273 vglShaderSourceARB (theVertexShader, 1, (const GLcharARB**)&shaderContent, NULL);
274 vglCompileShaderARB (theVertexShader);
276 free( shaderContent );
278 vglGetShaderivARB (theVertexShader, GL_COMPILE_STATUS, &compileStatus);
279 if (compileStatus != GL_TRUE)
282 GLcharARB info[1024];
284 vglGetShaderInfoLogARB (theVertexShader, 1024, &size, info);
285 std::cerr << "Can't compile vertex shader." << std::endl;
286 std::cerr << info << std::endl;
291 // Create fragment shader.
292 fileName = theFilePath + ".fs.glsl";
294 shaderContent = GUI_OPENGL::readFromFile (fileName);
296 theFragmentShader = vglCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
297 vglShaderSourceARB (theFragmentShader, 1, (const GLcharARB**)&shaderContent, NULL);
298 vglCompileShaderARB (theFragmentShader);
300 free (shaderContent);
302 vglGetShaderivARB (theFragmentShader, GL_COMPILE_STATUS, &compileStatus);
303 if (compileStatus != GL_TRUE)
306 GLcharARB info[1024];
308 vglGetShaderInfoLogARB (theVertexShader, 1024, &size, info);
309 std::cerr << "Can't compile fragment shader." << std::endl;
310 std::cerr << info << std::endl;
315 vglAttachObjectARB (theProgram, theVertexShader);
316 vglAttachObjectARB (theProgram, theFragmentShader);
317 vglLinkProgramARB (theProgram);
319 vglGetProgramivARB (theProgram, GL_LINK_STATUS, &linked);
322 std::cerr << "Can't link program." << std::endl;
326 vglValidateProgramARB (theProgram);
327 vglGetProgramivARB (theProgram, GL_VALIDATE_STATUS, &validateStatus);
329 if (validateStatus != GL_TRUE)
331 std::cerr << "Shader program is not validate." << std::endl;
341 // ============================================================================
342 // function : DestroyShaderProgram
344 // ============================================================================
345 void VTKViewer_OpenGLHelper::DestroyShaderProgram (GLhandleARB theProgram,
346 GLhandleARB theVertexShader,
347 GLhandleARB theFragmentShader) const
350 vglDetachObjectARB (theProgram, theVertexShader);
351 vglDetachObjectARB (theProgram, theFragmentShader);
353 vglDeleteObjectARB (theVertexShader);
354 vglDeleteObjectARB (theFragmentShader);
358 // ============================================================================
359 // function : SetUniformMatrix
361 // ============================================================================
363 void VTKViewer_OpenGLHelper::SetUniformMatrix (const GLint theLocation,
364 const vtkMatrix4x4* theMatrix) const
367 for (int i = 0; i < 16; ++i)
369 data[i] = theMatrix->Element[i / 4][i % 4];
372 this->vglUniformMatrix4fvARB (theLocation, 1, GL_FALSE, data);