Salome HOME
Merge remote-tracking branch 'origin/rnv/vtk_opengl2_backend' into V8_1_BR
[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 class VTKVIEWER_EXPORT VTKViewer_OpenGLHelper
70 {
71 public:
72   VTKViewer_OpenGLHelper();
73   ~VTKViewer_OpenGLHelper();
74
75   void Init();
76
77   bool IsInitialized() const { return mIsInitialized; }
78
79 public:
80   bool CreateShaderProgram (const std::string& theFilePath,
81                             GLhandleARB&       theProgram,
82                             GLhandleARB&       theVertexShader,
83                             GLhandleARB&       theFragmentShader) const;
84
85   void DestroyShaderProgram (GLhandleARB theProgram,
86                              GLhandleARB theVertexShader,
87                              GLhandleARB theFragmentShader) const;
88
89   void SetUniformMatrix (const GLint         theLocation,
90                          const vtkMatrix4x4* theMatrix) const;
91
92 protected:
93   typedef void        (APIENTRYP PFNGLSHADERSOURCEARBPROC)             (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length);
94   typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC)       (GLenum shaderType);
95   typedef void        (APIENTRYP PFNGLBINDBUFFERARBPROC)               (GLenum target, GLuint buffer);
96   typedef void        (APIENTRYP PFNGLDELETEBUFFERSARBPROC)            (GLsizei n, const GLuint *buffers);
97   typedef void        (APIENTRYP PFNGLGENBUFFERSARBPROC)               (GLsizei n, GLuint *buffers);
98   typedef void        (APIENTRYP PFNGLBUFFERDATAARBPROC)               (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
99   typedef void        (APIENTRYP PFNGLCOMPILESHADERARBPROC)            (GLhandleARB shaderObj);
100   typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC)      (void);
101   typedef void        (APIENTRYP PFNGLATTACHOBJECTARBPROC)             (GLhandleARB containerObj, GLhandleARB obj);
102   typedef void        (APIENTRYP PFNGLLINKPROGRAMARBPROC)              (GLhandleARB programObj);
103   typedef void        (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC)         (GLhandleARB programObj);
104   typedef GLint       (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC)        (GLhandleARB programObj, const GLcharARB *name);
105   typedef void        (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC)      (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
106   typedef void        (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC)  (GLuint index);
107   typedef void        (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
108
109 #ifdef VTK_OPENGL2
110   typedef void        (APIENTRYP PFNGLDETACHOBJECTARBPROC)             (GLhandleARB containerObj, GLhandleARB obj);
111   typedef void        (APIENTRYP PFNGLDELETEOBJECTARBPROC)             (GLhandleARB obj);
112   typedef void        (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC)          (GLhandleARB program);
113   typedef GLint       (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC)       (GLhandleARB program, const GLcharARB *name );
114   typedef void        (APIENTRYP PFNGLGETSHADERIVARBPROC)              (GLuint shader, GLenum pname, GLint *params);
115   typedef void        (APIENTRYP PFNGLGETPROGRAMIVARBPROC)             (GLuint program, GLenum pname, GLint *params);
116   typedef void        (APIENTRYP PFNGLGETSHADERINFOLOGARBPROC)         (GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog);
117   typedef void        (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC)         (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
118   typedef void        (APIENTRYP PFNGLGENVERTEXARRAYSARBPROC)          (GLsizei n, GLuint *arrays);
119   typedef void        (APIENTRYP PFNGLBINDVERTEXARRAYARBPROC)          (GLuint array);
120   typedef void        (APIENTRYP PFNGLUNIFORM1IARBPROC)                (GLint location, GLint v0);
121 #endif
122
123 public:
124   PFNGLSHADERSOURCEARBPROC             vglShaderSourceARB;
125   PFNGLCREATESHADEROBJECTARBPROC       vglCreateShaderObjectARB;
126   PFNGLCOMPILESHADERARBPROC            vglCompileShaderARB;
127   PFNGLCREATEPROGRAMOBJECTARBPROC      vglCreateProgramObjectARB;
128   PFNGLATTACHOBJECTARBPROC             vglAttachObjectARB;
129   PFNGLLINKPROGRAMARBPROC              vglLinkProgramARB;
130   PFNGLUSEPROGRAMOBJECTARBPROC         vglUseProgramObjectARB;
131
132   PFNGLGENBUFFERSARBPROC               vglGenBuffersARB;
133   PFNGLBINDBUFFERARBPROC               vglBindBufferARB;
134   PFNGLBUFFERDATAARBPROC               vglBufferDataARB;
135   PFNGLDELETEBUFFERSARBPROC            vglDeleteBuffersARB;
136   PFNGLGETATTRIBLOCATIONARBPROC        vglGetAttribLocationARB;
137   PFNGLVERTEXATTRIBPOINTERARBPROC      vglVertexAttribPointerARB;
138   PFNGLENABLEVERTEXATTRIBARRAYARBPROC  vglEnableVertexAttribArrayARB;
139   PFNGLDISABLEVERTEXATTRIBARRAYARBPROC vglDisableVertexAttribArrayARB;
140
141 #ifdef VTK_OPENGL2
142   PFNGLDETACHOBJECTARBPROC             vglDetachObjectARB;
143   PFNGLDELETEOBJECTARBPROC             vglDeleteObjectARB;
144   PFNGLVALIDATEPROGRAMARBPROC          vglValidateProgramARB;
145   PFNGLGETSHADERIVARBPROC              vglGetShaderivARB;
146   PFNGLGETPROGRAMIVARBPROC             vglGetProgramivARB;
147   PFNGLGETSHADERINFOLOGARBPROC         vglGetShaderInfoLogARB;
148
149   PFNGLUNIFORMMATRIX4FVARBPROC         vglUniformMatrix4fvARB;
150   PFNGLGENVERTEXARRAYSARBPROC          vglGenVertexArraysARB;
151   PFNGLBINDVERTEXARRAYARBPROC          vglBindVertexArrayARB;
152   PFNGLUNIFORM1IARBPROC                vglUniform1iARB;
153   PFNGLGETUNIFORMLOCATIONARBPROC       vglGetUniformLocationARB;
154 #endif
155
156 protected:
157   bool mIsInitialized;
158 };
159
160 #endif