]> SALOME platform Git repositories - modules/gui.git/blob - src/VTKViewer/VTKViewer_PolyDataMapper.h
Salome HOME
8fa5725b0dba170f77aeb95185a8df205de84f87
[modules/gui.git] / src / VTKViewer / VTKViewer_PolyDataMapper.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_POLYDATAMAPPER_H
21 #define VTKViewer_POLYDATAMAPPER_H
22
23 #include "VTKViewer.h"
24 #include "VTKViewer_MarkerDef.h"
25
26 #ifdef WIN32
27 #include <windows.h>
28 #endif
29
30 #include <map>
31
32 #include <GL/gl.h>
33
34 #include <vtkSmartPointer.h>
35
36 class vtkImageData;
37
38 #ifndef VTK_IMPLEMENT_MESA_CXX
39 #include <vtkOpenGLPolyDataMapper.h>
40 #define MAPPER_SUPERCLASS vtkOpenGLPolyDataMapper
41 #else
42 #include <vtkMesaPolyDataMapper.h>
43 #define MAPPER_SUPERCLASS vtkMesaPolyDataMapper
44 #endif
45
46 #include "VTKViewer_OpenGLHelper.h"
47
48 //----------------------------------------------------------------------------
49 //! OpenGL Point Sprites PolyData Mapper.
50 /*!
51  * VTKViewer_PolyDataMapper is a class that maps polygonal data 
52  * (i.e., vtkPolyData) to graphics primitives. It is performing the mapping
53  * to the rendering/graphics hardware/software. It is now possible to set a 
54  * memory limit for the pipeline in the mapper. If the total estimated memory 
55  * usage of the pipeline is larger than this limit, the mapper will divide 
56  * the data into pieces and render each in a for loop.
57  */
58 class VTKVIEWER_EXPORT VTKViewer_PolyDataMapper : public MAPPER_SUPERCLASS
59 {
60 public:
61   enum ExtensionsState { ES_None = 0, ES_Error, ES_Ok };
62
63 public:
64   static VTKViewer_PolyDataMapper* New();
65   vtkTypeMacro( VTKViewer_PolyDataMapper, MAPPER_SUPERCLASS );
66
67   //! Set point marker enabled
68   void SetMarkerEnabled( bool );
69
70   //! Set point ball enabled
71   void SetBallEnabled( bool );
72   
73   bool GetBallEnabled( );
74
75   //! Set ball scale factor
76   void SetBallScale( double );
77
78   double GetBallScale( );
79
80   //! Set standard point marker
81   void SetMarkerStd( VTK::MarkerType, VTK::MarkerScale );
82
83   //! Set custom point marker
84   void SetMarkerTexture( int, VTK::MarkerTexture );
85
86   //! Get type of the point marker
87   VTK::MarkerType GetMarkerType();
88
89   //! Get scale of the point marker
90   VTK::MarkerScale GetMarkerScale();
91
92   //! Get texture identifier of the point marker
93   int GetMarkerTexture();
94
95   //! Implement superclass render method.
96   virtual void RenderPiece( vtkRenderer*, vtkActor* );
97   //! Draw method for OpenGL.
98 #ifndef VTK_OPENGL2
99   virtual int Draw( vtkRenderer*, vtkActor* );
100 #else
101   virtual void RenderPieceDraw( vtkRenderer*, vtkActor* );
102 #endif    
103
104 protected:
105   VTKViewer_PolyDataMapper();
106   ~VTKViewer_PolyDataMapper();
107
108   //! Initializing OpenGL extensions.
109   int               InitExtensions();
110
111   //! Activate Point Sprites.
112   void              InitPointSprites();
113
114   //! Deactivate Point Sprites.
115   void              CleanupPointSprites();
116
117   //! Initializing textures for Point Sprites.
118   void              InitTextures();
119
120   //! Initializing of the Vertex Shader.
121   int               InitShader();
122
123   void              InternalDraw(vtkRenderer*, vtkActor*);
124
125 private:
126   int               ExtensionsInitialized;
127
128   GLuint            PointSpriteTexture;
129
130   vtkSmartPointer<vtkImageData> ImageData;
131
132   VTKViewer_OpenGLHelper OpenGLHelper;
133   GLhandleARB PointProgram;
134 #ifdef VTK_OPENGL2
135   GLhandleARB VertexShader;
136   GLhandleARB FragmentShader;
137   GLuint      VertexArrayObject;
138 #endif
139
140   struct Locations {
141     static const GLint INVALID_LOCATION = -1;
142
143     GLint ModelViewProjection;
144     GLint Projection;
145     GLint GeneralPointSize;
146     GLint PointSprite;
147
148     Locations()
149     : ModelViewProjection (INVALID_LOCATION),
150       Projection          (INVALID_LOCATION),
151       GeneralPointSize    (INVALID_LOCATION),
152       PointSprite         (INVALID_LOCATION)
153     {
154           //
155     }
156   } myLocations;
157
158   bool              MarkerEnabled;
159   bool              BallEnabled;
160   double            BallScale;
161   VTK::MarkerType   MarkerType;
162   VTK::MarkerScale  MarkerScale;
163   int               MarkerId;
164
165   typedef std::map< int, vtkSmartPointer<vtkImageData> > ImageDataMap;
166   ImageDataMap      StandardTextures;
167   ImageDataMap      CustomTextures;
168   ImageDataMap      SpecialTextures;  //special predefined textures, used to draw point sprites.
169 };
170
171 #endif