0031333: Data Exchange - RWGltf_TriangulationReader::readBuffer() fails to read inter...
authorkgv <kgv@opencascade.com>
Thu, 30 Jan 2020 14:10:29 +0000 (17:10 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 6 Feb 2020 14:45:05 +0000 (17:45 +0300)
Standard_ReadBuffer has been extended with a flag for reading an interleaved data.
RWGltf_TriangulationReader::readBuffer() uses new flag for reading vertex attributes.

src/RWGltf/RWGltf_TriangulationReader.cxx
src/Standard/Standard_ReadBuffer.hxx

index 8485afc..3303dab 100644 (file)
@@ -283,7 +283,7 @@ bool RWGltf_TriangulationReader::readBuffer (std::istream& theStream,
         return false;
       }
 
-      Standard_ReadBuffer aBuffer (theAccessor.Count * aStride, aStride);
+      Standard_ReadBuffer aBuffer (theAccessor.Count * aStride - (aStride - sizeof(Graphic3d_Vec3)), aStride, true);
       if (!myCoordSysConverter.IsEmpty())
       {
         for (Standard_Integer aVertIter = 0; aVertIter < aNbNodes; ++aVertIter)
@@ -336,7 +336,7 @@ bool RWGltf_TriangulationReader::readBuffer (std::istream& theStream,
       {
         return false;
       }
-      Standard_ReadBuffer aBuffer (theAccessor.Count * aStride, aStride);
+      Standard_ReadBuffer aBuffer (theAccessor.Count * aStride - (aStride - sizeof(Graphic3d_Vec3)), aStride, true);
       if (!myCoordSysConverter.IsEmpty())
       {
         for (Standard_Integer aVertIter = 0; aVertIter < aNbNodes; ++aVertIter)
@@ -402,7 +402,7 @@ bool RWGltf_TriangulationReader::readBuffer (std::istream& theStream,
         return false;
       }
 
-      Standard_ReadBuffer aBuffer (theAccessor.Count * aStride, aStride);
+      Standard_ReadBuffer aBuffer (theAccessor.Count * aStride - (aStride - sizeof(Graphic3d_Vec2)), aStride, true);
       for (int aVertIter = 0; aVertIter < aNbNodes; ++aVertIter)
       {
         Graphic3d_Vec2* aVec2 = aBuffer.ReadChunk<Graphic3d_Vec2> (theStream);
index e741e39..099a9ce 100644 (file)
@@ -25,7 +25,8 @@ public:
 
   //! Constructor with initialization.
   Standard_ReadBuffer (int64_t theDataLen,
-                       size_t  theChunkLen)
+                       size_t  theChunkLen,
+                       bool theIsPartialPayload = false)
   : myBufferPtr(NULL),
     myBufferEnd(NULL),
     myDataLen  (0),
@@ -34,17 +35,28 @@ public:
     myNbChunks (0),
     myBufferLen(0)
   {
-    Init (theDataLen, theChunkLen);
+    Init (theDataLen, theChunkLen, theIsPartialPayload);
   }
 
   //! Initialize the buffer.
-  //! @param theDataLen  the full length of input data to read from stream.
-  //! @param theChunkLen the length of single chunk to read
+  //! @param theDataLen  [in] the full length of input data to read from stream.
+  //! @param theChunkLen [in] the length of single chunk to read
+  //! @param theIsPartialPayload [in] when FALSE, theDataLen will be automatically aligned to the multiple of theChunkLen;
+  //!                                 when TRUE, last chunk will be read from stream exactly till theDataLen
+  //!                                 allowing portion of chunk to be uninitialized (useful for interleaved data)
   void Init (int64_t theDataLen,
-             size_t  theChunkLen)
+             size_t  theChunkLen,
+             bool theIsPartialPayload = false)
   {
     myDataRead  = 0;
-    myDataLen   = theDataLen - theDataLen % int64_t(theChunkLen);
+    if (theIsPartialPayload)
+    {
+      myDataLen = theDataLen;
+    }
+    else
+    {
+      myDataLen = theDataLen - theDataLen % int64_t(theChunkLen);
+    }
     myChunkLen  = theChunkLen;
     myNbChunks  = sizeof(myBuffer) / theChunkLen;
     myBufferLen = theChunkLen * myNbChunks;
@@ -95,7 +107,7 @@ private:
     }
 
     const int64_t aDataLeft = myDataLen - myDataRead;
-    if (aDataLeft == 0) // myDataLen should be multiple of myChunkLen
+    if (aDataLeft <= 0) // myDataLen is normally multiple of myChunkLen, but can be smaller in interleaved data
     {
       myBufferPtr = NULL;
       return NULL;