0028912: Visualization, TKOpenGl - multi-texture support
[occt.git] / src / OpenGl / OpenGl_Sampler.hxx
1 // Created on: 2014-10-08
2 // Created by: Denis BOGOLEPOV
3 // Copyright (c) 2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #ifndef _OpenGl_Sampler_Header
17 #define _OpenGl_Sampler_Header
18
19 #include <OpenGl_Context.hxx>
20 #include <OpenGl_Resource.hxx>
21
22 class OpenGl_Texture;
23
24 //! Class implements OpenGL sampler object resource that
25 //! stores the sampling parameters for a texture access.
26 class OpenGl_Sampler : public OpenGl_Resource
27 {
28   friend class OpenGl_Context;
29   friend class OpenGl_Texture;
30   DEFINE_STANDARD_RTTIEXT(OpenGl_Sampler, OpenGl_Resource)
31 public:
32
33   //! Helpful constant defining invalid sampler identifier
34   static const GLuint NO_SAMPLER = 0;
35
36 public:
37
38   //! Creates new sampler object.
39   Standard_EXPORT OpenGl_Sampler (const Handle(Graphic3d_TextureParams)& theParams);
40
41   //! Releases resources of sampler object.
42   Standard_EXPORT virtual ~OpenGl_Sampler();
43
44   //! Destroys object - will release GPU memory if any.
45   Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
46
47   //! Creates an uninitialized sampler object.
48   Standard_EXPORT Standard_Boolean Create (const Handle(OpenGl_Context)& theContext);
49
50   //! Creates and initializes sampler object.
51   //! Existing object will be reused if possible, however if existing Sampler Object has Immutable flag
52   //! and texture parameters should be re-initialized, then Sampler Object will be recreated.
53   Standard_EXPORT Standard_Boolean Init (const Handle(OpenGl_Context)& theContext,
54                                          const OpenGl_Texture& theTexture);
55
56   //! Returns true if current object was initialized.
57   Standard_Boolean IsValid() const
58   {
59     return isValidSampler();
60   }
61
62   //! Binds sampler object to texture unit specified in parameters.
63   void Bind (const Handle(OpenGl_Context)& theCtx)
64   {
65     Bind (theCtx, myParams->TextureUnit());
66   }
67
68   //! Unbinds sampler object from texture unit specified in parameters.
69   void Unbind (const Handle(OpenGl_Context)& theCtx)
70   {
71     Unbind (theCtx, myParams->TextureUnit());
72   }
73
74   //! Binds sampler object to the given texture unit.
75   Standard_EXPORT void Bind (const Handle(OpenGl_Context)& theCtx,
76                              const Graphic3d_TextureUnit   theUnit);
77
78   //! Unbinds sampler object from the given texture unit.
79   Standard_EXPORT void Unbind (const Handle(OpenGl_Context)& theCtx,
80                                const Graphic3d_TextureUnit   theUnit);
81
82   //! Sets specific sampler parameter.
83   void SetParameter (const Handle(OpenGl_Context)& theCtx,
84                      GLenum theTarget,
85                      GLenum theParam,
86                      GLint  theValue)
87   {
88     setParameter (theCtx, this, theTarget, theParam, theValue);
89   }
90
91   //! Returns OpenGL sampler ID.
92   GLuint SamplerID() const
93   {
94     return mySamplerID;
95   }
96
97   //! Return immutable flag preventing further modifications of sampler parameters, FALSE by default.
98   //! Immutable flag might be set when Sampler Object is used within Bindless Texture.
99   bool IsImmutable() const { return myIsImmutable; }
100
101   //! Setup immutable flag. It is not possible unsetting this flag without Sampler destruction.
102   void SetImmutable() { myIsImmutable = true; }
103
104   //! Returns texture parameters.
105   const Handle(Graphic3d_TextureParams)& Parameters() { return myParams; }
106
107   //! Sets texture parameters.
108   Standard_EXPORT void SetParameters (const Handle(Graphic3d_TextureParams)& theParams);
109
110   //! Returns texture parameters initialization state.
111   bool ToUpdateParameters() const { return mySamplerRevision != myParams->SamplerRevision(); }
112
113 protected:
114
115   //! Checks if sampler object is valid.
116   Standard_Boolean isValidSampler() const
117   {
118     return mySamplerID != NO_SAMPLER;
119   }
120
121   //! Sets specific sampler parameter.
122   Standard_EXPORT static void setParameter (const Handle(OpenGl_Context)& theContext,
123                                             OpenGl_Sampler* theSampler,
124                                             GLenum theTarget,
125                                             GLenum theParam,
126                                             GLint  theValue);
127
128   //! Apply sampler parameters.
129   //! If Sampler Object is not NULL and valid resource, the parameters will be set to it (and it is not required Sampler Object being bound).
130   //! Otherwise, parameters will be applied to currently bound Texture object.
131   Standard_EXPORT static void applySamplerParams (const Handle(OpenGl_Context)& theCtx,
132                                                   const Handle(Graphic3d_TextureParams)& theParams,
133                                                   OpenGl_Sampler* theSampler,
134                                                   const GLenum theTarget,
135                                                   const bool theHasMipMaps);
136
137   //! Apply global texture state for deprecated OpenGL functionality.
138   Standard_EXPORT static void applyGlobalTextureParams (const Handle(OpenGl_Context)& theCtx,
139                                                         const OpenGl_Texture& theTexture,
140                                                         const Handle(Graphic3d_TextureParams)& theParams);
141
142   //! Reset global texture state for deprecated OpenGL functionality.
143   Standard_EXPORT static void resetGlobalTextureParams (const Handle(OpenGl_Context)& theCtx,
144                                                         const OpenGl_Texture& theTexture,
145                                                         const Handle(Graphic3d_TextureParams)& theParams);
146
147 protected:
148
149   Handle(Graphic3d_TextureParams) myParams;          //!< texture parameters
150   unsigned int                    mySamplerRevision; //!< modification counter of parameters related to sampler state
151   GLuint                          mySamplerID;       //!< OpenGL sampler object ID
152   bool                            myIsImmutable;     //!< immutable flag preventing further modifications of sampler parameters, FALSE by default
153
154 };
155
156 DEFINE_STANDARD_HANDLE(OpenGl_Sampler, OpenGl_Resource)
157
158 #endif // _OpenGl_Sampler_Header