0024070: OpenGL capped object-level clipping planes
[occt.git] / src / OpenGl / OpenGl_Element.hxx
index 24219c4..44fa1dc 100644 (file)
 // 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