1706335e2dacd01624dc63987bf5544dd3e16f22
[occt.git] / src / OpenGl / OpenGl_AspectMarker.hxx
1 // Created on: 2011-07-13
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-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_AspectMarker_Header
17 #define OpenGl_AspectMarker_Header
18
19 #include <InterfaceGraphic_Graphic3d.hxx>
20 #include <Aspect_TypeOfMarker.hxx>
21 #include <Graphic3d_CAspectMarker.hxx>
22 #include <TCollection_AsciiString.hxx>
23
24 #include <OpenGl_Element.hxx>
25
26 #include <Image_PixMap_Handle.hxx>
27
28 class OpenGl_AspectMarker : public OpenGl_Element
29 {
30 public:
31
32   Standard_EXPORT OpenGl_AspectMarker();
33
34   //! Copy parameters
35   Standard_EXPORT void SetAspect (const CALL_DEF_CONTEXTMARKER& theAspect);
36
37   //! @return marker color
38   const TEL_COLOUR& Color() const
39   {
40     return myColor;
41   }
42
43   //! @return maker type
44   Aspect_TypeOfMarker Type() const
45   {
46     return myType;
47   }
48
49   //! @return marker scale
50   Standard_ShortReal Scale() const
51   {
52     return myScale;
53   }
54
55   //! @return marker size
56   Standard_ShortReal MarkerSize() const
57   {
58     return myMarkerSize;
59   }
60
61   //! Init and return OpenGl point sprite resource.
62   //! @return point sprite texture.
63   const Handle(OpenGl_PointSprite)& SpriteRes (const Handle(OpenGl_Context)& theCtx) const
64   {
65     if (!myResources.IsSpriteReady())
66     {
67       myResources.BuildSprites (theCtx, myMarkerImage, myType, myScale, myColor, myMarkerSize);
68       myResources.SetSpriteReady();
69     }
70
71     return myResources.Sprite;
72   }
73
74   //! Init and return OpenGl highlight point sprite resource.
75   //! @return point sprite texture for highlight.
76   const Handle(OpenGl_PointSprite)& SpriteHighlightRes (const Handle(OpenGl_Context)& theCtx) const
77   {
78     if (!myResources.IsSpriteReady())
79     {
80       myResources.BuildSprites (theCtx, myMarkerImage, myType, myScale, myColor, myMarkerSize);
81       myResources.SetSpriteReady();
82     }
83
84     return myResources.SpriteA;
85   }
86
87   //! Init and return OpenGl shader program resource.
88   //! @return shader program resource.
89   const Handle(OpenGl_ShaderProgram)& ShaderProgramRes (const Handle(OpenGl_Context)& theCtx) const
90   {
91     if (!myResources.IsShaderReady())
92     {
93       myResources.BuildShader (theCtx, myShaderProgram);
94       myResources.SetShaderReady();
95     }
96
97     return myResources.ShaderProgram;
98   }
99
100   Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const;
101   Standard_EXPORT virtual void Release (OpenGl_Context* theContext);
102
103 protected: //! @name ordinary aspect properties
104
105   TEL_COLOUR                      myColor;
106   Aspect_TypeOfMarker             myType;
107   Standard_ShortReal              myScale;
108   mutable Standard_ShortReal      myMarkerSize;
109   Handle(Graphic3d_MarkerImage)   myMarkerImage;
110   Handle(Graphic3d_ShaderProgram) myShaderProgram;
111
112 protected: //! @name OpenGl resources
113
114   //! OpenGl resources
115   mutable struct Resources
116   {
117   public:
118
119     Resources() :
120         SpriteKey (""),
121         SpriteAKey (""),
122         myIsSpriteReady (Standard_False),
123         myIsShaderReady (Standard_False) {}
124
125     Standard_Boolean IsSpriteReady() const { return myIsSpriteReady; }
126     Standard_Boolean IsShaderReady() const { return myIsShaderReady; }
127     void SetSpriteReady() { myIsSpriteReady = Standard_True; }
128     void SetShaderReady() { myIsShaderReady = Standard_True; }
129     void ResetSpriteReadiness() { myIsSpriteReady = Standard_False; }
130     void ResetShaderReadiness() { myIsShaderReady = Standard_False; }
131
132     Standard_EXPORT void BuildSprites (const Handle(OpenGl_Context)&        theCtx,
133                                        const Handle(Graphic3d_MarkerImage)& theMarkerImage,
134                                        const Aspect_TypeOfMarker            theType,
135                                        const Standard_ShortReal             theScale,
136                                        const TEL_COLOUR&                    theColor,
137                                        Standard_ShortReal&                  theMarkerSize);
138
139     Standard_EXPORT void BuildShader (const Handle(OpenGl_Context)&          theCtx,
140                                       const Handle(Graphic3d_ShaderProgram)& theShader);
141
142     Standard_EXPORT void SpriteKeys (const Handle(Graphic3d_MarkerImage)& theMarkerImage,
143                                      const Aspect_TypeOfMarker            theType,
144                                      const Standard_ShortReal             theScale,
145                                      const TEL_COLOUR&                    theColor,
146                                      TCollection_AsciiString&             theKey,
147                                      TCollection_AsciiString&             theKeyA);
148
149     Handle(OpenGl_PointSprite)   Sprite;
150     TCollection_AsciiString      SpriteKey;
151
152     Handle(OpenGl_PointSprite)   SpriteA;
153     TCollection_AsciiString      SpriteAKey;
154
155     Handle(OpenGl_ShaderProgram) ShaderProgram;
156     TCollection_AsciiString      ShaderProgramId;
157
158   private:
159
160     Standard_Boolean myIsSpriteReady;
161     Standard_Boolean myIsShaderReady;
162
163   } myResources;
164
165 public:
166
167   DEFINE_STANDARD_ALLOC
168
169 };
170
171 #endif // OpenGl_AspectMarker_Header