0031096: Visualization, TKOpenGl - support metallic-roughness texture mapping
[occt.git] / src / OpenGl / OpenGl_TextureSet.hxx
1 // Copyright (c) 2017 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifndef _OpenGl_TextureSet_Header
15 #define _OpenGl_TextureSet_Header
16
17 #include <Graphic3d_TextureSet.hxx>
18 #include <Graphic3d_TextureSetBits.hxx>
19
20 class OpenGl_Texture;
21
22 //! Class holding array of textures to be mapped as a set.
23 class OpenGl_TextureSet : public Standard_Transient
24 {
25   DEFINE_STANDARD_RTTIEXT(OpenGl_TextureSet, Standard_Transient)
26 public:
27
28   //! Texture slot - combination of Texture and binding Unit.
29   struct TextureSlot
30   {
31     Handle(OpenGl_Texture) Texture;
32     Graphic3d_TextureUnit  Unit;
33
34     operator const Handle(OpenGl_Texture)& () const { return Texture; }
35     operator       Handle(OpenGl_Texture)& ()       { return Texture; }
36
37     TextureSlot() : Unit (Graphic3d_TextureUnit_0) {}
38   };
39
40   //! Class for iterating texture set.
41   class Iterator : public NCollection_Array1<TextureSlot>::Iterator
42   {
43   public:
44     //! Empty constructor.
45     Iterator() {}
46
47     //! Constructor.
48     Iterator (const Handle(OpenGl_TextureSet)& theSet)
49     {
50       if (!theSet.IsNull())
51       {
52         NCollection_Array1<TextureSlot>::Iterator::Init (theSet->myTextures);
53       }
54     }
55
56     //! Access texture.
57     const Handle(OpenGl_Texture)& Value() const { return NCollection_Array1<TextureSlot>::Iterator::Value().Texture; }
58     Handle(OpenGl_Texture)& ChangeValue()       { return NCollection_Array1<TextureSlot>::Iterator::ChangeValue().Texture; }
59
60     //! Access texture unit.
61     Graphic3d_TextureUnit  Unit() const { return NCollection_Array1<TextureSlot>::Iterator::Value().Unit; }
62     Graphic3d_TextureUnit& ChangeUnit() { return NCollection_Array1<TextureSlot>::Iterator::ChangeValue().Unit; }
63   };
64
65 public:
66
67   //! Empty constructor.
68   OpenGl_TextureSet() : myTextureSetBits (Graphic3d_TextureSetBits_NONE) {}
69
70   //! Constructor.
71   OpenGl_TextureSet (Standard_Integer theNbTextures)
72   : myTextures (0, theNbTextures - 1),
73     myTextureSetBits (Graphic3d_TextureSetBits_NONE) {}
74
75   //! Constructor for a single texture.
76   Standard_EXPORT OpenGl_TextureSet (const Handle(OpenGl_Texture)& theTexture);
77
78   //! Return texture units declared within the program, @sa Graphic3d_TextureSetBits.
79   Standard_Integer TextureSetBits() const { return myTextureSetBits; }
80
81   //! Return texture units declared within the program, @sa Graphic3d_TextureSetBits.
82   Standard_Integer& ChangeTextureSetBits() { return myTextureSetBits; }
83
84   //! Return TRUE if texture array is empty.
85   Standard_Boolean IsEmpty() const { return myTextures.IsEmpty(); }
86
87   //! Return number of textures.
88   Standard_Integer Size() const { return myTextures.Size(); }
89
90   //! Return the lower index in texture set.
91   Standard_Integer Lower() const { return myTextures.Lower(); }
92
93   //! Return the upper index in texture set.
94   Standard_Integer Upper() const { return myTextures.Upper(); }
95
96   //! Return the first texture.
97   const Handle(OpenGl_Texture)& First() const { return myTextures.First().Texture; }
98
99   //! Return the first texture.
100   Handle(OpenGl_Texture)& ChangeFirst() { return myTextures.ChangeFirst().Texture; }
101
102   //! Return the last texture.
103   const Handle(OpenGl_Texture)& Last() const { return myTextures.Last().Texture; }
104
105   //! Return the last texture.
106   Handle(OpenGl_Texture)& ChangeLast() { return myTextures.ChangeLast().Texture; }
107
108   //! Return the last texture unit.
109   Graphic3d_TextureUnit& ChangeLastUnit() { return myTextures.ChangeLast().Unit; }
110
111   //! Return the texture at specified position within [0, Size()) range.
112   const Handle(OpenGl_Texture)& Value (Standard_Integer theIndex) const { return myTextures.Value (theIndex).Texture; }
113
114   //! Return the texture at specified position within [0, Size()) range.
115   Handle(OpenGl_Texture)& ChangeValue (Standard_Integer theIndex) { return myTextures.ChangeValue (theIndex).Texture; }
116
117   //! Return TRUE if texture color modulation has been enabled for the first texture
118   //! or if texture is not set at all.
119   Standard_EXPORT bool IsModulate() const;
120
121   //! Return TRUE if other than point sprite textures are defined within point set.
122   Standard_EXPORT bool HasNonPointSprite() const;
123
124   //! Return TRUE if last texture is a point sprite.
125   Standard_EXPORT bool HasPointSprite() const;
126
127   //! Nullify all handles.
128   void InitZero()
129   {
130     myTextures.Init (TextureSlot());
131     myTextureSetBits = Graphic3d_TextureSetBits_NONE;
132   }
133
134 protected:
135
136   NCollection_Array1<TextureSlot> myTextures;
137   Standard_Integer myTextureSetBits;
138
139 };
140
141 #endif //_OpenGl_TextureSet_Header