// purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License.
-
#ifndef OpenGl_Element_Header
#define OpenGl_Element_Header
-#include <OpenGl_Workspace.hxx>
+#include <Handle_OpenGl_Context.hxx>
+#include <Handle_OpenGl_Workspace.hxx>
+#include <OpenGl_RenderFilter.hxx>
+//! Base interface for drawable elements.
class OpenGl_Element
{
- public:
- OpenGl_Element () {}
- virtual ~OpenGl_Element () {}
+public:
+
+ Standard_EXPORT OpenGl_Element();
+
+ virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const = 0;
+
+ //! Release GPU resources.
+ virtual void Release (const Handle(OpenGl_Context)& theContext) = 0;
+
+ template <typename theResource_t>
+ static void Destroy (const Handle(OpenGl_Context)& theContext,
+ theResource_t*& theElement)
+ {
+ if (theElement == NULL)
+ {
+ return;
+ }
+
+ theElement->Release (theContext);
+ OpenGl_Element* anElement = theElement;
+ delete anElement;
+ theElement = NULL;
+ }
+
+public:
- virtual void Render (const Handle(OpenGl_Workspace) &AWorkspace) const = 0;
+ //! Render element if it passes the filtering procedure. This method should
+ //! be used for elements which can be used in scope of rendering algorithms.
+ //! E.g. elements of groups during recursive rendering.
+ //! If render filter is null, pure rendering is performed.
+ //! @param theWorkspace [in] the rendering workspace.
+ //! @param theFilter [in] the rendering filter to check whether the element
+ //! should be rendered or not.
+ //! @return True if element passes the filering check and is rendered.
+ inline Standard_Boolean
+ RenderFiltered (const Handle(OpenGl_Workspace)& theWorkspace,
+ const Handle(OpenGl_RenderFilter)& theFilter) const
+ {
+ if (!theFilter.IsNull() && !theFilter->CanRender (this))
+ {
+ return Standard_False;
+ }
+
+ Render (theWorkspace);
+
+ return Standard_True;
+ }
+
+protected:
+
+ Standard_EXPORT virtual ~OpenGl_Element();
+
+public:
- public:
DEFINE_STANDARD_ALLOC
+
};
-#endif //OpenGl_Element_Header
+#endif // OpenGl_Element_Header