0031505: Point Cloud Rendering - fix on-screen statistics about number of visible...
[occt.git] / src / OpenGl / OpenGl_PrimitiveArray.hxx
index cc42d03..7f98265 100644 (file)
@@ -4,8 +4,8 @@
 //
 // This file is part of Open CASCADE Technology software library.
 //
-// This library is free software; you can redistribute it and / or modify it
-// under the terms of the GNU Lesser General Public version 2.1 as published
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
 // by the Free Software Foundation, with special exception defined in the file
 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
 // distribution for complete text of the license and disclaimer of any warranty.
 #ifndef OpenGl_PrimitiveArray_Header
 #define OpenGl_PrimitiveArray_Header
 
-#include <OpenGl_VertexBuffer.hxx>
+#include <OpenGl_IndexBuffer.hxx>
 
-#include <InterfaceGraphic_Graphic3d.hxx>
 #include <Aspect_InteriorStyle.hxx>
 #include <Aspect_TypeOfMarker.hxx>
+#include <Graphic3d_TypeOfPrimitiveArray.hxx>
+#include <Graphic3d_IndexBuffer.hxx>
+#include <Graphic3d_BoundBuffer.hxx>
 
 #include <OpenGl_Element.hxx>
 
-struct OPENGL_SURF_PROP;
+class OpenGl_GraphicDriver;
 
+//! Class for rendering of arbitrary primitive array.
 class OpenGl_PrimitiveArray : public OpenGl_Element
 {
 public:
-  // OpenGL does not provie a constant for "none" draw mode.
-  // So we define our own one that does not conflict with GL constants
-  // and untilizes common GL invalid value
+  //! OpenGL does not provide a constant for "none" draw mode.
+  //! So we define our own one that does not conflict with GL constants and utilizes common GL invalid value.
   enum
   {
     DRAW_MODE_NONE = -1
   };
 
+  //! Empty constructor
+  Standard_EXPORT OpenGl_PrimitiveArray (const OpenGl_GraphicDriver* theDriver);
+
   //! Default constructor
-  OpenGl_PrimitiveArray (CALL_DEF_PARRAY* thePArray);
+  Standard_EXPORT OpenGl_PrimitiveArray (const OpenGl_GraphicDriver*          theDriver,
+                                         const Graphic3d_TypeOfPrimitiveArray theType,
+                                         const Handle(Graphic3d_IndexBuffer)& theIndices,
+                                         const Handle(Graphic3d_Buffer)&      theAttribs,
+                                         const Handle(Graphic3d_BoundBuffer)& theBounds);
+
+  //! Destructor
+  Standard_EXPORT virtual ~OpenGl_PrimitiveArray();
 
   //! Render primitives to the window
-  virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const;
+  Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE;
 
-  virtual void Release (const Handle(OpenGl_Context)&   theContext);
+  //! Release OpenGL resources (VBOs)
+  Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
 
-  CALL_DEF_PARRAY* PArray() const { return myPArray; }
+  //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules.
+  Standard_EXPORT virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE;
 
-private:
+  //! Increment draw calls statistics.
+  Standard_EXPORT virtual void UpdateDrawStats (Graphic3d_FrameStatsDataTmp& theStats,
+                                                bool theIsDetailed) const Standard_OVERRIDE;
 
-  Standard_Boolean toDrawVbo() const
-  {
-    return !myVbos[VBOVertices].IsNull();
-  }
+  //! Return true if VBOs initialization has been performed.
+  //! VBO initialization is performed during first Render() call.
+  //! Notice that this flag does not indicate VBOs validity.
+  Standard_Boolean IsInitialized() const { return myIsVboInit; }
+
+  //! Invalidate VBO content without destruction.
+  void Invalidate() const { myIsVboInit = Standard_False; }
+
+  //! @return primitive type (GL_LINES, GL_TRIANGLES and others)
+  GLint DrawMode() const { return myDrawMode; }
+
+  //! Return TRUE if primitive type generates shaded triangulation.
+  virtual Standard_Boolean IsFillDrawMode() const Standard_OVERRIDE { return myIsFillType; }
+
+  //! @return indices array
+  const Handle(Graphic3d_IndexBuffer)& Indices() const { return myIndices; }
+
+  //! @return attributes array
+  const Handle(Graphic3d_Buffer)& Attributes() const { return myAttribs; }
+
+  //! @return bounds array
+  const Handle(Graphic3d_BoundBuffer)& Bounds() const { return myBounds; }
+
+  //! Returns unique ID of primitive array. 
+  Standard_Size GetUID() const { return myUID; }
+
+  //! Initialize indices, attributes and bounds with new data.
+  Standard_EXPORT void InitBuffers (const Handle(OpenGl_Context)&        theContext,
+                                    const Graphic3d_TypeOfPrimitiveArray theType,
+                                    const Handle(Graphic3d_IndexBuffer)& theIndices,
+                                    const Handle(Graphic3d_Buffer)&      theAttribs,
+                                    const Handle(Graphic3d_BoundBuffer)& theBounds);
+
+public:
+
+  //! Returns index VBO.
+  const Handle(OpenGl_VertexBuffer)& IndexVbo() const { return  myVboIndices; }
+
+  //! Returns attributes VBO.
+  const Handle(OpenGl_VertexBuffer)& AttributesVbo() const { return myVboAttribs; }
+
+  //! Dumps the content of me into the stream
+  Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE;
+
+protected:
 
   //! VBO initialization procedures
-  Standard_Boolean BuildVBO (const Handle(OpenGl_Workspace)& theWorkspace) const;
-  void clearMemoryOwn() const;
-  void clearMemoryGL (const Handle(OpenGl_Context)& theGlCtx) const;
+  //! @param theCtx        bound GL context
+  //! @param theToKeepData when true, myAttribs will not be nullified after VBO creation
+  Standard_EXPORT Standard_Boolean buildVBO (const Handle(OpenGl_Context)& theCtx,
+                                             const Standard_Boolean        theToKeepData) const;
+
+  //! Patch VBO sub-date within invalidated range.
+  Standard_EXPORT void updateVBO (const Handle(OpenGl_Context)& theCtx) const;
+
+  //! Release GL memory.
+  Standard_EXPORT void clearMemoryGL (const Handle(OpenGl_Context)& theGlCtx) const;
+
+private:
+
+  //! Initialize normal (OpenGL-provided) VBO
+  Standard_Boolean initNormalVbo (const Handle(OpenGl_Context)& theCtx) const;
 
   //! Main procedure to draw array
-  void DrawArray (Tint theLightingModel,
-                  const Aspect_InteriorStyle theInteriorStyle,
-                  Tint theEdgeFlag,
-                  const TEL_COLOUR* theInteriorColour,
-                  const TEL_COLOUR* theLineColour,
-                  const TEL_COLOUR* theEdgeColour,
-                  const OPENGL_SURF_PROP* theFaceProp,
-                  const Handle(OpenGl_Workspace)& theWorkspace) const;
+  void drawArray (const Handle(OpenGl_Workspace)& theWorkspace,
+                  const Graphic3d_Vec4*           theFaceColors,
+                  const Standard_Boolean          theHasVertColor) const;
 
   //! Auxiliary procedures
-  void DrawEdges (const TEL_COLOUR*               theEdgeColour,
-                  const Handle(OpenGl_Workspace)& theWorkspace) const;
+  void drawEdges (const Handle(OpenGl_Workspace)& theWorkspace) const;
 
-  void DrawMarkers (const Handle(OpenGl_Workspace)& theWorkspace) const;
+  void drawMarkers (const Handle(OpenGl_Workspace)& theWorkspace) const;
 
-protected:
+  //! Sets OpenGL draw mode according to the input type of primitive array.
+  //! If buffer of attributes is empty, draw mode is set to NONE to avoid invalid array rendering.
+  //! @param theType type of primitive array.
+  void setDrawMode (const Graphic3d_TypeOfPrimitiveArray theType);
 
-  //! Destructor
-  virtual ~OpenGl_PrimitiveArray();
+  //! Rebuilds the array of vertex attributes so that it can be drawn without indices.
+  Standard_Boolean processIndices (const Handle(OpenGl_Context)& theContext) const;
 
 protected:
 
-  typedef enum
-  {
-    VBOEdges,
-    VBOVertices,
-    VBOVcolours,
-    VBOVnormals,
-    VBOVtexels,
-    VBOMaxType
-  } VBODataType;
-
-  mutable CALL_DEF_PARRAY*            myPArray;
-  mutable Handle(OpenGl_VertexBuffer) myVbos[VBOMaxType];
-  GLint                               myDrawMode;
-  mutable Standard_Boolean            myIsVboInit;
+  mutable Handle(OpenGl_VertexBuffer)   myVboIndices;
+  mutable Handle(OpenGl_VertexBuffer)   myVboAttribs;
+
+  mutable Handle(Graphic3d_IndexBuffer) myIndices;
+  mutable Handle(Graphic3d_Buffer)      myAttribs;
+  mutable Handle(Graphic3d_BoundBuffer) myBounds;
+  GLshort                               myDrawMode;
+  mutable Standard_Boolean              myIsFillType;
+  mutable Standard_Boolean              myIsVboInit;
+
+  Standard_Size                         myUID; //!< Unique ID of primitive array. 
 
 public: