diff options
Diffstat (limited to 'Runtime/ClusterRenderer/ClusterTransfer.cpp')
-rw-r--r-- | Runtime/ClusterRenderer/ClusterTransfer.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Runtime/ClusterRenderer/ClusterTransfer.cpp b/Runtime/ClusterRenderer/ClusterTransfer.cpp new file mode 100644 index 0000000..40b6633 --- /dev/null +++ b/Runtime/ClusterRenderer/ClusterTransfer.cpp @@ -0,0 +1,93 @@ +#include "UnityPrefix.h" +#if ENABLE_CLUSTER_SYNC +#include "ClusterTransfer.h" +#include "Runtime/Serialize/FileCache.h" +#include "Runtime/Serialize/CacheWrap.h" +#include "Runtime/Serialize/TransferFunctions/StreamedBinaryWrite.h" +#include "Runtime/Serialize/TransferFunctions/StreamedBinaryRead.h" +#include "Runtime/Input/InputManager.h" +#include "Runtime/Input/TimeManager.h" +#include "Runtime/Dynamics/PhysicsManager.h" + +#ifdef DEBUG +#include "Runtime/Dynamics/Rigidbody.h" +#include "Runtime/Graphics/Transform.h" +#endif + +template<class TransferFunc> +void TransferManagerStates (TransferFunc& transfer) +{ + // TODO: use macro incase manager is not present + GetInputManager().ClusterTransfer(transfer); + GetTimeManager().ClusterTransfer(transfer); + GetPhysicsManager().ClusterTransfer(transfer); +} + +void ClusterTransfer::TransferToBuffer(dynamic_array<UInt8>& buffer) +{ + StreamedBinaryWrite<false> writeStream; + CachedWriter& writeCache = writeStream.Init (0, BuildTargetSelection::NoTarget()); + MemoryCacheWriter memoryCache (buffer); + writeCache.InitWrite (memoryCache); + // transfer stuff + TransferManagerStates(writeStream); + // end of transfer + writeCache.CompleteWriting(); +} + +void ClusterTransfer::TransferFromBuffer(dynamic_array<UInt8>& buffer) +{ + // transfer setup + StreamedBinaryRead<false> readStream; + CachedReader& readCache = readStream.Init (0); + MemoryCacheReader memoryCache (buffer); + readCache.InitRead (memoryCache, 0, buffer.size()); + // transfer stuff + TransferManagerStates(readStream); + // end of transfer + readCache.End(); +} + +#ifdef DEBUG +void ClusterTransfer::TransferToFile(int slaveId) +{ + // create the buffer + dynamic_array<UInt8> buffer(kMemTempAlloc); + + // create the stream + StreamedBinaryWrite<false> writeStream; + CachedWriter& writeCache = writeStream.Init (0, BuildTargetSelection::NoTarget()); + MemoryCacheWriter memoryCache (buffer); + writeCache.InitWrite (memoryCache); + + // now write the data out to a file + for (int level=0;level<PhysicsManager::kMaxSortedActorsDepth;level++) + { + PhysicsManager::RigidbodyList& bodies = GetPhysicsManager().m_SortedActors[level]; + for (PhysicsManager::RigidbodyList::iterator i=bodies.begin();i != bodies.end();i++) + { + Rigidbody& body = **i; + + if (body.m_DisableReadUpdateTransform == 0) + { + GameObject& go = body.GetGameObject(); + Transform& transform = go.GetComponent (Transform); + transform.Transfer(writeStream); + } + } + } + + // end of transfer + writeCache.CompleteWriting(); + + + // now we have the buffer, we put it into a file, and compare that with other slaves. + char fileName[32]; + sprintf(fileName, "dump%d.dat\0", slaveId); + FILE* dump = fopen(fileName, "wb"); + fwrite(buffer.data(), sizeof(UInt8), buffer.size(), dump); + fclose(dump); +} +#endif // DEBUG + +#endif
\ No newline at end of file |