0024113: Provide missing OpenGl_VertexBuffer::SubData() specializations
authorkgv <kgv@opencascade.com>
Thu, 22 Aug 2013 07:25:38 +0000 (11:25 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 22 Aug 2013 07:27:07 +0000 (11:27 +0400)
remark on doxygen documentation

src/OpenGl/OpenGl_VertexBuffer.cxx
src/OpenGl/OpenGl_VertexBuffer.hxx
src/OpenGl/OpenGl_VertexBufferEditor.hxx

index 436e67d..1a9878c 100644 (file)
@@ -180,6 +180,31 @@ bool OpenGl_VertexBuffer::Init (const Handle(OpenGl_Context)& theGlCtx,
 }
 
 // =======================================================================
+// function : SubData
+// purpose  :
+// =======================================================================
+bool OpenGl_VertexBuffer::SubData (const Handle(OpenGl_Context)& theGlCtx,
+                                   const GLsizei theElemFrom,
+                                   const GLsizei theElemsNb,
+                                   const GLuint* theData)
+{
+  if (!IsValid() || myDataType != GL_UNSIGNED_INT
+   || theElemFrom < 0 || ((theElemFrom + theElemsNb) > myElemsNb))
+  {
+    return false;
+  }
+
+  Bind (theGlCtx);
+  theGlCtx->core15->glBufferSubData (GetTarget(),
+                                     GLintptr(theElemFrom)  * GLintptr(myComponentsNb)   * sizeof(GLuint), // offset in bytes
+                                     GLsizeiptr(theElemsNb) * GLsizeiptr(myComponentsNb) * sizeof(GLuint), // size   in bytes
+                                     theData);
+  bool isDone = (glGetError() == GL_NO_ERROR); // GL_OUT_OF_MEMORY
+  Unbind (theGlCtx);
+  return isDone;
+}
+
+// =======================================================================
 // function : Init
 // purpose  :
 // =======================================================================
@@ -204,6 +229,31 @@ bool OpenGl_VertexBuffer::Init (const Handle(OpenGl_Context)& theGlCtx,
 }
 
 // =======================================================================
+// function : SubData
+// purpose  :
+// =======================================================================
+bool OpenGl_VertexBuffer::SubData (const Handle(OpenGl_Context)& theGlCtx,
+                                   const GLsizei  theElemFrom,
+                                   const GLsizei  theElemsNb,
+                                   const GLubyte* theData)
+{
+  if (!IsValid() || myDataType != GL_UNSIGNED_BYTE
+   || theElemFrom < 0 || ((theElemFrom + theElemsNb) > myElemsNb))
+  {
+    return false;
+  }
+
+  Bind (theGlCtx);
+  theGlCtx->core15->glBufferSubData (GetTarget(),
+                                     GLintptr(theElemFrom)  * GLintptr(myComponentsNb)   * sizeof(GLubyte), // offset in bytes
+                                     GLsizeiptr(theElemsNb) * GLsizeiptr(myComponentsNb) * sizeof(GLubyte), // size   in bytes
+                                     theData);
+  bool isDone = (glGetError() == GL_NO_ERROR); // GL_OUT_OF_MEMORY
+  Unbind (theGlCtx);
+  return isDone;
+}
+
+// =======================================================================
 // function : BindVertexAttrib
 // purpose  :
 // =======================================================================
index d691615..564bddd 100644 (file)
@@ -113,13 +113,35 @@ public:
   //! Function replaces portion of data within this VBO using glBufferSubData().
   //! The VBO should be initialized before call.
   //! @param theElemFrom - element id from which replace buffer data (>=0);
-  //! @param theElemsNb  - elements count (theElemFrom + theElemsNb < GetElemsNb());
+  //! @param theElemsNb  - elements count (theElemFrom + theElemsNb <= GetElemsNb());
   //! @param theData     - pointer to GLfloat data.
   Standard_EXPORT bool SubData (const Handle(OpenGl_Context)& theGlCtx,
                                 const GLsizei  theElemFrom,
                                 const GLsizei  theElemsNb,
                                 const GLfloat* theData);
 
+  //! Notice that VBO will be unbound after this call.
+  //! Function replaces portion of data within this VBO using glBufferSubData().
+  //! The VBO should be initialized before call.
+  //! @param theElemFrom element id from which replace buffer data (>=0);
+  //! @param theElemsNb  elements count (theElemFrom + theElemsNb <= GetElemsNb());
+  //! @param theData     pointer to GLuint data.
+  Standard_EXPORT bool SubData (const Handle(OpenGl_Context)& theGlCtx,
+                                const GLsizei theElemFrom,
+                                const GLsizei theElemsNb,
+                                const GLuint* theData);
+
+  //! Notice that VBO will be unbound after this call.
+  //! Function replaces portion of data within this VBO using glBufferSubData().
+  //! The VBO should be initialized before call.
+  //! @param theElemFrom element id from which replace buffer data (>=0);
+  //! @param theElemsNb  elements count (theElemFrom + theElemsNb <= GetElemsNb());
+  //! @param theData     pointer to GLubyte data.
+  Standard_EXPORT bool SubData (const Handle(OpenGl_Context)& theGlCtx,
+                                const GLsizei  theElemFrom,
+                                const GLsizei  theElemsNb,
+                                const GLubyte* theData);
+
   //! Bind this VBO to active GLSL program.
   Standard_EXPORT void BindVertexAttrib (const Handle(OpenGl_Context)& theGlCtx,
                                          const GLuint                  theAttribLoc) const;
index eacf141..b953e74 100644 (file)
@@ -111,6 +111,12 @@ public:
     return Standard_True;
   }
 
+  //! @return assigned VBO
+  inline const Handle(OpenGl_VertexBuffer)& GetVBO() const
+  {
+    return myVbo;
+  }
+
 private:
 
   Handle(OpenGl_Context)       myGlCtx;     //!< handle to current OpenGL context