|
@@ -248,22 +248,27 @@ namespace BansheeEngine
|
|
|
else
|
|
else
|
|
|
typeSize = curField->getTypeSize();
|
|
typeSize = curField->getTypeSize();
|
|
|
|
|
|
|
|
- if((*bytesWritten + typeSize) > bufferLength)
|
|
|
|
|
|
|
+ if ((*bytesWritten + typeSize) > bufferLength)
|
|
|
{
|
|
{
|
|
|
- mTotalBytesWritten += *bytesWritten;
|
|
|
|
|
- buffer = flushBufferCallback(buffer - *bytesWritten, *bytesWritten, bufferLength);
|
|
|
|
|
- if(buffer == nullptr || bufferLength < typeSize)
|
|
|
|
|
|
|
+ UINT8* tempBuffer = (UINT8*)stackAlloc(typeSize);
|
|
|
|
|
+ curField->arrayElemToBuffer(object, arrIdx, tempBuffer);
|
|
|
|
|
+
|
|
|
|
|
+ buffer = dataBlockToBuffer(tempBuffer, typeSize, buffer, bufferLength, bytesWritten, flushBufferCallback);
|
|
|
|
|
+ if (buffer == nullptr || bufferLength == 0)
|
|
|
{
|
|
{
|
|
|
- return nullptr;
|
|
|
|
|
|
|
+ stackDeallocLast(tempBuffer);
|
|
|
si->onSerializationEnded(object);
|
|
si->onSerializationEnded(object);
|
|
|
|
|
+ return nullptr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- *bytesWritten = 0;
|
|
|
|
|
|
|
+ stackDeallocLast(tempBuffer);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ curField->arrayElemToBuffer(object, arrIdx, buffer);
|
|
|
|
|
+ buffer += typeSize;
|
|
|
|
|
+ *bytesWritten += typeSize;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- curField->arrayElemToBuffer(object, arrIdx, buffer);
|
|
|
|
|
- buffer += typeSize;
|
|
|
|
|
- *bytesWritten += typeSize;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
break;
|
|
@@ -312,22 +317,27 @@ namespace BansheeEngine
|
|
|
else
|
|
else
|
|
|
typeSize = curField->getTypeSize();
|
|
typeSize = curField->getTypeSize();
|
|
|
|
|
|
|
|
- if((*bytesWritten + typeSize) > bufferLength)
|
|
|
|
|
|
|
+ if ((*bytesWritten + typeSize) > bufferLength)
|
|
|
{
|
|
{
|
|
|
- mTotalBytesWritten += *bytesWritten;
|
|
|
|
|
- buffer = flushBufferCallback(buffer - *bytesWritten, *bytesWritten, bufferLength);
|
|
|
|
|
- if(buffer == nullptr || bufferLength < typeSize)
|
|
|
|
|
|
|
+ UINT8* tempBuffer = (UINT8*)stackAlloc(typeSize);
|
|
|
|
|
+ curField->toBuffer(object, tempBuffer);
|
|
|
|
|
+
|
|
|
|
|
+ buffer = dataBlockToBuffer(tempBuffer, typeSize, buffer, bufferLength, bytesWritten, flushBufferCallback);
|
|
|
|
|
+ if (buffer == nullptr || bufferLength == 0)
|
|
|
{
|
|
{
|
|
|
|
|
+ stackDeallocLast(tempBuffer);
|
|
|
si->onSerializationEnded(object);
|
|
si->onSerializationEnded(object);
|
|
|
return nullptr;
|
|
return nullptr;
|
|
|
}
|
|
}
|
|
|
- *bytesWritten = 0;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
- curField->toBuffer(object, buffer);
|
|
|
|
|
- buffer += typeSize;
|
|
|
|
|
- *bytesWritten += typeSize;
|
|
|
|
|
|
|
+ stackDeallocLast(tempBuffer);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ curField->toBuffer(object, buffer);
|
|
|
|
|
+ buffer += typeSize;
|
|
|
|
|
+ *bytesWritten += typeSize;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -342,33 +352,12 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
// Data block data
|
|
// Data block data
|
|
|
UINT8* dataToStore = value.getData();
|
|
UINT8* dataToStore = value.getData();
|
|
|
- UINT32 remainingSize = dataBlockSize;
|
|
|
|
|
- while(remainingSize > 0)
|
|
|
|
|
- {
|
|
|
|
|
- UINT32 remainingSpaceInBuffer = bufferLength - *bytesWritten;
|
|
|
|
|
|
|
|
|
|
- if(remainingSize <= remainingSpaceInBuffer)
|
|
|
|
|
- {
|
|
|
|
|
- COPY_TO_BUFFER(dataToStore, remainingSize);
|
|
|
|
|
- remainingSize = 0;
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- memcpy(buffer, dataToStore, remainingSpaceInBuffer);
|
|
|
|
|
- buffer += remainingSpaceInBuffer;
|
|
|
|
|
- *bytesWritten += remainingSpaceInBuffer;
|
|
|
|
|
- dataToStore += remainingSpaceInBuffer;
|
|
|
|
|
- remainingSize -= remainingSpaceInBuffer;
|
|
|
|
|
-
|
|
|
|
|
- mTotalBytesWritten += *bytesWritten;
|
|
|
|
|
- buffer = flushBufferCallback(buffer - *bytesWritten, *bytesWritten, bufferLength);
|
|
|
|
|
- if(buffer == nullptr || bufferLength == 0)
|
|
|
|
|
- {
|
|
|
|
|
- si->onSerializationEnded(object);
|
|
|
|
|
- return nullptr;
|
|
|
|
|
- }
|
|
|
|
|
- *bytesWritten = 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ buffer = dataBlockToBuffer(dataToStore, dataBlockSize, buffer, bufferLength, bytesWritten, flushBufferCallback);
|
|
|
|
|
+ if (buffer == nullptr || bufferLength == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ si->onSerializationEnded(object);
|
|
|
|
|
+ return nullptr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
break;
|
|
@@ -1060,6 +1049,39 @@ exit:
|
|
|
return emptyObject;
|
|
return emptyObject;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ UINT8* BinarySerializer::dataBlockToBuffer(UINT8* data, UINT32 size, UINT8* buffer, UINT32& bufferLength, int* bytesWritten,
|
|
|
|
|
+ std::function<UINT8*(UINT8* buffer, int bytesWritten, UINT32& newBufferSize)> flushBufferCallback)
|
|
|
|
|
+ {
|
|
|
|
|
+ UINT32 remainingSize = size;
|
|
|
|
|
+ while (remainingSize > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ UINT32 remainingSpaceInBuffer = bufferLength - *bytesWritten;
|
|
|
|
|
+
|
|
|
|
|
+ if (remainingSize <= remainingSpaceInBuffer)
|
|
|
|
|
+ {
|
|
|
|
|
+ COPY_TO_BUFFER(data, remainingSize);
|
|
|
|
|
+ remainingSize = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ memcpy(buffer, data, remainingSpaceInBuffer);
|
|
|
|
|
+ buffer += remainingSpaceInBuffer;
|
|
|
|
|
+ *bytesWritten += remainingSpaceInBuffer;
|
|
|
|
|
+ data += remainingSpaceInBuffer;
|
|
|
|
|
+ remainingSize -= remainingSpaceInBuffer;
|
|
|
|
|
+
|
|
|
|
|
+ mTotalBytesWritten += *bytesWritten;
|
|
|
|
|
+ buffer = flushBufferCallback(buffer - *bytesWritten, *bytesWritten, bufferLength);
|
|
|
|
|
+ if (buffer == nullptr || bufferLength == 0)
|
|
|
|
|
+ return nullptr;
|
|
|
|
|
+
|
|
|
|
|
+ *bytesWritten = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return buffer;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
UINT32 BinarySerializer::findOrCreatePersistentId(IReflectable* object)
|
|
UINT32 BinarySerializer::findOrCreatePersistentId(IReflectable* object)
|
|
|
{
|
|
{
|
|
|
void* ptrAddress = (void*)object;
|
|
void* ptrAddress = (void*)object;
|