674836832dc5c5d8c7c89dd742186b6a21b16796
[occt.git] / src / Graphic3d / Graphic3d_ShaderProgram.hxx
1 // Created on: 2013-09-20
2 // Created by: Denis BOGOLEPOV
3 // Copyright (c) 2013-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 _Graphic3d_ShaderProgram_HeaderFile
17 #define _Graphic3d_ShaderProgram_HeaderFile
18
19 #include <Graphic3d_ShaderObject.hxx>
20 #include <Graphic3d_ShaderVariable.hxx>
21 #include <NCollection_Sequence.hxx>
22
23 //! List of shader objects.
24 typedef NCollection_Sequence<Handle(Graphic3d_ShaderObject)> Graphic3d_ShaderObjectList;
25
26 //! List of custom uniform shader variables.
27 typedef NCollection_Sequence<Handle(Graphic3d_ShaderVariable)> Graphic3d_ShaderVariableList;
28
29 //! This class is responsible for managing shader programs.
30 class Graphic3d_ShaderProgram : public Standard_Transient
31 {
32
33 public:
34
35   //! The list of built-in GLSL programs
36   enum ShaderName
37   {
38     ShaderName_UNKNOWN, //!< undefined program
39     ShaderName_Phong    //!< per-pixel lighting (Phong shading)
40   };
41
42 public:
43
44   //! Creates new empty program object.
45   Standard_EXPORT Graphic3d_ShaderProgram();
46
47   //! Creates program object from pre-defined shaders.
48   //! Raises Standard_Failure exception if shader resources are unavailable.
49   Standard_EXPORT Graphic3d_ShaderProgram (const Graphic3d_ShaderProgram::ShaderName theName);
50
51   //! Releases resources of program object.
52   Standard_EXPORT virtual ~Graphic3d_ShaderProgram();
53
54   //! Releases resources of program object.
55   Standard_EXPORT void Destroy() const;
56
57   //! Checks if the program object is valid or not.
58   Standard_EXPORT virtual Standard_Boolean IsDone() const;
59
60   //! Returns unique ID used to manage resource in graphic driver.
61   const TCollection_AsciiString& GetId() const { return myID; }
62
63   //! Returns GLSL header (version code and extensions).
64   const TCollection_AsciiString& Header() const { return myHeader; }
65
66   //! Setup GLSL header containing language version code and used extensions.
67   //! Will be prepended to the very beginning of the source code.
68   //! Example:
69   //! @code
70   //!   #version 300 es
71   //!   #extension GL_ARB_bindless_texture : require
72   //! @endcode
73   void SetHeader (const TCollection_AsciiString& theHeader) { myHeader = theHeader; }
74
75   //! Attaches shader object to the program object.
76   Standard_EXPORT Standard_Boolean AttachShader (const Handle(Graphic3d_ShaderObject)& theShader);
77
78   //! Detaches shader object from the program object.
79   Standard_EXPORT Standard_Boolean DetachShader (const Handle(Graphic3d_ShaderObject)& theShader);
80
81   //! Returns list of attached shader objects.
82   const Graphic3d_ShaderObjectList& ShaderObjects() const { return myShaderObjects; }
83
84   //! Returns list of custom uniform variables.
85   const Graphic3d_ShaderVariableList& Variables() const { return myVariables; }
86
87   //! Pushes custom uniform variable to the program.
88   template<class T>
89   Standard_Boolean PushVariable (const TCollection_AsciiString& theName,
90                                  const T&                       theValue);
91
92   //! Removes all custom uniform variables from the program.
93   Standard_EXPORT void ClearVariables();
94
95 public:
96
97   //! The path to GLSL programs determined from CSF_ShadersDirectory or CASROOT environment variables.
98   //! @return the root folder with default GLSL programs.
99   Standard_EXPORT static const TCollection_AsciiString& ShadersFolder();
100
101 public:
102
103   DEFINE_STANDARD_RTTI (Graphic3d_ShaderProgram, Standard_Transient)
104
105 private:
106
107   TCollection_AsciiString      myID;            //!< The unique identifier of program object.
108   Graphic3d_ShaderObjectList   myShaderObjects; //!< the list of attached shader objects.
109   Graphic3d_ShaderVariableList myVariables;     //!< the list of custom uniform variables.
110   TCollection_AsciiString      myHeader;        //!< GLSL header with version code and used extensions
111
112 };
113
114 DEFINE_STANDARD_HANDLE (Graphic3d_ShaderProgram, Standard_Transient)
115
116 // =======================================================================
117 // function : PushVariable
118 // purpose  : Pushes custom uniform variable to the program
119 // =======================================================================
120 template<class T> inline
121 Standard_Boolean Graphic3d_ShaderProgram::PushVariable (const TCollection_AsciiString& theName,
122                                                         const T& theValue)
123 {
124   Handle(Graphic3d_ShaderVariable) aVariable = Graphic3d_ShaderVariable::Create (theName, theValue);
125   if (aVariable.IsNull() || !aVariable->IsDone())
126   {
127     return Standard_False;
128   }
129
130   myVariables.Append (aVariable);
131   return Standard_True;
132 }
133
134 #endif