#include <Graphic3d_ShaderObject.hxx>
#include <Graphic3d_ShaderProgram.hxx>
-#include <InterfaceGraphic_tgl_all.hxx>
-
#include <OpenGl_Vec.hxx>
#include <OpenGl_Matrix.hxx>
+#include <OpenGl_NamedResource.hxx>
#include <OpenGl_ShaderObject.hxx>
-#include <Handle_OpenGl_ShaderProgram.hxx>
+
+class OpenGl_ShaderProgram;
+DEFINE_STANDARD_HANDLE(OpenGl_ShaderProgram, OpenGl_NamedResource)
//! The enumeration of OCCT-specific OpenGL/GLSL variables.
enum OpenGl_StateVariable
// OpenGL clip planes state
OpenGl_OCC_CLIP_PLANE_EQUATIONS,
- OpenGl_OCC_CLIP_PLANE_SPACES,
OpenGl_OCC_CLIP_PLANE_COUNT,
// OpenGL light state
OpenGl_OCC_LIGHT_AMBIENT,
// Material state
- OpenGl_OCCT_ACTIVE_SAMPLER,
OpenGl_OCCT_TEXTURE_ENABLE,
OpenGl_OCCT_DISTINGUISH_MODE,
OpenGl_OCCT_FRONT_MATERIAL,
OpenGl_OCCT_BACK_MATERIAL,
+ OpenGl_OCCT_COLOR,
+
+ // Weighted, Blended Order-Independent Transparency rendering state
+ OpenGl_OCCT_OIT_OUTPUT,
+ OpenGl_OCCT_OIT_DEPTH_FACTOR,
+
+ // Context-dependent state
+ OpenGl_OCCT_TEXTURE_TRSF2D,
+ OpenGl_OCCT_POINT_SIZE,
// DON'T MODIFY THIS ITEM (insert new items before it)
OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES
};
-class OpenGl_ShaderProgram;
-
//! Interface for generic setter of user-defined uniform variables.
struct OpenGl_SetterInterface
{
OpenGl_MODEL_WORLD_STATE,
OpenGl_WORLD_VIEW_STATE,
OpenGl_PROJECTION_STATE,
- OpenGl_MATERIALS_STATE
+ OpenGl_MATERIAL_STATE,
+ OpenGl_SURF_DETAIL_STATE,
+ OpenGL_OIT_STATE,
+ OpenGl_UniformStateType_NB
};
-//! Total number of state types.
-const int MaxStateTypes = 6;
-
//! Wrapper for OpenGL program object.
-class OpenGl_ShaderProgram : public OpenGl_Resource
+class OpenGl_ShaderProgram : public OpenGl_NamedResource
{
- friend class OpenGl_Workspace;
-
+ friend class OpenGl_View;
+ friend class OpenGl_ShaderManager;
+ DEFINE_STANDARD_RTTIEXT(OpenGl_ShaderProgram, OpenGl_NamedResource)
public:
//! Non-valid shader name.
//! List of pre-defined OCCT state uniform variables.
static Standard_CString PredefinedKeywords[OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES];
-protected:
-
//! Creates uninitialized shader program.
+ //!
+ //! WARNING! This constructor is not intended to be called anywhere but from OpenGl_ShaderManager::Create().
+ //! Manager has been designed to synchronize camera position, lights definition and other aspects of the program implicitly,
+ //! as well as sharing same program across rendering groups.
+ //!
+ //! Program created outside the manager will be left detached from these routines,
+ //! and them should be performed manually by caller.
+ //!
+ //! This constructor has been made public to provide more flexibility to re-use OCCT OpenGL classes without OCCT Viewer itself.
+ //! If this is not the case - create the program using shared OpenGl_ShaderManager instance instead.
Standard_EXPORT OpenGl_ShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProxy = NULL);
+protected:
+
static OpenGl_VariableSetterSelector mySetterSelector;
public:
Standard_EXPORT Standard_Boolean Create (const Handle(OpenGl_Context)& theCtx);
//! Destroys shader program.
- Standard_EXPORT virtual void Release (const OpenGl_Context* theCtx);
+ Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE;
+
+ //! Returns estimated GPU memory usage - cannot be easily estimated.
+ virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE { return 0; }
//! Attaches shader object to the program object.
Standard_EXPORT Standard_Boolean AttachShader (const Handle(OpenGl_Context)& theCtx,
//! Fetches uniform variables from proxy shader program.
Standard_EXPORT Standard_Boolean ApplyVariables (const Handle(OpenGl_Context)& theCtx);
- //! Sets the program object as part of current rendering state.
- Standard_EXPORT void Bind (const Handle(OpenGl_Context)& theCtx) const;
-
- //! Binds the program object and applies variables from proxy shader program.
- Standard_EXPORT Standard_Boolean BindWithVariables (const Handle(OpenGl_Context)& theCtx);
-
- //! Reverts to fixed-function graphics pipeline (FFP).
- Standard_EXPORT static void Unbind (const Handle(OpenGl_Context)& theCtx);
-
//! @return true if current object was initialized
inline bool IsValid() const
{
return myProgramID != NO_PROGRAM;
}
+ //! @return program ID
+ inline GLuint ProgramId() const
+ {
+ return myProgramID;
+ }
+
+public:
+
+ //! Return TRUE if program defines tessellation stage.
+ Standard_Boolean HasTessellationStage() const { return myHasTessShader; }
+
+ //! Return the length of array of light sources (THE_MAX_LIGHTS),
+ //! to be used for initialization occLightSources (OpenGl_OCC_LIGHT_SOURCE_PARAMS).
+ Standard_Integer NbLightsMax() const { return myNbLightsMax; }
+
+ //! Return the length of array of clipping planes (THE_MAX_CLIP_PLANES),
+ //! to be used for initialization occClipPlaneEquations (OpenGl_OCC_CLIP_PLANE_EQUATIONS).
+ Standard_Integer NbClipPlanesMax() const { return myNbClipPlanesMax; }
+
+ //! Return the length of array of Fragment Shader outputs (THE_NB_FRAG_OUTPUTS),
+ //! to be used for initialization occFragColorArray/occFragColorN.
+ Standard_Integer NbFragmentOutputs() const { return myNbFragOutputs; }
+
+ //! Return true if Fragment Shader color should output the weighted OIT coverage; FALSE by default.
+ Standard_Boolean HasWeightOitOutput() const { return myHasWeightOitOutput; }
+
private:
//! Returns index of last modification of variables of specified state type.
- Standard_EXPORT Standard_Size ActiveState (const OpenGl_UniformStateType theType) const;
+ Standard_Size ActiveState (const OpenGl_UniformStateType theType) const
+ {
+ return theType < OpenGl_UniformStateType_NB
+ ? myCurrentState[theType]
+ : 0;
+ }
//! Updates index of last modification of variables of specified state type.
- Standard_EXPORT void UpdateState (const OpenGl_UniformStateType theType,
- const Standard_Size theIndex);
+ void UpdateState (const OpenGl_UniformStateType theType,
+ const Standard_Size theIndex)
+ {
+ if (theType < OpenGl_UniformStateType_NB)
+ {
+ myCurrentState[theType] = theIndex;
+ }
+ }
public:
GLint theLocation,
const OpenGl_Vec4i& theValue);
+public:
+
+ //! Specifies the value of the unsigned integer uniform 2D vector (uvec2).
+ Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
+ const GLchar* theName,
+ const OpenGl_Vec2u& theValue);
+
+ //! Specifies the value of the unsigned integer uniform 2D vector (uvec2).
+ Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
+ GLint theLocation,
+ const OpenGl_Vec2u& theValue);
+
+ //! Specifies the value of the uvec2 uniform array
+ Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
+ const GLchar* theName,
+ const GLsizei theCount,
+ const OpenGl_Vec2u* theValue);
+
+ //! Specifies the value of the uvec2 uniform array
+ Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
+ GLint theLocation,
+ const GLsizei theCount,
+ const OpenGl_Vec2u* theValue);
+
public:
//! Specifies the value of the float uniform variable.
//! Specifies the value of the float uniform 4x4 matrix.
Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
const GLchar* theName,
- const OpenGl_Matrix& theValue,
+ const OpenGl_Mat4& theValue,
GLboolean theTranspose = GL_FALSE);
//! Specifies the value of the float uniform 4x4 matrix.
Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
GLint theLocation,
- const OpenGl_Matrix& theValue,
+ const OpenGl_Mat4& theValue,
GLboolean theTranspose = GL_FALSE);
//! Specifies the value of the float uniform 4x4 matrix.
Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
const GLchar* theName,
- const Tmatrix3& theValue,
+ const OpenGl_Matrix& theValue,
GLboolean theTranspose = GL_FALSE);
//! Specifies the value of the float uniform 4x4 matrix.
Standard_EXPORT Standard_Boolean SetUniform (const Handle(OpenGl_Context)& theCtx,
GLint theLocation,
- const Tmatrix3& theValue,
+ const OpenGl_Matrix& theValue,
GLboolean theTranspose = GL_FALSE);
//! Specifies the value of the float uniform array
//! Specifies the value of the sampler uniform variable.
Standard_EXPORT Standard_Boolean SetSampler (const Handle(OpenGl_Context)& theCtx,
const GLchar* theName,
- const GLenum theTextureUnit);
+ const Graphic3d_TextureUnit theTextureUnit);
//! Specifies the value of the sampler uniform variable.
Standard_EXPORT Standard_Boolean SetSampler (const Handle(OpenGl_Context)& theCtx,
GLint theLocation,
- const GLenum theTextureUnit);
+ const Graphic3d_TextureUnit theTextureUnit);
protected:
OpenGl_ShaderList myShaderObjects; //!< List of attached shader objects
Handle(Graphic3d_ShaderProgram) myProxy; //!< Proxy shader program (from application layer)
Standard_Integer myShareCount; //!< program users count, initialized with 1 (already shared by one user)
+ Standard_Integer myNbLightsMax; //!< length of array of light sources (THE_MAX_LIGHTS)
+ Standard_Integer myNbClipPlanesMax; //!< length of array of clipping planes (THE_MAX_CLIP_PLANES)
+ Standard_Integer myNbFragOutputs; //!< length of array of Fragment Shader outputs (THE_NB_FRAG_OUTPUTS)
+ Standard_Boolean myHasWeightOitOutput; //!< flag indicating that Fragment Shader includes weighted OIT coverage
+ Standard_Boolean myHasTessShader; //!< flag indicating that program defines tessellation stage
protected:
- //! Defines last modification for variables of each state type.
- Standard_Size myCurrentState[MaxStateTypes];
+ Standard_Size myCurrentState[OpenGl_UniformStateType_NB]; //!< defines last modification for variables of each state type
//! Stores locations of OCCT state uniform variables.
GLint myStateLocations[OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES];
-public:
-
- DEFINE_STANDARD_RTTI (OpenGl_ShaderProgram)
- friend class OpenGl_ShaderManager;
-
};
template<class T>