Salome HOME
3a6c9d43417a0fb6664c6ad286f886059047b8e8
[modules/gui.git] / src / VTKViewer / VTKViewer_OpenGLHelper.h
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef VTKVIEWER_OPENGLHELPER_H
21 #define VTKVIEWER_OPENGLHELPER_H
22
23 #include <vtkObject.h>
24 #include <vtkMatrix4x4.h>
25 #include "VTKViewer.h"
26
27 #include <GL/gl.h>
28
29
30 #ifndef GL_ARB_shader_objects
31 typedef GLuint GLhandleARB;
32 #endif
33
34 #ifndef APIENTRY
35 #define APIENTRY
36 #endif
37 #ifndef APIENTRYP
38 #define APIENTRYP APIENTRY *
39 #endif
40
41 #ifndef GL_ARB_shader_objects
42 typedef char GLcharARB;
43 #endif
44
45 #ifndef GL_VERTEX_PROGRAM_POINT_SIZE_ARB
46 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB  0x8642
47 #endif
48
49 #ifndef GL_VERTEX_SHADER_ARB
50 #define GL_VERTEX_SHADER_ARB              0x8B31
51 #endif
52
53 #ifndef GL_FRAGMENT_SHADER_ARB
54 #define GL_FRAGMENT_SHADER_ARB            0x8B30
55 #endif
56
57 #ifndef GL_ARB_point_sprite
58 #define GL_POINT_SPRITE_ARB               0x8861
59 #define GL_COORD_REPLACE_ARB              0x8862
60 #endif
61
62 #ifndef GL_ARB_vertex_buffer_object
63 typedef ptrdiff_t GLsizeiptrARB;
64
65 #define GL_ARRAY_BUFFER_ARB               0x8892
66 #define GL_STATIC_DRAW_ARB                0x88E4
67 #endif
68
69
70 namespace GUI_OPENGL {
71 char* readFromFile( std::string fileName );
72 }
73
74 class VTKVIEWER_EXPORT VTKViewer_OpenGLHelper
75 {
76 public:
77   VTKViewer_OpenGLHelper();
78   ~VTKViewer_OpenGLHelper();
79
80   void Init();
81
82   bool IsInitialized() const { return mIsInitialized; }
83
84 public:
85   bool CreateShaderProgram (const std::string& theFilePath,
86                             GLhandleARB&       theProgram,
87                             GLhandleARB&       theVertexShader,
88                             GLhandleARB&       theFragmentShader) const;
89
90   void DestroyShaderProgram (GLhandleARB theProgram,
91                              GLhandleARB theVertexShader,
92                              GLhandleARB theFragmentShader) const;
93 #ifdef VTK_OPENGL2
94   void SetUniformMatrix (const GLint         theLocation,
95                          const vtkMatrix4x4* theMatrix) const;
96 #endif  
97
98 protected:
99   typedef void        (APIENTRYP PFNGLSHADERSOURCEARBPROC)             (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length);
100   typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC)       (GLenum shaderType);
101   typedef void        (APIENTRYP PFNGLBINDBUFFERARBPROC)               (GLenum target, GLuint buffer);
102   typedef void        (APIENTRYP PFNGLDELETEBUFFERSARBPROC)            (GLsizei n, const GLuint *buffers);
103   typedef void        (APIENTRYP PFNGLGENBUFFERSARBPROC)               (GLsizei n, GLuint *buffers);
104   typedef void        (APIENTRYP PFNGLBUFFERDATAARBPROC)               (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
105   typedef void        (APIENTRYP PFNGLCOMPILESHADERARBPROC)            (GLhandleARB shaderObj);
106   typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC)      (void);
107   typedef void        (APIENTRYP PFNGLATTACHOBJECTARBPROC)             (GLhandleARB containerObj, GLhandleARB obj);
108   typedef void        (APIENTRYP PFNGLLINKPROGRAMARBPROC)              (GLhandleARB programObj);
109   typedef void        (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC)         (GLhandleARB programObj);
110   typedef GLint       (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC)        (GLhandleARB programObj, const GLcharARB *name);
111   typedef void        (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC)      (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
112   typedef void        (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC)  (GLuint index);
113   typedef void        (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
114
115 #ifdef VTK_OPENGL2
116   typedef void        (APIENTRYP PFNGLDETACHOBJECTARBPROC)             (GLhandleARB containerObj, GLhandleARB obj);
117   typedef void        (APIENTRYP PFNGLDELETEOBJECTARBPROC)             (GLhandleARB obj);
118   typedef void        (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC)          (GLhandleARB program);
119   typedef GLint       (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC)       (GLhandleARB program, const GLcharARB *name );
120   typedef void        (APIENTRYP PFNGLGETSHADERIVARBPROC)              (GLuint shader, GLenum pname, GLint *params);
121   typedef void        (APIENTRYP PFNGLGETPROGRAMIVARBPROC)             (GLuint program, GLenum pname, GLint *params);
122   typedef void        (APIENTRYP PFNGLGETSHADERINFOLOGARBPROC)         (GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
123   typedef void        (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC)         (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
124   typedef void        (APIENTRYP PFNGLGENVERTEXARRAYSARBPROC)          (GLsizei n, GLuint *arrays);
125   typedef void        (APIENTRYP PFNGLBINDVERTEXARRAYARBPROC)          (GLuint array);
126   typedef void        (APIENTRYP PFNGLUNIFORM1IARBPROC)                (GLint location, GLint v0);
127 #endif
128
129 public:
130   PFNGLSHADERSOURCEARBPROC             vglShaderSourceARB;
131   PFNGLCREATESHADEROBJECTARBPROC       vglCreateShaderObjectARB;
132   PFNGLCOMPILESHADERARBPROC            vglCompileShaderARB;
133   PFNGLCREATEPROGRAMOBJECTARBPROC      vglCreateProgramObjectARB;
134   PFNGLATTACHOBJECTARBPROC             vglAttachObjectARB;
135   PFNGLLINKPROGRAMARBPROC              vglLinkProgramARB;
136   PFNGLUSEPROGRAMOBJECTARBPROC         vglUseProgramObjectARB;
137
138   PFNGLGENBUFFERSARBPROC               vglGenBuffersARB;
139   PFNGLBINDBUFFERARBPROC               vglBindBufferARB;
140   PFNGLBUFFERDATAARBPROC               vglBufferDataARB;
141   PFNGLDELETEBUFFERSARBPROC            vglDeleteBuffersARB;
142   PFNGLGETATTRIBLOCATIONARBPROC        vglGetAttribLocationARB;
143   PFNGLVERTEXATTRIBPOINTERARBPROC      vglVertexAttribPointerARB;
144   PFNGLENABLEVERTEXATTRIBARRAYARBPROC  vglEnableVertexAttribArrayARB;
145   PFNGLDISABLEVERTEXATTRIBARRAYARBPROC vglDisableVertexAttribArrayARB;
146
147 #ifdef VTK_OPENGL2
148   PFNGLDETACHOBJECTARBPROC             vglDetachObjectARB;
149   PFNGLDELETEOBJECTARBPROC             vglDeleteObjectARB;
150   PFNGLVALIDATEPROGRAMARBPROC          vglValidateProgramARB;
151   PFNGLGETSHADERIVARBPROC              vglGetShaderivARB;
152   PFNGLGETPROGRAMIVARBPROC             vglGetProgramivARB;
153   PFNGLGETSHADERINFOLOGARBPROC         vglGetShaderInfoLogARB;
154
155   PFNGLUNIFORMMATRIX4FVARBPROC         vglUniformMatrix4fvARB;
156   PFNGLGENVERTEXARRAYSARBPROC          vglGenVertexArraysARB;
157   PFNGLBINDVERTEXARRAYARBPROC          vglBindVertexArrayARB;
158   PFNGLUNIFORM1IARBPROC                vglUniform1iARB;
159   PFNGLGETUNIFORMLOCATIONARBPROC       vglGetUniformLocationARB;
160 #endif
161
162 protected:
163   bool mIsInitialized;
164 };
165
166 #endif