1 // Copyright (C) 2007-2022 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"
25 #include <Basics_Utils.hxx>
28 # ifndef GLX_GLXEXT_LEGACY
29 # define GLX_GLXEXT_LEGACY
38 #define GL_GetProcAddress( x ) glXGetProcAddressARB( (const GLubyte*)x )
40 #define GL_GetProcAddress( x ) wglGetProcAddress( (const LPCSTR)x )
43 // ============================================================================
44 // function : VTKViewer_OpenGLHelper
46 // ============================================================================
47 VTKViewer_OpenGLHelper::VTKViewer_OpenGLHelper()
48 : vglShaderSourceARB (NULL),
49 vglCreateShaderObjectARB (NULL),
50 vglCompileShaderARB (NULL),
51 vglCreateProgramObjectARB (NULL),
52 vglAttachObjectARB (NULL),
53 vglLinkProgramARB (NULL),
54 vglUseProgramObjectARB (NULL),
55 vglGenBuffersARB (NULL),
56 vglBindBufferARB (NULL),
57 vglBufferDataARB (NULL),
58 vglDeleteBuffersARB (NULL),
59 vglGetAttribLocationARB (NULL),
60 vglVertexAttribPointerARB (NULL),
61 vglEnableVertexAttribArrayARB (NULL),
62 vglDisableVertexAttribArrayARB (NULL),
64 vglDetachObjectARB (NULL),
65 vglDeleteObjectARB (NULL),
66 vglValidateProgramARB (NULL),
67 vglGetShaderivARB (NULL),
68 vglGetProgramivARB (NULL),
69 vglGetShaderInfoLogARB (NULL),
70 vglUniformMatrix4fvARB (NULL),
71 vglGenVertexArraysARB (NULL),
72 vglBindVertexArrayARB (NULL),
73 vglUniform1iARB (NULL),
74 vglGetUniformLocationARB (NULL),
75 vglActiveTextureARB (NULL),
76 vglGetStringiARB (NULL),
78 mIsInitialized (false)
83 // ============================================================================
84 // function : ~VTKViewer_OpenGLHelper
86 // ============================================================================
87 VTKViewer_OpenGLHelper::~VTKViewer_OpenGLHelper()
92 // ============================================================================
95 // ============================================================================
96 void VTKViewer_OpenGLHelper::Init()
101 vglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)GL_GetProcAddress( "glShaderSourceARB" );
102 if( !vglShaderSourceARB )
105 vglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)GL_GetProcAddress( "glCreateShaderObjectARB" );
106 if( !vglCreateShaderObjectARB )
109 vglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)GL_GetProcAddress( "glCompileShaderARB" );
110 if( !vglCompileShaderARB )
113 vglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glCreateProgramObjectARB" );
114 if( !vglCreateProgramObjectARB )
117 vglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)GL_GetProcAddress( "glAttachObjectARB" );
118 if( !vglAttachObjectARB )
121 vglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)GL_GetProcAddress( "glLinkProgramARB" );
122 if( !vglLinkProgramARB )
125 vglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glUseProgramObjectARB" );
126 if( !vglUseProgramObjectARB )
129 vglGenBuffersARB = (PFNGLGENBUFFERSARBPROC)GL_GetProcAddress( "glGenBuffersARB" );
130 if( !vglGenBuffersARB )
133 vglBindBufferARB = (PFNGLBINDBUFFERARBPROC)GL_GetProcAddress( "glBindBufferARB" );
134 if( !vglBindBufferARB )
137 vglBufferDataARB = (PFNGLBUFFERDATAARBPROC)GL_GetProcAddress( "glBufferDataARB" );
138 if( !vglBufferDataARB )
141 vglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)GL_GetProcAddress( "glDeleteBuffersARB" );
142 if( !vglDeleteBuffersARB )
145 vglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)GL_GetProcAddress( "glGetAttribLocation" );
146 if( !vglGetAttribLocationARB )
149 vglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)GL_GetProcAddress( "glVertexAttribPointer" );
150 if( !vglVertexAttribPointerARB )
153 vglEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)GL_GetProcAddress( "glEnableVertexAttribArray" );
154 if(!vglEnableVertexAttribArrayARB)
157 vglDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)GL_GetProcAddress( "glDisableVertexAttribArray" );
158 if(!vglDisableVertexAttribArrayARB)
162 vglDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)GL_GetProcAddress( "glDetachObjectARB" );
163 if( !vglDetachObjectARB )
166 vglDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)GL_GetProcAddress( "glDeleteObjectARB" );
167 if( !vglDeleteObjectARB )
170 vglValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)GL_GetProcAddress( "glValidateProgramARB" );
171 if ( !vglValidateProgramARB )
174 vglGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)GL_GetProcAddress( "glGetUniformLocationARB" );
175 if( !vglGetUniformLocationARB )
178 vglGetShaderivARB = (PFNGLGETSHADERIVARBPROC)GL_GetProcAddress( "glGetShaderiv" );
179 if( !vglGetShaderivARB )
182 vglActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)GL_GetProcAddress( "glActiveTexture" );
183 if (!vglActiveTextureARB)
186 vglGetStringiARB = (PFNGLGETSTRINGIPROC)GL_GetProcAddress("glGetStringi");
187 if (!vglGetStringiARB)
190 vglGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)GL_GetProcAddress( "glGetProgramiv" );
191 if( !vglGetProgramivARB )
194 vglGetShaderInfoLogARB = (PFNGLGETSHADERINFOLOGARBPROC)GL_GetProcAddress( "glGetShaderInfoLog" );
195 if( !vglGetShaderInfoLogARB )
198 vglUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)GL_GetProcAddress( "glUniformMatrix4fv" );
199 if( !vglUniformMatrix4fvARB )
202 vglGenVertexArraysARB = (PFNGLGENVERTEXARRAYSARBPROC)GL_GetProcAddress( "glGenVertexArrays" );
203 if( !vglGenVertexArraysARB )
206 vglBindVertexArrayARB = (PFNGLBINDVERTEXARRAYARBPROC)GL_GetProcAddress( "glBindVertexArray" );
207 if( !vglBindVertexArrayARB )
210 vglUniform1iARB = (PFNGLUNIFORM1IARBPROC)GL_GetProcAddress( "glUniform1i" );
211 if( !vglUniform1iARB )
215 mIsInitialized = true;
221 char* readFromFile( std::string fileName )
223 #if defined(WIN32) && defined(UNICODE)
224 const wchar_t* wFileName = Kernel_Utils::utf8_decode( fileName.c_str() );
225 FILE* file = _wfopen( wFileName, L"r" );
227 FILE* file = fopen( fileName.c_str(), "r" );
229 char* content = NULL;
234 fseek( file, 0, SEEK_END );
235 count = ftell( file );
240 content = ( char* )malloc( sizeof( char ) * ( count + 1 ) );
241 count = (int)fread( content, sizeof( char ), count, file ); //!< TODO: conversion from size_t to int
242 content[ count ] = '\0';
250 // ============================================================================
251 // function : CreateShaderProgram
253 // ============================================================================
254 bool VTKViewer_OpenGLHelper::CreateShaderProgram (const std::string& theFilePath,
255 GLhandleARB& theProgram,
256 GLhandleARB& theVertexShader,
257 GLhandleARB& theFragmentShader) const
261 theProgram = vglCreateProgramObjectARB();
264 std::cerr << "Can't create opengl program." << std::endl;
268 std::string fileName;
270 GLint linked, compileStatus, validateStatus;
272 // Create vertex shader.
273 fileName = theFilePath + ".vs.glsl";
275 shaderContent = GUI_OPENGL::readFromFile (fileName);
277 theVertexShader = vglCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
278 vglShaderSourceARB (theVertexShader, 1, (const GLcharARB**)&shaderContent, NULL);
279 vglCompileShaderARB (theVertexShader);
281 free( shaderContent );
283 vglGetShaderivARB (theVertexShader, GL_COMPILE_STATUS, &compileStatus);
284 if (compileStatus != GL_TRUE)
287 GLcharARB info[1024];
289 vglGetShaderInfoLogARB (theVertexShader, 1024, &size, info);
290 std::cerr << "Can't compile vertex shader." << std::endl;
291 std::cerr << info << std::endl;
296 // Create fragment shader.
297 fileName = theFilePath + ".fs.glsl";
299 shaderContent = GUI_OPENGL::readFromFile (fileName);
301 theFragmentShader = vglCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
302 vglShaderSourceARB (theFragmentShader, 1, (const GLcharARB**)&shaderContent, NULL);
303 vglCompileShaderARB (theFragmentShader);
305 free (shaderContent);
307 vglGetShaderivARB (theFragmentShader, GL_COMPILE_STATUS, &compileStatus);
308 if (compileStatus != GL_TRUE)
311 GLcharARB info[1024];
313 vglGetShaderInfoLogARB (theVertexShader, 1024, &size, info);
314 std::cerr << "Can't compile fragment shader." << std::endl;
315 std::cerr << info << std::endl;
320 vglAttachObjectARB (theProgram, theVertexShader);
321 vglAttachObjectARB (theProgram, theFragmentShader);
322 vglLinkProgramARB (theProgram);
324 vglGetProgramivARB (theProgram, GL_LINK_STATUS, &linked);
327 std::cerr << "Can't link program." << std::endl;
331 vglValidateProgramARB (theProgram);
332 vglGetProgramivARB (theProgram, GL_VALIDATE_STATUS, &validateStatus);
334 if (validateStatus != GL_TRUE)
336 std::cerr << "Shader program is not validate." << std::endl;
346 // ============================================================================
347 // function : DestroyShaderProgram
349 // ============================================================================
350 void VTKViewer_OpenGLHelper::DestroyShaderProgram (GLhandleARB theProgram,
351 GLhandleARB theVertexShader,
352 GLhandleARB theFragmentShader) const
355 vglDetachObjectARB (theProgram, theVertexShader);
356 vglDetachObjectARB (theProgram, theFragmentShader);
358 vglDeleteObjectARB (theVertexShader);
359 vglDeleteObjectARB (theFragmentShader);
363 // ============================================================================
364 // function : SetUniformMatrix
366 // ============================================================================
368 void VTKViewer_OpenGLHelper::SetUniformMatrix (const GLint theLocation,
369 const vtkMatrix4x4* theMatrix) const
372 for (int i = 0; i < 16; ++i)
374 data[i] = theMatrix->Element[i / 4][i % 4];
377 this->vglUniformMatrix4fvARB (theLocation, 1, GL_FALSE, data);