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)
{
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)
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);
//! Constructor with initialization.
Standard_ReadBuffer (int64_t theDataLen,
- size_t theChunkLen)
+ size_t theChunkLen,
+ bool theIsPartialPayload = false)
: myBufferPtr(NULL),
myBufferEnd(NULL),
myDataLen (0),
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;
}
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;