1 // Copyright (C) 2007-2016 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),
75 mIsInitialized (false)
80 // ============================================================================
81 // function : ~VTKViewer_OpenGLHelper
83 // ============================================================================
84 VTKViewer_OpenGLHelper::~VTKViewer_OpenGLHelper()
89 // ============================================================================
92 // ============================================================================
93 void VTKViewer_OpenGLHelper::Init()
98 vglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)GL_GetProcAddress( "glShaderSourceARB" );
99 if( !vglShaderSourceARB )
102 vglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)GL_GetProcAddress( "glCreateShaderObjectARB" );
103 if( !vglCreateShaderObjectARB )
106 vglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)GL_GetProcAddress( "glCompileShaderARB" );
107 if( !vglCompileShaderARB )
110 vglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glCreateProgramObjectARB" );
111 if( !vglCreateProgramObjectARB )
114 vglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)GL_GetProcAddress( "glAttachObjectARB" );
115 if( !vglAttachObjectARB )
118 vglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)GL_GetProcAddress( "glLinkProgramARB" );
119 if( !vglLinkProgramARB )
122 vglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glUseProgramObjectARB" );
123 if( !vglUseProgramObjectARB )
126 vglGenBuffersARB = (PFNGLGENBUFFERSARBPROC)GL_GetProcAddress( "glGenBuffersARB" );
127 if( !vglGenBuffersARB )
130 vglBindBufferARB = (PFNGLBINDBUFFERARBPROC)GL_GetProcAddress( "glBindBufferARB" );
131 if( !vglBindBufferARB )
134 vglBufferDataARB = (PFNGLBUFFERDATAARBPROC)GL_GetProcAddress( "glBufferDataARB" );
135 if( !vglBufferDataARB )
138 vglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)GL_GetProcAddress( "glDeleteBuffersARB" );
139 if( !vglDeleteBuffersARB )
142 vglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)GL_GetProcAddress( "glGetAttribLocation" );
143 if( !vglGetAttribLocationARB )
146 vglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)GL_GetProcAddress( "glVertexAttribPointer" );
147 if( !vglVertexAttribPointerARB )
150 vglEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)GL_GetProcAddress( "glEnableVertexAttribArray" );
151 if(!vglEnableVertexAttribArrayARB)
154 vglDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)GL_GetProcAddress( "glDisableVertexAttribArray" );
155 if(!vglDisableVertexAttribArrayARB)
159 vglDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)GL_GetProcAddress( "glDetachObjectARB" );
160 if( !vglDetachObjectARB )
163 vglDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)GL_GetProcAddress( "glDeleteObjectARB" );
164 if( !vglDeleteObjectARB )
167 vglValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)GL_GetProcAddress( "glValidateProgramARB" );
168 if ( !vglValidateProgramARB )
171 vglGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)GL_GetProcAddress( "glGetUniformLocationARB" );
172 if( !vglGetUniformLocationARB )
175 vglGetShaderivARB = (PFNGLGETSHADERIVPROC)GL_GetProcAddress( "glGetShaderiv" );
176 if( !vglGetShaderivARB )
179 vglGetProgramivARB = (PFNGLGETPROGRAMIVPROC)GL_GetProcAddress( "glGetProgramiv" );
180 if( !vglGetProgramivARB )
183 vglGetShaderInfoLogARB = (PFNGLGETSHADERINFOLOGPROC)GL_GetProcAddress( "glGetShaderInfoLog" );
184 if( !vglGetShaderInfoLogARB )
187 vglUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)GL_GetProcAddress( "glUniformMatrix4fv" );
188 if( !vglUniformMatrix4fvARB )
191 vglGenVertexArraysARB = (PFNGLGENVERTEXARRAYSARBPROC)GL_GetProcAddress( "glGenVertexArrays" );
192 if( !vglGenVertexArraysARB )
195 vglBindVertexArrayARB = (PFNGLBINDVERTEXARRAYARBPROC)GL_GetProcAddress( "glBindVertexArray" );
196 if( !vglBindVertexArrayARB )
199 vglUniform1iARB = (PFNGLUNIFORM1IARBPROC)GL_GetProcAddress( "glUniform1i" );
200 if( !vglUniform1iARB )
204 mIsInitialized = true;
210 char* readFromFile( std::string fileName )
212 FILE* file = fopen( fileName.c_str(), "r" );
214 char* content = NULL;
219 fseek( file, 0, SEEK_END );
220 count = ftell( file );
225 content = ( char* )malloc( sizeof( char ) * ( count + 1 ) );
226 count = fread( content, sizeof( char ), count, file );
227 content[ count ] = '\0';
235 // ============================================================================
236 // function : CreateShaderProgram
238 // ============================================================================
239 bool VTKViewer_OpenGLHelper::CreateShaderProgram (const std::string& theFilePath,
240 GLhandleARB& theProgram,
241 GLhandleARB& theVertexShader,
242 GLhandleARB& theFragmentShader) const
246 theProgram = vglCreateProgramObjectARB();
249 std::cerr << "Can't create opengl program." << std::endl;
253 std::string fileName;
255 GLint linked, compileStatus, validateStatus;
257 // Create vertex shader.
258 fileName = theFilePath + ".vs.glsl";
260 shaderContent = GUI_OPENGL::readFromFile (fileName);
262 theVertexShader = vglCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
263 vglShaderSourceARB (theVertexShader, 1, (const GLcharARB**)&shaderContent, NULL);
264 vglCompileShaderARB (theVertexShader);
266 free( shaderContent );
268 vglGetShaderivARB (theVertexShader, GL_COMPILE_STATUS, &compileStatus);
269 if (compileStatus != GL_TRUE)
274 vglGetShaderInfoLogARB (theVertexShader, 1024, &size, info);
275 std::cerr << "Can't compile vertex shader." << std::endl;
276 std::cerr << info << std::endl;
281 // Create fragment shader.
282 fileName = theFilePath + ".fs.glsl";
284 shaderContent = GUI_OPENGL::readFromFile (fileName);
286 theFragmentShader = vglCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
287 vglShaderSourceARB (theFragmentShader, 1, (const GLcharARB**)&shaderContent, NULL);
288 vglCompileShaderARB (theFragmentShader);
290 free (shaderContent);
292 vglGetShaderivARB (theFragmentShader, GL_COMPILE_STATUS, &compileStatus);
293 if (compileStatus != GL_TRUE)
298 vglGetShaderInfoLogARB (theVertexShader, 1024, &size, info);
299 std::cerr << "Can't compile fragment shader." << std::endl;
300 std::cerr << info << std::endl;
305 vglAttachObjectARB (theProgram, theVertexShader);
306 vglAttachObjectARB (theProgram, theFragmentShader);
307 vglLinkProgramARB (theProgram);
309 vglGetProgramivARB (theProgram, GL_LINK_STATUS, &linked);
312 std::cerr << "Can't link program." << std::endl;
316 vglValidateProgramARB (theProgram);
317 vglGetProgramivARB (theProgram, GL_VALIDATE_STATUS, &validateStatus);
319 if (validateStatus != GL_TRUE)
321 std::cerr << "Shader program is not validate." << std::endl;
331 // ============================================================================
332 // function : DestroyShaderProgram
334 // ============================================================================
335 void VTKViewer_OpenGLHelper::DestroyShaderProgram (GLhandleARB theProgram,
336 GLhandleARB theVertexShader,
337 GLhandleARB theFragmentShader) const
340 vglDetachObjectARB (theProgram, theVertexShader);
341 vglDetachObjectARB (theProgram, theFragmentShader);
343 vglDeleteObjectARB (theVertexShader);
344 vglDeleteObjectARB (theFragmentShader);
348 // ============================================================================
349 // function : SetUniformMatrix
351 // ============================================================================
353 void VTKViewer_OpenGLHelper::SetUniformMatrix (const GLint theLocation,
354 const vtkMatrix4x4* theMatrix) const
357 for (int i = 0; i < 16; ++i)
359 data[i] = theMatrix->Element[i / 4][i % 4];
362 this->vglUniformMatrix4fvARB (theLocation, 1, GL_FALSE, data);